前回の話から、せっせと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ディレイ }
画面はこんな感じでおま。
※数値は高速で変化しているため、
変な表示になっている。
ちなみに、このネタを始めてから、
ブログの閲覧数がグッと減った。
「なんでだろう」と妻に相談したら、
「そりゃそうだろ。誰が興味あるんだよ」
という心ない指摘。
だが続く。
おしまい
コメント