Anasse Abdoul / Mbed 2 deprecated Test_MPU6050

Dependencies:   mbed

Committer:
anasse
Date:
Thu Mar 31 07:43:50 2022 +0000
Revision:
0:a59a3d743804
vers0

Who changed what in which revision?

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