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);
}
これで値の表示はできた。
ここまでのコードはこちら