Added for gyro and testing

Committer:
moklumbys
Date:
Fri Feb 13 01:16:00 2015 +0000
Revision:
8:b1570b99df9e
Parent:
7:56e591a74939
Child:
9:898effccce30
Added one more function, which allows enabling interrupts on Int pin. Now we can gather data only when it is received. Next maybe possible to define time period for getting data...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 1:a3366f09e95c 1 /*Use #define MPU6050_ES before you include this file if you have an engineering sample (older EVBs will have them), to find out if you have one, check your accelerometer output.
Sissors 0:6757f7363a9f 2 If it is half of what you expected, and you still are on the correct planet, you got an engineering sample
Sissors 0:6757f7363a9f 3 */
Sissors 0:6757f7363a9f 4
Sissors 0:6757f7363a9f 5
Sissors 0:6757f7363a9f 6 #ifndef MPU6050_H
Sissors 0:6757f7363a9f 7 #define MPU6050_H
Sissors 0:6757f7363a9f 8
Sissors 0:6757f7363a9f 9 /**
Sissors 0:6757f7363a9f 10 * Includes
Sissors 0:6757f7363a9f 11 */
Sissors 0:6757f7363a9f 12 #include "mbed.h"
Sissors 1:a3366f09e95c 13
Sissors 0:6757f7363a9f 14
Sissors 0:6757f7363a9f 15 /**
Sissors 0:6757f7363a9f 16 * Defines
Sissors 0:6757f7363a9f 17 */
Sissors 1:a3366f09e95c 18 #ifndef MPU6050_ADDRESS
moklumbys 3:187152513f8d 19 #define MPU6050_ADDRESS 0x68 // address pin low (GND), default for InvenSense evaluation board
Sissors 1:a3366f09e95c 20 #endif
Sissors 1:a3366f09e95c 21
Sissors 0:6757f7363a9f 22 #ifdef MPU6050_ES
Sissors 0:6757f7363a9f 23 #define DOUBLE_ACCELERO
Sissors 0:6757f7363a9f 24 #endif
Sissors 0:6757f7363a9f 25
Sissors 0:6757f7363a9f 26 /**
Sissors 0:6757f7363a9f 27 * Registers
Sissors 0:6757f7363a9f 28 */
Sissors 0:6757f7363a9f 29 #define MPU6050_CONFIG_REG 0x1A
Sissors 0:6757f7363a9f 30 #define MPU6050_GYRO_CONFIG_REG 0x1B
Sissors 0:6757f7363a9f 31 #define MPU6050_ACCELERO_CONFIG_REG 0x1C
Sissors 0:6757f7363a9f 32
Sissors 0:6757f7363a9f 33 #define MPU6050_INT_PIN_CFG 0x37
Sissors 0:6757f7363a9f 34
Sissors 0:6757f7363a9f 35 #define MPU6050_ACCEL_XOUT_H_REG 0x3B
Sissors 0:6757f7363a9f 36 #define MPU6050_ACCEL_YOUT_H_REG 0x3D
Sissors 0:6757f7363a9f 37 #define MPU6050_ACCEL_ZOUT_H_REG 0x3F
Sissors 0:6757f7363a9f 38
Sissors 0:6757f7363a9f 39 #define MPU6050_TEMP_H_REG 0x41
Sissors 0:6757f7363a9f 40
Sissors 0:6757f7363a9f 41 #define MPU6050_GYRO_XOUT_H_REG 0x43
Sissors 0:6757f7363a9f 42 #define MPU6050_GYRO_YOUT_H_REG 0x45
Sissors 0:6757f7363a9f 43 #define MPU6050_GYRO_ZOUT_H_REG 0x47
Sissors 0:6757f7363a9f 44
Sissors 0:6757f7363a9f 45
Sissors 0:6757f7363a9f 46
Sissors 0:6757f7363a9f 47 #define MPU6050_PWR_MGMT_1_REG 0x6B
Sissors 0:6757f7363a9f 48 #define MPU6050_WHO_AM_I_REG 0x75
Sissors 0:6757f7363a9f 49
Sissors 0:6757f7363a9f 50
Sissors 0:6757f7363a9f 51
Sissors 0:6757f7363a9f 52 /**
Sissors 0:6757f7363a9f 53 * Definitions
Sissors 0:6757f7363a9f 54 */
Sissors 0:6757f7363a9f 55 #define MPU6050_SLP_BIT 6
Sissors 0:6757f7363a9f 56 #define MPU6050_BYPASS_BIT 1
Sissors 0:6757f7363a9f 57
Sissors 0:6757f7363a9f 58 #define MPU6050_BW_256 0
Sissors 0:6757f7363a9f 59 #define MPU6050_BW_188 1
Sissors 0:6757f7363a9f 60 #define MPU6050_BW_98 2
Sissors 0:6757f7363a9f 61 #define MPU6050_BW_42 3
Sissors 0:6757f7363a9f 62 #define MPU6050_BW_20 4
Sissors 0:6757f7363a9f 63 #define MPU6050_BW_10 5
Sissors 0:6757f7363a9f 64 #define MPU6050_BW_5 6
Sissors 0:6757f7363a9f 65
Sissors 0:6757f7363a9f 66 #define MPU6050_ACCELERO_RANGE_2G 0
Sissors 0:6757f7363a9f 67 #define MPU6050_ACCELERO_RANGE_4G 1
Sissors 0:6757f7363a9f 68 #define MPU6050_ACCELERO_RANGE_8G 2
Sissors 0:6757f7363a9f 69 #define MPU6050_ACCELERO_RANGE_16G 3
Sissors 0:6757f7363a9f 70
Sissors 0:6757f7363a9f 71 #define MPU6050_GYRO_RANGE_250 0
Sissors 0:6757f7363a9f 72 #define MPU6050_GYRO_RANGE_500 1
Sissors 0:6757f7363a9f 73 #define MPU6050_GYRO_RANGE_1000 2
Sissors 0:6757f7363a9f 74 #define MPU6050_GYRO_RANGE_2000 3
Sissors 0:6757f7363a9f 75
moklumbys 8:b1570b99df9e 76
moklumbys 8:b1570b99df9e 77 #define MPU6050_RA_INT_ENABLE 0x38 //interrupt address
moklumbys 8:b1570b99df9e 78
moklumbys 4:268d3fcb92ba 79 //define how the accelerometer is placed on surface
moklumbys 4:268d3fcb92ba 80 #define X_AXIS 1
moklumbys 4:268d3fcb92ba 81 #define Y_AXIS 2
moklumbys 4:268d3fcb92ba 82 #define Z_AXIS 0
Sissors 0:6757f7363a9f 83
moklumbys 6:502448484f91 84 #define RADIANS_TO_DEGREES 180/3.1415926536
moklumbys 6:502448484f91 85
moklumbys 7:56e591a74939 86 #define ALPHA 0.97 //filter constant
moklumbys 7:56e591a74939 87
moklumbys 7:56e591a74939 88 #define GYRO_SCALE 2.31 //scale the gyro
moklumbys 7:56e591a74939 89
Sissors 2:5c63e20c50f3 90 /** MPU6050 IMU library.
Sissors 2:5c63e20c50f3 91 *
Sissors 2:5c63e20c50f3 92 * Example:
Sissors 2:5c63e20c50f3 93 * @code
Sissors 2:5c63e20c50f3 94 * Later, maybe
Sissors 2:5c63e20c50f3 95 * @endcode
Sissors 2:5c63e20c50f3 96 */
Sissors 0:6757f7363a9f 97 class MPU6050 {
Sissors 0:6757f7363a9f 98 public:
Sissors 0:6757f7363a9f 99 /**
Sissors 0:6757f7363a9f 100 * Constructor.
Sissors 0:6757f7363a9f 101 *
Sissors 0:6757f7363a9f 102 * Sleep mode of MPU6050 is immediatly disabled
Sissors 0:6757f7363a9f 103 *
Sissors 0:6757f7363a9f 104 * @param sda - mbed pin to use for the SDA I2C line.
Sissors 0:6757f7363a9f 105 * @param scl - mbed pin to use for the SCL I2C line.
Sissors 0:6757f7363a9f 106 */
Sissors 0:6757f7363a9f 107 MPU6050(PinName sda, PinName scl);
Sissors 0:6757f7363a9f 108
Sissors 0:6757f7363a9f 109
Sissors 0:6757f7363a9f 110 /**
Sissors 0:6757f7363a9f 111 * Tests the I2C connection by reading the WHO_AM_I register.
Sissors 0:6757f7363a9f 112 *
Sissors 0:6757f7363a9f 113 * @return True for a working connection, false for an error
Sissors 0:6757f7363a9f 114 */
Sissors 0:6757f7363a9f 115 bool testConnection( void );
Sissors 0:6757f7363a9f 116
Sissors 0:6757f7363a9f 117 /**
Sissors 0:6757f7363a9f 118 * Sets the bandwidth of the digital low-pass filter
Sissors 0:6757f7363a9f 119 *
Sissors 0:6757f7363a9f 120 * Macros: MPU6050_BW_256 - MPU6050_BW_188 - MPU6050_BW_98 - MPU6050_BW_42 - MPU6050_BW_20 - MPU6050_BW_10 - MPU6050_BW_5
Sissors 0:6757f7363a9f 121 * Last number is the gyro's BW in Hz (accelero BW is virtually identical)
Sissors 0:6757f7363a9f 122 *
Sissors 0:6757f7363a9f 123 * @param BW - The three bits that set the bandwidth (use the predefined macros)
Sissors 0:6757f7363a9f 124 */
Sissors 0:6757f7363a9f 125 void setBW( char BW );
Sissors 0:6757f7363a9f 126
Sissors 0:6757f7363a9f 127 /**
Sissors 0:6757f7363a9f 128 * Sets the auxiliary I2C bus in bypass mode to read the sensors behind the MPU6050 (useful for eval board, otherwise just connect them to primary I2C bus)
Sissors 0:6757f7363a9f 129 *
Sissors 0:6757f7363a9f 130 * @param state - Enables/disables the I2C bypass mode
Sissors 0:6757f7363a9f 131 */
Sissors 0:6757f7363a9f 132 void setI2CBypass ( bool state );
Sissors 0:6757f7363a9f 133
Sissors 0:6757f7363a9f 134 /**
Sissors 0:6757f7363a9f 135 * Sets the Accelero full-scale range
Sissors 0:6757f7363a9f 136 *
Sissors 0:6757f7363a9f 137 * Macros: MPU6050_ACCELERO_RANGE_2G - MPU6050_ACCELERO_RANGE_4G - MPU6050_ACCELERO_RANGE_8G - MPU6050_ACCELERO_RANGE_16G
Sissors 0:6757f7363a9f 138 *
Sissors 0:6757f7363a9f 139 * @param range - The two bits that set the full-scale range (use the predefined macros)
Sissors 0:6757f7363a9f 140 */
Sissors 0:6757f7363a9f 141 void setAcceleroRange(char range);
Sissors 0:6757f7363a9f 142
Sissors 0:6757f7363a9f 143 /**
Sissors 0:6757f7363a9f 144 * Reads the accelero x-axis.
Sissors 0:6757f7363a9f 145 *
Sissors 0:6757f7363a9f 146 * @return 16-bit signed integer x-axis accelero data
Sissors 0:6757f7363a9f 147 */
Sissors 0:6757f7363a9f 148 int getAcceleroRawX( void );
Sissors 0:6757f7363a9f 149
Sissors 0:6757f7363a9f 150 /**
Sissors 0:6757f7363a9f 151 * Reads the accelero y-axis.
Sissors 0:6757f7363a9f 152 *
Sissors 0:6757f7363a9f 153 * @return 16-bit signed integer y-axis accelero data
Sissors 0:6757f7363a9f 154 */
Sissors 0:6757f7363a9f 155 int getAcceleroRawY( void );
Sissors 0:6757f7363a9f 156
Sissors 0:6757f7363a9f 157 /**
Sissors 0:6757f7363a9f 158 * Reads the accelero z-axis.
Sissors 0:6757f7363a9f 159 *
Sissors 0:6757f7363a9f 160 * @return 16-bit signed integer z-axis accelero data
Sissors 0:6757f7363a9f 161 */
Sissors 0:6757f7363a9f 162 int getAcceleroRawZ( void );
Sissors 0:6757f7363a9f 163
Sissors 0:6757f7363a9f 164 /**
Sissors 0:6757f7363a9f 165 * Reads all accelero data.
Sissors 0:6757f7363a9f 166 *
Sissors 0:6757f7363a9f 167 * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z
Sissors 0:6757f7363a9f 168 */
Sissors 0:6757f7363a9f 169 void getAcceleroRaw( int *data );
Sissors 0:6757f7363a9f 170
Sissors 0:6757f7363a9f 171 /**
Sissors 0:6757f7363a9f 172 * Reads all accelero data, gives the acceleration in m/s2
Sissors 0:6757f7363a9f 173 *
Sissors 0:6757f7363a9f 174 * Function uses the last setup value of the full scale range, if you manually set in another range, this won't work.
Sissors 0:6757f7363a9f 175 *
Sissors 0:6757f7363a9f 176 * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z
Sissors 0:6757f7363a9f 177 */
Sissors 0:6757f7363a9f 178 void getAccelero( float *data );
Sissors 0:6757f7363a9f 179
Sissors 0:6757f7363a9f 180 /**
Sissors 0:6757f7363a9f 181 * Sets the Gyro full-scale range
Sissors 0:6757f7363a9f 182 *
Sissors 0:6757f7363a9f 183 * Macros: MPU6050_GYRO_RANGE_250 - MPU6050_GYRO_RANGE_500 - MPU6050_GYRO_RANGE_1000 - MPU6050_GYRO_RANGE_2000
Sissors 0:6757f7363a9f 184 *
Sissors 0:6757f7363a9f 185 * @param range - The two bits that set the full-scale range (use the predefined macros)
Sissors 0:6757f7363a9f 186 */
Sissors 0:6757f7363a9f 187 void setGyroRange(char range);
Sissors 0:6757f7363a9f 188
Sissors 0:6757f7363a9f 189 /**
Sissors 0:6757f7363a9f 190 * Reads the gyro x-axis.
Sissors 0:6757f7363a9f 191 *
Sissors 0:6757f7363a9f 192 * @return 16-bit signed integer x-axis gyro data
Sissors 0:6757f7363a9f 193 */
Sissors 0:6757f7363a9f 194 int getGyroRawX( void );
Sissors 0:6757f7363a9f 195
Sissors 0:6757f7363a9f 196 /**
Sissors 0:6757f7363a9f 197 * Reads the gyro y-axis.
Sissors 0:6757f7363a9f 198 *
Sissors 0:6757f7363a9f 199 * @return 16-bit signed integer y-axis gyro data
Sissors 0:6757f7363a9f 200 */
Sissors 0:6757f7363a9f 201 int getGyroRawY( void );
Sissors 0:6757f7363a9f 202
Sissors 0:6757f7363a9f 203 /**
Sissors 0:6757f7363a9f 204 * Reads the gyro z-axis.
Sissors 0:6757f7363a9f 205 *
Sissors 0:6757f7363a9f 206 * @return 16-bit signed integer z-axis gyro data
Sissors 0:6757f7363a9f 207 */
Sissors 0:6757f7363a9f 208 int getGyroRawZ( void );
Sissors 0:6757f7363a9f 209
Sissors 0:6757f7363a9f 210 /**
Sissors 0:6757f7363a9f 211 * Reads all gyro data.
Sissors 0:6757f7363a9f 212 *
Sissors 0:6757f7363a9f 213 * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z
Sissors 0:6757f7363a9f 214 */
Sissors 0:6757f7363a9f 215 void getGyroRaw( int *data );
Sissors 0:6757f7363a9f 216
Sissors 0:6757f7363a9f 217 /**
Sissors 0:6757f7363a9f 218 * Reads all gyro data, gives the gyro in rad/s
Sissors 0:6757f7363a9f 219 *
Sissors 0:6757f7363a9f 220 * Function uses the last setup value of the full scale range, if you manually set in another range, this won't work.
Sissors 0:6757f7363a9f 221 *
Sissors 0:6757f7363a9f 222 * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z
Sissors 0:6757f7363a9f 223 */
Sissors 0:6757f7363a9f 224 void getGyro( float *data);
Sissors 0:6757f7363a9f 225
Sissors 0:6757f7363a9f 226 /**
Sissors 0:6757f7363a9f 227 * Reads temperature data.
Sissors 0:6757f7363a9f 228 *
Sissors 0:6757f7363a9f 229 * @return 16 bit signed integer with the raw temperature register value
Sissors 0:6757f7363a9f 230 */
Sissors 0:6757f7363a9f 231 int getTempRaw( void );
Sissors 0:6757f7363a9f 232
Sissors 0:6757f7363a9f 233 /**
Sissors 0:6757f7363a9f 234 * Returns current temperature
Sissors 0:6757f7363a9f 235 *
Sissors 0:6757f7363a9f 236 * @returns float with the current temperature
Sissors 0:6757f7363a9f 237 */
Sissors 0:6757f7363a9f 238 float getTemp( void );
Sissors 0:6757f7363a9f 239
Sissors 0:6757f7363a9f 240 /**
Sissors 0:6757f7363a9f 241 * Sets the sleep mode of the MPU6050
Sissors 0:6757f7363a9f 242 *
Sissors 0:6757f7363a9f 243 * @param state - true for sleeping, false for wake up
Sissors 0:6757f7363a9f 244 */
Sissors 0:6757f7363a9f 245 void setSleepMode( bool state );
Sissors 0:6757f7363a9f 246
Sissors 0:6757f7363a9f 247
Sissors 0:6757f7363a9f 248 /**
Sissors 0:6757f7363a9f 249 * Writes data to the device, could be private, but public is handy so you can transmit directly to the MPU.
Sissors 0:6757f7363a9f 250 *
Sissors 0:6757f7363a9f 251 * @param adress - register address to write to
Sissors 0:6757f7363a9f 252 * @param data - data to write
Sissors 0:6757f7363a9f 253 */
Sissors 0:6757f7363a9f 254 void write( char address, char data);
Sissors 0:6757f7363a9f 255
Sissors 0:6757f7363a9f 256 /**
Sissors 0:6757f7363a9f 257 * Read data from the device, could be private, but public is handy so you can transmit directly to the MPU.
Sissors 0:6757f7363a9f 258 *
Sissors 0:6757f7363a9f 259 * @param adress - register address to write to
Sissors 0:6757f7363a9f 260 * @return - data from the register specified by RA
Sissors 0:6757f7363a9f 261 */
Sissors 0:6757f7363a9f 262 char read( char adress);
Sissors 0:6757f7363a9f 263
Sissors 0:6757f7363a9f 264 /**
Sissors 0:6757f7363a9f 265 * Read multtiple regigsters from the device, more efficient than using multiple normal reads.
Sissors 0:6757f7363a9f 266 *
Sissors 0:6757f7363a9f 267 * @param adress - register address to write to
Sissors 0:6757f7363a9f 268 * @param length - number of bytes to read
Sissors 0:6757f7363a9f 269 * @param data - pointer where the data needs to be written to
Sissors 0:6757f7363a9f 270 */
Sissors 0:6757f7363a9f 271 void read( char adress, char *data, int length);
Sissors 0:6757f7363a9f 272
moklumbys 5:5873df1e58be 273 //added aditional functions
moklumbys 5:5873df1e58be 274 void getAcceleroAngle( float *data );
moklumbys 5:5873df1e58be 275 void getOffset(float *accOffset, float *gyroOffset, int sampleSize);
moklumbys 7:56e591a74939 276 void computeAngle (float *angle, float *accOffset, float *gyroOffset, float *currTime, float *prevTime);
moklumbys 8:b1570b99df9e 277 void enableInt( void );
moklumbys 8:b1570b99df9e 278 void disableInt( void );
moklumbys 8:b1570b99df9e 279
moklumbys 8:b1570b99df9e 280
Sissors 0:6757f7363a9f 281 private:
Sissors 0:6757f7363a9f 282
Sissors 1:a3366f09e95c 283 I2C connection;
Sissors 0:6757f7363a9f 284 char currentAcceleroRange;
Sissors 0:6757f7363a9f 285 char currentGyroRange;
Sissors 0:6757f7363a9f 286
Sissors 0:6757f7363a9f 287
Sissors 0:6757f7363a9f 288 };
Sissors 0:6757f7363a9f 289
Sissors 0:6757f7363a9f 290
Sissors 0:6757f7363a9f 291
Sissors 0:6757f7363a9f 292 #endif