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桁?もっとあるんちゃうの?
- 測定する度に同じファイルが上書きされちゃう
とりあえず、その辺をば、まずは改善して行きたいと思います。ま、本日はとりあえずプログラム動いたので、ここまでと。