先日、「M5:Bit micro:bit用変換ボード」を使ってマイクロビットとM5Stackをつなぎ、マイクロビットからM5Stackへデータを送る処理を行いました(記事は こちら)。
マイクロビットで取得したセンサデータをシリアル通信でM5Stackに送るのですが、この時には複数の数値データを連結して「文字列」として送っていたため、データを受け取ったM5Stackでは、その文字列を分割して必要な数値を取り出していました。
この文字列処理のところが煩雑なので、もっとスッキリさせたいと思い、JSON形式でデータを受け渡してみることにしました。
サンプルとして、マイクロビットではAボタンを押すたびに傾き情報(ピッチ、ロール)をM5Stackに送り、M5Stackでは受け取った傾き情報に応じてLCD画面に丸を表示する、というようなものをつくってみたいと思います。。
「M5:Bit micro:bit用変換ボード」を使ってマイクロビットとM5Stackをつなぎます。
マイクロビットのプログラムは以下のとおりです。
Aボタンを押すたびに、シリアル通信で「 {“PITCH”:値, “ROLL”:値} 」という文字列を送ります。
M5Stackでは「ArduinoJson」というライブラリを使います。
「ArduinoJson」はArduino IDEのライブラリマネージャからインストールできます。
「ArduinoJson Assistant」を使うとサンプルコードをつくることができます。
- 「ArduinoJson Assistant」のページ(こちら)にアクセスします。
- 「Processor」は「ESP32」、「Mode」は「Deserialize」、「Input type」は「String」を選択し、「Next:JSON」をクリックします。
- 受け取るJSON「 {“PITCH”:-90, “ROLL”:-90} 」を記述し、「Next:Size」をクリックします。
- 必要なメモリサイズが表示されるので、「Next:Program」をクリックします。
- サンプルコードが表示されるので、これをコピーしてArduinoスケッチ内で利用します。
上記のサンプルコードを使った、M5StackのArduinoスケッチは以下のとおりです。
#include <M5Stack.h>
#include <ArduinoJson.h>
int c = M5.Lcd.color565(255, 255, 255);
void setup() {
M5.begin();
Serial2.begin(115200, SERIAL_8N1, 22, 21);
}
void loop() {
if(Serial2.available()) {
String values = Serial2.readStringUntil('\n');
// ArduinoJson
StaticJsonDocument<64> doc;
DeserializationError error = deserializeJson(doc, values);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
return;
}
int PITCH = doc["PITCH"];
int ROLL = doc["ROLL"];
int x = map(constrain(ROLL, -30, 30), -30, 30, 20, 300);
int y = map(constrain(PITCH, -30, 30), -30, 30, 20, 220);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.fillCircle(x, y, 20, c);
}
}
マイクロビットのAボタンを押すと、M5StackのLCD画面に丸が表示されます。
M5Stackのスケッチで文字列分割などの処理がなくなり、スッキリさせることができました。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。