スケボーの動きを測りたい3

前回の話から、せっせとM5stackの
プログラムを作っていた。
とりあえず次のような仕様で作ってみた。
・IMUで3軸加速度、3軸角速度、
 3軸地磁気を測る
・測った数値を時系列にCSVデータで
 SDカードに保存する
・M5stackのボタンを押すと計測開始、
 再度押すと計測終了
・データはLOG***.csvのタイトルで保存
 次に保存するデータは***の数字を
 変更して、別名保存する

M5stackのIMUサンプルプログラムを
ベースに、ネットであれこれ見て
組み合わせた。
なんとなーくでも結構できるもんだ。
素人作なので、細かいところは
気にしないでほしい。

#define M5STACK_MPU6886 

#include <M5Stack.h>
#include <SD.h>

SPIClass SPI2;

unsigned long currentTime;
unsigned long prevTime=0;
unsigned long cnt=0;
unsigned long flag=0;
float accX = 0.0F; //スケボーの左右方向の加速度
float accY = 0.0F; //スケボーの前後方向の加速度
float accZ = 0.0F; //スケボーの上下方向の加速度
float prev_accX = 0.0f; //表示用
float prev_accY = 0.0f; //表示用
float prev_accZ = 0.0f; //表示用

float gyroX = 0.0F; //スケボーの前後軸中心の回転角速度
float gyroY = 0.0F; //スケボーの左右軸中心の回転角速度
float gyroZ = 0.0F; //スケボーの上下軸中心の回転角速度
float prev_gyroX = 0.0f; //表示用
float prev_gyroY = 0.0f; //表示用
float prev_gyroZ = 0.0f; //表示用

float pitch = 0.0F; //ピッチ
float roll  = 0.0F; //ロール
float yaw   = 0.0F; //ヨー
float prev_pitch = 0.0f; //表示用
float prev_roll = 0.0f; //表示用
float prev_yaw = 0.0f; //表示用
char fileName[16]; //SDカードに保存するファイル名
int fileNum = 0; //読み書き時のファイルNo.
String fileNum_s; //ファイルNo.文字列入れる用
File fileNo;
File file;


void setup(){
  M5.begin();
  M5.Power.begin();
  M5.IMU.Init();
  M5.Lcd.setRotation(1);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextColor(GREEN , BLACK);
  M5.Lcd.setTextSize(1);
  
  SPI2.begin(0, 36, 26, -1); // SPI初期化
  if(!SD.begin(-1, SPI2)) { // SDカード初期化
    M5.Lcd.println("Card Mount Failed");//SDカードがない場合は、失敗表示
    return;
  }
//SDカード内ファイルナンバーのテキストファイルがある場合は読み込む。ない場合はファイル作成。
  if(SD.exists("/fileNo.txt")){
    fileNo = SD.open("/fileNo.txt");
    fileNum_s = fileNo.readString();
    fileNo.close();
    fileNum = fileNum_s.toInt();
  }else{
    fileNo = SD.open("/fileNo.txt", FILE_WRITE);
    fileNo.println(fileNum);
    fileNo.close();
  }
}

// 繰り返し
void loop() {
  M5.update();
  if(flag==1) {
//加速度、角速度、地磁気のデータ取得
    M5.IMU.getAccelData(&accX,&accY,&accZ);
    M5.IMU.getGyroData(&gyroX,&gyroY,&gyroZ);
    M5.IMU.getAhrsData(&pitch,&roll,&yaw);
//9軸分のデータをディスプレイに表示 
    M5.Lcd.setCursor(0, 20);
    M5.Lcd.printf("%6.2f  %6.2f  %6.2f      ", accX, accY, accZ);
    M5.Lcd.setCursor(220, 42);
    M5.Lcd.print(" G");
    M5.Lcd.setCursor(0, 65);
    M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", gyroX, gyroY, gyroZ);
    M5.Lcd.setCursor(220, 87);
    M5.Lcd.print(" o/s");
    M5.Lcd.setCursor(0, 110);
    M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", pitch, roll, yaw);
    M5.Lcd.setCursor(220, 132);
    M5.Lcd.print(" degree");
    M5.Lcd.setCursor(0, 170);
    M5.Lcd.println(fileName);
//9軸分のデータをファイルに書き込み。CSVフォーマットを作成
    if(accX!=prev_accX || accY!=prev_accY || accZ!=prev_accZ || gyroX!=prev_gyroX || gyroY!=prev_gyroY || gyroZ!=prev_gyroZ || pitch!=prev_pitch || roll!=prev_roll || yaw!=prev_yaw) {
      file.println((String)millis() + "," + (String)accX + "," + (String)accY + "," + (String)accZ + "," + (String)gyroX + "," + (String)gyroY + "," + (String)gyroZ + "," + (String)pitch + "," + (String)roll + "," + (String)yaw);
      cnt++;
      prev_accX=accX;
      prev_accY=accY;
      prev_accZ=accZ;
      prev_gyroX=gyroX;
      prev_gyroY=gyroY;
      prev_gyroZ=gyroZ;
      prev_pitch=pitch;
      prev_roll=roll;
      prev_yaw=yaw;
    }
  
    currentTime=millis(); //プログラム実行から現在までの時間
    if(currentTime-prevTime>=1000) {
      M5.Lcd.fillScreen(BLACK);
      M5.Lcd.setCursor(0, 0, 4);
      M5.Lcd.println(cnt);
      cnt=0;
      prevTime=currentTime;
    }
  }

  if(M5.BtnA.wasPressed()) {
   flag = (flag+1)%2;
   if(flag==1) {// Aボタンがオンになったら、CSVファイル作成
   //ファイル名作成「LOG***.csv」を作成
    String s;
    fileNum++;
    s = "/LOG";
    if (fileNum < 10) {
      s += "00";
    } else if(fileNum < 100) {
      s += "0";
    }
    s += fileNum;
    s += ".csv";
    s.toCharArray(fileName, 16);

    file = SD.open(fileName, FILE_WRITE);//指定ファイル名でCSVファイル作成。書き込みモード。
    file.println("currenttime,accX,accY,accZ,gyroX,gyroY,gyroZ,pitch,roll,yaw");

    fileNo = SD.open("/fileNo.txt", FILE_WRITE);//ファイルナンバーのCSVファイル作成
    fileNo.println(fileNum);
    fileNo.close();

    }
    if(flag==0) {//Aボタンがオフになったら記録終わり。STOP表示。
      file.close();
      M5.Lcd.println("STOP");
    }
  }
  delay(1); //1msディレイ
}

画面はこんな感じでおま。
※数値は高速で変化しているため、
変な表示になっている。

ちなみに、このネタを始めてから、
ブログの閲覧数がグッと減った。
「なんでだろう」と妻に相談したら、
「そりゃそうだろ。誰が興味あるんだよ」
という心ない指摘。
だが続く。

おしまい