Skip to content

Iot.Device.Imu.Mpu6050 - System.IO.IOException on .CalibrateGyroscopeAccelerometer() #2356

Description

@mfitconsultants

I am struggling to calibrate an Mpu 6050 specifcially it is a;

Adafruit MPU-6050 6-DoF Accel and Gyro Sensor - STEMMA QT Qwiic

which is connected to a Raspberry Pi 2.

When I try to call the .CalibrateGyroscopeAccelerometer(); method I get the error;

System.IO.IOException: Can set GyroscopeBandwidth, desired value Bandwidth0184Hz, stored value Bandwidth0250Hz

 public HardwareAccelerometerController(
     ILogger<HardwareAccelerometerController> logger,
     int i2cAddress,
     int recalibrationIntervalMinutes,
     int i2cBusId = 1)
 {
     _logger = logger;

     try
     {
         var i2cSettings = new I2cConnectionSettings(i2cBusId, i2cAddress);
         var i2cDevice = I2cDevice.Create(i2cSettings);

         _mpu6050 = new Mpu6050(i2cDevice);  // Initialize the MPU6050
         _logger.LogInformation($"MPU6050 initialized with I2C address {i2cAddress} on bus {i2cBusId}.");
     }
     catch (Exception ex)
     {
         _logger.LogError(ex, $"Failed to initialize MPU6050 with I2C address {i2cAddress} on bus {i2cBusId}. Check connections and configuration.");
         throw new InvalidOperationException("MPU6050 initialization failed. Ensure the device is connected and configured correctly.", ex);
     }

     _recalibrationIntervalMinutes = recalibrationIntervalMinutes;
     _lastCalibrationTime = DateTime.Now;
 }

 /// <summary>
 /// Calibrate the accelerometer and gyroscope.
 /// </summary>
 public async Task CalibrateAsync()
 {
 if (_mpu6050 == null)
 {
     _logger.LogError("Cannot calibrate MPU6050 because it is not initialized.");
     throw new InvalidOperationException("MPU6050 is not initialized.");
 }

 await Task.Run(() =>
 {
     _logger.LogInformation("Calibrating MPU6050...");
     try
     {
         _mpu6050.CalibrateGyroscopeAccelerometer();
         _logger.LogInformation("Calibration complete.");
     }
     catch (IOException ex)
     {
         _logger.LogError(ex, "Failed to set the GyroscopeBandwidth. Proceeding with default bandwidth.");
     }
 });
}

From the logger the device is initilised;

MPU6050 initialized with I2C address 104 on bus 1.

From running sudo i2cdetect -y 1 on the pi I get

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

So the unit is present - i have also tried the a python sript which is returning data from the unit.

I have also tested

                    _logger.LogInformation($"MPU6050: Accelerometer X:{_mpu6050.GetAccelerometer().X}, Y:{_mpu6050.GetAccelerometer().Y}, Z:{_mpu6050.GetAccelerometer().Z}");
                    _logger.LogInformation($"MPU6050: Gyroscope X:{_mpu6050.GetGyroscopeReading().X}, Y:{_mpu6050.GetAccelerometer().Y}, Z:{_mpu6050.GetAccelerometer().Z}");

Prior to calling the CalibrateGyroscopeAccelerometer() method which return values. attmepting after the exception leads to 0,0,0 being returned.

I cannot find any detail on this specific error? Can anyone tell me how to debug this and what I may be doing wrong please?

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Priority:3Work that is nice to havebugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions