UnitV2 AIカメラからは認識結果が垂れ流しで出力されてくるようなので、それをM5stackで受け取ってみます。
M5stackのgroveは標準ではI2Cなので、シリアルで使うためにSoftwareSerialライブラリを使います。
参考は、
https://qiita.com/ma2shita/items/37d403fb7a79814d4d4c
ですが、SoftwareSerialの設定(インスタンス作成)では上のリンクのソースと21 <=> 22を入れ替え必要でした。
groveコネクタというのは物理的な形状や接続しか定義していないので、中を通る信号線は自由に定義できるから。
以下の画像から、
ピン21 — SDA — Tx(左端)
ピン22 — SCL — Rx(左端から2番目)
となるので、シリアルのツイスト対抗ピン設定すると”Grove(22, 21); // define rx/tx”
となります。
#include <M5Stack.h>
#include <ArduinoJson.h>
#include <SoftwareSerial.h>
SoftwareSerial Grove(22, 21); // define rx/tx connecting to the UnitV2 camera
// SoftwareSerial(rxPin, txPin, inverse_logic)
int x;
int y;
long k;
char data[50];
void setup() {
M5.begin();
M5.Lcd.setCursor(20, 40);
M5.Lcd.setTextSize(2);
Serial.begin(115200);
Grove.begin(115200);
M5.Lcd.print("--initialized--"); // display M5 Lcd message
Serial.print("---initialized---"); // output serial line
}
void loop_(){
if(Grove.available()) {
String recvStr = Grove.readStringUntil('\n');
if(recvStr[0] == '{'){
Serial.print(recvStr);
}
}
}
void readJSON(void){
String recvStr = Grove.readStringUntil('\n');
StaticJsonDocument<128> doc;
DeserializationError error = deserializeJson(doc, recvStr);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
x = doc["x"];
y = doc["y"];
k = doc["k"];
const char* running = doc["running"]; // "Lane Line Tracker"
}
void loop(){
if(Grove.available()) {
readJSON();
sprintf(data,"x = %d , y = %d , k = %ld",x,y,k);
Serial.println(data);
}
}
AIカメラの電源はgrove経由でM5stackから供給されるので、一度ブラウザでAIカメラの動作モードを指定してやれば、あとはAIカメラのUSBケーブルは抜いても引き続き動作します。
AIカメラから送信されるデータはjson形式なので、生のデータはこんな感じ。
これを、ArduinoJsont使って、解析します。
サンプルの事例ではLaneLineTrackerだったので同じコードを流用してますが、いかようにも変えられるでしょう。
生データ出力と解析データ表示は、ソース中ではloop()とloop_()関数で埋め込んで切り替えています。
また結果はUSBシリアルへの出力ですが、M5stackに表示させるだけで十分ならば画面表示させれば良いし、さらにパソコンやラズパイなどに無線で飛ばしても良いでしょう。
時々deserializeがエラーしているので、これはシリアルの転送速度を落としてやらないとダメかもしれません。
admin