M5UnitV2の検出結果をAmbientに送信するメモ
はじめに
M5UnitV2 流行ってますね。
私も手に入れたので、検出結果を Ambient に送信するまでの手順をメモします。
完成したコードはこちら。
セットアップ
先駆者の記事を参考に進めていく。
- ドライバをダウンロードする
- ドライバが RAR ファイルで提供されているので、7-zip を利用して解凍
- デバイスマネージャ > ほかのデバイス > USB 10/100 LAN にドライバを追加する
無事認識。
プリインストール済みの機能で遊ぶ
M5UnitV2 を PC に接続した状態で、http://10.254.239.1/ にアクセスするとプリインストール済みの機能が使えます。
いろいろ用意されていて、これを使って遊ぶだけでも結構楽しめる。
検出結果をAmbientに送信する
上記の記事によると、
UnitV2のbuilt-in recognition functionの内、Camera StreamとAudio FFT以外の機能は、検出結果を問答無用でシリアル出力しています。データgrove端子を通じてUARTで出力されていますので、これを読み取れば外部の装置で検出結果を利用できます。
とのことなので、一旦、UnitV2 --> M5StickC --> Ambient
という経路で送信することにします。
UnitV2上から直接curlとかでAmbientのAPIを叩くこともできそうですが、それは別途調査します。
M5UnitV2とM5StickCを接続する
手元にあった Grove ケーブルで接続。
UnitV2の出力をM5StickCで読み取る
M5StickC に以下のコードを書き込みます。
#include <M5StickC.h>
void setup() {
M5.begin();
Serial.begin(115200);
Serial2.begin(115200, SERIAL_8N1, 33, 32);
}
void loop(){
if(Serial2.available()) {
String receiveString = Serial2.readStringUntil('\n');
if(receiveString[0] == '{'){
Serial.println(receiveString);
}
}
}
Face Detector を起動すると、以下のような JSON の出力を取得できました。
形を整えるとこんな内容。
{
"num": 1,
"face": [
{
"x": 26.47280502,
"y": 333.1088257,
"w": 125.7219543,
"h": 144.8911743,
"prob": 0.997483611,
"mark": [
{
"x": 42,
"y": 380
},
{
"x": 86,
"y": 378
},
{
"x": 48,
"y": 404
},
{
"x": 52,
"y": 442
},
{
"x": 84,
"y": 440
}
]
}
],
"running": "Face Detector"
}
JSONをデシリアライズ
UnitV2 の出力が JSON なので、M5StickC 上でデシリアライズして、必要なデータを取り出します。
今回は、ArduinoJson
ライブラリを利用します。
【M5StickC Plus/Arduino】Arduinoでjsonを扱うを参考にさせていただきました。
ライブラリのインストール手順はこちらを参照ください。
#include <M5StickC.h>
#include <ArduinoJson.h>
DynamicJsonDocument doc(1024);
void setup()
{
M5.begin();
Serial.begin(115200);
Serial2.begin(115200, SERIAL_8N1, 33, 32);
}
void loop()
{
if (Serial2.available())
{
String receiveString = Serial2.readStringUntil('\n');
// JSONをデシリアライズ
deserializeJson(doc, receiveString);
// こんな感じで中身を取り出せる
double x = doc["face"][0]["x"];
Serial.println(x);
}
}
Ambientに送信する
先程のコードに Ambient への送信処理を追加して完成です。
Ambient
ライブラリを利用するので、以下の手順に従ってインストールしてください。
#include <M5StickC.h>
#include <ArduinoJson.h>
#include <Ambient.h>
#include <WiFi.h>
WiFiClient client;
const char *ssid = "SSID";
const char *password = "PASSWORD";
Ambient ambient;
unsigned int channelId = 10000; // CHANNEL ID
const char *writeKey = "WRITE KEY";
int lastSendTime = 0;
DynamicJsonDocument doc(1024);
void setup()
{
M5.begin();
Serial.begin(115200);
Serial2.begin(115200, SERIAL_8N1, 33, 32);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {}
}
void loop()
{
if (Serial2.available())
{
String receiveString = Serial2.readStringUntil('\n');
// JSONをデシリアライズ
deserializeJson(doc, receiveString);
// こんな感じで中身を取り出せる
double x = doc["face"][0]["x"];
Serial.println(x);
// 一定間隔でAmbientに送信
if (millis() - lastSendTime > 60000)
{
ambient.begin(channelId, writeKey, &client);
ambient.set(1, x);
ambient.send();
lastSendTime = millis();
}
}
}
まとめ
M5UnitV2 の検出結果を M5StickC から Ambient に送信する方法を紹介しました。
もっと良い方法を知ってる方は教えて下さい~。
Discussion