IMUの値を取得してみる。
_cfg.internal_imu で初期化しているので、検索するとここで初期化されている。
M5Atom Matrixは軸が異なってる様だ。
if (_cfg.internal_imu && In_I2C.isEnabled()) { if (M5.Imu.begin()) { if (M5.getBoard() == m5::board_t::board_M5Atom) { // ATOM Matrix's IMU is oriented differently, so change the setting. M5.Imu.setRotation(2); } } } if (!M5.Imu.isEnabled() && _cfg.external_imu) { M5.Imu.begin(&M5.Ex_I2C); }
IMUはM5.Imuで使用できる様なので検索すると、getAccel、getGyroで得られる様だ。
valはfloat
M5.Imu.getAccel(&val[0], &val[1], &val[2]); M5.Imu.getGyro(&val[3], &val[4], &val[5]);
z軸は重力で1Gになる様なのでその分を引いてベクトル長を計算。
static float velocity = 0; static void imu_task(void*) { float val[3]; while(true) { M5.Imu.getAccel(&val[0], &val[1], &val[2]); val[2] -= 1.0f; velocity = sqrt(val[0] * val[0] + val[1] * val[1] + val[2] * val[2]); delay(100); } } void setup() { . . // IMU task xTaskCreatePinnedToCore(imu_task, "imu_task", 1024, NULL, 25, NULL, APP_CPU_NUM); } void loop() { M5.Lcd.setCursor(1, 1); M5.Lcd.printf("V: %.4f", velocity); delay(200); }
これで値の表示はできた。
ここまでのコードはこちら