M5StickCの加速度センサーを使ってみた kintone
さてさて、久々の kintoneIoT部 の活動です。
M5StickCの加速度センサーを使ってみよう!
今回はM5StickCの加速度センサーMPU6886を使ってみました。
MPU6886というのはM5StickCに入っている、加速度・ジャイロセンサーで、6軸IMUと呼ばれています。
元記事は以下。ほとんどそのまんまです。
みんなのM5Stack入門の著者である下島健彦先生の記事で、とても参考になります。ありがとうございます。
これをそのままM5StickCにArudino IDEで転送するだけで、こんな素敵なグラフがでました。
緑のグラフがリアルタイムに更新されてキレイです!
で、これを応用してやりたいことは色々思いつくのですが、特にやりたいこととして、私は陸上競技をやっているのでこの仕組みをつかって短距離の歩数を測ったり、ゆくゆくはモーションセンサーとかできないかなーなんて夢をふくらませています。まあ考えるだけでも楽しいので。
さて、これM5StickC本体の液晶表示のみならず、Arduino IDEのシリアルプロッタでグラフ表示も可能です。以下なかしーさんの記事が参考になりました。ありがとうございます。
ラングシップさんのサイトでも詳しく紹介されています。ありがとうございます。
とくに記事内、
学研さんと「加速度センサー」のヒミツについて調べてみました。
学研さんと「ジャイロセンサー」のヒミツについて調べてみました。
は絶対絶対面白いので見てほしいです。
M5StickCのジャイロセンサーで超簡単な縄跳びカウンターをつくる。ZOE LOGさんの記事も参考になりました。ありがとうございます。
私が実際にシリアルプロッタ表示をしてみた結果が以下。[Ctrl]+[Shift]+[L]で表示されます。Serial値をソースと合わせてください。
実際の動画ではこんなかんじです。
沢山の先人の皆様のおかげで、私にもできました!!
グラフィカルに表示されると面白いですね!
kintoneにデータ送信
では次にkintoneにデータを転送するテストをやってみます。過去の私の記事を元に作成。アプリもほぼそのまま流用しました。
結果、とりあえず書き込みできることを確認できました!やったー!!
何度やっても私はJSON周りはニガテです。^^;
kintoneへの送信は、Loop内で加速度センサーのデータ捕捉とインターネットに接続して都度データを送信しているので動きがカクカクしました。これはちょっと実用には耐えられませんね^^;。データをバッファしてまとめて送信するなど工夫が必要だと思います。
noteの最後にソースも貼っておきます。実用レベルではないソースでも、ないよりあったほうがマシかもしれませんのでシェアします。晒しておくというレベルです。
加速度センサーの部分は参考サイトと大半いっしょですので、ソース貼り付けでなにか問題あればすみません。削除など対応します。不具合もあるかもしれませんが、かんべんしてください。
尚、シリアルプロッタ表示をする場合はkintone連携部分をコメントアウト。
最低限 httpResponseCode = http.POST(json); をコメントアウトするとグラフがさくさく動くようになります。
#include <M5StickC.h>
#include <WiFi.h>
#include <HTTPClient.h>
#define SAMPLE_PERIOD 20 // サンプリング間隔(ミリ秒)
#define SAMPLE_SIZE 150 // 20ms x 150 = 3秒
float ax, ay, az[SAMPLE_SIZE]; // 加速度データを読み出す変数
#define X0 5 // 横軸の描画開始座標
#define MINZ 600 // 縦軸の最小値 600mG
#define MAXZ 1400 // 縦軸の最大値 1400mG
// JSON用
char millisChr[5][24] = {0};
// Wifi の設定(利用可能なSSIDとPASSWORDを設定してください)
const char* ssid = "wifiのSSID";
const char* password = "wifiのPASSWORD";
// kintoneデータ更新用設定
char macAdr[24] = {0};
char activChr[24] = {0};
char json[4096];
HTTPClient http;
void setup() {
M5.begin();
Serial.begin(115200); // シリアルポート実行開始
M5.Lcd.setRotation(3);
M5.MPU6886.Init(); // MPU6886を初期設定する
// Wifi AP に接続
WiFi.begin(ssid, password);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print("!");
delay(500);
}
Serial.print("connecting");
Serial.println();
Serial.printf("ax,ay,az\n"); // プロッタタイトル
// WiFi Connected
Serial.println("\nWiFi Connected.");
Serial.println(WiFi.localIP());
// MACアドレス
byte mac[6];
WiFi.macAddress(mac);
sprintf(macAdr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
Serial.println(macAdr);
}
void loop() {
M5.Lcd.fillScreen(BLACK); // 画面をクリア
for (int i = 0; i < SAMPLE_SIZE; i++) {
M5.MPU6886.getAccelData(&ax,&ay,&az[i]); // MPU6886から加速度を取得
Serial.printf("%6.2f,%6.2f,%6.2f\n", ax, ay, az[i]); //シリアルポートへ出力
sprintf(activChr, "%s" , "9.shindoutest");
sprintf(json,"{\"app\":\"1234\",\"record\":{\"活動\":{\"value\":\"%s\"},\"カウント0\":{\"value\":\"%6.2f\"},\"カウント1\":{\"value\":\"%s\"},\"カウント2\":{\"value\":\"%s\"},\"カウント3\":{\"value\":\"%s\"},\"カウント4\":{\"value\":\"%s\"},\"MACアドレス\":{\"value\":\"%s\"}}}",activChr,ay,millisChr[1],millisChr[2],millisChr[3],millisChr[4],macAdr);
/***
sprintf(json,
"{\"app\":\"1234\",
\"record\":{
\"活動\":{\"value\":\"%s\"},
\"カウント0\":{\"value\":\"%6.2f\"},
\"カウント1\":{\"value\":\"%s\"},
\"カウント2\":{\"value\":\"%s\"},
\"カウント3\":{\"value\":\"%s\"},
\"カウント4\":{\"value\":\"%s\"},
\"MACアドレス\":{\"value\":\"%s\"}}}",
activChr,
ay,
millisChr[1],
millisChr[2],
millisChr[3],
millisChr[4],
macAdr);
***/
int httpResponseCode = 0;
http.begin("https://piyo.cybozu.com/k/v1/record.json");
http.addHeader(F("X-Cybozu-API-Token"), F("ABCdefgHijklMnOpqrstuVwxYzAbcdefgHiJkLmN")); // <= kintoneアプリのAPI-Tokenを設定
http.addHeader(F("Content-type"), F("application/json"));
httpResponseCode = http.POST(json);
Serial.printf("httpResponseCode = %d \n", httpResponseCode);
Serial.println(http.getString());
az[i] *= 1000; // mGに変換
if (i == 0) continue;
int y0 = map((int)(az[i - 1]), MINZ, MAXZ, M5.Lcd.height(), 0);
int y1 = map((int)(az[i]), MINZ, MAXZ, M5.Lcd.height(), 0);
M5.Lcd.drawLine(i - 1 + X0, y0, i + X0, y1, GREEN);
delay(SAMPLE_PERIOD);
}
}