はつねの日記

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

.NET nanoFrameworkでM5StickC Plusのブザーを鳴らしてみる

前回

hatsune.hatenablog.jp
前回は、.NET nanoFrameworkでの開発準備とM5StickC Plusでの簡単なアプリの実行まで実施しました。
今回は、M5StickC Plus本体に内蔵されているブザーを鳴らしてみたいと思います。

事前準備

Install the nanoFramework firmware

M5StickC PlusにはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

USBでM5StickC PlusをPCに接続したら、USB Serial Portのポート番号を確認します。今回の環境では「COM6」が該当しました。

Flasherアプリケーションのインストール

OSの[スタート]メニューから「Developer PowerShell for VS2022」を起動します。

dotnet tool install --global nanoff

nanoFrameworkfファームウェアをインストール

M5StickC Plusをターゲットにして「COM6」経由でnanoFrameworkをアップロードします。

nanoff --target M5StickCPlus --update --serialport COM6

Visual Studioの準備

Visual Studioを機能拡張する

Visual Studioには.NET nanoFramework Extensionをインストールして機能拡張しておきます。
この機能拡張によりnanoFrameworkアプリのテンプレートが追加されます。
このテンプレートで作成したプロジェクトには、NuGetから自動的に「nanoFramework.CoreLibrary」ライブラリが追加されています。

「nanoFramework.M5StickCPlus」ライブラリを追加する

M5StickC Plusの画面などハードウェアにアクセスするために、M5StickC Plus用のライブラリを追加します。

ここまでが、M5StickC Plusを使うアプリ開発を行う上での共通の事前準備となります。

ブザーを鳴らず

ボタンをクリックしたらブザーを鳴らす

ブザーを一定時間鳴らすには、PlayToneメソッドを使います
PlayToneメソッドには「周波数(Hz)」と「継続時間(ミリ秒)」の2つのパラメータがあります。
M5ボタンをクリックすると440Hz(ISOの国際標準ピッチ)の音を1秒間鳴らすには次のようなコード記述します。
gist.github.com
www.youtube.com

ボタンをクリックしている間だけブザーを鳴らす

では、ボタンをクリックしている間だけブザーを鳴らすようにしたいときはどうしたらよいでしょうか。
M5StickCPlus.ButtonM5.Pressイベントの処理をコメントアウトして、代わりにButtonDownイベントとButtonUpイベントの処理を追加します。
gist.github.com
www.youtube.com

次回

次回は本体LED関連についてを予定しています。

.NET nanoFrameworkでM5StickC Plusを使ってみる

今回は、.NET nanoFrameworkから、M5Stack Core 2と同じM5シリーズの1つであるM5StickC Plusを使ってみましょう。

M5StickC Plusとは

M5StickC Plusは、ESP32-PICO-D4を搭載し、赤外線、RTC(real-time clock)、マイクロフォン、LED、6軸IMU(Inertial Measurement Unit)、ボタン、PMIC(Power Management IC)、BluetoothWi-Fiを搭載したコンパクトなハードです。
www.switch-science.com

M5StickC Plusの外部接続

外部機器との接続用インターフェースとして次の3つが用意されています。

  • USB
  • PH2.0-4P
  • 2.54mm 8pin

ピン配置などは、M5StickC Plusの本体裏面にプリントされています。

USB

USB-Cが給電+シリアル接続用に用意されています。
USB接続した端末で開発環境が稼働していれば、このルートを使ってシリアル入出力を実現しています。

PH2.0-4P

PH2.0-4Pは、GROVE互換インターフェースのI2Cシリアルバス端子です。
GROVEは、Arduinoと容易に接続するためのインターフェースで、Seeed社から様々なGROVEシリーズのモジュール(拡張機器)が提供されています。
仕様が公開されていますので、Seeed社以外からも様々なモジュールが販売されています。
www.switch-science.com

IC2のピン配置を確認する

M5StickC Plusをみると、PH2.0-4Pのピン配置は、裏面を上にした状態で「GND」「5V」「G32」「G33」となっています。
GROVE互換インターフェースなので、G33=SCL、G32=SDAとなります。
つまり、同じGROVE互換インターフェースであるM5Stack Core 2のPORT.A.I2Cに接続できる「温度湿度環境センサ付きユニット」なども接続できます。

2.54mm 8pin

USB端子の対面には2.54mmのピンが刺さる端子が8個あります。端子の内容は次のようになっています。
[GND]
[5V出力]
[G26]
[G36/G25]
[G0]
[BAT]
[3V]
[5V入力]
2.54mmのサイズはブレッドボードなどと同一なのでジャンパワイヤーでブレッドボード接続して色々な回路と接続ができます。
www.switch-science.com

事前準備

それでは、.NET nanoFrameworkでM5StickC Plusを使ってみましょう。

.NET nanoFramework Extensionを追加

.NET nanoFrameworkのプロジェクトをVisual Studioで作成できるように、Visual Studioを拡張(機能追加)しましょう。
そのために使用する拡張機能が「.NET nanoFramework Extension」です。
marketplace.visualstudio.com
Visual Studio 2022を起動したら、[拡張機能]-[拡張機能の管理]メニューで管理ウィンドウを開いてから「nano」で検索して.NET nanoFramework Extensionを探し出して適用します。

Install the nanoFramework firmware

M5StickC PlusにはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

USBでM5StickC PlusをPCに接続したら、USB Serial Portのポート番号を確認します。今回の環境では「COM6」が該当しました。

Flasherアプリケーションのインストール

OSの[スタート]メニューから「Developer PowerShell for VS2022」を起動します。

dotnet tool install --global nanoff

nanoFrameworkfファームウェアをインストール

M5StickC Plusをターゲットにして「COM6」経由でnanoFrameworkをアップロードします。

nanoff --target M5StickCPlus --update --serialport COM6

正常に動作すると次のようなログが表示されます。
gist.github.com

M5StickC PlusでHelloWorld

M5StickC Plusアプリのプロジェクトを作成

.NET nanoFrameworkのテンプレートでプロジェクトを新規作成

機能拡張がうまくいくとVisual Studoの新規プロジェクト作成のテンプレートに「.NET nanoFramework」のテンプレートが追加されています。

まずは、「HelloWorld」というプロジェクト名で新規プロジェクトを作成して、M5StickC Plusの液晶画面に「Hello World」と表示するアプリを作ってみます。

Device ExplorerでM5StickC Plusを選択

プロジェクトが作成されたら、Device Explorerを開いてM5StickC Plusとの接続を確認します。
Device Explorerは、Visual Studioの「検索」機能から開くのが簡単です。

テンプレートの初期コードを実行

自動生成コードは「Debug.WriteLine("Hello from nanoFramework!");」が実行される簡単なコードなので、実行が成功するとイミディエイトウィンドウに「Hello from nanoFramework!」と表示されます。

M5StickC Plusの画面に「HelloWorld」

M5StickC Plus用のライブラリを追加

M5StickC Plusの画面などハードウェアにアクセスするために、M5StickC Plus用のライブラリを追加します。

初めてのM5StickC Plus C#プログラミング

M5StickC Plusの画面に文字を表示する簡単な方法は「nanoFramework.M5Stack.Console.WriteLine」メソッドを使う方法です。
Console.WriteLineと書くとSystem.Consoleと名前が重複するのでusingでConsoleはnanoFramework.M5Stack.Consoleのことであることを宣言してあります。
gist.github.com
M5Stack Core 2の時との違いは、クラスライブラリが相違点のほとんどを隠蔽しているので、InitializeScreenがM5StickCPlusクラスである点くらいです。

M5StickC Plusのボタンに反応するように拡張

起動して「HelloWorld」と表示されるだけでは味気ないので、M5StickC Plusについている2つのボタンをクリックしたら画面にボタンの種類を表示するようにしてみましょう。
M5StickC Plus用のライブラリでボタンクリックイベントは、M5ButtonとRightButtonのPressイベントとして取得できます。
gist.github.com

おわりに

M5Stackの特徴であるM-Busを使わないのであれば、M5StickC Plusは価格も安くて手軽に使えるデバイスです。
次回以降は、LEDやブザーなど、M5StickC Plus付属のインターフェースを使う方法について確認していく予定です。
hatsune.hatenablog.jp

M5Stackで.NET nanoFrameworkからAzure IoT Centralに繋いでみた

前回

前回は、M5Stack Core 2からAzure IoT Hubに取得したセンサー値を送信しました。
hatsune.hatenablog.jp


Azure IoT Hubは、デバイスからのセンサー値を安全に収集する目的のPaaSなので、収集したデータの蓄積や利用などは、他のAzureサービスを組み合わせるなど柔軟に構成を構築できます。
その一方で、手軽に集めたセンサー値をさくっと表示・管理したいと思ったときには、その柔軟な構成を組んでいかないといけないということになります。
そんなときにはPaaSではなくSaaSであるAzure IoT Centralアプリケーションを使うのはどうでしょうか。

Azure IoT Centralアプリケーションの作成

Azure IoT Centralアプリには、Data Explorerによる収集したデータの表示、ダッシュボードによる項目の監視など、IoTに必要な機能が備わっているので、「どのAzrueサービスをどう組み合わせてどう設定していけばいいのだろう」という自由度があるからこその検討ポイントに悩まずに済みます。
https://docs.microsoft.com/ja-jp/azure/iot-central/core/media/howto-create-analytics/analytics-ui.png

Azure Portalからの作成


project detail

Azure IoT Centralアプリを作成するときに、既存の様々なテンプレートでアプリを作成することができます。目的に合致するテンプレートがあるならば、それを使ってアプリを作成することがAzure IoT Centralアプリで成功するための近道です。
どんな設定項目があるかを説明しやすくするために、今回は、あえて「カスタムアプリケーション」のテンプレートを使います

Azure PortalでAzure IoT Centralの作成が終わったならば、これでAzure Portalでの操作は終わりです。以降は、作成したAzure IoT Centralアプリにサインインしての操作になります。

Azure IoT Central Portalからの作成

今回、Azure IoT Centalアプリの作成をAzure Portalから行いましたが、Azure IoT Central Portalからも行えます。
apps.azureiotcentral.com

料金プラン

大きな違いはAzure IoT Central Portalから作成するときは、7日間無料で使える「Free」が選べる点です。

マイアプリ

もちろん、どちらの方法で行った場合でもAzure IoT Central Portalの「マイアプリ」表示されるので、そこから作成したAzure IoT Centralアプリに行くこともできます。

Azure IoT Centralアプリケーションでの初期設定

Azure IoT Centralアプリのサイトに移動したら、さっそく、初期設定を開始しましょう。
カスタムアプリケーションのテンプレートから作成したときに、まず最初にやることは「デバイステンプレート」を作成することです。

バイステンプレートの作成


バイステンプレートとは、IoTデバイスからどのようなデータを取得するか、その項目を定義したテンプレートです。管理するIoTデバイスを追加するときに、このテンプレートを指定します

種類の指定


M5Stack Core 2を接続するためのテンプレートであれば、種類として「IoTデバイス」を選択して、「これはゲートウェイバイスです」にチェックを入れずに名前を入力して作成します。

モデルの作成

実際に収集するデータに関する情報はカスタム「モデル」の中に「機能」として定義します。

機能の指定

[機能の追加]を押して収集するデータ項目をモデルに追加していきます。

表示名を入れると自動的に名前(こちらは内部名)が決まりますが、表示名に日本語で「気温」と入れると名前には自動反映されないので、手動で名前を入れます。

機能名入力時の注意点

また、名前には日本語名は指定できません。指定すると形式が間違えていると表示されるので英語名をいれるようにしましょう。
なお「展開」すると単位も入れられるが、気圧の単位は「パスカル」か「キロパスカル」のみで残念ながら「ヘクトパスカル」は指定がなかった。
格納するセンサー値がすべて定義できたら「保存」をクリックして「機能」を「モデル」に保存します。

ビューの追加


取得したデータをどうみせるかは、「モデル」の中に「ビュー」として定義します。

規定のビューの追加

ビューを1から作成してもいいのですが、試しに「既定のビュー」を生成してみて、その内容からビュー定義の勘所をつかんみましょう。

既定のビューでは、「気温、湿度、気圧」が一緒になったものと3つそれぞれの領域の合計4つの領域が「overview」という名前のビューとして生成されます。

視覚化の変更

視覚化の変更によって、各領域の表示を決めていきます

3つの値が1つになった領域は折れ線グラフにします。残り3つの個別領域は最新値が表示されるようにしましょう。
もちろん、それ以外の表示構成でもよいでしょう。

バイステンプレートの公開

設定が終わったテンプレートは、「公開」して始めて使えるようになります。この公開は、自分の作ったAzure IoT Centralアプリに公開するという意味です。

バイスの作成

Azure IoT Centralアプリの[デバイス]-[新規]から接続するデバイスを作成します。

これでAzure IoT Centralアプリの準備は完了です。

M5Stck Core 2側の事前準備

センサーについて

M5Stack Core 2のPORT.A.I2C端子に接続して使用するENV-IIIユニットを使用します。

Install the nanoFramework firmware

M5Stackに使われているESP32にはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

USBでM5Stack Core 2をPCに接続したら、デバイスマネージャーで「CP210x」が接続されているポート番号を確認します。今回の環境では「COM4」が該当しました。

Flasherアプリケーションのインストール(インストール済の場合は不要)

OSの[スタート]メニューから「Developer PowerShell for VS2022」を起動します。

dotnet tool install --global nanoff

nanoFrameworkfファームウェアをインストール(インストール済の場合は不要)

今回使用するM5Stackは、M5Stack Core 2になります。
このM5Stack Core 2をターゲットにして「COM4」経由でnanoFrameworkをアップロードします。

nanoff --target M5Core2 --update --serialport COM4

Device Explorerでの接続確認

nanoFrameworkファームウェアをインストールしたあとにVisual Studioを起動してDevice Explorerをみると、「M5Core2 @ COM4」と表示されるようになります。

nanoFrameworkファームウェアは、インストールしたあとにnanoFramework以外の別イメージをM5Stack Core 2に転送(Burn)してしまうと消えてしまうので、Device Explorerに表示がないような場合は、再度、インストールをしてからVisual Studioを起動すれば表示されるようになります。

Visual Studioの準備

Visual Studioを機能拡張する

Visual Studioには.NET nanoFramework Extensionをインストールして機能拡張しておきます。
この機能拡張によりnanoFrameworkアプリのテンプレートが追加されます。
このテンプレートで作成したプロジェクトには、NuGetから自動的に「nanoFramework.CoreLibrary」ライブラリが追加されています。

「nanoFramework.M5Core2」ライブラリを追加する

今回は、M5Stack Core 2を使うので、「nanoFramework.M5Core2」ライブラリを手動でNuGetから追加します。

ここまでが、M5Stack Core 2を使うアプリ開発を行う上での共通の事前準備となります。

Azure IoT Centralにデータ送信する

基本的に、IoT Hubにデータ送信する場合と、IoT Centralアプリにデータ送信する場合では、接続時のコードの差し替えで動作します。

バイスからの接続に必要な情報の入手


バイスから接続するのに必要な情報は、IoT Centralアプリの画面にあるデバイスのところの「接続」から得られます。

が必要な情報です。

接続コードの変更ポイント

基本的に、IoT Hubにデータ送信する場合と、IoT Centralアプリにデータ送信する場合では、接続時のコードの差し替えで動作します。

Azure IoT Hubとの接続コード

まずは、元となるAzure IoT Hubとの接続部分のコードをみてみましょう。
gist.github.com
HostNameは、IoT Hubを有効にしたときに指定したホスト名になります。

Azure IoT Centralとの接続コード

この接続コードを次のように変更します。
Azure IoT Centralを利用するには、Device Provisioning Service (DPS) を使用してデバイスを登録して、そのうえで、Azure IoT Centralに繋ぐことになります。
DSPのURLは下記の公式サイトによれば「global.azure-devices-provisioning.net」とのことです。
docs.microsoft.com
よって、コードはこのようになります。
gist.github.com
ポイントはDSPから接続先URLを得てからDeviceClientでそこに繋ぐという2段階になる点です。

Azure IoT Centralの接続先とは

DSPからの戻り値は、Azure IoT CentralアプリのURLなのでしょうか。
ブレイクポイントを設定して実行時の「myDevice.AssignedHub」の値を確認してみると

"iotc-hogehogehogehoge.azure-devices.net"

とのことでした(一部伏字)ので、Azure IoT Centralのデバイスとの通信にはAzure IoT Hubが採用されていることが分かります。
確かにこれであれば、接続コードだけ対応すれば、そのまま動くというのもうなずけますね。

実行結果

M5Stack Core 2にアプリをデプロイしたら、Azure Iot Centralアプリでデバイスを選んでビューを表示してみましょう。

簡単にセンサー値が表示できましたね。

次回

次回は少しセンサーから離れて、Azure Cognitive ServicesのようなAzure AIをM5Stack Core 2から使う方法をご紹介できたらと考えています。

M5Stackで.NET nanoFrameworkからAzure IoT Hubに繋いでみた

前回

hatsune.hatenablog.jp
前回は、.NET nanoFrameworkでの開発準備とM5Stack Core 2に接続したセンサーから気圧、気温、湿度などを取得しました。
今回は、M5Stack Core 2からAzure IoT Hubに取得したセンサー値を送信してみたいと思います。

事前準備

センサーについて

M5Stack Core 2のPORT.A.I2C端子に接続して使用するENV-IIIユニットを使用します。

Install the nanoFramework firmware

M5Stackに使われているESP32にはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

USBでM5Stack Core 2をPCに接続したら、デバイスマネージャーで「CP210x」が接続されているポート番号を確認します。今回の環境では「COM4」が該当しました。

Flasherアプリケーションのインストール(インストール済の場合は不要)

OSの[スタート]メニューから「Developer PowerShell for VS2022」を起動します。

dotnet tool install --global nanoff

nanoFrameworkfファームウェアをインストール(インストール済の場合は不要)

今回使用するM5Stackは、M5Stack Core 2になります。
このM5Stack Core 2をターゲットにして「COM4」経由でnanoFrameworkをアップロードします。

nanoff --target M5Core2 --update --serialport COM4

Device Explorerでの接続確認

nanoFrameworkファームウェアをインストールしたあとにVisual Studioを起動してDevice Explorerをみると、「M5Core2 @ COM4」と表示されるようになります。

nanoFrameworkファームウェアは、インストールしたあとにnanoFramework以外の別イメージをM5Stack Core 2に転送(Burn)してしまうと消えてしまうので、Device Explorerに表示がないような場合は、再度、インストールをしてからVisual Studioを起動すれば表示されるようになります。

Visual Studioの準備

Visual Studioを機能拡張する

Visual Studioには.NET nanoFramework Extensionをインストールして機能拡張しておきます。
この機能拡張によりnanoFrameworkアプリのテンプレートが追加されます。
このテンプレートで作成したプロジェクトには、NuGetから自動的に「nanoFramework.CoreLibrary」ライブラリが追加されています。

「nanoFramework.M5Core2」ライブラリを追加する

今回は、M5Stack Core 2を使うので、「nanoFramework.M5Core2」ライブラリを手動でNuGetから追加します。

ここまでが、M5Stack Core 2を使うアプリ開発を行う上での共通の事前準備となります。

Azureの準備

Azrue側のサービスは、Azure IoT Hubを使います。
Azure IoT Hubを使うことで、ゼロから設計および構築をしなくても「セキュリティが担保された通信」「スケーリング」「正常性監視」「可用性」を確保しつつデバイスからのセンサー値の収集が容易にできます。
また、運用自体も利用しているAzure全体の運用の中に組み込むことで、運用負荷が著しく増加するということもありません。

IoT Hubの使用プロトコルについて

Azure IoT Hubは、MQTT (Message Queueing Telemetry Transport)、Http、AMQP (Advanced Message Queuing Protocol)など様々なプロトコルに対応しています。
今回のサンプルでは、「小さい」「大量」のデータを「低遅延」で「双方向」に通信できるMQTTを使います。

Azure IoT Hubを準備するには

Azure IoT Hubを使用するためには、まずは、Azure IoT Hub自体を作成して、そこに接続するデバイスを定義していきます。

Azure IoT Hubを作成する

Azure IoT Hubの作成は、Azure管理ポータルでリソースを作成するだけで簡単にできます。
Azure管理ポータルにサインインしたら、[リソースの作成]で「IoT Hub」を検索し、[作成]をクリックしてリソースを追加します。

プランで無料を選択する

Azure IoT Hubの料金プラン (課金額) は、作成時や作成後に指定できます。無料プランは、IoT Hubでは「F1:Freeレベル」という表記になります。

スケーリングが1だったり、「Defender for IoT」も有効にできなかったりといくつかの制限はありますが、無料プランでも基本的な機能は備えていますので、動作確認や数台を接続して試験するような場合に便利です。

Azure IoT Hubにデバイスを定義する

IoT Hubが作成できたら、その中に「IoTデバイス」を定義します。

[IoTデバイスの追加]をクリックして、「デバイスID」「認証の種類」を選んで、[自動生成キー]にチェックを入れて追加をすれば、IoTデバイスからIoT Hubに接続するための接続文字列が生成されます。

M5StackでAzure送信

M5Stack Core 2をAzure IoT Hubに接続するには「nanoFramework.Azure.Devices.Client」ライブラリを使います。

依存関係にあるライブラリを確認してみると、MQTT関連のライブラリも含まれていますね。

Azure TLS証明書をM5Stack Core 2に登録

.NET nanoFrameworkでAzure IoT Hubに接続するためには、ルートCA証明書が必要になります。

ルートCA証明書の取得

ルートCA証明書は、https://docs.microsoft.com/ja-jp/azure/security/fundamentals/tls-certificate-changesの中から「Baltimore CyberTrust Root」をダウンロードして取得します。

ルートCA証明書の登録

取得したルートCA証明書は次のいずれかの方法で利用します。

  1. ソースコードに埋め込む
  2. リソースとしてバイナリに同封
  3. バイスにあらかじめアップロード

今回は「リソースとしてバイナリに同封」方法を採用します。
まず、プロジェクトにリソースファイルを追加します。

次にリソースファイルで[リソースの追加]-[既存ファイルの追加]でダウンロードしたルートCA証明書ファイルを追加します。

WiFiと接続

WiFiとの接続には、最寄りのアクセスポイントへの接続情報が必要です。
gist.github.com
WiFiNetworkHelper.ConnectDhcpメソッドでアクセスポイントのSSIDとパスワードを指定して接続が成功すれば、IPアドレスが割り当てられて、メソッドはTrueを返却してきます。
ここではWi-Fi接続が成功するまで、0.5秒間隔で自動リトライするようにしています。
例えば、アクセスポイントの電源がはいっていないなどであれば電源がはいれば自動的に接続が確立できます。

Azure IoT Hubと接続

gist.github.com

自動リトライについて

実際に動作させてみると、IoT Hubとの接続に失敗するケースがあります。
リトライで解消はできるのでサンプルコードのように自動再接続のロジックを入れておくのがよいでしょう。

ルートCA証明書について

事前にリソースとして組み込んでいるルートCA証明書を使ってX509Certificateを生成してから接続します。IoT Hubとの接続方式はSAS(対象キー)方式ですが、このようにルートCA証明書を使っての接続になります。
AzureポータルでDeviceを登録するときには「X509CA署名済」という認証方式もありますので、SAS方式の場合はルートCA証明書などは不要かと思ってしまうかもしれませんが、対象キー方式の時はデバイス側にルートCA証明書を入れておくと覚えておくとよいでしょう。

Azure IoT Hubへデータ送信

gist.github.com

Azure Iot Hubからデータ受信

gist.github.com

実機へのデプロイが失敗したときは

Visual Studioから実機へのデプロイは失敗します。対処方法はいろいろあります。

  1. Device Explorerの再表示(COMポート再スキャンが行われるので)
  2. M5Stack Core 2の電源ボタン長押しで強制終了と、電源ボタン再度クリックによる電源再投入
  3. M5BurnerによるCore2FactoryTestイメージの再投入(nanoFrameworkなども消えます)

改良が必要なポイント

ネットワークが途中で切断されてしまった場合

WiFi再接続、IoT Hub再接続などが必要ですが、本サンプルはそのあたりの対応が抜けています。
SendMessageの戻り値がfalseのときは、Client.IsConnectedプロパティを確認してfalseだったらネットワーク再接続を再実施するようなロジックが必要です。

バイスIDをAzrue IoT Hubへデバイス側から登録

今回のサンプルでは、デイバスIDをAzure IoT Hub側で登録して、それをコードの中に記述していました。
利用デバイスが1つだけであればそれでもいいのですが、複数のデバイスをサポートし、また、どのデバイスからのデータかを判断したいような場合は、

  1. コードでデバイス自体からユニークなデバイスIDを取得
  2. 取得したデバイスIDでAzrue IoT Hubにデバイスを登録

というような流れが必要です。

データ取得間隔の安定化

今回のサンプルでは、「Azure IoT Hubにデータ送信後10秒経過したらセンサー値を取得して再度送信」という時間間隔でした。
しかし、この方法ではデータ送信などが遅延した場合などにセンサーからのデータ取得時間がずれていく可能性があります。
センサー値自体の取得間隔をきちんとしたいということであれば、

  1. タイマーなどで一定間隔でセンサー値取得
  2. 取得したセンサー値はキューに保存
  3. 別スレッドでキューを取り出してシーケンシャルにAzure IoT Hubに送信

のような処理方式が必要です。

最後に

.NET nanoFrameworkには、Azure IoT Hubのライブラリもあり比較的簡単にコードを書くことができました。
しかし、ルートCA証明書が必要な点などが明確に書かれた情報が少なく、DeviceClientのOpenをしたときのエラーをなかなかとることができませんでした。
このブログエントリで同じことに悩む人が1人でもすくなくなってくれたら嬉しいです。

次回

次回は、センサーデータを蓄積してグラフ表示してみたいと思います。
もちろん、IoT HubにBLOBやPowerBIなどを組み合わせて作っていってもいいのですが、そのあたりもサポートしているSaaS製品であるAzure IoT Centralを使って最小手順で構築してみたいと思います。
hatsune.hatenablog.jp

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

すっかり書いた気になっていたM5Stack Core 2でArduinoを使って、Azure IoT Hubにデータを送信するお話となります。
いま、.NET nanoFrameworkを使って同じ流れをおさらいしていますが、まずは、そこに先行して、こちらのお話を完結させたいと思います。

前回

hatsune.hatenablog.jp
前回はAzure IoT Hubの準備が完了したところまで進みましたので、今回は、M5Stack Core 5からAzure IoT Hubに「気圧」「気温」「湿度」を送信するためのプログラム(スケッチ)を紹介します。

Setupへの追加ロジック

センサー値を取得するスケッチのSetupに2つのロジックを追加します。

Wi-Fi初期化

gist.github.com
関連するライブラリはWiFi.hにあるので、スケッチの先頭でインクルードしておきましょう。

#include

MQTT初期化

Azure IoT Hubに接続するためのライブラリは、Visual Studio CodeでCTRL+SHIFT+Pで「Arduino Board Manager」起動して「M5Stack」をインストールすると「AzureIotHub」と「Esp32MQTTClient」のライブラリがダウンロードされてきます。

この「Esp32MQTTClient」のライブラリをスケッチの先頭でインクルードしておきます。

#include "Esp32MQTTClient.h"

次にSetUpの中でMQTTを初期化します。
gist.github.com
「connectionString」をAzure IoT Hub上で表示されているプライマリ接続文字列を設定します。

Loopへの追加ロジック

初期化が終わったらセンサー値を取得しているLoopの中にMQTT送信用のコードを入れます。
gist.github.com
主要部分は次のようになっています。

IoT Hubに送信するメッセージの作成

送信するメッセージは次のようなJSONフォーマットです。

このフォーマットに対して、snprintf文を使ってセンサー値を入れたものを「messagePayload」変数に設定します。

snprintf(messagePayload, MESSAGE_MAX_LEN, messageData, messageCount++, Tmp, Hum, Pressure);

IoT Hubへの送信

JSON文字列が出来上がったならば、MQTTに送信します。

EVENT_INSTANCE* message = Esp32MQTTClient_Event_Generate(messagePayload, MESSAGE);
Esp32MQTTClient_SendEventInstance(message);

これで、取得したセンサー値を「INTERVAL」ミリ秒ごとに送信することになります。

最後に

データをWEBでリアルタイム表示

IoT Hubに送信されたデータを「リアルタイム」で、つまり、Azure上のストレージなどにデータを格納せずに届いたタイミングでWEBアプリで表示してみましょう。
IoT Hubのサービス用の共通アクセスポリシーを含んだ接続文字列と、組込みエンドポイントのコンシューマーグループをWEBアプリ側で指定することでAzure IoT Hubと接続できます。

このあたりは、.NET nanoFrameworkを使ったときも同じになるので、機会があればそちらの流れでWEBアプリについては掘り下げたいと思います。

Microsoft MVP for Windows Developmentを再受賞しました。

2022-2023 Microsoft MVP for Windows Developmentを受賞しました。
2008年から15年連続となります。

コロナ禍での影響で今までの形での活動からチェンジが必要だったり、昨年は自動再受賞だったのでチェンジした活動がコミュニティに貢献できていたのか暗中模索を続けている状況でしたが、なんとか再受賞できたというのが正直な感想です。

また、オフラインイベントなども増えてきましたし、オンライン中心からの再シフトなどもあるかもしれませんが、状況に応じて自分ができる範囲で無理せずコミュニティ活動を続けていけたらと思います。

今年は、.NET nanoFramework、そして、AzureのAI関係を基軸にして、MRTKやOpenXRについてもアウトプットを増やしていけたらと思っています。
引き続きよろしくお願いします。

M5Stack Core 2で基本に帰ってLチカしてみよう

初めに

PORT.A.I2Cは、I2Cシリアル通信をサポートしているので接続しているモジュールのアドレスが分かると、あとはデザインシートをよみとってセンサー値の取得ができます。
運が良ければ、モジュールに対応したライブラリが公開されているので、そうするとかなり楽になります。
hatsune.hatenablog.jp

それでは、PORT.A.I2C以外のインターフェースを使う場合はどうでしょうか。
今回は、GPIOを使って、その先にLEDをつなげて、C#でLEDをチカチカさせるプログラムを作ってみたいと思います。
やはり、組込み系にはLチカ(LEDをチカチカさせること)が、Hello Worldですよね。

M5Stck Core 2側の事前準備

Install the nanoFramework firmware

M5Stackに使われているESP32にはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

USBでM5Stack Core 2をPCに接続したら、デバイスマネージャーで「CP210x」が接続されているポート番号を確認します。今回の環境では「COM4」が該当しました。

Flasherアプリケーションのインストール(インストール済の場合は不要)

OSの[スタート]メニューから「Developer PowerShell for VS2022」を起動します。

dotnet tool install --global nanoff

nanoFrameworkfファームウェアをインストール(インストール済の場合は不要)

今回使用するM5Stackは、M5Stack Core 2になります。
このM5Stack Core 2をターゲットにして「COM4」経由でnanoFrameworkをアップロードします。

nanoff --target M5Core2 --update --serialport COM4

Device Explorerでの接続確認

nanoFrameworkファームウェアをインストールしたあとにVisual Studioを起動してDevice Explorerをみると、「M5Core2 @ COM4」と表示されるようになります。

nanoFrameworkファームウェアは、インストールしたあとにnanoFramework以外の別イメージをM5Stack Core 2に転送(Burn)してしまうと消えてしまうので、Device Explorerに表示がないような場合は、再度、インストールをしてからVisual Studioを起動すれば表示されるようになります。

Visual Studioの準備

Visual Studioを機能拡張する

Visual Studioには.NET nanoFramework Extensionをインストールして機能拡張しておきます。
この機能拡張によりnanoFrameworkアプリのテンプレートが追加されます。
このテンプレートで作成したプロジェクトには、NuGetから自動的に「nanoFramework.CoreLibrary」ライブラリが追加されています。

「nanoFramework.M5Core2」ライブラリを追加する

今回は、M5Stack Core 2を使うので、「nanoFramework.M5Core2」ライブラリを手動でNuGetから追加します。

ここまでが、M5Stack Core 2を使うアプリ開発を行う上での共通の事前準備となります。

Lチカプログラム

接続インターフェースについて

M5Stack Core 2の裏の「CORE 2」を書かれている白いふたを外して、M-Busを露出させます。

M-Busについて
  • 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

今回はG19のGPIOを使います。

GPIOについて

GPIOは「General-purpose input/output」といってデジタル(ONとOFFの二値)値の入出力ができるインターフェースです。
ONにすることで5Vが出力され、OFFにすると0Vが出力されます。

回路

M5Stack Core 2からのGPIO出力をそのままLEDに繋ぐと電圧が高すぎるため150Ωくらいの抵抗を繋いで次のような回路を作ります。

赤ケーブルをM-Busのピン19、そして青ケーブルをGNDに繋ぎます。

コードについて

gist.github.com

GPIOコントローラー

GPIOを使うときは、まずはGPIOコントローラーを生成します。

var gpio = nanoFramework.M5Stack.M5Core2.GpioController;

LEDの接続をオープン

LEDを光らせるためには、GPIOに対して出力をすることになるので、ピン19を指定して出力モードでオープンします。

var led = gpio.OpenPin(19, PinMode.Output);

ONとOFFを交互に実行する

少し下手なコードですが2秒ごとにONとOFFを無限ループするようにしています。
GPIOでONにするコードは次のようになります。

led.Write(PinValue.High);

GPIOでOFFにするコードは次のようになります。

led.Write(PinValue.Low);

実行

youtu.be