Go Down

Topic: mpu6050 problem (Read 30515 times) previous topic - next topic


Ok thank you. But how can I change the i2c address in 0x69?


That's why I added my own measurements to that page : http://playground.arduino.cc/Main/MPU-6050#measurements

Your values seem okay. If you want to know what they mean, you have to read the datasheet about bits and range.
For serious use, you can now move on to use the library by Jeff Rowberg. But you have to connect the INT to Arduino digital pin 2.

Another option you have is to use the FreeIMU library, which supports generic MPU6050 breakout boards.  Be sure to modify freeIMU.h, and comment out the line the by default sets to the libary to use FreeIMU hardware, and un-comment out the line that say GenericMPU6050.

I have used both Rowbergs code and the FreeIMU library.  They are both very good.  Here are few things to know about each to get them up and running.

Rowbergs code is designed to use I2CDev library and his code accesses the DMP (digital motion processor) on the MPU6050.  This offloads a lot of the motion calculations to the MPU6050 instead of your Arduino doing the calculations.  Getting your MPU6050 working with Rowberg's code is pretty easy, and the resulting data output from the DMP looks good.  It will output Yaw/Pitch/Roll, Euler Angles, and Accelerations from the accelerometer.

FreeIMU takes a little more work to get up and running, but not by much.  FreeIMU does not use the DMP, and comes with a library that uses a MARG orientation algorithm to calculate the Yaw/Pitch/Roll of your sensor.  FreeIMU comes with an older I2CDev library that does NOT work with Rowbergs DMP code.  So make sure you keep the I2CDev libararies separate somehow.  I name one directory I2CDev_Master and one I2CDev_FreeIMU.  Whichever code I am using (I often switch between the two for comparison) I rename to just I2CDev.  I am working on modifying the I2CDev libaries to work with both, but I am slow at it.  FreeIMU does not output just acclerations, it only uses the accelerometer to aid in determinging yaw/pitch/roll and Euler angles.  I may be wrong about that, as I need to spend more time looking at the examples and code, but from what I saw initially, I did not find anything in the code that would suggest it outputs accelerations on their own.  I am working on a sketch that integrates the FreeIMU code to get the yaw/pitch/roll and Rowberg's DMP code to get the acclerations. The problem has been the I2CDev versions that are incompatible.  The freeIMU libary's yaw/pitch/roll data seems to be stable and faster than using the DMP, which is why I want to use freeIMU's code for it.

Another thing to keep in mind is support.  I've emailed Jeff before with questions about quaternions and gymbal lock with respect to his code and he responded very quickly and was very helpful, so that is a bonus.  FreeIMU's founder Fabio Varesano sadly passed away last month so support for FreeIMU will only be from other users until/unless somebody else takes over FreeIMU and continues to develop it. 


Thank you so much for this reply. Also I have emailed to jeff, but he did't replie me yet. ok. let's try XD


Ok. I've modified the source and now Arduino can find my board, but it does the same value that the first sketch did... How is this possible?
Code: [Select]
Initializing I2C devices...
Testing device connections...
MPU6050 connection successful
a/g: -4488 244 17336 236 -134 -76
a/g: -4476 252 17184 259 -146 -78
a/g: -4436 368 17380 254 -162 -84
a/g: -4496 336 17364 250 -173 -62
a/g: -4544 200 17308 261 -189 -68


Looks like you are using the raw data example.  There is another example directory included called "DMP6 Example" or something like that.  That is the one that uses the DMP to process the data, and will allow you to output in degrees and accelerations instead of raw sensor values.


The DMP example code writes to the sensors FIFO buffer and uses an interrupt to notify the Arduino of incoming data.  You have to have the interrupt pin on your sensor board connected to pin #2 I think of your Arduino (at least for my Uno R3)


Ok. I've connected the pin 2 to the pin int of my board, but it doesn't change. :smiley-roll-blue: Howerever, now I want to try the "teapot" sketch, but I don't find the toxi libraries. Have you a dowload link for it?
Code: [Select]
import toxi.geom.*;
import toxi.processing.*;


Are you able to see anything at all in the serial monitor?  If you aren't seeing anything in the serial monitor, you will not be able to get the teapot sketch to work.  I never tried to get the teapot sketch to work and have never used processing for anything.  I just output the yaw/pitch/roll and accelerations and wrote some C# code to view it.  So I can't help you with getting that processing thing to work.

Here's a video of one of my C# programs using the output serial data.



wow! amazing! In serial monitor I read this:
Code: [Select]
Testing device connections...
MPU6050 connection successful
a/g: -1900 264 17964 250 -172 -72
a/g: -2024 140 17784 241 -160 -95
a/g: -1888 212 17700 228 -162 -93
a/g: -1932 172 17632 233 -170 -85
a/g: -1872 192 17880 239 -146 -94
a/g: -1952 184 17796 268 -175 -80
a/g: -1932 284 17880 254 -160 -87
a/g: -1984 288 17844 220 -191 -72
a/g: -1964 228 17872 249 -160 -83
The problem is that this values are strange and i can't use it... Can you understand them?


The first 3 sets of values are are the raw accelerometer values.    The 2nd set of 3 values looks to be the yaw/pitch/roll or Euler angles of the gyro.

The raw values for the accelerometer don't mean much.  I think the sensors are 16 bit, so a number between 0-65k.  Divide that by the G-range of the sensor.  By default I think it is 4.  Anyway, the DMP example has an option to enable real-world acceleration and/or readable acceleraction in G's instead of raw values. Read through the example code, you just have to un-comment a #define variable if I recall correctly.  If you post your code, I will point it out for you.


thanks for this so fast reply. My code is this:
Code: [Select]
// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#include "Wire.h"

// 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"

// 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;

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

#define LED_PIN 13
bool blinkState = false;

void setup() {
    // join I2C bus (I2Cdev library doesn't do this automatically)

    // 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)

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

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

    // 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);

    // display tab-separated accel/gyro x/y/z values
    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");

    // blink LED to indicate activity
    blinkState = !blinkState;
    digitalWrite(LED_PIN, blinkState);
It's the example of the library MPU6050 (https://github.com/jrowberg/i2cdevlib/blob/master/Arduino/MPU6050/Examples/MPU6050_DMP6/Processing/MPUTeapot.pde)


Yeah, that code is not using the DMP and is just returning raw values from the sensor.  So the sketch is working correctly.  If you want to output values that have units and mean something, try using this code.


This is the code that uses the DMP to output values in G-force and degrees of rotation.

The code you are using is just the individual raw values from the the accelerometer and gyro.  The DMP code uses a fusion algorithm use the data from both the acclerometer AND gyro together to get much more accurate accleration and angle measurements than you get from the individual sensors.  The calculations are being done on the DMP of the sensor though, so we can't really see what is going, its a black box to us.

The code from the FreeIMU library does not use the DMP, but uses its own fusion algorithm to determine the orientation of the sensor, and from what I can tell is at least as accurate and faster than the DMP code. 

I would start with getting the DMP code working first though and see if you are happy with it or not before moving on.

Good luck.


thank you very much but there's another prolem:
Code: [Select]
Initializing I2C devices...
Testing device connections...
MPU6050 connection successful

Send any character to begin DMP programming and demo:
Initializing DMP...
Enabling DMP...
Enabling interrupt detection (Arduino external interrupt 0)...
DMP ready! Waiting for first interrupt...
on the serial monitor I read this!!! :smiley-eek-blue: :smiley-eek-blue: :smiley-eek-blue:


You need to enter anything into the serial monitor and hit send.  It doesn't matter what you type, I usually type "1".  That should cause the program to start outputting values.  The default output is for the teapot processing program to use (i've never used it so i can't vouch that it works, but I assume it does).  It will look like gibberish and not mean anything to you.  There are several #define commands near the top-middle of the code that if you uncomment will output things like Quaternion, Euler Angle, Yaw/Pitch/Roll, Real-World Acceleration and Readable Acceleration (gravity compensated) values in the serial monitor instead.


I've just seen that Jeff had comment the information to obtain the values in degrees and g. Tomorrow I'm testing. Thank you very, very much for all this information.  :)

Go Up