スケボーの動きを測りたい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ディレイ
}

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

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

おしまい

コメント

タイトルとURLをコピーしました