M5Stackの入門書と、ESP32の「技術百科」の2冊を買ってしまったので、ブラブラしている分けにも行きません。まずは作らねばと言いながら後回しになっていた、M5Stackをセンサのロガーに使う件を進めてまいりたいと思います。データ保存にマイクロSDカードが使え、バッテリとLCDでスタンドアロンでも使えるM5Stackはまさにポケットなロガーとしても最適かと思います。
※「IoT何をいまさら」投稿順Indexはこちら
購入した本やら、M5Stackのサンプルプログラムなど眺めれば、とりあえず何かセンスした結果をマイクロSDカードに保存するようなプログラムは20、30分もあれば動作してしまうお手軽さ。これぞM5Stackの利点かと思います。しかしね、何時ものことですが、
そうは問屋が卸さない
ケースがままあります(ま、自分が悪いのですが。。。)今回は、マイクロSDカードの「入れ方」で問屋が卸してくれませんでした。
蓋を開ければ直ぐに分かることですが、LCDのある側を基板の表と呼ぶならば、マイクロSDカードのソケットは裏面にあるので、上の写真のようにマイクロSDカードの端子を上に向けて、コアの側面のスロットに押し込めば良いわけです。私も当然そうしました。
がしかし、エラーメッセージが出ました。
ERROR: SD CARD.
ま、自分で書いたプログラムから出力されたエラーなので、内容は分かります。SDカードが見当たらないときにでるエラーです。入っている筈なのになぜ?最初ソフトを疑いましたが、結局、
マイクロSDカードがソケットにちゃんと収まらずにソケットの下側(というか基板から見て空間側に)逃げてしまっていた、ことに気付きました。コアの蓋を開けて、ナナメっているカードを取り出し、入れなおして事が済みました。M5StackのマイクロSDカード用のスロットは、意外と遊びが大きい。プラスチックケースとソケットの隙間に簡単にナナメって入ってしまいました。蓋を開ければ取り出すのは簡単ですが、ナナメに入ってしまっているのに気づいたときは、どうしようかとちと青くなりました。ちゃんと、カチっと収まることを確認すべきでした。LCDを下向きにして挿入する方がナナメに入らないかも。
さて、くだくだ言わずにテスト用に書いた「ローガー」のソース、拙いものですが、御覧いただきましょう。
// test Logger // 2019/12/22 #include <M5Stack.h> #include "utility/MPU9250.h" MPU9250 IMU; File f; bool fOK = false; int i = 0; void setup() { M5.begin(); // Start SD card if (!SD.begin()) { M5.Lcd.println("ERROR: SD CARD."); while (1) ; } // Open log file f = SD.open("/testLog.txt", FILE_WRITE); if (!f) { M5.Lcd.println("ERROR: OPEN FILE."); while (1) ; } // Start MPU9250 Wire.begin(); IMU.initMPU9250(); IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias); // Greeting Message M5.Lcd.println("testLogger"); } bool measureIMU() { if (IMU.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01) { IMU.readAccelData(IMU.accelCount); IMU.getAres(); IMU.ax = (float)IMU.accelCount[0] * IMU.aRes; IMU.ay = (float)IMU.accelCount[1] * IMU.aRes; IMU.az = (float)IMU.accelCount[2] * IMU.aRes; } else { return false; } return true; } void loop() { String dataString = "V="; M5.update(); if (fOK) { dataString += String(i++); if (measureIMU()) { dataString += String(","); dataString += String(IMU.ax); dataString += String(","); dataString += String(IMU.ay); dataString += String(","); dataString += String(IMU.az); } f.println(dataString); } if (M5.BtnA.wasPressed()) { M5.Lcd.println("Start>"); fOK = true; } if (M5.BtnB.wasPressed()) { M5.Lcd.println("End"); fOK = false; } if (M5.BtnC.wasPressed()) { f.close(); M5.powerOFF(); } delay(10); }
これをM5Stack Grey(センサはMPU9250搭載のもの)に書き込むと、マイクロSDカードに問題が無ければ、testLogger と画面に表示されます。そこでAボタンを押すと3軸加速度を取得して、SDカードのルートに置いた testLog.txt ファイルにカンマ区切りでデータを書き込んでいきます。Bボタンを押すとデータ書き込みを終え、Cボタンを押すとファイルを閉じて、電源を切ります。そうしたらマイクロSDカードを抜いて取得したデータを読めば良いと。
結果のファイルはこんな感じ。
V=0,-0.06,0.36,0.63 V=1,-0.04,-0.06,1.07 V=2,-0.06,0.14,0.86 V=3,-0.06,0.03,0.96 V=4,-0.06,0.08,0.92 V=5,-0.06,0.06,0.94 V=6,-0.06,0.06,0.93 V=7,-0.06,0.06,0.93 V=8,-0.06,0.06,0.94 V=9,-0.06,0.07,0.94 V=10,-0.06,0.07,0.92
とりあえず、何かセンサの値を読んで、マイクロSDのファイルに書き込むという最低限の目的は果たしたけれども、なんだかな~
-
- delayで10msのお休みいれているけれども、実際の計測間隔は成り行き。もっと正確な時間間隔で測定したい。
- 加速度センサの値、有効数字2桁?もっとあるんちゃうの?
- 測定する度に同じファイルが上書きされちゃう
とりあえず、その辺をば、まずは改善して行きたいと思います。ま、本日はとりあえずプログラム動いたので、ここまでと。