How to configurate MPU6886 for over 8G? (Change MAX +/-8G to +/-16G)
-
Hi M5 community,
I'm using the M5StickC PLUS2 as an accelerometer in my project. It seems that the M5 detected accelerations over 8G, so I need to configure the MPU6886 to measure accelerations above 8G. However, I couldn't find an option to increase the max acceleration range in the IMU. I'm not very familiar with M5 or C++ programming, so if my explanation is unclear, please feel free to point it out.Below is the actual measurement data, which is capped at +/-8G.
below is my project code, just in case.
#include "M5StickCPlus2.h" #define SAMPLE_PERIOD 10 // サンプリング間隔(ミリ秒) #define BUFFER_SIZE 100 // 1秒間に10回データを保持する(100ms * 10 = 1秒) #define THRESHOLD 3 // 加速度の閾値 (例: 1.5G) #define STOP_DELAY 1000 // 閾値を超えてから1秒で記録停止(1000ミリ秒) // 状態管理のためのenum定義 enum State { INITIAL_SCREEN, MEASURING, STOPPED, RESULT_SCREEN }; State currentState = INITIAL_SCREEN; // 現在の状態を初期画面に設定 float accelX[BUFFER_SIZE]; // X軸加速度のバッファ float accelY[BUFFER_SIZE]; // Y軸加速度のバッファ float accelZ[BUFFER_SIZE]; // Z軸加速度のバッファ int bufferIndex = 0; // バッファの現在のインデックス bool thresholdExceeded = false; // 閾値が超えたかどうかを管理 unsigned long thresholdExceededTime = 0; // 閾値を超えた時刻を記録 float maxTotalAccel = 0; // 最大合成加速度を記録する変数 void setup() { auto cfg = M5.config(); StickCP2.begin(cfg); StickCP2.Display.setRotation(1); StickCP2.Display.setTextColor(GREEN); StickCP2.Display.setTextDatum(middle_center); StickCP2.Display.setFont(&fonts::FreeSansBold9pt7b); StickCP2.Display.setTextSize(2); Serial.begin(115200); showInitialScreen(); // 初期画面を表示 } void loop(void) { M5.update(); // ボタンの状態を更新 if (M5.BtnA.wasPressed()) { // G83ボタンが押されたら handleButtonPress(); // ボタン押下に応じた処理を行う } // 測定中の処理 if (currentState == MEASURING) { measureShock(); // 加速度を測定 } delay(SAMPLE_PERIOD); // サンプリング間隔 } // G83ボタンが押されたときの処理 void handleButtonPress() { switch (currentState) { case INITIAL_SCREEN: currentState = MEASURING; thresholdExceeded = false; maxTotalAccel = 0; // 最大加速度をリセット showMeasuringScreen(); break; case MEASURING: currentState = STOPPED; showStoppedScreen(); break; case STOPPED: currentState = RESULT_SCREEN; sendBufferData(); // シリアル送信を開始 showResultScreen(); break; case RESULT_SCREEN: currentState = INITIAL_SCREEN; showInitialScreen(); break; } } // 加速度測定を行う void measureShock() { auto imu_update = StickCP2.Imu.update(); if (imu_update) { auto data = StickCP2.Imu.getImuData(); // リングバッファに加速度データを保存 accelX[bufferIndex] = data.accel.x; accelY[bufferIndex] = data.accel.y; accelZ[bufferIndex] = data.accel.z; // バッファインデックスを更新(0~BUFFER_SIZE-1を循環) bufferIndex = (bufferIndex + 1) % BUFFER_SIZE; // 合成加速度を計算 float totalAccel = sqrt(data.accel.x * data.accel.x + data.accel.y * data.accel.y + data.accel.z * data.accel.z); // 画面に加速度データを表示 StickCP2.Display.setCursor(0, 40); StickCP2.Display.clear(); // 画面をクリア StickCP2.Display.printf("Accel: %.2f G\n", totalAccel); // 最大合成加速度を更新 if (totalAccel > maxTotalAccel) { maxTotalAccel = totalAccel; } // 閾値を超えたかどうかを確認 if (totalAccel > THRESHOLD && !thresholdExceeded) { thresholdExceeded = true; thresholdExceededTime = millis(); // 閾値を超えた時刻を記録 Serial.println("Threshold exceeded! Starting countdown..."); } // 閾値を超えてから1秒が経過したら測定を停止 if (thresholdExceeded && (millis() - thresholdExceededTime >= STOP_DELAY)) { currentState = STOPPED; showStoppedScreen(); // 測定終了画面を表示 } } } // 初期画面を表示 void showInitialScreen() { StickCP2.Display.clear(); StickCP2.Display.setCursor(0, 20); StickCP2.Display.printf("Press G83 to Start\n"); int bat = StickCP2.Power.getBatteryLevel(); StickCP2.Display.printf("BAT:%d%" , bat); } // 測定中画面を表示 void showMeasuringScreen() { StickCP2.Display.clear(); StickCP2.Display.setCursor(0, 20); StickCP2.Display.printf("Measuring..."); } // 測定停止画面を表示し、最大合成Gを表示する void showStoppedScreen() { StickCP2.Display.clear(); StickCP2.Display.setCursor(0, 20); StickCP2.Display.printf("Measurement Stopped\n"); StickCP2.Display.printf("Max G: %.2f G\n", maxTotalAccel); } // 結果画面を表示 void showResultScreen() { StickCP2.Display.clear(); StickCP2.Display.setCursor(0, 20); StickCP2.Display.printf("Results Sent via Serial"); } // バッファ内のデータをすべてシリアル通信で送信 void sendBufferData() { int time = 10; // 開始時間(ミリ秒単位) // CSV形式のヘッダーを送信 Serial.println("TIME,ACCEL_X,ACCEL_Y,ACCEL_Z"); // バッファ内のデータを送信 for (int i = 0; i < BUFFER_SIZE; i++) { // データのインデックスがリングバッファの先頭から始まるように調整 int index = (bufferIndex + i) % BUFFER_SIZE; //Serial.printf("%d,%0.2f,%0.2f,%0.2f\r\n", time, accelX[index], accelY[index], accelZ[index]); Serial.printf("%0.2f,%0.2f,%0.2f\r\n", accelX[index], accelY[index], accelZ[index]); // 10ミリ秒ごとに時間を更新 time += 10; } // データの送信終了を示すメッセージ Serial.println("---- END_OF_DATA ----"); }
-
-
Hi, @felmue
Thank you for your advice!
It seems that I needed, I will try.