Log in

View Full Version : Help! Why Can't I Read Gyro Values Over the I2C Interface!


Brindlefly
06-02-2015, 21:20
We bought a MPU 6050 gyro/accelerometer from Sparkfun Electronics. The spec sheet says the I2C address is 0x68 and that the WhoAmI register is at adress 075. When we read from that address we get the expected output of 104 decimal (0x68). When we tried to read the gyro register, at 0x43 - 0x47, we only get zeros. When we try to read the temperature register, we also get zeros. Is there something we have to do to enable reporting of the values?


private I2C gyro = new I2C(I2C.Port.kOnboard, 0x68);

protected void initialize () {
gyro.write(0x6B, 0x80);
}

protected void execute () {
byte[] whoAmI = new byte[1];
gyro.read(0x75, 1, whoAmI);
System.out.println("WhoAmI: " + whoAmI[0]);

for (int i = 0x43; i <= 0x47; i += 0x02) {
byte[] angle = new byte[2];
gyro.read(i, 2, angle);

System.out.println(i + ": " + angle[0] + "" + angle[1]);
}
}

protected boolean isFinished () {
return false;
}

protected void end () {

}

protected void interrupted () {
end();
}

Ben Wolsieffer
06-02-2015, 21:38
Looking at this Arduino driver (https://github.com/jrowberg/i2cdevlib/blob/master/Arduino/MPU6050/MPU6050.cpp), I think you need to select a range for the gyro and possibly wake it from sleep. According to the register map (http://invensense.com/mems/gyro/documents/RM-MPU-6000A.pdf), that means writing 0 (250 degrees/sec), 1 (500 degrees/sec), 2 (1000 degrees/sec) or 3 (2000 degrees/sec) to bits 3-4 of the GYRO_CONFIG register (0x1B). To wake it from sleep, write a 0 to bit 6 of the PWR_MGMT_1 register (0x6B). You also might want to change the clock source to one of the gyros to increase accuracy.

Brindlefly
06-02-2015, 21:44
Thanks for your help. I will try tomorrow!

Brindlefly
07-02-2015, 10:21
Ok, now I am getting an output from the gyro but it changes only when you turn it and then it goes back to zero when it stops turning.


private I2C gyro = new I2C(I2C.Port.kOnboard, 0x68);

protected void initialize () {
gyro.write(0x6B, 0x03); // Power
gyro.write(0x1A, 0x1B); // Basic Config
gyro.write(0x1B, 0x18); // Gyro Config
}

protected void execute () {

byte[] angle = new byte[1];
gyro.read(0x47, 2, angle);

double rotation = (angle[1] << 8) | angle[0];

System.out.println("Rotation: " + rotation);
}

protected boolean isFinished () {
return false;
}

protected void end () {

}

protected void interrupted () {
end();
}

Brindlefly
07-02-2015, 10:55
Ok now I am adding up the values from the gyro to get degrees, but when the robot turns in the positive direction the value shoots up to the thousands, and in the positive direction it goes to -3 max.

Brindlefly
07-02-2015, 14:41
Ok I just figured it out. Here is the code for anyone who is interested.


private static double degrees = 0;

private I2C gyro = RobotMap.gyro;

public GyroSensor () {
gyro.write(0x6B, 0x03); // Power
gyro.write(0x1A, 0x18); // Basic Config
gyro.write(0x1B, 0x00); // Gyro Config
}

public double getDegrees (double deltaTime) {
byte[] angle = new byte[1];
gyro.read(0x47, 1, angle);

double rotation = (angle[0] * deltaTime) * 2;

degrees += rotation;

return -degrees;
}

EricS-Team180
08-02-2015, 21:43
Hey Thanks!
We were just looking for something like this <sweet> :cool:

David Lame
20-03-2016, 01:01
Bumping this year old thread to thank the authors. This came up on a google search, and it was part of what got me able to get my new mpu6050 working.