diff --git a/main/ugv_io_mpu.cc b/main/ugv_io_mpu.cc index 944beb2..098711b 100644 --- a/main/ugv_io_mpu.cc +++ b/main/ugv_io_mpu.cc @@ -56,6 +56,8 @@ void MPU::Init() { } mpu_->setAccelFullScale(MPU_ACCEL_FS); mpu_->setGyroFullScale(MPU_GYRO_FS); + // force magnetometer into continuous mode + mpu_->compassWriteByte(0x0A, 0x12); xSemaphoreGive(i2c_mutex); BaseType_t xRet = @@ -77,19 +79,31 @@ void MPU::DoTask() { esp_err_t ret; while (true) { vTaskDelay(pdMS_TO_TICKS(50)); + uint8_t mxh, mxl, myh, myl, mzh, mzl, n; xSemaphoreTake(i2c_mutex, portMAX_DELAY); - ret = mpu_->motion(&accel_, &gyro_, &mag_); + ret = mpu_->motion(&accel_, &gyro_); + mpu_->compassReadByte(0x03, &mxl); + mpu_->compassReadByte(0x04, &mxh); + mpu_->compassReadByte(0x05, &myl); + mpu_->compassReadByte(0x06, &myh); + mpu_->compassReadByte(0x07, &mzl); + mpu_->compassReadByte(0x08, &mzh); + mpu_->compassReadByte(0x09, &n); xSemaphoreGive(i2c_mutex); if (ret != ESP_OK) { ESP_LOGE(TAG, "error reading MPU"); continue; } + int16_t mx = (static_cast(mxh) << 8) | static_cast(mxl); + int16_t my = (static_cast(myh) << 8) | static_cast(myl); + int16_t mz = (static_cast(mzh) << 8) | static_cast(mzl); + ESP_LOGV(TAG, "compass: %d, %d, %d", mx, my, mz); xSemaphoreTake(mutex_, pdMS_TO_TICKS(1000)); mpu_data_.accel = mpud::accelGravity(accel_, MPU_ACCEL_FS); mpu_data_.gyro_rate = mpud::gyroDegPerSec(gyro_, MPU_GYRO_FS); - mpu_data_.mag.x = ((float)mag_.x) * MPU_MAG_TO_FLUX; - mpu_data_.mag.y = ((float)mag_.y) * MPU_MAG_TO_FLUX; - mpu_data_.mag.z = ((float)mag_.z) * MPU_MAG_TO_FLUX; + mpu_data_.mag.x = ((float)mx) * MPU_MAG_TO_FLUX; + mpu_data_.mag.y = ((float)my) * MPU_MAG_TO_FLUX; + mpu_data_.mag.z = ((float)mz) * MPU_MAG_TO_FLUX; xSemaphoreGive(mutex_); } vTaskDelete(NULL);