PythonでArduinoからJSONをシリアル通信で受け取る

Arduinoに複数センサーを接続してRaspberry Piで値を取得したい。

シリアル通信を行うが、Pythonでテキストのパーサーを書くのも面倒だし、Arduinoでパーサーしやすい形を手打ちするのも手間。

楽にArduinoからデータを吸い出せないか検索していた所、JSONを使って実現することが出来た。

以下のサイトから取得したいデータに応じてkey, valueを入力し、次々進んでいくとArduinoに必要なプログラムを自動生成してくれる。

ArduinoJson Assistant 6
The ArduinoJson Assistant is an online tool that computes the required JsonDocument capacity for a given document and ge...

CO2と湿度を取得したかったので、こんな感じになった。

StaticJsonDocument<16> doc;

doc["co2"] = 1.1;
doc["humidity"] = 2.2;

serializeJson(doc, output);

Arduinoにコピペし、数値の部分を変数に書き換え。

output先はシリアル通信先なのでそれも書き換え。

printlnで改行コードを挟むのも忘れない。

#include <ArduinoJson.h>

void setup()
{
  ...
}

void loop()
{
  float co2, humidity;
  co2 = ... ;
  humidity = ... ;

  doc["co2"] = co2;
  doc["humidity"] = humidity;

  serializeJson(doc, Serial);
  Serial.println("");
}

Pythonとシリアル通信を開始する。

Arduinoと通信するタイミングによってはJSONの途中の文字列から受信する可能性があるので、try, exceptは必須。

import serial
import json

PORT = "/dev/ttyACM0"
BAUDRATES = ...
ser = serial.Serial(PORT, BAUDRATES)

while True:
    byte_data = ser.readline()
    str_data = byte_data.decode().split()[0]
    try:
        json_data = json.loads(str_data)
    except json.JSONDecodeError:
        continue

これでArduinoから複数の値をRaspberry Piに送信し、Pythonで簡単に受信することが出来た。

参考

https://frenchsavvy.com/2020/12/30/python-serial-port-arduino-and-json/

コメント

タイトルとURLをコピーしました