Dima Dudin / MPU6050

Fork of MPU6050 by Stanislav Dudin

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MPU6050.cpp Source File

MPU6050.cpp

00001 #include "mbed.h"
00002 #include "MPU6050.h"
00003 
00004 #define ADDRESS 0xD1 //68 shifted left: 7-bit to 8-bit address conversion
00005 
00006 MPU6050::MPU6050(PinName sda, PinName scl):
00007     _MPU6050(sda, scl)
00008 {
00009     _MPU6050.frequency(400000);
00010 }
00011 
00012 void MPU6050::start(void)
00013 {
00014     write_reg(ADDRESS,MPU6050_PWR_MGMT_1,0x00);
00015     write_reg(ADDRESS,MPU6050_GYRO_CONFIG,0x00);//gyro +-500deg/s //0x10);//gyro +-1000deg/s
00016     write_reg(ADDRESS,MPU6050_ACCEL_CONFIG,0x00);//accel +-2G //0x08);//accel +-4G
00017     write_reg(ADDRESS,MPU6050_CONFIG,0x06);//2 - bandwidth 94Hz, delay 3 mS; 3 - bandwidth 44Hz, delay 5 mS; 4 - bandwidth 21Hz, delay 8.5 mS; 5 - bandwidth 10Hz, delay 14 mS
00018     write_reg(ADDRESS,MPU6050_SMPLRT_DIV,0x0);//sample rate 1000Hz (1000/5)
00019 }
00020 
00021 char MPU6050::getID(void)
00022 {
00023     char devID;
00024     read_reg(ADDRESS,MPU6050_WHO_AM_I,&devID);
00025     return devID;
00026 }
00027 
00028 bool MPU6050::read(float *gx, float *gy, float *gz,float *ax, float *ay, float *az)
00029 {
00030     char data[6];
00031     char data2[6];
00032     if (read_data(ADDRESS, MPU6050_GYRO_XOUT_H, data, 6)) {
00033         read_data(ADDRESS, MPU6050_ACCEL_XOUT_H, data2, 6);
00034         *gx = float(short(data[0] << 8 | data[1]))*2.663e-4/2; //rad/s
00035         *gy =  float(short(data[2] << 8 | data[3]))*2.663e-4/2;
00036         *gz =  float(short(data[4] << 8 | data[5]))*2.663e-4/2;
00037         *ax = float(short(data2[0] << 8 | data2[1]))*5.9875e-6; //m/s^2
00038         *ay =  float(short(data2[2] << 8 | data2[3]))*5.9875e-6;
00039         *az =  float(short(data2[4] << 8 | data2[5]))*5.9875e-6;
00040         return true;
00041     }
00042     return false;
00043 }
00044 
00045 bool MPU6050::readraw(int *gx, int *gy, int *gz,int *ax, int *ay, int *az)
00046 {
00047     char data[6];
00048     char data2[6];
00049     if (read_data(ADDRESS, MPU6050_GYRO_XOUT_H, data, 6)) {
00050         read_data(ADDRESS, MPU6050_ACCEL_XOUT_H, data2, 6);
00051         *gx = int(short(data[0] << 8 | data[1]));
00052         *gy =  int(short(data[2] << 8 | data[3]));
00053         *gz =  int(short(data[4] << 8 | data[5]));
00054         *ax = int(short(data2[0] << 8 | data2[1]));
00055         *ay =  int(short(data2[2] << 8 | data2[3]));
00056         *az =  int(short(data2[4] << 8 | data2[5]));
00057         return true;
00058     }
00059     return false;
00060 }
00061 
00062 bool MPU6050::write_reg(int addr_i2c,int addr_reg, char v)
00063 {
00064     char data[2] = {addr_reg, v};
00065     return MPU6050::_MPU6050.write(addr_i2c, data, 2) == 0;
00066 }
00067 
00068 bool MPU6050::read_reg(int addr_i2c,int addr_reg, char *v)
00069 {
00070     char data = addr_reg;
00071     bool result = false;
00072 //    __disable_irq();
00073     if ((_MPU6050.write(addr_i2c, &data, 1) == 0) && (_MPU6050.read(addr_i2c, &data, 1) == 0)) {
00074         *v = data;
00075         result = true;
00076     }
00077 //    __enable_irq();
00078     return result;
00079 }
00080 
00081 
00082 bool MPU6050::read_data(char sad, char sub, char *buf, int length)
00083 {
00084     if (length > 1) sub |= 0x80;
00085 
00086     return _MPU6050.write(sad, &sub, 1, true) == 0 && _MPU6050.read(sad, buf, length) == 0;
00087 }
00088 
00089 /* sample code for Nucleo-F042K6
00090 #include "mbed.h"
00091 #include "MPU6050.h"
00092 
00093 MPU6050 mpu(D7,D8);
00094 Serial pc(USBTX,USBRX);
00095 
00096 float gx,gy,gz,ax,ay,az;
00097 
00098 int main()
00099 {
00100     pc.baud(115200);
00101     if(mpu.getID()==0x68) {
00102         pc.printf("MPU6050 OK");
00103         wait(1);
00104     } else {
00105         pc.printf("MPU6050 error ID=0x%x\r\n",mpu.getID());
00106         while(1) {
00107         }
00108     }
00109     mpu.start();
00110     while(1) {
00111         mpu.read(&gx,&gy,&gz,&ax,&ay,&az);
00112         pc.printf("gx,gy,gz,ax,ay,az %.1f,%.1f,%.1f,%.2f,%.2f,%.2f\r\n",gx,gy,gz,ax,ay,az);
00113         wait(0.1);
00114     }
00115 }
00116 */