前回までにmicro:bitについては、Node-REDダッシュボードへの上り、下り両方向の通信ができるようになりました。まあラズパイとPythonのお助けのお陰ですが。今回は自力でTCP/IPネットワーク接続可能なデバイスからNode-REDへHello Worldしてみます。まずはM5StickCとM5Stack Grayの「兄弟」から。
※「IoT何をいまさら」投稿順Indexはこちら
上のアイキャッチ画像にオレンジ色のM5StickCと灰色のM5Stack Grayの写真を掲げました。写真の印象では差が大きいですが、どちらもESP32コア機、基本部分はほとんど共通、兄弟機種と言っていいんじゃないかと思います。LCDパネルの大きさなど、周辺部分はいろいろ差があります。Arduino環境での開発の場合、差のある部分はそれぞれ取り込むヘッダファイルでかなり吸収できているように思います。
-
- M5StickC.h
- M5Stack.h
どちらもWiFiによる無線ネットワーク接続可能。WiFi部分はESP32のコア部分なので特に指定すること無しに利用可能な「共通」部分だと思います。ArduinoIDEからであれば
ターゲット・ボードの指定の変更のみで同じソースでビルドできる
と考えました。WiFiクライアントについては、両機種とも簡単に利用することができます。追加で必要なのは、WiFiクライアントを使役してMQTT通信を行う上位プロトコルレイヤのライブラリです。Arduino環境で「標準」といえるMQTTクライアント・ライブラリは、以下のもののようです。
上記URLのGitHubから直接ダウンロードしてもよいですが、ArduinoIDEのライブラリ・マネージャから pubsubclient で検索しても発見でき、インストール可能でした。なお、ライブラリAPIの解説は以下にあります。
インストールすればArduinoIDEからMQTTのサンプルプログラムを開くこともできるので利用の敷居は低いです。今回はさらに、末端のM5StickC/M5Stackから Node-REDダッシュボードへHello Worldするだけなので、サンプルプログラムよりも簡単です。サンプルプログラムを見ながら
MQTTクライアントといっても一発Publishするだけ
の機能に絞ってみました。Subscribeするわけでなく、接続時のエラーの報告などするわけでもないので、非常に簡単。なお、Node-REDのフローやダッシュボードの設定は、前回までにmicro:bitの緑色機用に作成済のものをそのまま利用です。今のところ、なにもセキュリティなどの手立てをしていないのでM5StickCであろうが、M5Stack Grayだろうが、micro:bit GREENに「成りすまして」ステータスに任意の文字列を発行できる、というわけです。
M5StickCのコード
// M5StickC MQTT test #include <WiFi.h> #include <PubSubClient.h> char *ssid = "your SSID"; char *password = "your PASSWORD"; const char *brokerAdr = "your IP address"; const int brokerPort = 1883; WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); void reconnect() { while(!mqttClient.connected()) { if (!mqttClient.connect("M5StickC")) { delay(5000); } } } void setup() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } mqttClient.setServer(brokerAdr, brokerPort); reconnect(); mqttClient.publish("MBGreen/Status", "Hello from M5StickC"); } void loop() { }
かなり手抜きでありますが、これだけのコードでNode-REDのダッシュボードにHelloすることができました。やってみた結果がこちら。
M5StickCから、WiFi経由でルータに飛び、ルータに有線で接続しているRaspberry Pi上のNode-REDに伝わったということです。そして、Node-REDのダッシュボードをPC上のブラウザでみた結果のキャプチャであります。まあOKだな。
M5Stack Grayの場合
結論からいえば、予想通りまったく同じソースコードで問題ありませんでした。ただし、どちらが動いているのか分からないと困るので装置のお名前のところだけは変更しています。念のため「ほとんど同じ」ソースコードがこちら。
// M5Stack gray MQTT test #include <WiFi.h> #include <PubSubClient.h> char *ssid = "your SSID"; char *password = "your PASSWORD"; const char *brokerAdr = "your IP address"; const int brokerPort = 1883; WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); void reconnect() { while(!mqttClient.connected()) { if (!mqttClient.connect("M5StackG")) { delay(5000); } } } void setup() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } mqttClient.setServer(brokerAdr, brokerPort); reconnect(); mqttClient.publish("MBGreen/Status", "Hello from M5Stack gray"); } void loop() { }
これまた念のため、ダッシュボードに表示されたHelloメッセージはこちら。
後で、M5StickC/M5Stackに実際にセンサなりを接続して、もそっとIoTらしくいたしたいです。その前に、micro:bit用のウイジットに間借り(なりすまし)でなくそれぞれにNode-REDのフローとダッシュボードを準備してやらないと。