program test MPU6050

Dependents:   ticker_test_mpu6050

Fork of MPU6050 by Erik -

Committer:
allanmarie
Date:
Tue Feb 17 18:29:16 2015 +0000
Revision:
3:09293fbaf92b
Parent:
1:a3366f09e95c
Child:
4:4926b02b5eab
Lecture capteur MPU6050 avec traitement de l'angle (Accelero+gyro) pour calculer l'angle estim?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 0:6757f7363a9f 1 /**
Sissors 0:6757f7363a9f 2 * Includes
Sissors 0:6757f7363a9f 3 */
Sissors 0:6757f7363a9f 4 #include "MPU6050.h"
Sissors 0:6757f7363a9f 5
Sissors 0:6757f7363a9f 6 MPU6050::MPU6050(PinName sda, PinName scl) : connection(sda, scl) {
Sissors 0:6757f7363a9f 7 this->setSleepMode(false);
Sissors 0:6757f7363a9f 8
Sissors 0:6757f7363a9f 9 //Initializations:
Sissors 0:6757f7363a9f 10 currentGyroRange = 0;
Sissors 0:6757f7363a9f 11 currentAcceleroRange=0;
Sissors 0:6757f7363a9f 12 }
Sissors 0:6757f7363a9f 13
Sissors 0:6757f7363a9f 14 //--------------------------------------------------
Sissors 0:6757f7363a9f 15 //-------------------General------------------------
Sissors 0:6757f7363a9f 16 //--------------------------------------------------
Sissors 0:6757f7363a9f 17
Sissors 0:6757f7363a9f 18 void MPU6050::write(char address, char data) {
Sissors 0:6757f7363a9f 19 char temp[2];
Sissors 0:6757f7363a9f 20 temp[0]=address;
Sissors 0:6757f7363a9f 21 temp[1]=data;
Sissors 0:6757f7363a9f 22
Sissors 0:6757f7363a9f 23 connection.write(MPU6050_ADDRESS * 2,temp,2);
Sissors 0:6757f7363a9f 24 }
Sissors 0:6757f7363a9f 25
Sissors 0:6757f7363a9f 26 char MPU6050::read(char address) {
Sissors 0:6757f7363a9f 27 char retval;
Sissors 0:6757f7363a9f 28 connection.write(MPU6050_ADDRESS * 2, &address, 1, true);
Sissors 0:6757f7363a9f 29 connection.read(MPU6050_ADDRESS * 2, &retval, 1);
Sissors 0:6757f7363a9f 30 return retval;
Sissors 0:6757f7363a9f 31 }
Sissors 0:6757f7363a9f 32
Sissors 0:6757f7363a9f 33 void MPU6050::read(char address, char *data, int length) {
Sissors 0:6757f7363a9f 34 connection.write(MPU6050_ADDRESS * 2, &address, 1, true);
Sissors 0:6757f7363a9f 35 connection.read(MPU6050_ADDRESS * 2, data, length);
Sissors 0:6757f7363a9f 36 }
Sissors 0:6757f7363a9f 37
Sissors 0:6757f7363a9f 38 void MPU6050::setSleepMode(bool state) {
Sissors 0:6757f7363a9f 39 char temp;
Sissors 0:6757f7363a9f 40 temp = this->read(MPU6050_PWR_MGMT_1_REG);
Sissors 0:6757f7363a9f 41 if (state == true)
Sissors 0:6757f7363a9f 42 temp |= 1<<MPU6050_SLP_BIT;
Sissors 0:6757f7363a9f 43 if (state == false)
Sissors 0:6757f7363a9f 44 temp &= ~(1<<MPU6050_SLP_BIT);
Sissors 0:6757f7363a9f 45 this->write(MPU6050_PWR_MGMT_1_REG, temp);
Sissors 0:6757f7363a9f 46 }
Sissors 0:6757f7363a9f 47
Sissors 0:6757f7363a9f 48 bool MPU6050::testConnection( void ) {
Sissors 0:6757f7363a9f 49 char temp;
allanmarie 3:09293fbaf92b 50 int i,isOK=1;
allanmarie 3:09293fbaf92b 51 char data;
allanmarie 3:09293fbaf92b 52 bool isFindSlave=false;
allanmarie 3:09293fbaf92b 53 printf("test I2C\n\r");
allanmarie 3:09293fbaf92b 54 for(i=1;i<127;i++)
allanmarie 3:09293fbaf92b 55 { wait(0.01);
allanmarie 3:09293fbaf92b 56 isOK=connection.read(i*2,&data,1,false);
allanmarie 3:09293fbaf92b 57 if(isOK==0){
allanmarie 3:09293fbaf92b 58 printf("slave I2C find : 0X%X\n\r",i);
allanmarie 3:09293fbaf92b 59 isFindSlave=true;
allanmarie 3:09293fbaf92b 60 }
allanmarie 3:09293fbaf92b 61
allanmarie 3:09293fbaf92b 62 }
allanmarie 3:09293fbaf92b 63 if(isFindSlave){
allanmarie 3:09293fbaf92b 64 temp = this->read(MPU6050_WHO_AM_I_REG);
allanmarie 3:09293fbaf92b 65 printf(" WHO AM I : 0X%X\n\r",temp);
allanmarie 3:09293fbaf92b 66 }
allanmarie 3:09293fbaf92b 67 else
allanmarie 3:09293fbaf92b 68 temp=1;
Sissors 0:6757f7363a9f 69 return (temp == (MPU6050_ADDRESS & 0xFE));
Sissors 0:6757f7363a9f 70 }
Sissors 0:6757f7363a9f 71
Sissors 0:6757f7363a9f 72 void MPU6050::setBW(char BW) {
Sissors 0:6757f7363a9f 73 char temp;
Sissors 0:6757f7363a9f 74 BW=BW & 0x07;
Sissors 0:6757f7363a9f 75 temp = this->read(MPU6050_CONFIG_REG);
Sissors 0:6757f7363a9f 76 temp &= 0xF8;
Sissors 0:6757f7363a9f 77 temp = temp + BW;
Sissors 0:6757f7363a9f 78 this->write(MPU6050_CONFIG_REG, temp);
Sissors 0:6757f7363a9f 79 }
Sissors 0:6757f7363a9f 80
Sissors 0:6757f7363a9f 81 void MPU6050::setI2CBypass(bool state) {
Sissors 0:6757f7363a9f 82 char temp;
Sissors 0:6757f7363a9f 83 temp = this->read(MPU6050_INT_PIN_CFG);
Sissors 0:6757f7363a9f 84 if (state == true)
Sissors 0:6757f7363a9f 85 temp |= 1<<MPU6050_BYPASS_BIT;
Sissors 0:6757f7363a9f 86 if (state == false)
Sissors 0:6757f7363a9f 87 temp &= ~(1<<MPU6050_BYPASS_BIT);
Sissors 0:6757f7363a9f 88 this->write(MPU6050_INT_PIN_CFG, temp);
Sissors 0:6757f7363a9f 89 }
Sissors 0:6757f7363a9f 90
Sissors 0:6757f7363a9f 91 //--------------------------------------------------
Sissors 0:6757f7363a9f 92 //----------------Accelerometer---------------------
Sissors 0:6757f7363a9f 93 //--------------------------------------------------
Sissors 0:6757f7363a9f 94
Sissors 0:6757f7363a9f 95 void MPU6050::setAcceleroRange( char range ) {
Sissors 0:6757f7363a9f 96 char temp;
Sissors 0:6757f7363a9f 97 range = range & 0x03;
Sissors 0:6757f7363a9f 98 currentAcceleroRange = range;
Sissors 0:6757f7363a9f 99
Sissors 0:6757f7363a9f 100 temp = this->read(MPU6050_ACCELERO_CONFIG_REG);
Sissors 0:6757f7363a9f 101 temp &= ~(3<<3);
Sissors 0:6757f7363a9f 102 temp = temp + (range<<3);
Sissors 0:6757f7363a9f 103 this->write(MPU6050_ACCELERO_CONFIG_REG, temp);
Sissors 0:6757f7363a9f 104 }
Sissors 0:6757f7363a9f 105
Sissors 0:6757f7363a9f 106 int MPU6050::getAcceleroRawX( void ) {
Sissors 0:6757f7363a9f 107 short retval;
Sissors 0:6757f7363a9f 108 char data[2];
Sissors 0:6757f7363a9f 109 this->read(MPU6050_ACCEL_XOUT_H_REG, data, 2);
Sissors 0:6757f7363a9f 110 retval = (data[0]<<8) + data[1];
Sissors 0:6757f7363a9f 111 return (int)retval;
Sissors 0:6757f7363a9f 112 }
Sissors 0:6757f7363a9f 113
Sissors 0:6757f7363a9f 114 int MPU6050::getAcceleroRawY( void ) {
Sissors 0:6757f7363a9f 115 short retval;
Sissors 0:6757f7363a9f 116 char data[2];
Sissors 0:6757f7363a9f 117 this->read(MPU6050_ACCEL_YOUT_H_REG, data, 2);
Sissors 0:6757f7363a9f 118 retval = (data[0]<<8) + data[1];
Sissors 0:6757f7363a9f 119 return (int)retval;
Sissors 0:6757f7363a9f 120 }
Sissors 0:6757f7363a9f 121
Sissors 0:6757f7363a9f 122 int MPU6050::getAcceleroRawZ( void ) {
Sissors 0:6757f7363a9f 123 short retval;
Sissors 0:6757f7363a9f 124 char data[2];
Sissors 0:6757f7363a9f 125 this->read(MPU6050_ACCEL_ZOUT_H_REG, data, 2);
Sissors 0:6757f7363a9f 126 retval = (data[0]<<8) + data[1];
Sissors 0:6757f7363a9f 127 return (int)retval;
Sissors 0:6757f7363a9f 128 }
Sissors 0:6757f7363a9f 129
Sissors 0:6757f7363a9f 130 void MPU6050::getAcceleroRaw( int *data ) {
Sissors 0:6757f7363a9f 131 char temp[6];
Sissors 0:6757f7363a9f 132 this->read(MPU6050_ACCEL_XOUT_H_REG, temp, 6);
Sissors 0:6757f7363a9f 133 data[0] = (int)(short)((temp[0]<<8) + temp[1]);
Sissors 0:6757f7363a9f 134 data[1] = (int)(short)((temp[2]<<8) + temp[3]);
Sissors 0:6757f7363a9f 135 data[2] = (int)(short)((temp[4]<<8) + temp[5]);
Sissors 0:6757f7363a9f 136 }
Sissors 0:6757f7363a9f 137
Sissors 0:6757f7363a9f 138 void MPU6050::getAccelero( float *data ) {
Sissors 0:6757f7363a9f 139 int temp[3];
Sissors 0:6757f7363a9f 140 this->getAcceleroRaw(temp);
Sissors 0:6757f7363a9f 141 if (currentAcceleroRange == MPU6050_ACCELERO_RANGE_2G) {
Sissors 0:6757f7363a9f 142 data[0]=(float)temp[0] / 16384.0 * 9.81;
Sissors 0:6757f7363a9f 143 data[1]=(float)temp[1] / 16384.0 * 9.81;
Sissors 0:6757f7363a9f 144 data[2]=(float)temp[2] / 16384.0 * 9.81;
Sissors 0:6757f7363a9f 145 }
Sissors 0:6757f7363a9f 146 if (currentAcceleroRange == MPU6050_ACCELERO_RANGE_4G){
Sissors 0:6757f7363a9f 147 data[0]=(float)temp[0] / 8192.0 * 9.81;
Sissors 0:6757f7363a9f 148 data[1]=(float)temp[1] / 8192.0 * 9.81;
Sissors 0:6757f7363a9f 149 data[2]=(float)temp[2] / 8192.0 * 9.81;
Sissors 0:6757f7363a9f 150 }
Sissors 0:6757f7363a9f 151 if (currentAcceleroRange == MPU6050_ACCELERO_RANGE_8G){
Sissors 0:6757f7363a9f 152 data[0]=(float)temp[0] / 4096.0 * 9.81;
Sissors 0:6757f7363a9f 153 data[1]=(float)temp[1] / 4096.0 * 9.81;
Sissors 0:6757f7363a9f 154 data[2]=(float)temp[2] / 4096.0 * 9.81;
Sissors 0:6757f7363a9f 155 }
Sissors 0:6757f7363a9f 156 if (currentAcceleroRange == MPU6050_ACCELERO_RANGE_16G){
Sissors 0:6757f7363a9f 157 data[0]=(float)temp[0] / 2048.0 * 9.81;
Sissors 0:6757f7363a9f 158 data[1]=(float)temp[1] / 2048.0 * 9.81;
Sissors 0:6757f7363a9f 159 data[2]=(float)temp[2] / 2048.0 * 9.81;
Sissors 0:6757f7363a9f 160 }
Sissors 0:6757f7363a9f 161
Sissors 0:6757f7363a9f 162 #ifdef DOUBLE_ACCELERO
Sissors 0:6757f7363a9f 163 data[0]*=2;
Sissors 0:6757f7363a9f 164 data[1]*=2;
Sissors 0:6757f7363a9f 165 data[2]*=2;
Sissors 0:6757f7363a9f 166 #endif
Sissors 0:6757f7363a9f 167 }
Sissors 0:6757f7363a9f 168
Sissors 0:6757f7363a9f 169 //--------------------------------------------------
Sissors 0:6757f7363a9f 170 //------------------Gyroscope-----------------------
Sissors 0:6757f7363a9f 171 //--------------------------------------------------
Sissors 0:6757f7363a9f 172 void MPU6050::setGyroRange( char range ) {
Sissors 0:6757f7363a9f 173 char temp;
Sissors 0:6757f7363a9f 174 currentGyroRange = range;
Sissors 0:6757f7363a9f 175 range = range & 0x03;
Sissors 0:6757f7363a9f 176 temp = this->read(MPU6050_GYRO_CONFIG_REG);
Sissors 0:6757f7363a9f 177 temp &= ~(3<<3);
Sissors 0:6757f7363a9f 178 temp = temp + range<<3;
Sissors 0:6757f7363a9f 179 this->write(MPU6050_GYRO_CONFIG_REG, temp);
Sissors 0:6757f7363a9f 180 }
Sissors 0:6757f7363a9f 181
Sissors 0:6757f7363a9f 182 int MPU6050::getGyroRawX( void ) {
Sissors 0:6757f7363a9f 183 short retval;
Sissors 0:6757f7363a9f 184 char data[2];
Sissors 0:6757f7363a9f 185 this->read(MPU6050_GYRO_XOUT_H_REG, data, 2);
Sissors 0:6757f7363a9f 186 retval = (data[0]<<8) + data[1];
Sissors 0:6757f7363a9f 187 return (int)retval;
Sissors 0:6757f7363a9f 188 }
Sissors 0:6757f7363a9f 189
Sissors 0:6757f7363a9f 190 int MPU6050::getGyroRawY( void ) {
Sissors 0:6757f7363a9f 191 short retval;
Sissors 0:6757f7363a9f 192 char data[2];
Sissors 0:6757f7363a9f 193 this->read(MPU6050_GYRO_YOUT_H_REG, data, 2);
Sissors 0:6757f7363a9f 194 retval = (data[0]<<8) + data[1];
Sissors 0:6757f7363a9f 195 return (int)retval;
Sissors 0:6757f7363a9f 196 }
Sissors 0:6757f7363a9f 197
Sissors 0:6757f7363a9f 198 int MPU6050::getGyroRawZ( void ) {
Sissors 0:6757f7363a9f 199 short retval;
Sissors 0:6757f7363a9f 200 char data[2];
Sissors 0:6757f7363a9f 201 this->read(MPU6050_GYRO_ZOUT_H_REG, data, 2);
Sissors 0:6757f7363a9f 202 retval = (data[0]<<8) + data[1];
Sissors 0:6757f7363a9f 203 return (int)retval;
Sissors 0:6757f7363a9f 204 }
Sissors 0:6757f7363a9f 205
Sissors 0:6757f7363a9f 206 void MPU6050::getGyroRaw( int *data ) {
Sissors 0:6757f7363a9f 207 char temp[6];
Sissors 0:6757f7363a9f 208 this->read(MPU6050_GYRO_XOUT_H_REG, temp, 6);
Sissors 0:6757f7363a9f 209 data[0] = (int)(short)((temp[0]<<8) + temp[1]);
Sissors 0:6757f7363a9f 210 data[1] = (int)(short)((temp[2]<<8) + temp[3]);
Sissors 0:6757f7363a9f 211 data[2] = (int)(short)((temp[4]<<8) + temp[5]);
Sissors 0:6757f7363a9f 212 }
Sissors 0:6757f7363a9f 213
Sissors 0:6757f7363a9f 214 void MPU6050::getGyro( float *data ) {
Sissors 0:6757f7363a9f 215 int temp[3];
Sissors 0:6757f7363a9f 216 this->getGyroRaw(temp);
Sissors 1:a3366f09e95c 217 if (currentGyroRange == MPU6050_GYRO_RANGE_250) {
Sissors 0:6757f7363a9f 218 data[0]=(float)temp[0] / 7505.7;
Sissors 0:6757f7363a9f 219 data[1]=(float)temp[1] / 7505.7;
Sissors 0:6757f7363a9f 220 data[2]=(float)temp[2] / 7505.7;
Sissors 0:6757f7363a9f 221 }
Sissors 1:a3366f09e95c 222 if (currentGyroRange == MPU6050_GYRO_RANGE_500){
Sissors 0:6757f7363a9f 223 data[0]=(float)temp[0] / 3752.9;
Sissors 0:6757f7363a9f 224 data[1]=(float)temp[1] / 3752.9;
Sissors 0:6757f7363a9f 225 data[2]=(float)temp[2] / 3752.9;
Sissors 0:6757f7363a9f 226 }
Sissors 1:a3366f09e95c 227 if (currentGyroRange == MPU6050_GYRO_RANGE_1000){
Sissors 0:6757f7363a9f 228 data[0]=(float)temp[0] / 1879.3;;
Sissors 0:6757f7363a9f 229 data[1]=(float)temp[1] / 1879.3;
Sissors 0:6757f7363a9f 230 data[2]=(float)temp[2] / 1879.3;
Sissors 0:6757f7363a9f 231 }
Sissors 1:a3366f09e95c 232 if (currentGyroRange == MPU6050_GYRO_RANGE_2000){
Sissors 0:6757f7363a9f 233 data[0]=(float)temp[0] / 939.7;
Sissors 0:6757f7363a9f 234 data[1]=(float)temp[1] / 939.7;
Sissors 0:6757f7363a9f 235 data[2]=(float)temp[2] / 939.7;
Sissors 0:6757f7363a9f 236 }
Sissors 0:6757f7363a9f 237 }
Sissors 0:6757f7363a9f 238 //--------------------------------------------------
Sissors 0:6757f7363a9f 239 //-------------------Temperature--------------------
Sissors 0:6757f7363a9f 240 //--------------------------------------------------
Sissors 0:6757f7363a9f 241 int MPU6050::getTempRaw( void ) {
Sissors 0:6757f7363a9f 242 short retval;
Sissors 0:6757f7363a9f 243 char data[2];
Sissors 0:6757f7363a9f 244 this->read(MPU6050_TEMP_H_REG, data, 2);
Sissors 0:6757f7363a9f 245 retval = (data[0]<<8) + data[1];
Sissors 0:6757f7363a9f 246 return (int)retval;
Sissors 0:6757f7363a9f 247 }
Sissors 0:6757f7363a9f 248
Sissors 0:6757f7363a9f 249 float MPU6050::getTemp( void ) {
Sissors 0:6757f7363a9f 250 float retval;
Sissors 0:6757f7363a9f 251 retval=(float)this->getTempRaw();
Sissors 0:6757f7363a9f 252 retval=(retval+521.0)/340.0+35.0;
Sissors 0:6757f7363a9f 253 return retval;
Sissors 0:6757f7363a9f 254 }
Sissors 0:6757f7363a9f 255