はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

M5Stack Core 2で始めるAzure IoT Hub入門(その3)

前回
hatsune.hatenablog.jp

第3回目の今回は、M5Coreでのプログラミングの基礎と、PORT.A.I2Cでの入出力について調べていきたいと思います。
第1回ではArduino IDEでスケッチを作成した後に、Visual Studio Codeでそのスケッチを取り扱えるようにVisual Studio Codeの環境を整えました。
今回は、第1回で環境整備の基本はおわっているので、Visual Studio Codeで新規にスケッチを作成する方法を確認していきます。

Visual Studio Codeでの新規プログラミング

Visual Studio Codeの[ファイル]-[フォルダを開く]で新しいスケッチを入れるためのフォルダを作成してから開きます。
これは、Arduino IDEが、例えば「hoge.ino」というスケッチを扱うには、必ず「hoge」フォルダの下に「hoge.ino」を期待しているからです。
あとからArduino IDEでスケッチを開きたいということがあったときもスムーズにVisual Studio CodeArduino IDEの行き来ができるように、Arduino IDEのお作法に沿ってフォルダを作成しておきましょう。
今回は「Env2Unit」というフォルダにしましょう。
フォルダを作成した直後のVisual Studio Codeのエキスプローラー表示をみてみましょう。
f:id:hatsune_a:20210607205749p:plain

シリアルポートの設定

その1でArduino拡張 (およびc++拡張) はインストール済ですので、M5CoreをUSBで接続してから、Ctrl+Shift+Pで「Arduino: Select Serial Port」で、シリアルポートを選択します。
こうすることで「Env2Unit」フォルダの中に「.vscode」フォルダが作成されて、「Env2Unit」フォルダを開いた設定として、指定したポート番号が適用されるようになります。
f:id:hatsune_a:20210607210343p:plain

ボードを選択

Ctrl+Shift+Pで「Arduino: Board Config」を選択して、ボードを選択します。
f:id:hatsune_a:20210607211437p:plain

スケッチファイルを作成

新規ファイル追加で「Env2Unit.ino」ファイルを作成します。
f:id:hatsune_a:20210607211106p:plain

Arduino.jsonにスケッチファイル名を指定する

f:id:hatsune_a:20210607212343p:plain
"sketch": "Env2Unit.ino"
を追加すると自動的にスケッチの解析が行われて、「c_cpp_properties.json」ファイルが作成されます。

M5Stack用のインテリセンスが効くように設定

c_cpp_properties.jsonを開いて、includePathにArduino IDEで指定したスケッチブックの保存場所の中のライブラリを指定します。

例:"C:\Users\hatsune\Documents\Arduino\libraries\\**",

前の行の最後に , を入れるのも忘れないようにしましょう。

準備が整ったかを確認

簡単なスケッチを記述して、M5Coreにデプロイして動作することを確認します。
gist.github.com

ENV.II SENSORで気圧を測定

BMP280用ライブラリを追加

ENV.II SENSORは、SHT30とBMP280が内蔵されています。
BMP280は気圧センサーなので、気圧の表示部分を作成してみます。
Ctrk+Shift+Pで「Arduino Library Manager」を起動して必要なライブラリが提供されているかを確認します。
f:id:hatsune_a:20210607222821p:plain
サクッとインストールします。

スケッチ解析エラーを解決する

BMP280用ライブラリを使うために

#include <Adafruit_BMP280.h>

をスケッチに追加して解析すると"Adafruit_Sensor.h"がないというエラーが表示されます。
前年ながらArudino Library Managerでは追加できないので公式GitHubから落としてきます。
https://github.com/m5stack/M5-ProductExampleCodes/tree/master/Unit/ENVII/Arduino/ENVII
ファイルの保存先は、ライブラリフォルダの中の[Adafruit_BMP280_Library]フォルダです。

例:"C:\Users\hatsune\Documents\Arduino\libraries\\Adafruit_BMP280_Library",

ENV.IIで測定した気圧を表示

gist.github.com

  1. 動作に必要な4つのライブラリをincludeします。
  2. Wire.Begin() でPORT.A.I2C を初期化します。
  3. while (!Bmp.begin(0x76)) でアドレス0x76を指定して接続します。
  4. loop関数の中では、Bmp.readPressure()によって気圧を取得します。
  5. M5.Lcd.setCursor(0, 0); で液晶画面先頭にカーソルを移動します。
  6. M5.Lcd.printfで情報を表示します。
  7. 0.1秒ごとに更新します。

f:id:hatsune_a:20210607233127p:plain

ENV.II SENSORで気温と湿度を測定

BMP280用ライブラリを追加

"Adafruit_Sensor.h"と同様に公式GitHubから”SHT3X.h”と”SHT3X.cpp"を"Adafruit_Sensor.h"と同じ場所にダウンロードします。

ENV.IIで測定した室温と湿度を表示

SHT3Xに関する処理を追加してスケッチを完成させます。
gist.github.com

  1. loop関数の中では、Sht30.get()によって温度 (cTemp) と湿度 (humidity) を取得します。

f:id:hatsune_a:20210608002833p:plain

室温が30度近かったんですね。暑いはずです。

ライブラリは必要?

今回はM5Stack用モジュールとして販売されているものだったので公式サイトからライブラリを入手できました。
もし、自分で作成した回路をつなげるような場合であれば、利用ている回路のデータシートなどからI2Cでのデータフォーマットを把握して、その部分を作成してあげることで、ライブラリを使わなくても同じようなことが可能です。

次回はAzure側の準備についてふれてみたいと思います。
hatsune.hatenablog.jp

M5Stack Core 2で始めるAzure IoT Hub入門(その2)

前回
hatsune.hatenablog.jp

2回目の今回は、M5Stackへの外部接続について、少しまとめておきたいと思います。
M5Stackの本体であるCoreモジュールには、外部機器との接続用インターフェースとして次の3つが用意されています。

  • USB
  • PORT.A.I2C
  • M-Bus

ピン配置などは、M5Stack Core 2の場合は本体裏面にプリントされています。
f:id:hatsune_a:20210605124344p:plain

USB

USB-Cが給電+シリアル接続用に用意されています。シリアル接続はCP2104を使って実現しており、ESP32でいえばTXD3とRXD3になります。
USB接続した端末で開発環境が稼働していれば、このルートを使ってシリアル入出力を実現しています。
また、AXP192という電源管理のチップセットがあり、内部電源か外部電源かやバッテリー電圧なども取得できます。FactoryTestスケッチなどはこのあたりを使っていると思います(FactoryTestスケッチについては後日取り上げる予定です)。

PORT.A.I2C

PORT.A.I2Cは、Inter-Integrated Circuitの略であり、アイ・スクエア・シーまたはアイ・ツー・シーと呼ばれるシリアルバス規格です。
I2C対応機器にはどのようなものがあって、どうやって繋ぐかなどは2015年の記事となりますが、buildinsiderで記事を書かせていただいていますので、そちらをご覧いただくとよいと思います。
www.buildinsider.net
Netduinoも電源5Vラインですのでピン配置に気を付ければ接続先の回路などはそのまま流用できます。

IC2のピン配置を確認する

記事中では、I2Cは「SCL」「SDA」「VDD」「GND」のピンがあるとしています。
M5Stack Core 2をみると、PORT.A.I2Cのピン配置は、液晶面を上にした状態で左から「G33」「G32」「5V」「GND」となっています。
このM-Basピン配列ではG33=PA_SCL、G32=PA_SDAとありますので、PORT.A.I2Cのピン配置は「SCL」「SDA]「5V」「GND」となります。
実際に端子を指すところにもSCLにはクロック信号っぽいマーク、SDAにはON/OFFの2値っぽいマークがついてます。
さらにダメ押しの確認としてPORT.A.I2Cに接続できる「温度湿度環境センサ付きユニット」の接続ピン配置を確認してみましょう。
f:id:hatsune_a:20210605124751p:plain
こちらはしっかりと「SCL」「SDA」「5V」「GND」って表記になっています。どうやらPORT.A.I2Cのピン配置は「SCL」「SDA]「5V」「GND」で間違いなさそうです。

PORT.A.I2CとGROVE互換インターフェース

M5StackのPORT.A.I2CはGROVE互換インターフェースとも呼ばれています。
GROVEは、Arduinoと容易に接続するためのインターフェースで、Seeed社から様々なGROVEシリーズのモジュール(拡張機器)が提供されています。
仕様が公開されていますので、Seeed社以外からも様々なモジュールが販売されています。
www.switch-science.com
GROVEと互換があるということはM5Coreでも、GROVEモジュールをつなげて使えるということになります。

M-Bus

M-Busは、ESP32 (Coreの中心となるSoC) の次のピンを取り出しているインターフェースです。

  • G0:I2S LRCK PDM CLK
  • G1:TXD0
  • G2:I2S DOUT
  • G3:RXD0
  • G13:RXD2
  • G14:TXD2
  • G18:SCK
  • G19:GPIO
  • G21:intSDA
  • G22:intSCL
  • G23:MOSI
  • G25:DAC
  • G26:DAC
  • G27:GPIO
  • G32:PA_SDA (PORT.A.I2Cと同じ)
  • G33:PA_SCL (PORT.A.I2Cと同じ)
  • G34:PDM DAT
  • G35:ADC
  • G36:ADC
  • G38:MISO
  • GND
  • 3.3V
  • 5V
  • RST
  • BAT

M-Busを使うことでESP32の(すべてではないですが)ピンに接続できますので、PORT.A.I2C端子よりもつながるものがかなり多くなります。また、ピン配置もM5Stackの「モジュール」と呼ばれるものであれば筐体の大きさも含めて、M5Coreとぴったり重ね合わせできるので、取り扱いも楽になります。
「モジュール」には、例えば、GPSモジュールなどはI2CではなくGPIOで接続するためM-Bus接続のモジュールとして提供されています。
www.switch-science.com

M-BusにPORT.A.I2Cと同じものがあるということは

GROVE互換インターフェースをもったものであれば、Busモジュールの中に入れてしまってM5Coreの下に重ね合わせてしまうなんていうこともできます。
www.switch-science.com

M-BusにGPIOがあるということは

M-BusにGPIOがあるということは、GPIOがつながる色々な機器ともつながるということですね。
みんな大好きMESHにもGPIOがありますから、MESHでの操作をGPIOでBusモジュール+M5Coreで収集して、Wi-Fiに飛ばしてAzureでなんということも可能です。
MESHとGPIOについての詳細は、BuildInsiderに記事を掲載いただいてますので、見ていただけると嬉しいです。
www.buildinsider.net

おまけ:温度湿度環境センサについて

www.switch-science.com
このセンサですが、温湿度センサーとしてSHT-30、気圧センサーとしてBMP280が内蔵されています。
BMP280単体のGROVEモジュールもあるので気圧センサーだけだったらそれを使う手もあります。
www.switch-science.com
GROVEモジュールであれば、GROVE互換インターフェースであるPORT.A.I2Cともつながります。
でも、M5Stack用のユニットなら外装あるので、ユニットの方が扱いが楽かもしれないですね。

それでは、また、次回まで!
次回はいよいよM5Stackのプログラミング(スケッチ)に取り掛かります。
その3→
M5Stack Core 2で始めるAzure IoT Hub入門(その3) - はつねの日記

M5Stack Core 2で始めるAzure IoT Hub入門(その1)

AzureとIoTとHoloLensはすごく相性がいいです。
build 2021でもかなり力を入れてAzure Digital Twinsとも絡めて多くの説明がありました。
このブログでも過去にArudinoやESP32、Netduino、Rasberry PIなどについて書いたエントリもあったりします。
今回は、みんな大好きM5Stackを使ってやってみたいと思います。
まず、第1回目の今回は、M5Stackのアプリをデプロイするところまでやってみましょう。

M5Stackとは

M5Stackは、ESP32というbluetoothWi-Fiを内蔵するSoCを使って、それに320x240のTFTカラー液晶、microSDカードスロット、スピーカーを組み合わせたコンパクトで便利な開発モジュールになります。
f:id:hatsune_a:20210604195926p:plain
ESP32はArudino環境で開発ができるのでM5Stackで動作するアプリもArduino環境で開発ができます。
M5Stackには様々な拡張モジュールがあり、M5Stack Coreと呼ばれるM5Stack本体に拡張モジュールを積み重ねていくことでいろいろな機能が拡張ができます。

M5Stack Core 2とは

今回使うM5Stack Core 2は、M5StackのCore機能を改良した第二世代のCoreデバイスとなります。
www.switch-science.com
M5Stack Core 2本体にはUSB Type-Cが用意されていて、こことPCのUSB Type-Aを接続するUSBケーブルも同封されています。
ただし、SDカードは付属していないので、忘れずに一緒に購入しておくとよいでしょう。

M5Stack Core 2の電源を入れる

PCとUSBケーブルを接続して電源ボタンをクリックするとすぐに立ち上がります。
f:id:hatsune_a:20210604201416j:plain
FactoryTestというスケッチ(アプリコード)が実行されてるのですが、色合いや表示されている表示なんかが、みんな大好きエヴァ風だったりします。
USBケーブルを抜くと「外部」から「内部」にちゃんと主要電源表示が切り替わります。すばらしい。

M5Stackの開発環境を整える

Arduio IDEで開発してもいいのですが、今回の目標は、Visual Studio CodeでM5Stack開発環境を整えて、簡単なコードをデプロイして動かすところまでを目標にします。
参考にするMicrosoft Docsはこちらになります。
docs.microsoft.com

開発環境のゴール

gist.github.com
M5Stackの画面にHelloWorldと表示します。

Arduino IDEをインストールする

https://www.arduino.cc/en/software
Visual Studio CodeからArduino IDEの動作環境を呼び出すため、Windows Appsではなく、Windows Win 7 and newerのリンクからexeファイルをダウンロードしてインストールします。
インストールオプションは変えずにそのままインストールしましょう。
f:id:hatsune_a:20210604203451p:plain

M5Stack Core 2との接続を確認する

M5Stack Core 2をPCにUSB接続したら、デバイスマネージャーでシリアル接続先として認識されているかを確認します。
f:id:hatsune_a:20210604205425p:plain
[ポート (COMとLPT) ]の中に「CP210x」があるかを探して、COMの番号を調べておきます。上手ではCOM4です。

Arduino IDEの設定を行う

Arduino IDEを起動したら、[ファイル]-[環境設定]メニューをクリックします。
f:id:hatsune_a:20210604205743p:plain
[追加のボードマネジャーのURL]に下記を設定します。
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

[ツール]-[ボード]-[ボードマネージャー]メニューを選択します。
f:id:hatsune_a:20210604210051p:plain

ボードマネージャーで「m5stack」と入力して、M5Stackの公式ボードが検索されたらそれをインストールします。
f:id:hatsune_a:20210604210252p:plain

M5Stack Core2ライブラリのインストールを行う

[スケッチ]-[ライブラリをインクルード]-[ライブラリを管理]メニューをクリックします。
f:id:hatsune_a:20210604210649p:plain

ライブラリマネージャーで「m5core2」と入力して、M5Stack公式のライブラリをインストールします。
f:id:hatsune_a:20210604210841p:plain

ボードを選択する

[ツール]-[ボード]-[M5Stack Arudino]-[M5Stack-Core2]を選択します。
f:id:hatsune_a:20210604211022p:plain

シリアルポートを選択する

[ツール]-[シリアルポート]メニューで、デバイスマネージャーで確認したCOM番号のものを指定します。f:id:hatsune_a:20210604211146p:plain

Ardino IDEのシリアルモニタを開く

Arduino IDEで[ツール]-[シリアルモニタ]メニューをクリックしてシリアルモニタを開きます。
ボーレートには115200bpsをを指定しておきます。

スケッチ(プログラム)をデプロイする

[スケッチ]-[マイコンボードに書き込み]メニューをクリックするとしばらく時間がかかりますが、「Hard resetting via RTS pin...」と表示されて、M5Stack Core 2の画面がFactoryTestから変わってスケッチで記述した表示に変わります。

Ardino IDEのシリアルモニタで確認する

スケッチが起動すると、次のような表示が出力されます。
f:id:hatsune_a:20210606155126p:plain

Visual Studio Codeをインストールする

もう大抵の開発機にはインストールされているとは思いますが、Visual Studio Codeで今回は開発するのでVisual Studio Codeもインストールしておきます。

Visual Studio CodeArduino拡張をインストールする

サイドメニューアイコンの[拡張機能]を選択して、「Arduino」で検索して拡張機能をインストールします。
f:id:hatsune_a:20210604214216p:plain

Arduino用の設定を行う

拡張機能Arduinoから「Arduino: Path」の設定にパスを設定します。
f:id:hatsune_a:20210604232818p:plain

IntelliSenseの設定を行う

拡張機能C/C++から「C_Cpp: Intelli Sense Engine」の設定を「Tag Parser」にします。
f:id:hatsune_a:20210604232445p:plain

フォルダを開く

[ファイル]-[フォルダを開く]メニューでコードを置く場所を開きます。

シリアルポートの設定

VSCodeでCtrl+Shift+Pで「Arduino: Select Serial Port」で、先ほど調べた「COM4」を指定します。
f:id:hatsune_a:20210604235204p:plain
これで、フォルダの中に[.vscode]-[arduino.json]ファイルが作成されます。

ボードを選択する

Ctrl+Shift+Pで「Arduino: Board Config」を選択して、ボードを選択します。
f:id:hatsune_a:20210605002930p:plain
これで、フォルダの中に[.vscode]-[c_cpp_properties.json]ファイルが作成されます。

M5Stack用のインテリセンスが効くように設定する

c_cpp_properties.jsonを開いて、includePathにArduino IDEで指定したスケッチブックの保存場所の中のライブラリを指定します。

例:"C:\Users\hatsune\Documents\Arduino\libraries\\**",

前の行の最後に , を入れるのも忘れないようにしましょう。

シリアルモニターとの通信ボーレートを指定する

Ctrl+Shift+Pで「Arduino: Change Baud Rate」を選択して、115200を選択します。
f:id:hatsune_a:20210606162306p:plain

コードを書く

HelloWorld.inoをフォルダの中に作成します。

スケッチ(プログラム)をビルドする

Ctrl+Alt+RまたはVSCodeの右上のVerifyアイコンをクリックしてコンパイルします。
ベリファイが終わると次の表示がでます。

[Done] Finished verify sketch - helloworld.ino

スケッチ(プログラム)をデプロイする

Ctrl+Alt+UまたはVSCodeの右上のUploadアイコンをクリックしてコンパイルします。

[Done] Uploaded the sketch: helloworld.ino

シリアルモニタに接続する

スケッチが起動したことを確認したら、Visual Studio Codeの画面最下部のコンセントマークをクリックしてシリアルモニターをオープンします。
f:id:hatsune_a:20210606182414p:plain
シリアルモニタには、次のような表示が出力されます。
f:id:hatsune_a:20210606185316p:plain
なお、シリアルモニタをオープンしたまま、スケッチをデプロイしようとすると「スケッチの書き込み中にエラーが発生しました」となりますので注意してください、


ここまで順調にできたならば、開発環境の準備は終わりです。
次回をお楽しみに!
その2→
M5Stack Core 2で始めるAzure IoT Hub入門(その2) - はつねの日記

Azure Digital Twinsを学ぶために最適なLearn

Microsoft Build 2021に参加していて、Azure Digital Twinsについて、もう一度ちゃんと把握したくなったのでdocsで資料読むだけじゃなくてMicrosoft Learnでも学んでみようと思い立ったので、該当するLearnのURLをあつめてみました。
docs.microsoft.com
docs.microsoft.com
docs.microsoft.com
docs.microsoft.com
docs.microsoft.com
このあたりを一通り進めてみようと思います。

Microsoft Graph REST APIを使うときに必要な私たちのLearn

Microsoft 365(TeamsとかOffice 365)のデータにアプリからアクセスしようとした場合、Microsoft Graphを経由してアクセスすることになります。
Microsoft Graphによって、AzureADに登録したアプリごとのアクセス権に基づいたAPI呼出し制限や、テナントに対する流量制限なども行えるため、アプリ側の問題などで、利用中のMicrosoft 365データに対して予期しない操作を防止することができます。
Graphを使うためには、Graph SDKREST APIの2つの方法があります。
SDKが対応している言語やプラットフォームであればSDKを使うのも1つの方法です。
しかし、.NET 5などで、マルチプラットフォームでの動作を想定するならばREST APIも押さえておくのが良いでしょう。

そこで、REST APIを使ってMicrosoft Graph APIに接続するときに分かりやすいLearnを見つけたので共有します。
docs.microsoft.com
ぜひ、挑戦してみてください。

そろそろ.NET 6のWindows OS動作環境をまとめておこう

2021年5月現在、サポート対象となっている.NET (.NET Core) のバージョンは、.NET Core 2.1、.NET Core 3.1、.NET 5です。

Windows クライアント 動作OS

それらがサポートしているWindows クライアント OSとしては次のものがあります。

Windows 7で注意しなければならないのは、SP1定期済であり、また、通常サポートも終了(2020年1月14日)しているので拡張セキュリティ更新プログラム (ESU) が適用されていることです。
docs.microsoft.com
ESUは最大3年の施策ですから、2023年1月14日にはWindows 7 SP1自体のOSとしてのサポートも終わります。
Windows 8.1のサポート終了が2023年1月10日ですので、あと約2年くらいでWindows 10にWindows OSを1本化できる世界線がやってきます。

.NET 6 のWindows動作OS

github.com
リリースノートによれば、.NET 6についても同様にWindows クライアントOSについては、

となっています。
.NET 6はプレビュー版ですが、.NET 5で簡単なWPFアプリなどを作成しておいて、配布先で動作するかをためしておくと.NET 6がGA (正式リリース) されたときの移行もスムーズかもしれませんね。

.NET 5アプリを動作させる上でのその他の注意点

Windows 7では更に次の2つもインストールされている必要があります。

Windows 8.1では次のものがインストールされている必要があります。

  • Microsoft Visual C++ 2015-2019再配布可能パッケージ

そろそろ.NET 5のWindows OS動作環境をまとめておこう

2021年5月現在、サポート対象となっている.NET (.NET Core) のバージョンは、.NET Core 2.1、.NET Core 3.1、.NET 5です。

Windows クライアント 動作OS

それらがサポートしているWindows クライアント OSとしては次のものがあります。

Windows 7で注意しなければならないのは、SP1定期済であり、また、通常サポートも終了(2020年1月14日)しているので拡張セキュリティ更新プログラム (ESU) が適用されていることです。
docs.microsoft.com
ESUは最大3年の施策ですから、2023年1月14日にはWindows 7 SP1自体のOSとしてのサポートも終わります。
Windows 8.1のサポート終了が2023年1月10日ですので、あと約2年くらいでWindows 10にWindows OSを1本化できる世界線がやってきます。

.NET 6 のWindows動作OS

github.com
リリースノートによれば、.NET 6についても同様にWindows クライアントOSについては、

となっています。
.NET 6はプレビュー版ですが、.NET 5で簡単なWPFアプリなどを作成しておいて、配布先で動作するかをためしておくと.NET 6がGA (正式リリース) されたときの移行もスムーズかもしれませんね。

.NET 5アプリを動作させる上でのその他の注意点

Windows 7では更に次の2つもインストールされている必要があります。

Windows 8.1では次のものがインストールされている必要があります。

  • Microsoft Visual C++ 2015-2019再配布可能パッケージ