マイクロビットからM5StackへJSON形式のデータを受け渡す

スポンサーリンク
電子工作の作例

先日、「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の使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。