MPU-6050 Raw Data Conversion Accelerometer

Asked

Viewed 626 times

2

I am using an MPU6050 with Arduino UNO, however the values that this sensor displays are the raw values. I need the acceleration values for distance calculation, but I’m not getting the actual acceleration value.

These are some answers displayed by the sensor:

AcX = -13428 | AcY = 5280 | AcZ = -8384 | Tmp = 27.12 | GyX = -998 | GyY = -310 | GyZ = -86
AcX = -13120 | AcY = 5580 | AcZ = -7488 | Tmp = 27.07 | GyX = -269 | GyY = -203 | GyZ = -2
AcX = -13212 | AcY = 5444 | AcZ = -8396 | Tmp = 27.12 | GyX = -367 | GyY = -264 | GyZ = 135

Based on the sensor datasheet I divided the acceleration values by 16384 to test and the values become Ax=0.00 Ay=0.00 and Az=-1 I believe I did not do it correctly.

Would anyone know how to convert the gross values of acceleration to real values? Datasheet of the sensor: https://www.invensense.com/wp-content/uploads/2015/02/MPU-6000-Datasheet1.pdf

    //Carrega a biblioteca Wire
    #include<Wire.h>

    //Endereco I2C do MPU6050
    const int MPU=0x68;  
    //Variaveis para armazenar valores dos sensores
    int AcX=0,AcY=0,AcZ=0,Tmp=0,GyX=0,GyY=0,GyZ=0;

    void setup()
    {
      Serial.begin(9600);
      Wire.begin();
      Wire.beginTransmission(MPU);
      Wire.write(0x6B); 
      //Inicializa o MPU-6050
      Wire.write(0); 
      Wire.endTransmission(true); 
    }
    void loop()
    {
      Wire.beginTransmission(MPU);
      Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
      Wire.endTransmission(false);
      //Solicita os dados do sensor
      Wire.requestFrom(MPU,14,true);
      //Armazena o valor dos sensores nas variaveis correspondentes
      AcX=Wire.read()<<8|Wire.read();  //0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
      AcY=Wire.read()<<8|Wire.read();  //0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
      AcZ=Wire.read()<<8|Wire.read();  //0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
      Tmp=Wire.read()<<8|Wire.read();  //0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
      GyX=Wire.read()<<8|Wire.read();  //0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
      GyY=Wire.read()<<8|Wire.read();  //0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
      GyZ=Wire.read()<<8|Wire.read();  //0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

      //imprimindo os valores da aceleração lido pelo sensor antes do calculo.
      Serial.println("\n");
      Serial.print("AcX = "); Serial.print(AcX);
      //Envia valor Y do acelerometro para a serial
      Serial.print(" | AcY = "); Serial.print(AcY);
      //Envia valor Z do acelerometro para a serial
      Serial.print(" | AcZ = "); Serial.println(AcZ);
      Serial.println("\n");

      //calculo para converter o valor bruto do acelerometro
      float Ax=AcX/16384;
      float Ay=AcY/16384;
      float Az=AcZ/16384;

     //valor da aceleração após o cálculo.
      Serial.print("AcX = "); Serial.print(Ax);
      Serial.print(" | AcY = "); Serial.print(Ay);
      Serial.print(" | AcZ = "); Serial.print(Az);

      //Envia valor da temperatura para a serial 
      //Calcula a temperatura em graus Celsius
      Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);
      //Envia valor X do giroscopio para a serial 
      Serial.print(" | GyX = "); Serial.print(GyX);
      //Envia valor Y do giroscopio para a serial 
      Serial.print(" | GyY = "); Serial.print(GyY);
      //Envia valor Z do giroscopio para a serial
      Serial.print(" | GyZ = "); Serial.println(GyZ);

      //Aguarda 300 ms e reinicia o processo
      delay(400);
    }
  • 3

    It appears to be a problem not to be splitting like a float. I don’t know if it applies to your platform, but try "16384.0" instead of "16384". Maybe I need a cast

  • 4

    I wanted to understand the vote they gave to close as out of scope.

  • It worked, thanks for the tip, saved me!!!

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.