Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Java (http://www.chiefdelphi.com/forums/forumdisplay.php?f=184)
-   -   Help! Why Can't I Read Gyro Values Over the I2C Interface! (http://www.chiefdelphi.com/forums/showthread.php?t=134098)

Brindlefly 02-06-2015 09:20 PM

Help! Why Can't I Read Gyro Values Over the I2C Interface!
 
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?

Code:

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 02-06-2015 09:38 PM

Re: Help! Why Can't I Read Gyro Values Over the I2C Interface!
 
Looking at this Arduino driver, I think you need to select a range for the gyro and possibly wake it from sleep. According to the register map, 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 02-06-2015 09:44 PM

Re: Help! Why Can't I Read Gyro Values Over the I2C Interface!
 
Thanks for your help. I will try tomorrow!

Brindlefly 02-07-2015 10:21 AM

Re: Help! Why Can't I Read Gyro Values Over the I2C Interface!
 
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.

Code:

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 02-07-2015 10:55 AM

Re: Help! Why Can't I Read Gyro Values Over the I2C Interface!
 
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 02-07-2015 02:41 PM

Re: Help! Why Can't I Read Gyro Values Over the I2C Interface!
 
Ok I just figured it out. Here is the code for anyone who is interested.

Code:

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 02-08-2015 09:43 PM

Re: Help! Why Can't I Read Gyro Values Over the I2C Interface!
 
Hey Thanks!
We were just looking for something like this <sweet> :cool:

David Lame 03-20-2016 01:01 AM

Re: Help! Why Can't I Read Gyro Values Over the I2C Interface!
 
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.


All times are GMT -5. The time now is 07:54 AM.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi