エラー判定用 '\0' + クォータニオンのfloat型4成分,合計17byteのデータをひたすらバイナリ形式で送り続ける.最初のバイトが '\0' でなかったらズレているので,適当なバイト数見送って先頭が '\0' になるよう合わせること.
MPU9250/MPU9250.h@0:2a7221ee9861, 2018-03-21 (annotated)
- Committer:
- daqn
- Date:
- Wed Mar 21 07:58:57 2018 +0000
- Revision:
- 0:2a7221ee9861
i dont know what should i write here
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
daqn | 0:2a7221ee9861 | 1 | /** Daqn change log |
daqn | 0:2a7221ee9861 | 2 | * 2018/02/16 : Replace words "MPU6050" with "MPU9250". |
daqn | 0:2a7221ee9861 | 3 | * 2018/02/21 : |
daqn | 0:2a7221ee9861 | 4 | */ |
daqn | 0:2a7221ee9861 | 5 | |
daqn | 0:2a7221ee9861 | 6 | /*Use #define MPU9250_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. |
daqn | 0:2a7221ee9861 | 7 | If it is half of what you expected, and you still are on the correct planet, you got an engineering sample |
daqn | 0:2a7221ee9861 | 8 | */ |
daqn | 0:2a7221ee9861 | 9 | |
daqn | 0:2a7221ee9861 | 10 | |
daqn | 0:2a7221ee9861 | 11 | #ifndef MPU9250_H |
daqn | 0:2a7221ee9861 | 12 | #define MPU9250_H |
daqn | 0:2a7221ee9861 | 13 | |
daqn | 0:2a7221ee9861 | 14 | /** |
daqn | 0:2a7221ee9861 | 15 | * Includes |
daqn | 0:2a7221ee9861 | 16 | */ |
daqn | 0:2a7221ee9861 | 17 | #include "mbed.h" |
daqn | 0:2a7221ee9861 | 18 | |
daqn | 0:2a7221ee9861 | 19 | |
daqn | 0:2a7221ee9861 | 20 | /** |
daqn | 0:2a7221ee9861 | 21 | * Defines |
daqn | 0:2a7221ee9861 | 22 | */ |
daqn | 0:2a7221ee9861 | 23 | #ifndef MPU9250_ADDRESS |
daqn | 0:2a7221ee9861 | 24 | #define MPU9250_ADDRESS 0x68 // address pin low (GND), default for InvenSense evaluation board |
daqn | 0:2a7221ee9861 | 25 | #endif |
daqn | 0:2a7221ee9861 | 26 | |
daqn | 0:2a7221ee9861 | 27 | #ifdef MPU9250_ES |
daqn | 0:2a7221ee9861 | 28 | #define DOUBLE_ACCELERO |
daqn | 0:2a7221ee9861 | 29 | #endif |
daqn | 0:2a7221ee9861 | 30 | |
daqn | 0:2a7221ee9861 | 31 | /** |
daqn | 0:2a7221ee9861 | 32 | * Registers |
daqn | 0:2a7221ee9861 | 33 | */ |
daqn | 0:2a7221ee9861 | 34 | #define MPU9250_CONFIG_REG 0x1A |
daqn | 0:2a7221ee9861 | 35 | #define MPU9250_GYRO_CONFIG_REG 0x1B |
daqn | 0:2a7221ee9861 | 36 | #define MPU9250_ACCELERO_CONFIG_REG 0x1C |
daqn | 0:2a7221ee9861 | 37 | |
daqn | 0:2a7221ee9861 | 38 | #define MPU9250_INT_PIN_CFG 0x37 |
daqn | 0:2a7221ee9861 | 39 | |
daqn | 0:2a7221ee9861 | 40 | #define MPU9250_ACCEL_XOUT_H_REG 0x3B |
daqn | 0:2a7221ee9861 | 41 | #define MPU9250_ACCEL_YOUT_H_REG 0x3D |
daqn | 0:2a7221ee9861 | 42 | #define MPU9250_ACCEL_ZOUT_H_REG 0x3F |
daqn | 0:2a7221ee9861 | 43 | |
daqn | 0:2a7221ee9861 | 44 | #define MPU9250_TEMP_H_REG 0x41 |
daqn | 0:2a7221ee9861 | 45 | |
daqn | 0:2a7221ee9861 | 46 | #define MPU9250_GYRO_XOUT_H_REG 0x43 |
daqn | 0:2a7221ee9861 | 47 | #define MPU9250_GYRO_YOUT_H_REG 0x45 |
daqn | 0:2a7221ee9861 | 48 | #define MPU9250_GYRO_ZOUT_H_REG 0x47 |
daqn | 0:2a7221ee9861 | 49 | |
daqn | 0:2a7221ee9861 | 50 | #define MPU9250_MAG_XOUT_H_REG 0x04 |
daqn | 0:2a7221ee9861 | 51 | #define MPU9250_MAG_YOUT_H_REG 0x06 |
daqn | 0:2a7221ee9861 | 52 | #define MPU9250_MAG_ZOUT_H_REG 0x08 |
daqn | 0:2a7221ee9861 | 53 | |
daqn | 0:2a7221ee9861 | 54 | |
daqn | 0:2a7221ee9861 | 55 | |
daqn | 0:2a7221ee9861 | 56 | #define MPU9250_PWR_MGMT_1_REG 0x6B |
daqn | 0:2a7221ee9861 | 57 | #define MPU9250_WHO_AM_I_REG 0x75 |
daqn | 0:2a7221ee9861 | 58 | |
daqn | 0:2a7221ee9861 | 59 | |
daqn | 0:2a7221ee9861 | 60 | |
daqn | 0:2a7221ee9861 | 61 | /** |
daqn | 0:2a7221ee9861 | 62 | * Definitions |
daqn | 0:2a7221ee9861 | 63 | */ |
daqn | 0:2a7221ee9861 | 64 | #define MPU9250_SLP_BIT 6 |
daqn | 0:2a7221ee9861 | 65 | #define MPU9250_BYPASS_BIT 1 |
daqn | 0:2a7221ee9861 | 66 | |
daqn | 0:2a7221ee9861 | 67 | #define MPU9250_BW_256 0 |
daqn | 0:2a7221ee9861 | 68 | #define MPU9250_BW_188 1 |
daqn | 0:2a7221ee9861 | 69 | #define MPU9250_BW_98 2 |
daqn | 0:2a7221ee9861 | 70 | #define MPU9250_BW_42 3 |
daqn | 0:2a7221ee9861 | 71 | #define MPU9250_BW_20 4 |
daqn | 0:2a7221ee9861 | 72 | #define MPU9250_BW_10 5 |
daqn | 0:2a7221ee9861 | 73 | #define MPU9250_BW_5 6 |
daqn | 0:2a7221ee9861 | 74 | |
daqn | 0:2a7221ee9861 | 75 | #define MPU9250_ACCELERO_RANGE_2G 0 |
daqn | 0:2a7221ee9861 | 76 | #define MPU9250_ACCELERO_RANGE_4G 1 |
daqn | 0:2a7221ee9861 | 77 | #define MPU9250_ACCELERO_RANGE_8G 2 |
daqn | 0:2a7221ee9861 | 78 | #define MPU9250_ACCELERO_RANGE_16G 3 |
daqn | 0:2a7221ee9861 | 79 | |
daqn | 0:2a7221ee9861 | 80 | #define MPU9250_GYRO_RANGE_250 0 |
daqn | 0:2a7221ee9861 | 81 | #define MPU9250_GYRO_RANGE_500 1 |
daqn | 0:2a7221ee9861 | 82 | #define MPU9250_GYRO_RANGE_1000 2 |
daqn | 0:2a7221ee9861 | 83 | #define MPU9250_GYRO_RANGE_2000 3 |
daqn | 0:2a7221ee9861 | 84 | |
daqn | 0:2a7221ee9861 | 85 | //interrupt address |
daqn | 0:2a7221ee9861 | 86 | #define MPU9250_RA_INT_ENABLE 0x38 |
daqn | 0:2a7221ee9861 | 87 | //define how the accelerometer is placed on surface |
daqn | 0:2a7221ee9861 | 88 | #define X_AXIS 1 |
daqn | 0:2a7221ee9861 | 89 | #define Y_AXIS 2 |
daqn | 0:2a7221ee9861 | 90 | #define Z_AXIS 0 |
daqn | 0:2a7221ee9861 | 91 | //translation from radians to degrees |
daqn | 0:2a7221ee9861 | 92 | #define RADIANS_TO_DEGREES 180/3.1415926536 |
daqn | 0:2a7221ee9861 | 93 | //constant used for the complementary filter, which ranges usually from 0.9 to 1.0 |
daqn | 0:2a7221ee9861 | 94 | #define ALPHA 0.96 //filter constant |
daqn | 0:2a7221ee9861 | 95 | //scale the gyro |
daqn | 0:2a7221ee9861 | 96 | #define GYRO_SCALE 2.7176 |
daqn | 0:2a7221ee9861 | 97 | |
daqn | 0:2a7221ee9861 | 98 | |
daqn | 0:2a7221ee9861 | 99 | /** |
daqn | 0:2a7221ee9861 | 100 | * Magnetometer |
daqn | 0:2a7221ee9861 | 101 | */ |
daqn | 0:2a7221ee9861 | 102 | #define AK8963_ADDRESS 0x0C<<1 |
daqn | 0:2a7221ee9861 | 103 | #define WHO_AM_I_AK8963 0x00 // should return 0x48 |
daqn | 0:2a7221ee9861 | 104 | #define INFO 0x01 |
daqn | 0:2a7221ee9861 | 105 | #define AK8963_ST1 0x02 // data ready status bit 0 |
daqn | 0:2a7221ee9861 | 106 | #define AK8963_XOUT_L 0x03 // data |
daqn | 0:2a7221ee9861 | 107 | #define AK8963_XOUT_H 0x04 |
daqn | 0:2a7221ee9861 | 108 | #define AK8963_YOUT_L 0x05 |
daqn | 0:2a7221ee9861 | 109 | #define AK8963_YOUT_H 0x06 |
daqn | 0:2a7221ee9861 | 110 | #define AK8963_ZOUT_L 0x07 |
daqn | 0:2a7221ee9861 | 111 | #define AK8963_ZOUT_H 0x08 |
daqn | 0:2a7221ee9861 | 112 | #define AK8963_ST2 0x09 // Data overflow bit 3 and data read error status bit 2 |
daqn | 0:2a7221ee9861 | 113 | #define AK8963_CNTL 0x0A // Power down (0000), single-measurement (0001), self-test (1000) and Fuse ROM (1111) modes on bits 3:0 |
daqn | 0:2a7221ee9861 | 114 | #define AK8963_ASTC 0x0C // Self test control |
daqn | 0:2a7221ee9861 | 115 | #define AK8963_I2CDIS 0x0F // I2C disable |
daqn | 0:2a7221ee9861 | 116 | #define AK8963_ASAX 0x10 // Fuse ROM x-axis sensitivity adjustment value |
daqn | 0:2a7221ee9861 | 117 | #define AK8963_ASAY 0x11 // Fuse ROM y-axis sensitivity adjustment value |
daqn | 0:2a7221ee9861 | 118 | #define AK8963_ASAZ 0x12 // Fuse ROM z-axis sensitivity adjustment value |
daqn | 0:2a7221ee9861 | 119 | |
daqn | 0:2a7221ee9861 | 120 | |
daqn | 0:2a7221ee9861 | 121 | /** MPU9250 IMU library. |
daqn | 0:2a7221ee9861 | 122 | * |
daqn | 0:2a7221ee9861 | 123 | * Example: |
daqn | 0:2a7221ee9861 | 124 | * @code |
daqn | 0:2a7221ee9861 | 125 | * Later, maybe |
daqn | 0:2a7221ee9861 | 126 | * @endcode |
daqn | 0:2a7221ee9861 | 127 | */ |
daqn | 0:2a7221ee9861 | 128 | class MPU9250 |
daqn | 0:2a7221ee9861 | 129 | { |
daqn | 0:2a7221ee9861 | 130 | public: |
daqn | 0:2a7221ee9861 | 131 | /** |
daqn | 0:2a7221ee9861 | 132 | * Constructor. |
daqn | 0:2a7221ee9861 | 133 | * |
daqn | 0:2a7221ee9861 | 134 | * Sleep mode of MPU9250 is immediatly disabled |
daqn | 0:2a7221ee9861 | 135 | * |
daqn | 0:2a7221ee9861 | 136 | * @param sda - mbed pin to use for the SDA I2C line. |
daqn | 0:2a7221ee9861 | 137 | * @param scl - mbed pin to use for the SCL I2C line. |
daqn | 0:2a7221ee9861 | 138 | */ |
daqn | 0:2a7221ee9861 | 139 | MPU9250(PinName sda, PinName scl); |
daqn | 0:2a7221ee9861 | 140 | |
daqn | 0:2a7221ee9861 | 141 | |
daqn | 0:2a7221ee9861 | 142 | /** |
daqn | 0:2a7221ee9861 | 143 | * Tests the I2C connection by reading the WHO_AM_I register. |
daqn | 0:2a7221ee9861 | 144 | * |
daqn | 0:2a7221ee9861 | 145 | * @return True for a working connection, false for an error |
daqn | 0:2a7221ee9861 | 146 | */ |
daqn | 0:2a7221ee9861 | 147 | bool testConnection( void ); |
daqn | 0:2a7221ee9861 | 148 | |
daqn | 0:2a7221ee9861 | 149 | /** |
daqn | 0:2a7221ee9861 | 150 | * Sets the bandwidth of the digital low-pass filter |
daqn | 0:2a7221ee9861 | 151 | * |
daqn | 0:2a7221ee9861 | 152 | * Macros: MPU9250_BW_256 - MPU9250_BW_188 - MPU9250_BW_98 - MPU9250_BW_42 - MPU9250_BW_20 - MPU9250_BW_10 - MPU9250_BW_5 |
daqn | 0:2a7221ee9861 | 153 | * Last number is the gyro's BW in Hz (accelero BW is virtually identical) |
daqn | 0:2a7221ee9861 | 154 | * |
daqn | 0:2a7221ee9861 | 155 | * @param BW - The three bits that set the bandwidth (use the predefined macros) |
daqn | 0:2a7221ee9861 | 156 | */ |
daqn | 0:2a7221ee9861 | 157 | void setBW( char BW ); |
daqn | 0:2a7221ee9861 | 158 | |
daqn | 0:2a7221ee9861 | 159 | /** |
daqn | 0:2a7221ee9861 | 160 | * Sets the auxiliary I2C bus in bypass mode to read the sensors behind the MPU9250 (useful for eval board, otherwise just connect them to primary I2C bus) |
daqn | 0:2a7221ee9861 | 161 | * |
daqn | 0:2a7221ee9861 | 162 | * @param state - Enables/disables the I2C bypass mode |
daqn | 0:2a7221ee9861 | 163 | */ |
daqn | 0:2a7221ee9861 | 164 | void setI2CBypass ( bool state ); |
daqn | 0:2a7221ee9861 | 165 | |
daqn | 0:2a7221ee9861 | 166 | /** |
daqn | 0:2a7221ee9861 | 167 | * Sets the Accelero full-scale range |
daqn | 0:2a7221ee9861 | 168 | * |
daqn | 0:2a7221ee9861 | 169 | * Macros: MPU9250_ACCELERO_RANGE_2G - MPU9250_ACCELERO_RANGE_4G - MPU9250_ACCELERO_RANGE_8G - MPU9250_ACCELERO_RANGE_16G |
daqn | 0:2a7221ee9861 | 170 | * |
daqn | 0:2a7221ee9861 | 171 | * @param range - The two bits that set the full-scale range (use the predefined macros) |
daqn | 0:2a7221ee9861 | 172 | */ |
daqn | 0:2a7221ee9861 | 173 | void setAcceleroRange(char range); |
daqn | 0:2a7221ee9861 | 174 | |
daqn | 0:2a7221ee9861 | 175 | /** |
daqn | 0:2a7221ee9861 | 176 | * Reads the accelero x-axis. |
daqn | 0:2a7221ee9861 | 177 | * |
daqn | 0:2a7221ee9861 | 178 | * @return 16-bit signed integer x-axis accelero data |
daqn | 0:2a7221ee9861 | 179 | */ |
daqn | 0:2a7221ee9861 | 180 | int getAcceleroRawX( void ); |
daqn | 0:2a7221ee9861 | 181 | |
daqn | 0:2a7221ee9861 | 182 | /** |
daqn | 0:2a7221ee9861 | 183 | * Reads the accelero y-axis. |
daqn | 0:2a7221ee9861 | 184 | * |
daqn | 0:2a7221ee9861 | 185 | * @return 16-bit signed integer y-axis accelero data |
daqn | 0:2a7221ee9861 | 186 | */ |
daqn | 0:2a7221ee9861 | 187 | int getAcceleroRawY( void ); |
daqn | 0:2a7221ee9861 | 188 | |
daqn | 0:2a7221ee9861 | 189 | /** |
daqn | 0:2a7221ee9861 | 190 | * Reads the accelero z-axis. |
daqn | 0:2a7221ee9861 | 191 | * |
daqn | 0:2a7221ee9861 | 192 | * @return 16-bit signed integer z-axis accelero data |
daqn | 0:2a7221ee9861 | 193 | */ |
daqn | 0:2a7221ee9861 | 194 | int getAcceleroRawZ( void ); |
daqn | 0:2a7221ee9861 | 195 | |
daqn | 0:2a7221ee9861 | 196 | /** |
daqn | 0:2a7221ee9861 | 197 | * Reads all accelero data. |
daqn | 0:2a7221ee9861 | 198 | * |
daqn | 0:2a7221ee9861 | 199 | * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z |
daqn | 0:2a7221ee9861 | 200 | */ |
daqn | 0:2a7221ee9861 | 201 | void getAcceleroRaw( int *data ); |
daqn | 0:2a7221ee9861 | 202 | |
daqn | 0:2a7221ee9861 | 203 | /** |
daqn | 0:2a7221ee9861 | 204 | * Reads all accelero data, gives the acceleration in m/s2 |
daqn | 0:2a7221ee9861 | 205 | * |
daqn | 0:2a7221ee9861 | 206 | * Function uses the last setup value of the full scale range, if you manually set in another range, this won't work. |
daqn | 0:2a7221ee9861 | 207 | * |
daqn | 0:2a7221ee9861 | 208 | * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z |
daqn | 0:2a7221ee9861 | 209 | */ |
daqn | 0:2a7221ee9861 | 210 | void getAccelero( float *data ); |
daqn | 0:2a7221ee9861 | 211 | |
daqn | 0:2a7221ee9861 | 212 | /** |
daqn | 0:2a7221ee9861 | 213 | * Sets the Gyro full-scale range |
daqn | 0:2a7221ee9861 | 214 | * |
daqn | 0:2a7221ee9861 | 215 | * Macros: MPU9250_GYRO_RANGE_250 - MPU9250_GYRO_RANGE_500 - MPU9250_GYRO_RANGE_1000 - MPU9250_GYRO_RANGE_2000 |
daqn | 0:2a7221ee9861 | 216 | * |
daqn | 0:2a7221ee9861 | 217 | * @param range - The two bits that set the full-scale range (use the predefined macros) |
daqn | 0:2a7221ee9861 | 218 | */ |
daqn | 0:2a7221ee9861 | 219 | void setGyroRange(char range); |
daqn | 0:2a7221ee9861 | 220 | |
daqn | 0:2a7221ee9861 | 221 | /** |
daqn | 0:2a7221ee9861 | 222 | * Reads the gyro x-axis. |
daqn | 0:2a7221ee9861 | 223 | * |
daqn | 0:2a7221ee9861 | 224 | * @return 16-bit signed integer x-axis gyro data |
daqn | 0:2a7221ee9861 | 225 | */ |
daqn | 0:2a7221ee9861 | 226 | int getGyroRawX( void ); |
daqn | 0:2a7221ee9861 | 227 | |
daqn | 0:2a7221ee9861 | 228 | /** |
daqn | 0:2a7221ee9861 | 229 | * Reads the gyro y-axis. |
daqn | 0:2a7221ee9861 | 230 | * |
daqn | 0:2a7221ee9861 | 231 | * @return 16-bit signed integer y-axis gyro data |
daqn | 0:2a7221ee9861 | 232 | */ |
daqn | 0:2a7221ee9861 | 233 | int getGyroRawY( void ); |
daqn | 0:2a7221ee9861 | 234 | |
daqn | 0:2a7221ee9861 | 235 | /** |
daqn | 0:2a7221ee9861 | 236 | * Reads the gyro z-axis. |
daqn | 0:2a7221ee9861 | 237 | * |
daqn | 0:2a7221ee9861 | 238 | * @return 16-bit signed integer z-axis gyro data |
daqn | 0:2a7221ee9861 | 239 | */ |
daqn | 0:2a7221ee9861 | 240 | int getGyroRawZ( void ); |
daqn | 0:2a7221ee9861 | 241 | |
daqn | 0:2a7221ee9861 | 242 | /** |
daqn | 0:2a7221ee9861 | 243 | * Reads all gyro data. |
daqn | 0:2a7221ee9861 | 244 | * |
daqn | 0:2a7221ee9861 | 245 | * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z |
daqn | 0:2a7221ee9861 | 246 | */ |
daqn | 0:2a7221ee9861 | 247 | void getGyroRaw( int *data ); |
daqn | 0:2a7221ee9861 | 248 | |
daqn | 0:2a7221ee9861 | 249 | /** |
daqn | 0:2a7221ee9861 | 250 | * Reads all gyro data, gives the gyro in rad/s |
daqn | 0:2a7221ee9861 | 251 | * |
daqn | 0:2a7221ee9861 | 252 | * Function uses the last setup value of the full scale range, if you manually set in another range, this won't work. |
daqn | 0:2a7221ee9861 | 253 | * |
daqn | 0:2a7221ee9861 | 254 | * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z |
daqn | 0:2a7221ee9861 | 255 | */ |
daqn | 0:2a7221ee9861 | 256 | void getGyro( float *data); |
daqn | 0:2a7221ee9861 | 257 | |
daqn | 0:2a7221ee9861 | 258 | /** |
daqn | 0:2a7221ee9861 | 259 | * Reads temperature data. |
daqn | 0:2a7221ee9861 | 260 | * |
daqn | 0:2a7221ee9861 | 261 | * @return 16 bit signed integer with the raw temperature register value |
daqn | 0:2a7221ee9861 | 262 | */ |
daqn | 0:2a7221ee9861 | 263 | int getTempRaw( void ); |
daqn | 0:2a7221ee9861 | 264 | |
daqn | 0:2a7221ee9861 | 265 | /** |
daqn | 0:2a7221ee9861 | 266 | * Returns current temperature |
daqn | 0:2a7221ee9861 | 267 | * |
daqn | 0:2a7221ee9861 | 268 | * @returns float with the current temperature |
daqn | 0:2a7221ee9861 | 269 | */ |
daqn | 0:2a7221ee9861 | 270 | float getTemp( void ); |
daqn | 0:2a7221ee9861 | 271 | |
daqn | 0:2a7221ee9861 | 272 | /** |
daqn | 0:2a7221ee9861 | 273 | * Sets the sleep mode of the MPU9250 |
daqn | 0:2a7221ee9861 | 274 | * |
daqn | 0:2a7221ee9861 | 275 | * @param state - true for sleeping, false for wake up |
daqn | 0:2a7221ee9861 | 276 | */ |
daqn | 0:2a7221ee9861 | 277 | void setSleepMode( bool state ); |
daqn | 0:2a7221ee9861 | 278 | |
daqn | 0:2a7221ee9861 | 279 | |
daqn | 0:2a7221ee9861 | 280 | /** |
daqn | 0:2a7221ee9861 | 281 | * Writes data to the device, could be private, but public is handy so you can transmit directly to the MPU. |
daqn | 0:2a7221ee9861 | 282 | * |
daqn | 0:2a7221ee9861 | 283 | * @param adress - register address to write to |
daqn | 0:2a7221ee9861 | 284 | * @param data - data to write |
daqn | 0:2a7221ee9861 | 285 | */ |
daqn | 0:2a7221ee9861 | 286 | void write( char address, char data); |
daqn | 0:2a7221ee9861 | 287 | |
daqn | 0:2a7221ee9861 | 288 | /** |
daqn | 0:2a7221ee9861 | 289 | * Read data from the device, could be private, but public is handy so you can transmit directly to the MPU. |
daqn | 0:2a7221ee9861 | 290 | * |
daqn | 0:2a7221ee9861 | 291 | * @param adress - register address to write to |
daqn | 0:2a7221ee9861 | 292 | * @return - data from the register specified by RA |
daqn | 0:2a7221ee9861 | 293 | */ |
daqn | 0:2a7221ee9861 | 294 | char read( char adress); |
daqn | 0:2a7221ee9861 | 295 | |
daqn | 0:2a7221ee9861 | 296 | /** |
daqn | 0:2a7221ee9861 | 297 | * Read multtiple regigsters from the device, more efficient than using multiple normal reads. |
daqn | 0:2a7221ee9861 | 298 | * |
daqn | 0:2a7221ee9861 | 299 | * @param adress - register address to write to |
daqn | 0:2a7221ee9861 | 300 | * @param length - number of bytes to read |
daqn | 0:2a7221ee9861 | 301 | * @param data - pointer where the data needs to be written to |
daqn | 0:2a7221ee9861 | 302 | */ |
daqn | 0:2a7221ee9861 | 303 | void read( char adress, char *data, int length); |
daqn | 0:2a7221ee9861 | 304 | |
daqn | 0:2a7221ee9861 | 305 | /** |
daqn | 0:2a7221ee9861 | 306 | * function for calculating the angle from the accelerometer. |
daqn | 0:2a7221ee9861 | 307 | * it takes 3 values which correspond acceleration in X, Y and Z direction and calculates angles in degrees |
daqn | 0:2a7221ee9861 | 308 | * for pitch, roll and one more direction.. (NOT YAW!) |
daqn | 0:2a7221ee9861 | 309 | * |
daqn | 0:2a7221ee9861 | 310 | * @param data - angle calculated using only accelerometer |
daqn | 0:2a7221ee9861 | 311 | * |
daqn | 0:2a7221ee9861 | 312 | */ |
daqn | 0:2a7221ee9861 | 313 | void getAcceleroAngle( float *data ); |
daqn | 0:2a7221ee9861 | 314 | |
daqn | 0:2a7221ee9861 | 315 | |
daqn | 0:2a7221ee9861 | 316 | /**function which allows to produce the offset values for gyro and accelerometer. |
daqn | 0:2a7221ee9861 | 317 | * offset for gyro is simply a value, which needs to be substracted from original gyro rad/sec speed |
daqn | 0:2a7221ee9861 | 318 | * but offset for accelerometer is calculated in angles... later on might change that |
daqn | 0:2a7221ee9861 | 319 | * function simply takes the number of samples to be taken and calculated the average |
daqn | 0:2a7221ee9861 | 320 | * |
daqn | 0:2a7221ee9861 | 321 | * @param accOffset - accelerometer offset in angle |
daqn | 0:2a7221ee9861 | 322 | * @param gyroOffset - gyroscope offset in rad/s |
daqn | 0:2a7221ee9861 | 323 | * @param sampleSize - number of samples to be taken for calculating offsets |
daqn | 0:2a7221ee9861 | 324 | * |
daqn | 0:2a7221ee9861 | 325 | */ |
daqn | 0:2a7221ee9861 | 326 | void getOffset(float *accOffset, float *gyroOffset, int sampleSize); |
daqn | 0:2a7221ee9861 | 327 | |
daqn | 0:2a7221ee9861 | 328 | /** |
daqn | 0:2a7221ee9861 | 329 | * function for computing the angle, when accelerometer angle offset and gyro offset are both known. |
daqn | 0:2a7221ee9861 | 330 | * we also need to know how much time passed from previous calculation to now |
daqn | 0:2a7221ee9861 | 331 | * it produces the angle in degrees. However angles are produced from -90.0 to 90.0 degrees |
daqn | 0:2a7221ee9861 | 332 | * if anyone need smth different, they can update this library... |
daqn | 0:2a7221ee9861 | 333 | * |
daqn | 0:2a7221ee9861 | 334 | * @param angle - calculated accurate angle from complemetary filter |
daqn | 0:2a7221ee9861 | 335 | * @param accOffset - offset in angle for the accelerometer |
daqn | 0:2a7221ee9861 | 336 | * @param gyroOffset - offset in rad/s for the gyroscope |
daqn | 0:2a7221ee9861 | 337 | * @param interval - time before previous angle calculation and now |
daqn | 0:2a7221ee9861 | 338 | * |
daqn | 0:2a7221ee9861 | 339 | */ |
daqn | 0:2a7221ee9861 | 340 | void computeAngle (float *angle, float *accOffset, float *gyroOffset, float interval); |
daqn | 0:2a7221ee9861 | 341 | |
daqn | 0:2a7221ee9861 | 342 | ///function, which enables interrupts on MPU9250 INT pin |
daqn | 0:2a7221ee9861 | 343 | void enableInt( void ); |
daqn | 0:2a7221ee9861 | 344 | |
daqn | 0:2a7221ee9861 | 345 | ///disables interrupts |
daqn | 0:2a7221ee9861 | 346 | void disableInt( void ); |
daqn | 0:2a7221ee9861 | 347 | |
daqn | 0:2a7221ee9861 | 348 | /**function which sets the alpha value - constant for the complementary filter. default alpha = 0.97 |
daqn | 0:2a7221ee9861 | 349 | * |
daqn | 0:2a7221ee9861 | 350 | * @param val - value the alpha (complementary filter constant) should be set to |
daqn | 0:2a7221ee9861 | 351 | * |
daqn | 0:2a7221ee9861 | 352 | */ |
daqn | 0:2a7221ee9861 | 353 | void setAlpha(float val); |
daqn | 0:2a7221ee9861 | 354 | |
daqn | 0:2a7221ee9861 | 355 | //////////////////////////////////////////////////////////////////////////// |
daqn | 0:2a7221ee9861 | 356 | //////////////////////////////////////////////////////////////////////////// |
daqn | 0:2a7221ee9861 | 357 | //////////////////////////////////////////////////////////////////////////// |
daqn | 0:2a7221ee9861 | 358 | |
daqn | 0:2a7221ee9861 | 359 | /** Daqn added |
daqn | 0:2a7221ee9861 | 360 | * read bytes on specific address and subaddress. |
daqn | 0:2a7221ee9861 | 361 | * |
daqn | 0:2a7221ee9861 | 362 | * @param adress - register address to write to |
daqn | 0:2a7221ee9861 | 363 | * @param subadress - register address to write to |
daqn | 0:2a7221ee9861 | 364 | * @param length - number of bytes to read |
daqn | 0:2a7221ee9861 | 365 | * @param data - pointer where the data needs to be written to |
daqn | 0:2a7221ee9861 | 366 | */ |
daqn | 0:2a7221ee9861 | 367 | void read(char address, char subaddress, char *data, int length); |
daqn | 0:2a7221ee9861 | 368 | |
daqn | 0:2a7221ee9861 | 369 | /** Daqn added |
daqn | 0:2a7221ee9861 | 370 | * Sets the Magneto full-scale range |
daqn | 0:2a7221ee9861 | 371 | * |
daqn | 0:2a7221ee9861 | 372 | * Macros: MPU9250_MAGNETO_RANGE_250 - MPU9250_MAGNETO_RANGE_500 - MPU9250_MAGNETO_RANGE_1000 - MPU9250_MAGNETO_RANGE_2000 |
daqn | 0:2a7221ee9861 | 373 | * |
daqn | 0:2a7221ee9861 | 374 | * @param range - The two bits that set the full-scale range (use the predefined macros) |
daqn | 0:2a7221ee9861 | 375 | */ |
daqn | 0:2a7221ee9861 | 376 | // void setMagnetoRange(char range); |
daqn | 0:2a7221ee9861 | 377 | |
daqn | 0:2a7221ee9861 | 378 | /** Daqn added |
daqn | 0:2a7221ee9861 | 379 | * Reads the magnetometer x-axis. |
daqn | 0:2a7221ee9861 | 380 | * |
daqn | 0:2a7221ee9861 | 381 | * @return 16-bit signed integer x-axis magnetometer data |
daqn | 0:2a7221ee9861 | 382 | */ |
daqn | 0:2a7221ee9861 | 383 | int getMagnetoRawX( void ); |
daqn | 0:2a7221ee9861 | 384 | |
daqn | 0:2a7221ee9861 | 385 | /** Daqn added |
daqn | 0:2a7221ee9861 | 386 | * Reads the magnetometer y-axis. |
daqn | 0:2a7221ee9861 | 387 | * |
daqn | 0:2a7221ee9861 | 388 | * @return 16-bit signed integer y-axis magnetometer data |
daqn | 0:2a7221ee9861 | 389 | */ |
daqn | 0:2a7221ee9861 | 390 | int getMagnetoRawY( void ); |
daqn | 0:2a7221ee9861 | 391 | |
daqn | 0:2a7221ee9861 | 392 | /** Daqn added |
daqn | 0:2a7221ee9861 | 393 | * Reads the magnetometer z-axis. |
daqn | 0:2a7221ee9861 | 394 | * |
daqn | 0:2a7221ee9861 | 395 | * @return 16-bit signed integer z-axis magnetometer data |
daqn | 0:2a7221ee9861 | 396 | */ |
daqn | 0:2a7221ee9861 | 397 | int getMagnetoRawZ( void ); |
daqn | 0:2a7221ee9861 | 398 | |
daqn | 0:2a7221ee9861 | 399 | /** Daqn added |
daqn | 0:2a7221ee9861 | 400 | * Reads all magnetometer data. |
daqn | 0:2a7221ee9861 | 401 | * |
daqn | 0:2a7221ee9861 | 402 | * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z |
daqn | 0:2a7221ee9861 | 403 | */ |
daqn | 0:2a7221ee9861 | 404 | void getMagnetoRaw( int *data ); |
daqn | 0:2a7221ee9861 | 405 | |
daqn | 0:2a7221ee9861 | 406 | /** Daqn added |
daqn | 0:2a7221ee9861 | 407 | * Reads all magnetometer data, gives the magnetometer in [[[TBD]]] |
daqn | 0:2a7221ee9861 | 408 | * |
daqn | 0:2a7221ee9861 | 409 | * Function uses the last setup value of the full scale range, if you manually set in another range, this won't work. |
daqn | 0:2a7221ee9861 | 410 | * |
daqn | 0:2a7221ee9861 | 411 | * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z |
daqn | 0:2a7221ee9861 | 412 | */ |
daqn | 0:2a7221ee9861 | 413 | void getMagneto( float *data); |
daqn | 0:2a7221ee9861 | 414 | |
daqn | 0:2a7221ee9861 | 415 | private: |
daqn | 0:2a7221ee9861 | 416 | |
daqn | 0:2a7221ee9861 | 417 | I2C connection; |
daqn | 0:2a7221ee9861 | 418 | char currentAcceleroRange; |
daqn | 0:2a7221ee9861 | 419 | char currentGyroRange; |
daqn | 0:2a7221ee9861 | 420 | float alpha; |
daqn | 0:2a7221ee9861 | 421 | |
daqn | 0:2a7221ee9861 | 422 | }; |
daqn | 0:2a7221ee9861 | 423 | |
daqn | 0:2a7221ee9861 | 424 | |
daqn | 0:2a7221ee9861 | 425 | |
daqn | 0:2a7221ee9861 | 426 | #endif |