Added for gyro and testing

Committer:
moklumbys
Date:
Fri Feb 13 01:04:17 2015 +0000
Revision:
7:56e591a74939
Parent:
6:502448484f91
Child:
8:b1570b99df9e
So, added the final function to the library, which would allow to compute angle, knowing the time difference between each calculation.

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 4:268d3fcb92ba 76 //define how the accelerometer is placed on surface
moklumbys 4:268d3fcb92ba 77 #define X_AXIS 1
moklumbys 4:268d3fcb92ba 78 #define Y_AXIS 2
moklumbys 4:268d3fcb92ba 79 #define Z_AXIS 0
Sissors 0:6757f7363a9f 80
moklumbys 6:502448484f91 81 #define RADIANS_TO_DEGREES 180/3.1415926536
moklumbys 6:502448484f91 82
moklumbys 7:56e591a74939 83 #define ALPHA 0.97 //filter constant
moklumbys 7:56e591a74939 84
moklumbys 7:56e591a74939 85 #define GYRO_SCALE 2.31 //scale the gyro
moklumbys 7:56e591a74939 86
Sissors 2:5c63e20c50f3 87 /** MPU6050 IMU library.
Sissors 2:5c63e20c50f3 88 *
Sissors 2:5c63e20c50f3 89 * Example:
Sissors 2:5c63e20c50f3 90 * @code
Sissors 2:5c63e20c50f3 91 * Later, maybe
Sissors 2:5c63e20c50f3 92 * @endcode
Sissors 2:5c63e20c50f3 93 */
Sissors 0:6757f7363a9f 94 class MPU6050 {
Sissors 0:6757f7363a9f 95 public:
Sissors 0:6757f7363a9f 96 /**
Sissors 0:6757f7363a9f 97 * Constructor.
Sissors 0:6757f7363a9f 98 *
Sissors 0:6757f7363a9f 99 * Sleep mode of MPU6050 is immediatly disabled
Sissors 0:6757f7363a9f 100 *
Sissors 0:6757f7363a9f 101 * @param sda - mbed pin to use for the SDA I2C line.
Sissors 0:6757f7363a9f 102 * @param scl - mbed pin to use for the SCL I2C line.
Sissors 0:6757f7363a9f 103 */
Sissors 0:6757f7363a9f 104 MPU6050(PinName sda, PinName scl);
Sissors 0:6757f7363a9f 105
Sissors 0:6757f7363a9f 106
Sissors 0:6757f7363a9f 107 /**
Sissors 0:6757f7363a9f 108 * Tests the I2C connection by reading the WHO_AM_I register.
Sissors 0:6757f7363a9f 109 *
Sissors 0:6757f7363a9f 110 * @return True for a working connection, false for an error
Sissors 0:6757f7363a9f 111 */
Sissors 0:6757f7363a9f 112 bool testConnection( void );
Sissors 0:6757f7363a9f 113
Sissors 0:6757f7363a9f 114 /**
Sissors 0:6757f7363a9f 115 * Sets the bandwidth of the digital low-pass filter
Sissors 0:6757f7363a9f 116 *
Sissors 0:6757f7363a9f 117 * 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 118 * Last number is the gyro's BW in Hz (accelero BW is virtually identical)
Sissors 0:6757f7363a9f 119 *
Sissors 0:6757f7363a9f 120 * @param BW - The three bits that set the bandwidth (use the predefined macros)
Sissors 0:6757f7363a9f 121 */
Sissors 0:6757f7363a9f 122 void setBW( char BW );
Sissors 0:6757f7363a9f 123
Sissors 0:6757f7363a9f 124 /**
Sissors 0:6757f7363a9f 125 * 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 126 *
Sissors 0:6757f7363a9f 127 * @param state - Enables/disables the I2C bypass mode
Sissors 0:6757f7363a9f 128 */
Sissors 0:6757f7363a9f 129 void setI2CBypass ( bool state );
Sissors 0:6757f7363a9f 130
Sissors 0:6757f7363a9f 131 /**
Sissors 0:6757f7363a9f 132 * Sets the Accelero full-scale range
Sissors 0:6757f7363a9f 133 *
Sissors 0:6757f7363a9f 134 * Macros: MPU6050_ACCELERO_RANGE_2G - MPU6050_ACCELERO_RANGE_4G - MPU6050_ACCELERO_RANGE_8G - MPU6050_ACCELERO_RANGE_16G
Sissors 0:6757f7363a9f 135 *
Sissors 0:6757f7363a9f 136 * @param range - The two bits that set the full-scale range (use the predefined macros)
Sissors 0:6757f7363a9f 137 */
Sissors 0:6757f7363a9f 138 void setAcceleroRange(char range);
Sissors 0:6757f7363a9f 139
Sissors 0:6757f7363a9f 140 /**
Sissors 0:6757f7363a9f 141 * Reads the accelero x-axis.
Sissors 0:6757f7363a9f 142 *
Sissors 0:6757f7363a9f 143 * @return 16-bit signed integer x-axis accelero data
Sissors 0:6757f7363a9f 144 */
Sissors 0:6757f7363a9f 145 int getAcceleroRawX( void );
Sissors 0:6757f7363a9f 146
Sissors 0:6757f7363a9f 147 /**
Sissors 0:6757f7363a9f 148 * Reads the accelero y-axis.
Sissors 0:6757f7363a9f 149 *
Sissors 0:6757f7363a9f 150 * @return 16-bit signed integer y-axis accelero data
Sissors 0:6757f7363a9f 151 */
Sissors 0:6757f7363a9f 152 int getAcceleroRawY( void );
Sissors 0:6757f7363a9f 153
Sissors 0:6757f7363a9f 154 /**
Sissors 0:6757f7363a9f 155 * Reads the accelero z-axis.
Sissors 0:6757f7363a9f 156 *
Sissors 0:6757f7363a9f 157 * @return 16-bit signed integer z-axis accelero data
Sissors 0:6757f7363a9f 158 */
Sissors 0:6757f7363a9f 159 int getAcceleroRawZ( void );
Sissors 0:6757f7363a9f 160
Sissors 0:6757f7363a9f 161 /**
Sissors 0:6757f7363a9f 162 * Reads all accelero data.
Sissors 0:6757f7363a9f 163 *
Sissors 0:6757f7363a9f 164 * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z
Sissors 0:6757f7363a9f 165 */
Sissors 0:6757f7363a9f 166 void getAcceleroRaw( int *data );
Sissors 0:6757f7363a9f 167
Sissors 0:6757f7363a9f 168 /**
Sissors 0:6757f7363a9f 169 * Reads all accelero data, gives the acceleration in m/s2
Sissors 0:6757f7363a9f 170 *
Sissors 0:6757f7363a9f 171 * 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 172 *
Sissors 0:6757f7363a9f 173 * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z
Sissors 0:6757f7363a9f 174 */
Sissors 0:6757f7363a9f 175 void getAccelero( float *data );
Sissors 0:6757f7363a9f 176
Sissors 0:6757f7363a9f 177 /**
Sissors 0:6757f7363a9f 178 * Sets the Gyro full-scale range
Sissors 0:6757f7363a9f 179 *
Sissors 0:6757f7363a9f 180 * Macros: MPU6050_GYRO_RANGE_250 - MPU6050_GYRO_RANGE_500 - MPU6050_GYRO_RANGE_1000 - MPU6050_GYRO_RANGE_2000
Sissors 0:6757f7363a9f 181 *
Sissors 0:6757f7363a9f 182 * @param range - The two bits that set the full-scale range (use the predefined macros)
Sissors 0:6757f7363a9f 183 */
Sissors 0:6757f7363a9f 184 void setGyroRange(char range);
Sissors 0:6757f7363a9f 185
Sissors 0:6757f7363a9f 186 /**
Sissors 0:6757f7363a9f 187 * Reads the gyro x-axis.
Sissors 0:6757f7363a9f 188 *
Sissors 0:6757f7363a9f 189 * @return 16-bit signed integer x-axis gyro data
Sissors 0:6757f7363a9f 190 */
Sissors 0:6757f7363a9f 191 int getGyroRawX( void );
Sissors 0:6757f7363a9f 192
Sissors 0:6757f7363a9f 193 /**
Sissors 0:6757f7363a9f 194 * Reads the gyro y-axis.
Sissors 0:6757f7363a9f 195 *
Sissors 0:6757f7363a9f 196 * @return 16-bit signed integer y-axis gyro data
Sissors 0:6757f7363a9f 197 */
Sissors 0:6757f7363a9f 198 int getGyroRawY( void );
Sissors 0:6757f7363a9f 199
Sissors 0:6757f7363a9f 200 /**
Sissors 0:6757f7363a9f 201 * Reads the gyro z-axis.
Sissors 0:6757f7363a9f 202 *
Sissors 0:6757f7363a9f 203 * @return 16-bit signed integer z-axis gyro data
Sissors 0:6757f7363a9f 204 */
Sissors 0:6757f7363a9f 205 int getGyroRawZ( void );
Sissors 0:6757f7363a9f 206
Sissors 0:6757f7363a9f 207 /**
Sissors 0:6757f7363a9f 208 * Reads all gyro data.
Sissors 0:6757f7363a9f 209 *
Sissors 0:6757f7363a9f 210 * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z
Sissors 0:6757f7363a9f 211 */
Sissors 0:6757f7363a9f 212 void getGyroRaw( int *data );
Sissors 0:6757f7363a9f 213
Sissors 0:6757f7363a9f 214 /**
Sissors 0:6757f7363a9f 215 * Reads all gyro data, gives the gyro in rad/s
Sissors 0:6757f7363a9f 216 *
Sissors 0:6757f7363a9f 217 * 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 218 *
Sissors 0:6757f7363a9f 219 * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z
Sissors 0:6757f7363a9f 220 */
Sissors 0:6757f7363a9f 221 void getGyro( float *data);
Sissors 0:6757f7363a9f 222
Sissors 0:6757f7363a9f 223 /**
Sissors 0:6757f7363a9f 224 * Reads temperature data.
Sissors 0:6757f7363a9f 225 *
Sissors 0:6757f7363a9f 226 * @return 16 bit signed integer with the raw temperature register value
Sissors 0:6757f7363a9f 227 */
Sissors 0:6757f7363a9f 228 int getTempRaw( void );
Sissors 0:6757f7363a9f 229
Sissors 0:6757f7363a9f 230 /**
Sissors 0:6757f7363a9f 231 * Returns current temperature
Sissors 0:6757f7363a9f 232 *
Sissors 0:6757f7363a9f 233 * @returns float with the current temperature
Sissors 0:6757f7363a9f 234 */
Sissors 0:6757f7363a9f 235 float getTemp( void );
Sissors 0:6757f7363a9f 236
Sissors 0:6757f7363a9f 237 /**
Sissors 0:6757f7363a9f 238 * Sets the sleep mode of the MPU6050
Sissors 0:6757f7363a9f 239 *
Sissors 0:6757f7363a9f 240 * @param state - true for sleeping, false for wake up
Sissors 0:6757f7363a9f 241 */
Sissors 0:6757f7363a9f 242 void setSleepMode( bool state );
Sissors 0:6757f7363a9f 243
Sissors 0:6757f7363a9f 244
Sissors 0:6757f7363a9f 245 /**
Sissors 0:6757f7363a9f 246 * Writes data to the device, could be private, but public is handy so you can transmit directly to the MPU.
Sissors 0:6757f7363a9f 247 *
Sissors 0:6757f7363a9f 248 * @param adress - register address to write to
Sissors 0:6757f7363a9f 249 * @param data - data to write
Sissors 0:6757f7363a9f 250 */
Sissors 0:6757f7363a9f 251 void write( char address, char data);
Sissors 0:6757f7363a9f 252
Sissors 0:6757f7363a9f 253 /**
Sissors 0:6757f7363a9f 254 * Read data from the device, could be private, but public is handy so you can transmit directly to the MPU.
Sissors 0:6757f7363a9f 255 *
Sissors 0:6757f7363a9f 256 * @param adress - register address to write to
Sissors 0:6757f7363a9f 257 * @return - data from the register specified by RA
Sissors 0:6757f7363a9f 258 */
Sissors 0:6757f7363a9f 259 char read( char adress);
Sissors 0:6757f7363a9f 260
Sissors 0:6757f7363a9f 261 /**
Sissors 0:6757f7363a9f 262 * Read multtiple regigsters from the device, more efficient than using multiple normal reads.
Sissors 0:6757f7363a9f 263 *
Sissors 0:6757f7363a9f 264 * @param adress - register address to write to
Sissors 0:6757f7363a9f 265 * @param length - number of bytes to read
Sissors 0:6757f7363a9f 266 * @param data - pointer where the data needs to be written to
Sissors 0:6757f7363a9f 267 */
Sissors 0:6757f7363a9f 268 void read( char adress, char *data, int length);
Sissors 0:6757f7363a9f 269
moklumbys 5:5873df1e58be 270 //added aditional functions
moklumbys 5:5873df1e58be 271 void getAcceleroAngle( float *data );
moklumbys 5:5873df1e58be 272 void getOffset(float *accOffset, float *gyroOffset, int sampleSize);
moklumbys 7:56e591a74939 273 void computeAngle (float *angle, float *accOffset, float *gyroOffset, float *currTime, float *prevTime);
Sissors 0:6757f7363a9f 274
Sissors 0:6757f7363a9f 275 private:
Sissors 0:6757f7363a9f 276
Sissors 1:a3366f09e95c 277 I2C connection;
Sissors 0:6757f7363a9f 278 char currentAcceleroRange;
Sissors 0:6757f7363a9f 279 char currentGyroRange;
Sissors 0:6757f7363a9f 280
Sissors 0:6757f7363a9f 281
Sissors 0:6757f7363a9f 282 };
Sissors 0:6757f7363a9f 283
Sissors 0:6757f7363a9f 284
Sissors 0:6757f7363a9f 285
Sissors 0:6757f7363a9f 286 #endif