MPU6050 (accelerometer)

Hi

I am currently doing a school projekt where i need to measure g-force. Therefore i want to find out how to get my measurements from the MPU6050 to show g-force.

My serial monitor shows weird number, and values i dont understand. accX: -2930 accY: -441 accZ: 15831

The numbers are average numbers

If you’d posted your code, it would’ve been easier to help, but if you place the device horizontally on a stationary surface, the Z axis should indicate the acceleration due to gravity, or about 10ms-2.
From that, you should be able to figure the correct scaling factor.

{

// I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files
// for both classes must be in the include path of your project
#include "I2Cdev.h"
#include "MPU6050.h"

// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
   #include "Wire.h"
#endif

// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for InvenSense evaluation board)
// AD0 high = 0x69
MPU6050 accelgyro;
//MPU6050 accelgyro(0x69); // <-- use for AD0 high

int16_t ax, ay, az;
int16_t gx, gy, gz;



// uncomment "OUTPUT_READABLE_ACCELGYRO" if you want to see a tab-separated
// list of the accel X/Y/Z and then gyro X/Y/Z values in decimal. Easy to read,
// not so easy to parse, and slow(er) over UART.
#define OUTPUT_READABLE_ACCELGYRO

// uncomment "OUTPUT_BINARY_ACCELGYRO" to send all 6 axes of data as 16-bit
// binary, one right after the other. This is very fast (as fast as possible
// without compression or data loss), and easy to parse, but impossible to read
// for a human.
//#define OUTPUT_BINARY_ACCELGYRO


#define LED_PIN 13
bool blinkState = false;

void setup() {
   // join I2C bus (I2Cdev library doesn't do this automatically)
   #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
       Wire.begin();
   #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
       Fastwire::setup(400, true);
   #endif

   // initialize serial communication
   // (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
   // it's really up to you depending on your project)
   Serial.begin(38400);

   // initialize device
   Serial.println("Initializing I2C devices...");
   accelgyro.initialize();

   // verify connection
   Serial.println("Testing device connections...");
   Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

   // use the code below to change accel/gyro offset values
  
   Serial.println("Updating internal sensor offsets...");
   // -76 -2359 1688 0 0 0
   Serial.print(accelgyro.getXAccelOffset()); Serial.print("\t"); // -29230
   Serial.print(accelgyro.getYAccelOffset()); Serial.print("\t"); // -441
   Serial.print(accelgyro.getZAccelOffset()); Serial.print("\t"); // 15831
   Serial.print(accelgyro.getXGyroOffset()); Serial.print("\t"); // 0
   Serial.print(accelgyro.getYGyroOffset()); Serial.print("\t"); // 0
   Serial.print(accelgyro.getZGyroOffset()); Serial.print("\t"); // 0
   Serial.print("\n");
   accelgyro.setXGyroOffset(220);
   accelgyro.setYGyroOffset(76);
   accelgyro.setZGyroOffset(-85);
   accelgyro.setXAccelOffset(-76);
   accelgyro.setYAccelOffset(-2359);
   accelgyro.setZAccelOffset(1688);
   Serial.print(accelgyro.getXAccelOffset()); Serial.print("\t"); // -29230
   Serial.print(accelgyro.getYAccelOffset()); Serial.print("\t"); // -441
   Serial.print(accelgyro.getZAccelOffset()); Serial.print("\t"); // 15831
   Serial.print(accelgyro.getXGyroOffset()); Serial.print("\t"); // 0
   Serial.print(accelgyro.getYGyroOffset()); Serial.print("\t"); // 0
   Serial.print(accelgyro.getZGyroOffset()); Serial.print("\t"); // 0
   Serial.print("\n");

   // configure Arduino LED for
   pinMode(LED_PIN, OUTPUT);
}

void loop() {
   // read raw accel/gyro measurements from device
   accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

   // these methods (and a few others) are also available
   //accelgyro.getAcceleration(&ax, &ay, &az);
   //accelgyro.getRotation(&gx, &gy, &gz);

   #ifdef OUTPUT_READABLE_ACCELGYRO
       // display tab-separated accel/gyro x/y/z values
       Serial.print("a/g:\t");
       Serial.print(ax); Serial.print("\t");
       Serial.print(ay); Serial.print("\t");
       Serial.print(az); Serial.print("\t");
       Serial.print(gx); Serial.print("\t");
       Serial.print(gy); Serial.print("\t");
       Serial.println(gz);
   #endif

   #ifdef OUTPUT_BINARY_ACCELGYRO
       Serial.write((uint8_t)(ax >> 8)); Serial.write((uint8_t)(ax & 0xFF));
       Serial.write((uint8_t)(ay >> 8)); Serial.write((uint8_t)(ay & 0xFF));
       Serial.write((uint8_t)(az >> 8)); Serial.write((uint8_t)(az & 0xFF));
       Serial.write((uint8_t)(gx >> 8)); Serial.write((uint8_t)(gx & 0xFF));
       Serial.write((uint8_t)(gy >> 8)); Serial.write((uint8_t)(gy & 0xFF));
       Serial.write((uint8_t)(gz >> 8)); Serial.write((uint8_t)(gz & 0xFF));
   #endif

   // blink LED to indicate activity
   blinkState = !blinkState;
   digitalWrite(LED_PIN, blinkState);
   delay(10);
}

Better?

Depending on the sensitivity (default is +-2g), the numbers represent the gravity within this range with an "int", ranging from -32768 (=-2g) to 32767 (=+2g).

15831 on your z axis means it measures 15831 / 32767 * 2 = 0.97g

Lars81: Depending on the sensitivity (default is +-2g), the numbers represent the gravity within this range with an "int", ranging from -32768 (=-2g) to 32767 (=+2g).

15831 on your z axis means it measures 15831 / 32767 * 2 = 0.97g

What about x and y then?

All three axes share the same scale.

But where do you get "32767" from? I understand the purpose of it, but i can not be the same for x and y? ex:-2930/32767*2=-0,017. Please help

0osimono0: But where do you get "32767" from? I understand the purpose of it, but i can not be the same for x and y? ex:-2930/32767*2=-0,017. Please help

The x and y axis are horizontal when the z axis reads almost 1g.

The measurements are stored as two byte signed integers, hence -32768 to 32767.

Lars81: The x and y axis are horizontal when the z axis reads almost 1g.

The measurements are stored as two byte signed integers, hence -32768 to 32767.

Do you happen to be danish? It would help me understand what you are saying :-)

0osimono0: Do you happen to be danish? It would help me understand what you are saying :-)

Norwegian, but this is really not complicated :).

Take the value, multiply with 4 (-2g to 2g) and divide by 2^16. You get the acceleration in g's for the respective axis.

Thank you!

Take the value, multiply with 4 (-2g to 2g) and divide by 2^16.

sp. “Take the value, multiply with 4 (-2g to 2g) and divide by 216”.