M5Stack Core2内蔵のジャイロ加速度計「MPU6886」の入力」でジャイロ加速度計「MPU6886」からデータを入力しました。前回は開発環境が「PlatformIO」でしたが、今回はArduino IDEでプログラムを開発します。また、Arduino IDEのシリアルプロッタを使用して、取得したデータを確認します。

M5Stack Core2の姿勢

M5Stack Core2内蔵のジャイロ加速度計「MPU6886」は、次のような座標で出力されます。

シリアルプロッタで複数の値を出力

それぞれのグラフの値を「,(コンマ)」で区切って出力します。また、シリアルプロッタの表示に凡例も合わせて表示したい場合は、次のようなフォーマットでシリアル出力します。加速度データを例にしています。

Serial.printf("accelX:%.2f, Y:%.2f, Z:%.2f\n", accX, accY, accZ);

ジャイロ加速度計入力アプリの作成

m5core2gyro.ino

  • M5Stack Core2の3つあるボタンの左側ボタンを押すごとに、出力されるデータ内容を切り替えています。
  • シリアルプロッタで表示できるように、Serial.printfメソッドのフォーマットを作成します。
// 振動センサのデータをシリアル出力するプログラム。ArduinoIDEのシリアルプロッタでグラフとして確認します。※液晶表示は何も表示されません。
#define M5STACK_MPU6886  // ヘッダーファイルをincludeする前に、IMUモジュールを#defineしておく
#include <M5Core2.h>     // ヘッダーファイル ※AtomMatrixは <M5Atom.h> / CPlusは <M5StickCPlus.h> / GRAYは <M5Stack.h>
// 変数宣言
float accX, accY, accZ;     // 加速度格納用
float gyroX, gyroY, gyroZ;  // 角速度格納用
float pitch, roll, yaw;     // 姿勢角格納用
int mode = 0;               // 測定モード選択用
// 初期設定 ----------------------------------------------------------
void setup() {
  M5.begin();                         // 本体初期化
  Serial.begin(9600);               // シリアル出力初期化
  M5.IMU.Init();                      // 6軸センサ初期化
  M5.IMU.SetAccelFsr(M5.IMU.AFS_8G);  // 加速度センサースケール初期値設定 ±8G(2,4,8,16) ※GRAYは「setAccelFsr」(先頭のsが小文字)
}
// メイン処理 --------------------------------------------------------
void loop() {
  M5.update();  // ボタン状態更新

  M5.IMU.getAccelData(&accX, &accY, &accZ);    // 加速度データ取得
  M5.IMU.getGyroData(&gyroX, &gyroY, &gyroZ);  // 角速度データ取得
  M5.IMU.getAhrsData(&pitch, &roll, &yaw);     // 姿勢角データ取得

  float x_angle = atan2(accX, accZ) * 180.0 / PI;  // X-Z加速度から角度に換算
  float y_angle = atan2(accY, accZ) * 180.0 / PI;  // Y-Z加速度から角度に換算

  // ボタンONで測定モード切り替え
  if (M5.BtnA.wasPressed()) { mode++; }  // ※Atom Matrixは「M5.Btn.」
  if (mode == 4) { mode = 0; }
  switch (mode) {  // modeによって出力データを切り替え
    case 0:
      //Serial.println("accelX, Y, Z");     // 加速度項目
      //Serial.printf("%7.2f, %7.2f, %7.2f\n", accX, accY, accZ);   // 加速度
      Serial.printf("accelX:%.2f, Y:%.2f, Z:%.2f\n", accX, accY, accZ);  // 加速度
      break;
    case 1:
      //Serial.println("gyroX, Y, Z");                                // ジャイロ項目
      //Serial.printf("%7.2f, %7.2f, %7.2f\n", gyroX, gyroY, gyroZ);  // ジャイロ
      Serial.printf("gyroX:%.2f, Y:%.2f, Z:%.2f\n", gyroX, gyroY, gyroZ);  // 加速度
      break;
    case 2:
      //Serial.println("pitch, roll, yaw");                        // 姿勢角
      //Serial.printf("%7.2f, %7.2f, %7.2f\n", pitch, roll, yaw);  // 姿勢角
      Serial.printf("pitch:%.2f,roll:%.2f, yw:%.2f\n", pitch, roll, yaw);  // 加速度
      break;
    case 3:
      //Serial.println("AngleX,Y");                         // 角度項目
      //Serial.printf("%5.1f, %5.1f\n", x_angle, y_angle);  // 加速度から換算した角度
      Serial.printf("AngleX:%.3f, Y:%.3f\n", x_angle, y_angle);  // 加速度
      break;
  }
  delay(100);
}

ジャイロ加速度計「MPU6886」からのデータ

いずれも、X方向に傾けた場合のシリアルプロッタへの出力結果を次に示します。

  1. 加速度
  2. ジャイロ
  3. なぜかY軸の値が振れます。机の上に置いても値がぶれます。

  4. 姿勢角
  5. 角度項目
  6. 机の上に置いても値がぶれます。