Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: BLE_Nano_MPU6050Service
MPU6050.h@2:32b13cc64cb0, 2015-07-13 (annotated)
- Committer:
- fruediger
- Date:
- Mon Jul 13 15:23:35 2015 +0000
- Revision:
- 2:32b13cc64cb0
- Parent:
- 1:96a227d1ca7e
- Child:
- 3:a6e53ab2c8c0
more complete implementation (and even more stuff should follow...)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fruediger | 0:95916b07e8be | 1 | #pragma once |
fruediger | 0:95916b07e8be | 2 | #ifndef __MPU6050_H__ |
fruediger | 0:95916b07e8be | 3 | #define __MPU6050_H__ |
fruediger | 0:95916b07e8be | 4 | |
fruediger | 0:95916b07e8be | 5 | /** |
fruediger | 0:95916b07e8be | 6 | * Based on the work of authors of |
fruediger | 0:95916b07e8be | 7 | * https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050 |
fruediger | 0:95916b07e8be | 8 | * |
fruediger | 0:95916b07e8be | 9 | * Ported by Felix Rüdiger, 2015 |
fruediger | 0:95916b07e8be | 10 | * (scrapping all the I2C-slave-bus stuff) |
fruediger | 0:95916b07e8be | 11 | * |
fruediger | 0:95916b07e8be | 12 | */ |
fruediger | 0:95916b07e8be | 13 | |
fruediger | 0:95916b07e8be | 14 | #include "mbed.h" |
fruediger | 0:95916b07e8be | 15 | #include "helpers.h" |
fruediger | 2:32b13cc64cb0 | 16 | |
fruediger | 2:32b13cc64cb0 | 17 | typedef struct |
fruediger | 2:32b13cc64cb0 | 18 | { |
fruediger | 2:32b13cc64cb0 | 19 | int16_t ax, ay, az; |
fruediger | 2:32b13cc64cb0 | 20 | int16_t temp; |
fruediger | 2:32b13cc64cb0 | 21 | int16_t ox, oy, oz; |
fruediger | 2:32b13cc64cb0 | 22 | } MPU6050SensorReading; |
fruediger | 2:32b13cc64cb0 | 23 | |
fruediger | 0:95916b07e8be | 24 | class MPU6050 |
fruediger | 0:95916b07e8be | 25 | { |
fruediger | 0:95916b07e8be | 26 | public: |
fruediger | 1:96a227d1ca7e | 27 | /** |
fruediger | 1:96a227d1ca7e | 28 | * Constants |
fruediger | 2:32b13cc64cb0 | 29 | */ |
fruediger | 1:96a227d1ca7e | 30 | |
fruediger | 0:95916b07e8be | 31 | enum BaseAddress |
fruediger | 0:95916b07e8be | 32 | { |
fruediger | 0:95916b07e8be | 33 | // left shift by 1 bit is neccessary for mbed's I2C abstraction class |
fruediger | 0:95916b07e8be | 34 | // look at https://developer.mbed.org/users/okano/notebook/i2c-access-examples/ |
fruediger | 0:95916b07e8be | 35 | ADDRESS_0 = BYTE(01101000) << 1, |
fruediger | 0:95916b07e8be | 36 | ADRESSS_1 = BYTE(01101001) << 1 |
fruediger | 0:95916b07e8be | 37 | }; |
fruediger | 0:95916b07e8be | 38 | |
fruediger | 0:95916b07e8be | 39 | enum Register |
fruediger | 0:95916b07e8be | 40 | { |
fruediger | 0:95916b07e8be | 41 | REG_AUX_VDDIO = 0x01, // R/W |
fruediger | 0:95916b07e8be | 42 | REG_SMPLRT_DIV = 0x19, // R/W |
fruediger | 0:95916b07e8be | 43 | REG_CONFIG = 0x1A, // R/W |
fruediger | 0:95916b07e8be | 44 | REG_GYRO_CONFIG = 0x1B, // R/W |
fruediger | 0:95916b07e8be | 45 | REG_ACCEL_CONFIG = 0x1C, // R/W |
fruediger | 0:95916b07e8be | 46 | REG_FF_THR = 0x1D, // R/W |
fruediger | 0:95916b07e8be | 47 | REG_FF_DUR = 0x1E, // R/W |
fruediger | 0:95916b07e8be | 48 | REG_MOT_THR = 0x1F, // R/W |
fruediger | 0:95916b07e8be | 49 | REG_MOT_DUR = 0x20, // R/W |
fruediger | 0:95916b07e8be | 50 | REG_ZRMOT_THR = 0x21, // R/W |
fruediger | 0:95916b07e8be | 51 | REG_ZRMOT_DUR = 0x22, // R/W |
fruediger | 0:95916b07e8be | 52 | REG_FIFO_EN = 0x23, // R/W |
fruediger | 0:95916b07e8be | 53 | /* REG_I2C_MST_CTRL = 0x24, // R/W |
fruediger | 0:95916b07e8be | 54 | REG_I2C_SLV0_ADDR = 0x25, // R/W |
fruediger | 0:95916b07e8be | 55 | REG_I2C_SLV0_REG = 0x26, // R/W |
fruediger | 0:95916b07e8be | 56 | REG_I2C_SLV0_CTRL = 0x27, // R/W |
fruediger | 0:95916b07e8be | 57 | REG_I2C_SLV1_ADDR = 0x28, // R/W |
fruediger | 0:95916b07e8be | 58 | REG_I2C_SLV1_REG = 0x29, // R/W |
fruediger | 0:95916b07e8be | 59 | REG_I2C_SLV1_CTRL = 0x2A, // R/W |
fruediger | 0:95916b07e8be | 60 | REG_I2C_SLV2_ADDR = 0x2B, // R/W |
fruediger | 0:95916b07e8be | 61 | REG_I2C_SLV2_REG = 0x2C, // R/W |
fruediger | 0:95916b07e8be | 62 | REG_I2C_SLV2_CTRL = 0x2D, // R/W |
fruediger | 0:95916b07e8be | 63 | REG_I2C_SLV3_ADDR = 0x2E, // R/W |
fruediger | 0:95916b07e8be | 64 | REG_I2C_SLV3_REG = 0x2F, // R/W |
fruediger | 0:95916b07e8be | 65 | REG_I2C_SLV3_CTRL = 0x30, // R/W |
fruediger | 0:95916b07e8be | 66 | REG_I2C_SLV4_ADDR = 0x31, // R/W |
fruediger | 0:95916b07e8be | 67 | REG_I2C_SLV4_REG = 0x32, // R/W |
fruediger | 0:95916b07e8be | 68 | REG_I2C_SLV4_DO = 0x33, // R/W |
fruediger | 0:95916b07e8be | 69 | REG_I2C_SLV4_CTRL = 0x34, // R/W |
fruediger | 0:95916b07e8be | 70 | REG_I2C_SLV4_DI = 0x35, // R |
fruediger | 1:96a227d1ca7e | 71 | REG_I2C_MST_STATUS = 0x36, // R */ |
fruediger | 0:95916b07e8be | 72 | REG_INT_PIN_CFG = 0x37, // R/W |
fruediger | 0:95916b07e8be | 73 | REG_INT_ENABLE = 0x38, // R/W |
fruediger | 0:95916b07e8be | 74 | REG_INT_STATUS = 0x3A, // R |
fruediger | 0:95916b07e8be | 75 | REG_ACCEL_XOUT_H = 0x3B, // R |
fruediger | 0:95916b07e8be | 76 | REG_ACCEL_XOUT_L = 0x3C, // R |
fruediger | 0:95916b07e8be | 77 | REG_ACCEL_YOUT_H = 0x3D, // R |
fruediger | 0:95916b07e8be | 78 | REG_ACCEL_YOUT_L = 0x3E, // R |
fruediger | 0:95916b07e8be | 79 | REG_ACCEL_ZOUT_H = 0x3F, // R |
fruediger | 0:95916b07e8be | 80 | REG_ACCEL_ZOUT_L = 0x40, // R |
fruediger | 0:95916b07e8be | 81 | REG_TEMP_OUT_H = 0x41, // R |
fruediger | 0:95916b07e8be | 82 | REG_TEMP_OUT_L = 0x42, // R |
fruediger | 0:95916b07e8be | 83 | REG_GYRO_XOUT_H = 0x43, // R |
fruediger | 0:95916b07e8be | 84 | REG_GYRO_XOUT_L = 0x44, // R |
fruediger | 0:95916b07e8be | 85 | REG_GYRO_YOUT_H = 0x45, // R |
fruediger | 0:95916b07e8be | 86 | REG_GYRO_YOUT_L = 0x46, // R |
fruediger | 0:95916b07e8be | 87 | REG_GYRO_ZOUT_H = 0x47, // R |
fruediger | 0:95916b07e8be | 88 | REG_GYRO_ZOUT_L = 0x48, // R |
fruediger | 1:96a227d1ca7e | 89 | /* REG_EXT_SENS_DATA_00 = 0x49, // R |
fruediger | 0:95916b07e8be | 90 | REG_EXT_SENS_DATA_01 = 0x4A, // R |
fruediger | 0:95916b07e8be | 91 | REG_EXT_SENS_DATA_02 = 0x4B, // R |
fruediger | 0:95916b07e8be | 92 | REG_EXT_SENS_DATA_03 = 0x4C, // R |
fruediger | 0:95916b07e8be | 93 | REG_EXT_SENS_DATA_04 = 0x4D, // R |
fruediger | 0:95916b07e8be | 94 | REG_EXT_SENS_DATA_05 = 0x4E, // R |
fruediger | 0:95916b07e8be | 95 | REG_EXT_SENS_DATA_06 = 0x4F, // R |
fruediger | 0:95916b07e8be | 96 | REG_EXT_SENS_DATA_07 = 0x50, // R |
fruediger | 0:95916b07e8be | 97 | REG_EXT_SENS_DATA_08 = 0x51, // R |
fruediger | 0:95916b07e8be | 98 | REG_EXT_SENS_DATA_09 = 0x52, // R |
fruediger | 0:95916b07e8be | 99 | REG_EXT_SENS_DATA_10 = 0x53, // R |
fruediger | 0:95916b07e8be | 100 | REG_EXT_SENS_DATA_11 = 0x54, // R |
fruediger | 0:95916b07e8be | 101 | REG_EXT_SENS_DATA_12 = 0x55, // R |
fruediger | 0:95916b07e8be | 102 | REG_EXT_SENS_DATA_13 = 0x56, // R |
fruediger | 0:95916b07e8be | 103 | REG_EXT_SENS_DATA_14 = 0x57, // R |
fruediger | 0:95916b07e8be | 104 | REG_EXT_SENS_DATA_15 = 0x58, // R |
fruediger | 0:95916b07e8be | 105 | REG_EXT_SENS_DATA_16 = 0x59, // R |
fruediger | 0:95916b07e8be | 106 | REG_EXT_SENS_DATA_17 = 0x5A, // R |
fruediger | 0:95916b07e8be | 107 | REG_EXT_SENS_DATA_18 = 0x5B, // R |
fruediger | 0:95916b07e8be | 108 | REG_EXT_SENS_DATA_19 = 0x5C, // R |
fruediger | 0:95916b07e8be | 109 | REG_EXT_SENS_DATA_20 = 0x5D, // R |
fruediger | 0:95916b07e8be | 110 | REG_EXT_SENS_DATA_21 = 0x5E, // R |
fruediger | 0:95916b07e8be | 111 | REG_EXT_SENS_DATA_22 = 0x5F, // R |
fruediger | 1:96a227d1ca7e | 112 | REG_EXT_SENS_DATA_23 = 0x60, // R */ |
fruediger | 0:95916b07e8be | 113 | REG_MOT_DETECT_STATUS = 0x61, // R |
fruediger | 2:32b13cc64cb0 | 114 | /* REG_I2C_SLV0_DO = 0x63, // R/W |
fruediger | 0:95916b07e8be | 115 | REG_I2C_SLV1_DO = 0x64, // R/W |
fruediger | 0:95916b07e8be | 116 | REG_I2C_SLV2_DO = 0x65, // R/W |
fruediger | 2:32b13cc64cb0 | 117 | REG_I2C_SLV3_DO = 0x66, // R/W |
fruediger | 2:32b13cc64cb0 | 118 | REG_I2C_MST_DELAY_CTRL = 0x67, // R/W */ |
fruediger | 0:95916b07e8be | 119 | REG_SIGNAL_PATH_RESET = 0x68, // R/W |
fruediger | 0:95916b07e8be | 120 | REG_MOT_DETECT_CTRL = 0x69, // R/W |
fruediger | 0:95916b07e8be | 121 | REG_USER_CTRL = 0x6A, // R/W |
fruediger | 0:95916b07e8be | 122 | REG_PWR_MGMT_1 = 0x6B, // R/W |
fruediger | 0:95916b07e8be | 123 | REG_PWR_MGMT_2 = 0x6C, // R/W |
fruediger | 0:95916b07e8be | 124 | REG_FIFO_COUNTH = 0x72, // R/W |
fruediger | 0:95916b07e8be | 125 | REG_FIFO_COUNTL = 0x73, // R/W |
fruediger | 0:95916b07e8be | 126 | REG_FIFO_R_W = 0x74, // R/W |
fruediger | 0:95916b07e8be | 127 | REG_WHO_AM_I = 0x75 // R |
fruediger | 0:95916b07e8be | 128 | }; |
fruediger | 0:95916b07e8be | 129 | |
fruediger | 0:95916b07e8be | 130 | static const uint8_t AUX_VDDIO_MASK = BYTE(10000000); |
fruediger | 0:95916b07e8be | 131 | enum AuxVDDIOLevel |
fruediger | 0:95916b07e8be | 132 | { |
fruediger | 0:95916b07e8be | 133 | AUX_VDDIO_VLOGIC = BYTE(00000000), |
fruediger | 0:95916b07e8be | 134 | AUX_VDDIO_VDD = BYTE(10000000) |
fruediger | 0:95916b07e8be | 135 | }; |
fruediger | 0:95916b07e8be | 136 | |
fruediger | 0:95916b07e8be | 137 | static const uint8_t EXT_SYNC_MASK = BYTE(00111000); |
fruediger | 0:95916b07e8be | 138 | enum ExtFrameSync |
fruediger | 0:95916b07e8be | 139 | { |
fruediger | 0:95916b07e8be | 140 | EXT_SYNC_DISABLED = BYTE(00000000), |
fruediger | 0:95916b07e8be | 141 | EXT_SYNC_TEMP_OUT_L = BYTE(00001000), |
fruediger | 0:95916b07e8be | 142 | EXT_SYNC_GYRO_XOUT_L = BYTE(00010000), |
fruediger | 0:95916b07e8be | 143 | EXT_SYNC_GYRO_YOUT_L = BYTE(00011000), |
fruediger | 0:95916b07e8be | 144 | EXT_SYNC_GYRO_ZOUT_L = BYTE(00100000), |
fruediger | 0:95916b07e8be | 145 | EXT_SYNC_ACCEL_XOUT_L = BYTE(00101000), |
fruediger | 0:95916b07e8be | 146 | EXT_SYNC_ACCEL_YOUT_L = BYTE(00110000), |
fruediger | 0:95916b07e8be | 147 | EXT_SYNC_ACCEL_ZOUT_L = BYTE(00111000) |
fruediger | 0:95916b07e8be | 148 | }; |
fruediger | 0:95916b07e8be | 149 | |
fruediger | 0:95916b07e8be | 150 | static const uint8_t DLPF_MASK = BYTE(00000111); |
fruediger | 0:95916b07e8be | 151 | enum DLPFBandwidth |
fruediger | 0:95916b07e8be | 152 | { |
fruediger | 0:95916b07e8be | 153 | DLPF_260HZ_256Hz = BYTE(00000000), |
fruediger | 0:95916b07e8be | 154 | DLPF_184HZ_188Hz = BYTE(00000001), |
fruediger | 0:95916b07e8be | 155 | DLPF_94HZ_98HZ = BYTE(00000010), |
fruediger | 0:95916b07e8be | 156 | DLPF_44HZ_42HZ = BYTE(00000011), |
fruediger | 0:95916b07e8be | 157 | DLPF_21HZ_20HZ = BYTE(00000100), |
fruediger | 0:95916b07e8be | 158 | DLPF_10HZ_10HZ = BYTE(00000101), |
fruediger | 0:95916b07e8be | 159 | DLPF_5HZ_5HZ = BYTE(00000110), |
fruediger | 0:95916b07e8be | 160 | DLPF_RESERVED = BYTE(00000111) |
fruediger | 0:95916b07e8be | 161 | }; |
fruediger | 0:95916b07e8be | 162 | |
fruediger | 0:95916b07e8be | 163 | static const uint8_t GYRO_X_ST_MASK = BYTE(10000000); |
fruediger | 0:95916b07e8be | 164 | static const uint8_t GYRO_Y_ST_MASK = BYTE(01000000); |
fruediger | 0:95916b07e8be | 165 | static const uint8_t GYRO_Z_ST_MASK = BYTE(00100000); |
fruediger | 0:95916b07e8be | 166 | |
fruediger | 0:95916b07e8be | 167 | static const uint8_t GYRO_RANGE_MASK = BYTE(00011000); |
fruediger | 0:95916b07e8be | 168 | enum GyroRange |
fruediger | 0:95916b07e8be | 169 | { |
fruediger | 0:95916b07e8be | 170 | GYRO_RANGE_250 = BYTE(00000000), |
fruediger | 0:95916b07e8be | 171 | GYRO_RANGE_500 = BYTE(00001000), |
fruediger | 0:95916b07e8be | 172 | GYRO_RANGE_1000 = BYTE(00010000), |
fruediger | 0:95916b07e8be | 173 | GYRO_RANGE_2000 = BYTE(00011000) |
fruediger | 0:95916b07e8be | 174 | }; |
fruediger | 0:95916b07e8be | 175 | |
fruediger | 0:95916b07e8be | 176 | static const uint8_t ACCEL_X_ST_MASK = BYTE(10000000); |
fruediger | 0:95916b07e8be | 177 | static const uint8_t ACCEL_Y_ST_MASK = BYTE(01000000); |
fruediger | 0:95916b07e8be | 178 | static const uint8_t ACCEL_Z_ST_MASK = BYTE(00100000); |
fruediger | 0:95916b07e8be | 179 | |
fruediger | 0:95916b07e8be | 180 | static const uint8_t ACCEL_HPF_MASK = BYTE(00000111); |
fruediger | 0:95916b07e8be | 181 | enum AccelHPFCutOff |
fruediger | 0:95916b07e8be | 182 | { |
fruediger | 0:95916b07e8be | 183 | ACCEL_HPF_RESET = BYTE(00000000), |
fruediger | 0:95916b07e8be | 184 | ACCEL_HPF_5HZ = BYTE(00000001), |
fruediger | 0:95916b07e8be | 185 | ACCEL_HPF_2_5HZ = BYTE(00000010), |
fruediger | 0:95916b07e8be | 186 | ACCEL_HPF_1_25HZ = BYTE(00000011), |
fruediger | 0:95916b07e8be | 187 | ACCEL_HPF_0_63HZ = BYTE(00000100), |
fruediger | 0:95916b07e8be | 188 | ACCEL_HPF_HOLD = BYTE(00000111) |
fruediger | 0:95916b07e8be | 189 | }; |
fruediger | 0:95916b07e8be | 190 | |
fruediger | 0:95916b07e8be | 191 | static const uint8_t ACCEL_RANGE_MASK = BYTE(00011000); |
fruediger | 0:95916b07e8be | 192 | enum AccelRange |
fruediger | 0:95916b07e8be | 193 | { |
fruediger | 0:95916b07e8be | 194 | ACCEL_RANGE_2G = BYTE(00000000), |
fruediger | 0:95916b07e8be | 195 | ACCEL_RANGE_4G = BYTE(00001000), |
fruediger | 0:95916b07e8be | 196 | ACCEL_RANGE_8G = BYTE(00010000), |
fruediger | 0:95916b07e8be | 197 | ACCEL_RANGE_16G = BYTE(00011000) |
fruediger | 0:95916b07e8be | 198 | }; |
fruediger | 0:95916b07e8be | 199 | |
fruediger | 0:95916b07e8be | 200 | static const uint8_t TEMP_FIFO_EN_MASK = BYTE(10000000); |
fruediger | 0:95916b07e8be | 201 | static const uint8_t GYRO_X_FIFO_EN_MASK = BYTE(01000000); |
fruediger | 0:95916b07e8be | 202 | static const uint8_t GYRO_Y_FIFO_EN_MASK = BYTE(00100000); |
fruediger | 0:95916b07e8be | 203 | static const uint8_t GYRO_Z_FIFO_EN_MASK = BYTE(00010000); |
fruediger | 0:95916b07e8be | 204 | static const uint8_t ACCEL_FIFO_EN_MASK = BYTE(00001000); |
fruediger | 0:95916b07e8be | 205 | |
fruediger | 1:96a227d1ca7e | 206 | static const uint8_t INT_LEVEL_MASK = BYTE(10000000); |
fruediger | 1:96a227d1ca7e | 207 | enum InterruptLevel |
fruediger | 1:96a227d1ca7e | 208 | { |
fruediger | 1:96a227d1ca7e | 209 | INT_LEVEL_ACTIVE_HIGH = BYTE(00000000), |
fruediger | 1:96a227d1ca7e | 210 | INT_LEVEL_ACTIVE_LOW = BYTE(10000000) |
fruediger | 1:96a227d1ca7e | 211 | }; |
fruediger | 1:96a227d1ca7e | 212 | |
fruediger | 1:96a227d1ca7e | 213 | static const uint8_t INT_DRIVE_MASK = BYTE(01000000); |
fruediger | 1:96a227d1ca7e | 214 | enum InterruptDrive |
fruediger | 1:96a227d1ca7e | 215 | { |
fruediger | 1:96a227d1ca7e | 216 | INT_DRIVE_PUSH_PULL = BYTE(00000000), |
fruediger | 1:96a227d1ca7e | 217 | INT_DRIVE_OPEN_DRAIN = BYTE(01000000) |
fruediger | 1:96a227d1ca7e | 218 | }; |
fruediger | 1:96a227d1ca7e | 219 | |
fruediger | 1:96a227d1ca7e | 220 | static const uint8_t INT_LATCH_MASK = BYTE(00100000); |
fruediger | 1:96a227d1ca7e | 221 | enum InterruptLatch |
fruediger | 1:96a227d1ca7e | 222 | { |
fruediger | 1:96a227d1ca7e | 223 | INT_LATCH_50US_PULSE = BYTE(00000000), |
fruediger | 1:96a227d1ca7e | 224 | INT_LATCH_WAIT_CLEARED = BYTE(00100000) |
fruediger | 1:96a227d1ca7e | 225 | }; |
fruediger | 1:96a227d1ca7e | 226 | |
fruediger | 1:96a227d1ca7e | 227 | static const uint8_t INT_CLEAR_MASK = BYTE(00010000); |
fruediger | 1:96a227d1ca7e | 228 | enum InterruptClear |
fruediger | 1:96a227d1ca7e | 229 | { |
fruediger | 1:96a227d1ca7e | 230 | INT_CLEAR_STATUS_ONLY_READ = BYTE(00000000), |
fruediger | 1:96a227d1ca7e | 231 | INT_CLEAR_ANY_READ = BYTE(00010000) |
fruediger | 1:96a227d1ca7e | 232 | }; |
fruediger | 1:96a227d1ca7e | 233 | |
fruediger | 1:96a227d1ca7e | 234 | static const uint8_t INT_FSYNC_LEVEL_MASK = BYTE(00001000); |
fruediger | 1:96a227d1ca7e | 235 | enum InterruptFSyncLevel |
fruediger | 1:96a227d1ca7e | 236 | { |
fruediger | 1:96a227d1ca7e | 237 | INT_FSYNC_LEVEL_ACTIVE_HIGH = BYTE(00000000), |
fruediger | 1:96a227d1ca7e | 238 | INT_FSYNC_LEVEL_ACTIVE_LOW = BYTE(00001000) |
fruediger | 1:96a227d1ca7e | 239 | }; |
fruediger | 1:96a227d1ca7e | 240 | |
fruediger | 1:96a227d1ca7e | 241 | static const uint8_t INT_FSYNC_EN_MASK = BYTE(00000100); |
fruediger | 1:96a227d1ca7e | 242 | |
fruediger | 1:96a227d1ca7e | 243 | enum Interrupt |
fruediger | 1:96a227d1ca7e | 244 | { |
fruediger | 1:96a227d1ca7e | 245 | INT_FREEFALL = BYTE(10000000), |
fruediger | 1:96a227d1ca7e | 246 | INT_MOTION = BYTE(01000000), |
fruediger | 1:96a227d1ca7e | 247 | INT_ZERO_MOTION = BYTE(00100000), |
fruediger | 1:96a227d1ca7e | 248 | INT_FIFO_OVERFLOW = BYTE(00010000), |
fruediger | 1:96a227d1ca7e | 249 | /* INT_I2C_MASTER = BYTE(00001000), |
fruediger | 1:96a227d1ca7e | 250 | INT_PLL_READY = BYTE(00000100), |
fruediger | 1:96a227d1ca7e | 251 | INT_DMP_INIT = BYTE(00000010), */ |
fruediger | 1:96a227d1ca7e | 252 | INT_DATA_READY = BYTE(00000001) |
fruediger | 1:96a227d1ca7e | 253 | }; |
fruediger | 1:96a227d1ca7e | 254 | friend inline Interrupt operator|(Interrupt a, Interrupt b) { return static_cast<Interrupt>(static_cast<int>(a) | static_cast<int>(b)); } |
fruediger | 1:96a227d1ca7e | 255 | friend inline Interrupt operator&(Interrupt a, Interrupt b) { return static_cast<Interrupt>(static_cast<int>(a) & static_cast<int>(b)); } |
fruediger | 1:96a227d1ca7e | 256 | |
fruediger | 2:32b13cc64cb0 | 257 | enum Motion |
fruediger | 2:32b13cc64cb0 | 258 | { |
fruediger | 2:32b13cc64cb0 | 259 | MOT_NEGATIVE_X = BYTE(10000000), |
fruediger | 2:32b13cc64cb0 | 260 | MOT_POSITIVE_X = BYTE(01000000), |
fruediger | 2:32b13cc64cb0 | 261 | MOT_NEGATIVE_Y = BYTE(00100000), |
fruediger | 2:32b13cc64cb0 | 262 | MOT_POSITIVE_Y = BYTE(00010000), |
fruediger | 2:32b13cc64cb0 | 263 | MOT_NEGATIVE_Z = BYTE(00001000), |
fruediger | 2:32b13cc64cb0 | 264 | MOT_POSITIVE_Z = BYTE(00000100), |
fruediger | 2:32b13cc64cb0 | 265 | MOT_ZERO = BYTE(00000001) |
fruediger | 2:32b13cc64cb0 | 266 | }; |
fruediger | 2:32b13cc64cb0 | 267 | friend inline Motion operator|(Motion a, Motion b) { return static_cast<Motion>(static_cast<int>(a) | static_cast<int>(b)); } |
fruediger | 2:32b13cc64cb0 | 268 | friend inline Motion operator&(Motion a, Motion b) { return static_cast<Motion>(static_cast<int>(a) & static_cast<int>(b)); } |
fruediger | 2:32b13cc64cb0 | 269 | |
fruediger | 2:32b13cc64cb0 | 270 | static const uint8_t GYRO_PATH_RESET_MASK = BYTE(00000100); |
fruediger | 2:32b13cc64cb0 | 271 | static const uint8_t ACCEL_PATH_RESET_MASK = BYTE(00000010); |
fruediger | 2:32b13cc64cb0 | 272 | static const uint8_t TEMP_PATH_RESET_MASK = BYTE(00000001); |
fruediger | 2:32b13cc64cb0 | 273 | |
fruediger | 1:96a227d1ca7e | 274 | /** |
fruediger | 1:96a227d1ca7e | 275 | * basic members |
fruediger | 1:96a227d1ca7e | 276 | */ |
fruediger | 1:96a227d1ca7e | 277 | |
fruediger | 0:95916b07e8be | 278 | MPU6050(PinName sda, PinName scl, BaseAddress address = ADDRESS_0) : i2c(sda, scl), baseAddress(address) |
fruediger | 2:32b13cc64cb0 | 279 | { i2c.frequency(500); } |
fruediger | 0:95916b07e8be | 280 | |
fruediger | 0:95916b07e8be | 281 | BaseAddress getAddress() { return baseAddress; } |
fruediger | 0:95916b07e8be | 282 | |
fruediger | 0:95916b07e8be | 283 | /** |
fruediger | 0:95916b07e8be | 284 | * REG_AUX_VDDIO register |
fruediger | 0:95916b07e8be | 285 | */ |
fruediger | 0:95916b07e8be | 286 | |
fruediger | 0:95916b07e8be | 287 | bool getAuxVDDIOLevel(AuxVDDIOLevel *level, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 288 | bool setAuxVDDIOLevel(AuxVDDIOLevel level, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 289 | |
fruediger | 0:95916b07e8be | 290 | /** |
fruediger | 0:95916b07e8be | 291 | * REG_SMPLRT_DIV register |
fruediger | 0:95916b07e8be | 292 | */ |
fruediger | 0:95916b07e8be | 293 | |
fruediger | 0:95916b07e8be | 294 | bool getGyroSampleRateDivider(uint8_t *rateDivider, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 295 | bool setGyroSampleRateDivider(uint8_t rateDivider, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 296 | |
fruediger | 0:95916b07e8be | 297 | /** |
fruediger | 0:95916b07e8be | 298 | * REG_CONFIG register |
fruediger | 0:95916b07e8be | 299 | */ |
fruediger | 0:95916b07e8be | 300 | |
fruediger | 0:95916b07e8be | 301 | bool getExternalFrameSync(ExtFrameSync *frameSync, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 302 | bool setExternalFrameSync(ExtFrameSync frameSync, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 303 | |
fruediger | 0:95916b07e8be | 304 | bool getDLPFBandwidth(DLPFBandwidth *bandwidth, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 305 | bool setDLPFBandwidth(DLPFBandwidth bandwidth, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 306 | |
fruediger | 0:95916b07e8be | 307 | /** |
fruediger | 0:95916b07e8be | 308 | * REG_GYRO_CONFIG register |
fruediger | 0:95916b07e8be | 309 | */ |
fruediger | 0:95916b07e8be | 310 | |
fruediger | 0:95916b07e8be | 311 | bool getGyroXSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 312 | bool setGyroXSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 313 | |
fruediger | 0:95916b07e8be | 314 | bool getGyroYSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 315 | bool setGyroYSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 316 | |
fruediger | 0:95916b07e8be | 317 | bool getGyroZSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 318 | bool setGyroZSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 319 | |
fruediger | 0:95916b07e8be | 320 | bool getGyroRange(GyroRange *gyroRange, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 321 | bool setGyroRange(GyroRange gyroRange, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 322 | |
fruediger | 0:95916b07e8be | 323 | /** |
fruediger | 0:95916b07e8be | 324 | * REG_ACCEL_CONFIG register |
fruediger | 0:95916b07e8be | 325 | */ |
fruediger | 0:95916b07e8be | 326 | |
fruediger | 0:95916b07e8be | 327 | bool getAccelXSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 328 | bool setAccelXSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 329 | |
fruediger | 0:95916b07e8be | 330 | bool getAccelYSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 331 | bool setAccelYSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 332 | |
fruediger | 0:95916b07e8be | 333 | bool getAccelZSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 334 | bool setAccelZSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 335 | |
fruediger | 0:95916b07e8be | 336 | bool getAccelHPFCutOff(AccelHPFCutOff *frequency, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 337 | bool setAccelHPFCutOff(AccelHPFCutOff frequency, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 338 | |
fruediger | 0:95916b07e8be | 339 | bool getAccelRange(AccelRange *accelRange, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 340 | bool setAccelRange(AccelRange accelRange, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 341 | |
fruediger | 0:95916b07e8be | 342 | /** |
fruediger | 0:95916b07e8be | 343 | * REG_FF_THR register |
fruediger | 0:95916b07e8be | 344 | */ |
fruediger | 0:95916b07e8be | 345 | |
fruediger | 0:95916b07e8be | 346 | bool getFreefallDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 347 | bool setFreefallDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 348 | |
fruediger | 0:95916b07e8be | 349 | /** |
fruediger | 0:95916b07e8be | 350 | * REG_FF_DUR register |
fruediger | 0:95916b07e8be | 351 | */ |
fruediger | 0:95916b07e8be | 352 | |
fruediger | 0:95916b07e8be | 353 | bool getFreefallDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 354 | bool setFreefallDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 355 | |
fruediger | 0:95916b07e8be | 356 | /** |
fruediger | 0:95916b07e8be | 357 | * REG_MOT_THR register |
fruediger | 0:95916b07e8be | 358 | */ |
fruediger | 0:95916b07e8be | 359 | |
fruediger | 0:95916b07e8be | 360 | bool getMotionDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 361 | bool setMotionDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 362 | |
fruediger | 0:95916b07e8be | 363 | /** |
fruediger | 0:95916b07e8be | 364 | * REG_MOT_DUR register |
fruediger | 0:95916b07e8be | 365 | */ |
fruediger | 0:95916b07e8be | 366 | |
fruediger | 0:95916b07e8be | 367 | bool getMotionDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 368 | bool setMotionDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 369 | |
fruediger | 0:95916b07e8be | 370 | /** |
fruediger | 0:95916b07e8be | 371 | * REG_ZRMOT_THR register |
fruediger | 0:95916b07e8be | 372 | */ |
fruediger | 0:95916b07e8be | 373 | |
fruediger | 0:95916b07e8be | 374 | bool getZeroMotionDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 375 | bool setZeroMotionDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 376 | |
fruediger | 0:95916b07e8be | 377 | /** |
fruediger | 0:95916b07e8be | 378 | * REG_ZRMOT_DUR register |
fruediger | 0:95916b07e8be | 379 | */ |
fruediger | 0:95916b07e8be | 380 | |
fruediger | 0:95916b07e8be | 381 | bool getZeroMotionDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 382 | bool setZeroMotionDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 383 | |
fruediger | 0:95916b07e8be | 384 | /** |
fruediger | 0:95916b07e8be | 385 | * REG_FIFO_EN register |
fruediger | 0:95916b07e8be | 386 | */ |
fruediger | 0:95916b07e8be | 387 | |
fruediger | 0:95916b07e8be | 388 | bool getTempFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 389 | bool setTempFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 390 | |
fruediger | 0:95916b07e8be | 391 | bool getGyroXFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 392 | bool setGyroXFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 393 | |
fruediger | 0:95916b07e8be | 394 | bool getGyroYFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 395 | bool setGyroYFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 396 | |
fruediger | 0:95916b07e8be | 397 | bool getGyroZFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 398 | bool setGyroZFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 399 | |
fruediger | 0:95916b07e8be | 400 | bool getAccelFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 401 | bool setAccelFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 402 | |
fruediger | 0:95916b07e8be | 403 | /** |
fruediger | 1:96a227d1ca7e | 404 | * REG_INT_PIN_CFG register |
fruediger | 1:96a227d1ca7e | 405 | */ |
fruediger | 1:96a227d1ca7e | 406 | |
fruediger | 1:96a227d1ca7e | 407 | bool getInterruptLevel(InterruptLevel *level, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 408 | bool setInterruptLevel(InterruptLevel level, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 409 | |
fruediger | 1:96a227d1ca7e | 410 | bool getInterruptDrive(InterruptDrive *drive, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 411 | bool setInterruptDrive(InterruptDrive drive, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 412 | |
fruediger | 1:96a227d1ca7e | 413 | bool getInterruptLatch(InterruptLatch *latch, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 414 | bool setInterruptLatch(InterruptLatch latch, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 415 | |
fruediger | 1:96a227d1ca7e | 416 | bool getInterruptLatchClear(InterruptClear *latchClear, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 417 | bool setInterruptLatchClear(InterruptClear latchClear, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 418 | |
fruediger | 1:96a227d1ca7e | 419 | bool getInterruptFSyncLevel(InterruptFSyncLevel *fsyncLevel, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 420 | bool setInterruptFSyncLevel(InterruptFSyncLevel fsyncLevel, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 421 | |
fruediger | 1:96a227d1ca7e | 422 | bool getInterruptFSyncEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 423 | bool setInterruptFSyncEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 424 | |
fruediger | 1:96a227d1ca7e | 425 | /** |
fruediger | 1:96a227d1ca7e | 426 | * REG_INT_ENABLE register |
fruediger | 1:96a227d1ca7e | 427 | */ |
fruediger | 1:96a227d1ca7e | 428 | |
fruediger | 1:96a227d1ca7e | 429 | bool getInterruptsEnabled(Interrupt *interruptSet, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 430 | bool setInterruptsEnabled(Interrupt interruptSet, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 431 | |
fruediger | 1:96a227d1ca7e | 432 | bool getInterruptFreefallEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 433 | bool setInterruptFreefallEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 434 | |
fruediger | 1:96a227d1ca7e | 435 | bool getInterruptMotionEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 436 | bool setInterruptMotionEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 437 | |
fruediger | 1:96a227d1ca7e | 438 | bool getInterruptZeroMotionEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 439 | bool setInterruptZeroMotionEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 440 | |
fruediger | 1:96a227d1ca7e | 441 | bool getInterruptFIFOOverflowEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 442 | bool setInterruptFIFOOverflowEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 443 | |
fruediger | 1:96a227d1ca7e | 444 | bool getInterruptDataReadyEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 445 | bool setInterruptDataReadyEnabled(bool enabled, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 446 | |
fruediger | 1:96a227d1ca7e | 447 | /** |
fruediger | 1:96a227d1ca7e | 448 | * REG_INT_STATUS register |
fruediger | 1:96a227d1ca7e | 449 | */ |
fruediger | 1:96a227d1ca7e | 450 | |
fruediger | 1:96a227d1ca7e | 451 | bool getInterruptStatuses(Interrupt *interruptSet, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 452 | |
fruediger | 1:96a227d1ca7e | 453 | bool getInterruptFreefallStatus(bool *status, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 454 | |
fruediger | 1:96a227d1ca7e | 455 | bool getInterruptMotionStatus(bool *status, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 456 | |
fruediger | 1:96a227d1ca7e | 457 | bool getInterruptZeroMotionStatus(bool *status, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 458 | |
fruediger | 1:96a227d1ca7e | 459 | bool getInterruptFIFOOverflowStatus(bool *status, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 460 | |
fruediger | 1:96a227d1ca7e | 461 | bool getInterruptDataReadyStatus(bool *status, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 462 | |
fruediger | 1:96a227d1ca7e | 463 | /** |
fruediger | 1:96a227d1ca7e | 464 | * REG_ACCEL_XOUT_H |
fruediger | 1:96a227d1ca7e | 465 | * REG_ACCEL_XOUT_L |
fruediger | 1:96a227d1ca7e | 466 | * REG_ACCEL_YOUT_H |
fruediger | 1:96a227d1ca7e | 467 | * REG_ACCEL_YOUT_L |
fruediger | 1:96a227d1ca7e | 468 | * REG_ACCEL_ZOUT_H |
fruediger | 1:96a227d1ca7e | 469 | * REG_ACCEL_ZOUT_L |
fruediger | 1:96a227d1ca7e | 470 | * REG_TEMP_OUT_H |
fruediger | 1:96a227d1ca7e | 471 | * REG_TEMP_OUT_L |
fruediger | 1:96a227d1ca7e | 472 | * REG_GYRO_XOUT_H |
fruediger | 1:96a227d1ca7e | 473 | * REG_GYRO_XOUT_L |
fruediger | 1:96a227d1ca7e | 474 | * REG_GYRO_YOUT_H |
fruediger | 1:96a227d1ca7e | 475 | * REG_GYRO_YOUT_L |
fruediger | 1:96a227d1ca7e | 476 | * REG_GYRO_ZOUT_H |
fruediger | 1:96a227d1ca7e | 477 | * REG_GYRO_ZOUT_L registers |
fruediger | 1:96a227d1ca7e | 478 | */ |
fruediger | 1:96a227d1ca7e | 479 | |
fruediger | 1:96a227d1ca7e | 480 | /** Acceleration */ |
fruediger | 1:96a227d1ca7e | 481 | |
fruediger | 1:96a227d1ca7e | 482 | bool getAcceleration(int16_t *ax, int16_t *ay, int16_t *az, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 483 | |
fruediger | 1:96a227d1ca7e | 484 | bool getAccelerationX(int16_t* ax, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 485 | |
fruediger | 1:96a227d1ca7e | 486 | bool getAccelerationY(int16_t* ay, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 487 | |
fruediger | 1:96a227d1ca7e | 488 | bool getAccelerationZ(int16_t* az, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 489 | |
fruediger | 1:96a227d1ca7e | 490 | /** Temperature */ |
fruediger | 1:96a227d1ca7e | 491 | |
fruediger | 1:96a227d1ca7e | 492 | bool getTemperature(int16_t* temp, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 493 | |
fruediger | 1:96a227d1ca7e | 494 | /** Rotation speed */ |
fruediger | 1:96a227d1ca7e | 495 | |
fruediger | 1:96a227d1ca7e | 496 | bool getRotationSpeed(int16_t *ox, int16_t *oy, int16_t *oz, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 497 | |
fruediger | 1:96a227d1ca7e | 498 | bool getRotationSpeedX(int16_t* ox, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 499 | |
fruediger | 1:96a227d1ca7e | 500 | bool getRotationSpeedY(int16_t* oy, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 501 | |
fruediger | 1:96a227d1ca7e | 502 | bool getRotationSpeedZ(int16_t* oz, float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 503 | |
fruediger | 1:96a227d1ca7e | 504 | /** All three */ |
fruediger | 1:96a227d1ca7e | 505 | |
fruediger | 1:96a227d1ca7e | 506 | bool getMotionAndTemperature(int16_t* ax, int16_t* ay, int16_t* az, |
fruediger | 1:96a227d1ca7e | 507 | int16_t* ox, int16_t* oy, int16_t* oz, |
fruediger | 1:96a227d1ca7e | 508 | int16_t* temp, float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 509 | |
fruediger | 2:32b13cc64cb0 | 510 | bool getMotionAndTemperature(MPU6050SensorReading *sensorReading, float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 511 | |
fruediger | 2:32b13cc64cb0 | 512 | /** |
fruediger | 2:32b13cc64cb0 | 513 | * REG_MOT_DETECT_STATUS register |
fruediger | 2:32b13cc64cb0 | 514 | */ |
fruediger | 2:32b13cc64cb0 | 515 | |
fruediger | 2:32b13cc64cb0 | 516 | bool getMotionStatus(Motion *motionSet, float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 517 | |
fruediger | 2:32b13cc64cb0 | 518 | bool getNegativeXMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 519 | |
fruediger | 2:32b13cc64cb0 | 520 | bool getPositiveXMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 521 | |
fruediger | 2:32b13cc64cb0 | 522 | bool getNegativeYMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 523 | |
fruediger | 2:32b13cc64cb0 | 524 | bool getPositiveYMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 525 | |
fruediger | 2:32b13cc64cb0 | 526 | bool getNegativeZMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 527 | |
fruediger | 2:32b13cc64cb0 | 528 | bool getPositiveZMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 529 | |
fruediger | 2:32b13cc64cb0 | 530 | bool getZeroMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 531 | |
fruediger | 2:32b13cc64cb0 | 532 | /** |
fruediger | 2:32b13cc64cb0 | 533 | * REG_SIGNAL_PATH_RESET register |
fruediger | 2:32b13cc64cb0 | 534 | */ |
fruediger | 2:32b13cc64cb0 | 535 | |
fruediger | 2:32b13cc64cb0 | 536 | bool resetGyroscopeSignalPath(float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 537 | |
fruediger | 2:32b13cc64cb0 | 538 | bool resetAccelerometerSignalPath(float timeout_secs = defaultTimeout_secs); |
fruediger | 2:32b13cc64cb0 | 539 | |
fruediger | 2:32b13cc64cb0 | 540 | bool resetTemperatureSignalPath(float timeout_secs = defaultTimeout_secs); |
fruediger | 1:96a227d1ca7e | 541 | |
fruediger | 1:96a227d1ca7e | 542 | /** |
fruediger | 0:95916b07e8be | 543 | * Read and write registers |
fruediger | 0:95916b07e8be | 544 | */ |
fruediger | 0:95916b07e8be | 545 | |
fruediger | 0:95916b07e8be | 546 | bool read(Register reg, uint8_t *data, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 547 | bool read(Register reg, uint8_t *data, size_t length, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 548 | |
fruediger | 0:95916b07e8be | 549 | bool write(Register reg, uint8_t data, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 550 | bool write(Register reg, uint8_t *data, size_t length, float timeout_secs = defaultTimeout_secs); |
fruediger | 0:95916b07e8be | 551 | |
fruediger | 0:95916b07e8be | 552 | private: |
fruediger | 0:95916b07e8be | 553 | static const float retryDelay_secs = 0.005; |
fruediger | 0:95916b07e8be | 554 | static const float defaultTimeout_secs = 0.1; // makes a maximum of 20 tries |
fruediger | 0:95916b07e8be | 555 | |
fruediger | 0:95916b07e8be | 556 | I2C i2c; |
fruediger | 0:95916b07e8be | 557 | BaseAddress baseAddress; |
fruediger | 2:32b13cc64cb0 | 558 | |
fruediger | 2:32b13cc64cb0 | 559 | union |
fruediger | 2:32b13cc64cb0 | 560 | { |
fruediger | 2:32b13cc64cb0 | 561 | struct |
fruediger | 2:32b13cc64cb0 | 562 | { |
fruediger | 2:32b13cc64cb0 | 563 | uint8_t ax_h, ax_l; |
fruediger | 2:32b13cc64cb0 | 564 | uint8_t ay_h, ay_l; |
fruediger | 2:32b13cc64cb0 | 565 | uint8_t az_h, az_l; |
fruediger | 2:32b13cc64cb0 | 566 | |
fruediger | 2:32b13cc64cb0 | 567 | uint8_t temp_h, temp_l; |
fruediger | 2:32b13cc64cb0 | 568 | |
fruediger | 2:32b13cc64cb0 | 569 | uint8_t ox_h, ox_l; |
fruediger | 2:32b13cc64cb0 | 570 | uint8_t oy_h, oy_l; |
fruediger | 2:32b13cc64cb0 | 571 | uint8_t oz_h, oz_l; |
fruediger | 2:32b13cc64cb0 | 572 | } reg; |
fruediger | 2:32b13cc64cb0 | 573 | |
fruediger | 2:32b13cc64cb0 | 574 | MPU6050SensorReading value; |
fruediger | 2:32b13cc64cb0 | 575 | } converter; |
fruediger | 0:95916b07e8be | 576 | }; |
fruediger | 0:95916b07e8be | 577 | |
fruediger | 0:95916b07e8be | 578 | #endif |