ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

M5StickCでM5UnifiedでIMU(2)

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);
}

これで値の表示はできた。

ここまでのコードはこちら

雪寄せ時間を記録するためのM5StickCのプログラム · GitHub