Open1

M5UnifiedでIMUから読み取る

nnn112358nnn112358

M5UnifiedライブラリのM5.Imuクラスは、M5Stackデバイスのさまざまな慣性計測ユニット(IMU)を簡単に扱うためのインターフェースを提供します。主要な機能と仕様を説明します:

M5.Imu の主な仕様と機能

  1. センサ自動検出

    • MPU6050, MPU6886, MPU9250, BMI270, SH200Qなど様々なIMUセンサに対応
    • デバイスの種類を自動的に検出して適切に初期化
  2. 基本的なメソッド

    • begin(): IMUセンサの初期化
    • getAccelData(float*, float*, float*): 加速度データ(X,Y,Z)の取得 (単位: G)
    • getGyroData(float*, float*, float*): 角速度データ(X,Y,Z)の取得 (単位: deg/s)
    • getTemp(float*): 温度データの取得 (単位: °C)
    • getAhrsData(float*, float*, float*): 方位・姿勢データ(ピッチ、ロール、ヨー)の取得(MPU9250等の磁気センサ搭載モデルのみ)
  3. センサ設定

    • setAccelFsr(uint8_t fsr): 加速度センサの感度範囲設定(2G、4G、8G、16G)
    • setGyroFsr(uint8_t fsr): ジャイロセンサの感度範囲設定(250、500、1000、2000 deg/s)
  4. 詳細情報

    • imuType: 搭載されているIMUの種類を示す列挙型
    • getImuType(): 検出されたIMUの種類を取得
  5. サンプリングレート

    • 一般的に内部サンプリングレートは100Hz程度(モデルにより異なる)
    • ユーザーのコードでの読み取り頻度はdelayなどで調整可能

使用例

// 基本的な使用法
void setup() {
  M5.begin();
  M5.Imu.begin();  // IMUの初期化
}

void loop() {
  float accX, accY, accZ;
  
  // 加速度データの取得
  M5.Imu.getAccelData(&accX, &accY, &accZ);
  
  // 感度範囲の設定例(8G)
  // M5.Imu.setAccelFsr(M5.Imu.ACCEL_FSR_8G);
}

注意点

  • 一部のメソッドは搭載センサーによって利用できない場合があります(例:磁気センサを持たないモデルでのAHRSデータ取得)
  • M5Unifiedライブラリの特徴として、異なるM5Stackデバイス間でコードの互換性を保ちやすい設計になっています
  • 内部的にはI2C通信を使用してセンサーと通信しています

M5.Imuクラスは、センサの詳細を抽象化し、複雑なレジスタ操作を隠蔽することで、IMUセンサを簡単に扱えるようにする役割を果たしています。

#include <M5Unified.h>

void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);
  
  // シリアル通信の初期化(115200bps)
  Serial.begin(115200);
  Serial.println("M5Stack IMU Serial Output Test");

  M5.Display.setTextSize(2);
  M5.Display.println("IMU Test");
  M5.Display.println("Data on Serial Monitor");

  // IMUセンサの初期化
  M5.Imu.begin();
}

void loop() {
  float accX = 0.0F;
  float accY = 0.0F;
  float accZ = 0.0F;
  float gyroX = 0.0F;
  float gyroY = 0.0F;
  float gyroZ = 0.0F;
  float temp = 0.0F;

  // センサからデータを読み取る
  M5.update();
  M5.Imu.getAccelData(&accX, &accY, &accZ);
  M5.Imu.getGyroData(&gyroX, &gyroY, &gyroZ);
  M5.Imu.getTemp(&temp);

  // ディスプレイに表示
  M5.Display.setCursor(0, 50);
  M5.Display.fillRect(0, 50, 320, 190, BLACK);
  
  M5.Display.printf("accel: X:%5.2f Y:%5.2f Z:%5.2f\n", accX, accY, accZ);
  M5.Display.printf("gyro : X:%5.2f Y:%5.2f Z:%5.2f\n", gyroX, gyroY, gyroZ);
  M5.Display.printf("temp : %5.2f\n", temp);

  // シリアルにデータを出力
  Serial.print("Accelerometer: X=");
  Serial.print(accX, 2);
  Serial.print(", Y=");
  Serial.print(accY, 2);
  Serial.print(", Z=");
  Serial.println(accZ, 2);
  
  Serial.print("Gyroscope: X=");
  Serial.print(gyroX, 2);
  Serial.print(", Y=");
  Serial.print(gyroY, 2);
  Serial.print(", Z=");
  Serial.println(gyroZ, 2);
  
  Serial.print("Temperature: ");
  Serial.println(temp, 2);
  
  Serial.println("------------------------");

  delay(500); // 出力間隔を500msに設定(データが見やすいように)
}