Open1
M5UnifiedでIMUから読み取る

M5UnifiedライブラリのM5.Imu
クラスは、M5Stackデバイスのさまざまな慣性計測ユニット(IMU)を簡単に扱うためのインターフェースを提供します。主要な機能と仕様を説明します:
M5.Imu の主な仕様と機能
-
センサ自動検出
- MPU6050, MPU6886, MPU9250, BMI270, SH200Qなど様々なIMUセンサに対応
- デバイスの種類を自動的に検出して適切に初期化
-
基本的なメソッド
-
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等の磁気センサ搭載モデルのみ)
-
-
センサ設定
-
setAccelFsr(uint8_t fsr)
: 加速度センサの感度範囲設定(2G、4G、8G、16G) -
setGyroFsr(uint8_t fsr)
: ジャイロセンサの感度範囲設定(250、500、1000、2000 deg/s)
-
-
詳細情報
-
imuType
: 搭載されているIMUの種類を示す列挙型 -
getImuType()
: 検出されたIMUの種類を取得
-
-
サンプリングレート
- 一般的に内部サンプリングレートは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に設定(データが見やすいように)
}