cancel
Showing results for 
Search instead for 
Did you mean: 

STEVAL-MKI245KA IMU readings not updating

cloudymnms
Associate II

I'm using the STEVAL-MKI245KA development kit, trying to get the IMU readings with an AT-Mega through I2C. The I2C communication between the adapter board of the kit is working, but the IMU values recieved by the arduino are not updating. When I run the code to get the accelerometer and gyroscope values, the value is always 0 for all axes acc and gyro. (the reason I know the I2C is working is because when it wasn't working, the values were all -1, but when it does 'work' the values at all 0). 

Here is a screenshot from the datasheet of the IMU with the registers of all the parameters:

cloudymnms_0-1723222036195.png

And here is the code that I am using to access the values at these registers:

#include <Wire.h>

#define IMU_ADDRESS 0x6B  // Address of the IMU device

void setup() {
  Wire.begin();        // Initialize I2C communication
  
  Serial.begin(9600);  // Initialize serial communication
}

void loop() {
  // Read STATUS_REG register
  Wire.beginTransmission(IMU_ADDRESS);
  Wire.write(0x1E);  // Address of the STATUS_REG register
  Wire.endTransmission(false);
  Wire.requestFrom(IMU_ADDRESS, 1);
  byte status = Wire.read();

  // Check if there is new accelerometer and gyroscope data available
  bool newDataAvailable = (status & 0x03) == 0x03;

  if (newDataAvailable) {
    // Read angular rate of pitch
    int pitch = readAxisData(0x22);  // OUTX_L_G register

    // Read angular rate of roll
    int roll = readAxisData(0x24);   // OUTY_L_G register

    // Read angular rate of yaw
    int yaw = readAxisData(0x26);    // OUTZ_L_G register

    // Read acceleration of X axis
    int accelX = readAxisData(0x28); // OUTX_L_A register

    // Read acceleration of Y axis
    int accelY = readAxisData(0x2A); // OUTY_L_A register

    // Read acceleration of Z axis
    int accelZ = readAxisData(0x2C); // OUTZ_L_A register

    // Print the values
    Serial.print("Pitch: ");
    Serial.println(pitch);
    Serial.print("Roll: ");
    Serial.println(roll);
    Serial.print("Yaw: ");
    Serial.println(yaw);
    Serial.print("Accel X: ");
    Serial.println(accelX);
    Serial.print("Accel Y: ");
    Serial.println(accelY);
    Serial.print("Accel Z: ");
    Serial.println(accelZ);
  }
  else {
    Serial.println("No new data");
  }
  delay(1000);  // Wait for 1 second before reading again
}
int readAxisData(uint8_t reg) {
  Wire.beginTransmission(IMU_ADDRESS);
  Wire.write(reg);
  Wire.endTransmission(false);
  Wire.requestFrom(IMU_ADDRESS, 2);

  // Read the 16-bit value
  int16_t value = Wire.read() | (Wire.read() << 8);

  if (value & (1 << 15)) {
      value = value - 65536; // If negative, convert to 16-bit value
    }

  return value;
}

What am I doing wrong? My end goal is to read and use the IMU accel and gyro values for dead reckoning.

1 REPLY 1
Federica Bossi
ST Employee

Hi @cloudymnms ,

Can you try to follow our official PID example on Github and let me know if you will be able to get the data? Thanks

In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.