IoT何をいまさら(42) M5Stack、マイクロSDカードにロギング

M5Stackの入門書と、ESP32の「技術百科」の2冊を買ってしまったので、ブラブラしている分けにも行きません。まずは作らねばと言いながら後回しになっていた、M5Stackをセンサのロガーに使う件を進めてまいりたいと思います。データ保存にマイクロSDカードが使え、バッテリとLCDでスタンドアロンでも使えるM5Stackはまさにポケットなロガーとしても最適かと思います。

購入した本やら、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のファイルに書き込むという最低限の目的は果たしたけれども、なんだかな~

  1. delayで10msのお休みいれているけれども、実際の計測間隔は成り行き。もっと正確な時間間隔で測定したい。
  2. 加速度センサの値、有効数字2桁?もっとあるんちゃうの?
  3. 測定する度に同じファイルが上書きされちゃう

とりあえず、その辺をば、まずは改善して行きたいと思います。ま、本日はとりあえずプログラム動いたので、ここまでと。

IoT何をいまさら(42) 高級スポーツウオッチの脈拍計測 へ戻る

IoT何をいまさら(44) M5Stack.hの中身を確認しとこう へ進む