MPU9250
Fork of MPU6050 by
Embed:
(wiki syntax)
Show/hide line numbers
MPU6050.h
00001 //ported from arduino library: https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050 00002 //written by szymon gaertig (email: szymon@gaertig.com.pl) 00003 // 00004 //Changelog: 00005 //2013-01-08 - first beta release 00006 00007 // I2Cdev library collection - MPU6050 I2C device class 00008 // Based on InvenSense MPU-6050 register map document rev. 2.0, 5/19/2011 (RM-MPU-6000A-00) 00009 // 10/3/2011 by Jeff Rowberg <jeff@rowberg.net> 00010 // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib 00011 // 00012 // Changelog: 00013 // ... - ongoing debug release 00014 00015 // NOTE: THIS IS ONLY A PARIAL RELEASE. THIS DEVICE CLASS IS CURRENTLY UNDERGOING ACTIVE 00016 // DEVELOPMENT AND IS STILL MISSING SOME IMPORTANT FEATURES. PLEASE KEEP THIS IN MIND IF 00017 // YOU DECIDE TO USE THIS PARTICULAR CODE FOR ANYTHING. 00018 00019 /* ============================================ 00020 I2Cdev device library code is placed under the MIT license 00021 Copyright (c) 2012 Jeff Rowberg 00022 00023 Permission is hereby granted, free of charge, to any person obtaining a copy 00024 of this software and associated documentation files (the "Software"), to deal 00025 in the Software without restriction, including without limitation the rights 00026 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00027 copies of the Software, and to permit persons to whom the Software is 00028 furnished to do so, subject to the following conditions: 00029 00030 The above copyright notice and this permission notice shall be included in 00031 all copies or substantial portions of the Software. 00032 00033 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00034 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00035 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00036 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00037 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00038 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00039 THE SOFTWARE. 00040 =============================================== 00041 */ 00042 00043 #ifndef _MPU6050_H_ 00044 #define _MPU6050_H_ 00045 00046 #include "mbed.h" 00047 #include "I2Cdev.h" 00048 #include "helper_3dmath.h" 00049 00050 00051 // select MPU9250 or MPU6050 00052 #define MPU9250 00053 //#define MPU6050 00054 00055 00056 #ifdef MPU9250 00057 #include "AK8963.h" 00058 #endif 00059 00060 #define MPU6050_ADDRESS_AD0_LOW 0x68 // address pin low (GND), default for InvenSense evaluation board 00061 #define MPU6050_ADDRESS_AD0_HIGH 0x69 // address pin high (VCC) 00062 #define MPU6050_DEFAULT_ADDRESS MPU6050_ADDRESS_AD0_LOW 00063 00064 #define MPU6050_RA_XG_OFFS_TC 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD 00065 #define MPU6050_RA_YG_OFFS_TC 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD 00066 #define MPU6050_RA_ZG_OFFS_TC 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD 00067 #define MPU6050_RA_X_FINE_GAIN 0x03 //[7:0] X_FINE_GAIN 00068 #define MPU6050_RA_Y_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN 00069 #define MPU6050_RA_Z_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN 00070 #define MPU6050_RA_XA_OFFS_H 0x06 //[15:0] XA_OFFS 00071 #define MPU6050_RA_XA_OFFS_L_TC 0x07 00072 #define MPU6050_RA_YA_OFFS_H 0x08 //[15:0] YA_OFFS 00073 #define MPU6050_RA_YA_OFFS_L_TC 0x09 00074 #define MPU6050_RA_ZA_OFFS_H 0x0A //[15:0] ZA_OFFS 00075 #define MPU6050_RA_ZA_OFFS_L_TC 0x0B 00076 #define MPU6050_RA_XG_OFFS_USRH 0x13 //[15:0] XG_OFFS_USR 00077 #define MPU6050_RA_XG_OFFS_USRL 0x14 00078 #define MPU6050_RA_YG_OFFS_USRH 0x15 //[15:0] YG_OFFS_USR 00079 #define MPU6050_RA_YG_OFFS_USRL 0x16 00080 #define MPU6050_RA_ZG_OFFS_USRH 0x17 //[15:0] ZG_OFFS_USR 00081 #define MPU6050_RA_ZG_OFFS_USRL 0x18 00082 #define MPU6050_RA_SMPLRT_DIV 0x19 00083 #define MPU6050_RA_CONFIG 0x1A 00084 #define MPU6050_RA_GYRO_CONFIG 0x1B 00085 #define MPU6050_RA_ACCEL_CONFIG 0x1C 00086 #define MPU6050_RA_FF_THR 0x1D 00087 #define MPU6050_RA_FF_DUR 0x1E 00088 #define MPU6050_RA_MOT_THR 0x1F 00089 #define MPU6050_RA_MOT_DUR 0x20 00090 #define MPU6050_RA_ZRMOT_THR 0x21 00091 #define MPU6050_RA_ZRMOT_DUR 0x22 00092 #define MPU6050_RA_FIFO_EN 0x23 00093 #define MPU6050_RA_I2C_MST_CTRL 0x24 00094 #define MPU6050_RA_I2C_SLV0_ADDR 0x25 00095 #define MPU6050_RA_I2C_SLV0_REG 0x26 00096 #define MPU6050_RA_I2C_SLV0_CTRL 0x27 00097 #define MPU6050_RA_I2C_SLV1_ADDR 0x28 00098 #define MPU6050_RA_I2C_SLV1_REG 0x29 00099 #define MPU6050_RA_I2C_SLV1_CTRL 0x2A 00100 #define MPU6050_RA_I2C_SLV2_ADDR 0x2B 00101 #define MPU6050_RA_I2C_SLV2_REG 0x2C 00102 #define MPU6050_RA_I2C_SLV2_CTRL 0x2D 00103 #define MPU6050_RA_I2C_SLV3_ADDR 0x2E 00104 #define MPU6050_RA_I2C_SLV3_REG 0x2F 00105 #define MPU6050_RA_I2C_SLV3_CTRL 0x30 00106 #define MPU6050_RA_I2C_SLV4_ADDR 0x31 00107 #define MPU6050_RA_I2C_SLV4_REG 0x32 00108 #define MPU6050_RA_I2C_SLV4_DO 0x33 00109 #define MPU6050_RA_I2C_SLV4_CTRL 0x34 00110 #define MPU6050_RA_I2C_SLV4_DI 0x35 00111 #define MPU6050_RA_I2C_MST_STATUS 0x36 00112 #define MPU6050_RA_INT_PIN_CFG 0x37 00113 #define MPU6050_RA_INT_ENABLE 0x38 00114 #define MPU6050_RA_DMP_INT_STATUS 0x39 00115 #define MPU6050_RA_INT_STATUS 0x3A 00116 #define MPU6050_RA_ACCEL_XOUT_H 0x3B 00117 #define MPU6050_RA_ACCEL_XOUT_L 0x3C 00118 #define MPU6050_RA_ACCEL_YOUT_H 0x3D 00119 #define MPU6050_RA_ACCEL_YOUT_L 0x3E 00120 #define MPU6050_RA_ACCEL_ZOUT_H 0x3F 00121 #define MPU6050_RA_ACCEL_ZOUT_L 0x40 00122 #define MPU6050_RA_TEMP_OUT_H 0x41 00123 #define MPU6050_RA_TEMP_OUT_L 0x42 00124 #define MPU6050_RA_GYRO_XOUT_H 0x43 00125 #define MPU6050_RA_GYRO_XOUT_L 0x44 00126 #define MPU6050_RA_GYRO_YOUT_H 0x45 00127 #define MPU6050_RA_GYRO_YOUT_L 0x46 00128 #define MPU6050_RA_GYRO_ZOUT_H 0x47 00129 #define MPU6050_RA_GYRO_ZOUT_L 0x48 00130 #define MPU6050_RA_EXT_SENS_DATA_00 0x49 00131 #define MPU6050_RA_EXT_SENS_DATA_01 0x4A 00132 #define MPU6050_RA_EXT_SENS_DATA_02 0x4B 00133 #define MPU6050_RA_EXT_SENS_DATA_03 0x4C 00134 #define MPU6050_RA_EXT_SENS_DATA_04 0x4D 00135 #define MPU6050_RA_EXT_SENS_DATA_05 0x4E 00136 #define MPU6050_RA_EXT_SENS_DATA_06 0x4F 00137 #define MPU6050_RA_EXT_SENS_DATA_07 0x50 00138 #define MPU6050_RA_EXT_SENS_DATA_08 0x51 00139 #define MPU6050_RA_EXT_SENS_DATA_09 0x52 00140 #define MPU6050_RA_EXT_SENS_DATA_10 0x53 00141 #define MPU6050_RA_EXT_SENS_DATA_11 0x54 00142 #define MPU6050_RA_EXT_SENS_DATA_12 0x55 00143 #define MPU6050_RA_EXT_SENS_DATA_13 0x56 00144 #define MPU6050_RA_EXT_SENS_DATA_14 0x57 00145 #define MPU6050_RA_EXT_SENS_DATA_15 0x58 00146 #define MPU6050_RA_EXT_SENS_DATA_16 0x59 00147 #define MPU6050_RA_EXT_SENS_DATA_17 0x5A 00148 #define MPU6050_RA_EXT_SENS_DATA_18 0x5B 00149 #define MPU6050_RA_EXT_SENS_DATA_19 0x5C 00150 #define MPU6050_RA_EXT_SENS_DATA_20 0x5D 00151 #define MPU6050_RA_EXT_SENS_DATA_21 0x5E 00152 #define MPU6050_RA_EXT_SENS_DATA_22 0x5F 00153 #define MPU6050_RA_EXT_SENS_DATA_23 0x60 00154 #define MPU6050_RA_MOT_DETECT_STATUS 0x61 00155 #define MPU6050_RA_I2C_SLV0_DO 0x63 00156 #define MPU6050_RA_I2C_SLV1_DO 0x64 00157 #define MPU6050_RA_I2C_SLV2_DO 0x65 00158 #define MPU6050_RA_I2C_SLV3_DO 0x66 00159 #define MPU6050_RA_I2C_MST_DELAY_CTRL 0x67 00160 #define MPU6050_RA_SIGNAL_PATH_RESET 0x68 00161 #define MPU6050_RA_MOT_DETECT_CTRL 0x69 00162 #define MPU6050_RA_USER_CTRL 0x6A 00163 #define MPU6050_RA_PWR_MGMT_1 0x6B 00164 #define MPU6050_RA_PWR_MGMT_2 0x6C 00165 #define MPU6050_RA_BANK_SEL 0x6D 00166 #define MPU6050_RA_MEM_START_ADDR 0x6E 00167 #define MPU6050_RA_MEM_R_W 0x6F 00168 #define MPU6050_RA_DMP_CFG_1 0x70 00169 #define MPU6050_RA_DMP_CFG_2 0x71 00170 #define MPU6050_RA_FIFO_COUNTH 0x72 00171 #define MPU6050_RA_FIFO_COUNTL 0x73 00172 #define MPU6050_RA_FIFO_R_W 0x74 00173 #define MPU6050_RA_WHO_AM_I 0x75 00174 00175 #define MPU6050_TC_PWR_MODE_BIT 7 00176 #define MPU6050_TC_OFFSET_BIT 6 00177 #define MPU6050_TC_OFFSET_LENGTH 6 00178 #define MPU6050_TC_OTP_BNK_VLD_BIT 0 00179 00180 #define MPU6050_VDDIO_LEVEL_VLOGIC 0 00181 #define MPU6050_VDDIO_LEVEL_VDD 1 00182 00183 #define MPU6050_CFG_EXT_SYNC_SET_BIT 5 00184 #define MPU6050_CFG_EXT_SYNC_SET_LENGTH 3 00185 #define MPU6050_CFG_DLPF_CFG_BIT 2 00186 #define MPU6050_CFG_DLPF_CFG_LENGTH 3 00187 00188 #define MPU6050_EXT_SYNC_DISABLED 0x0 00189 #define MPU6050_EXT_SYNC_TEMP_OUT_L 0x1 00190 #define MPU6050_EXT_SYNC_GYRO_XOUT_L 0x2 00191 #define MPU6050_EXT_SYNC_GYRO_YOUT_L 0x3 00192 #define MPU6050_EXT_SYNC_GYRO_ZOUT_L 0x4 00193 #define MPU6050_EXT_SYNC_ACCEL_XOUT_L 0x5 00194 #define MPU6050_EXT_SYNC_ACCEL_YOUT_L 0x6 00195 #define MPU6050_EXT_SYNC_ACCEL_ZOUT_L 0x7 00196 00197 #define MPU6050_DLPF_BW_256 0x00 00198 #define MPU6050_DLPF_BW_188 0x01 00199 #define MPU6050_DLPF_BW_98 0x02 00200 #define MPU6050_DLPF_BW_42 0x03 00201 #define MPU6050_DLPF_BW_20 0x04 00202 #define MPU6050_DLPF_BW_10 0x05 00203 #define MPU6050_DLPF_BW_5 0x06 00204 00205 #define MPU6050_GCONFIG_FS_SEL_BIT 4 00206 #define MPU6050_GCONFIG_FS_SEL_LENGTH 2 00207 00208 #define MPU6050_GYRO_FS_250 0x00 00209 #define MPU6050_GYRO_FS_500 0x01 00210 #define MPU6050_GYRO_FS_1000 0x02 00211 #define MPU6050_GYRO_FS_2000 0x03 00212 00213 #define MPU6050_ACONFIG_XA_ST_BIT 7 00214 #define MPU6050_ACONFIG_YA_ST_BIT 6 00215 #define MPU6050_ACONFIG_ZA_ST_BIT 5 00216 #define MPU6050_ACONFIG_AFS_SEL_BIT 4 00217 #define MPU6050_ACONFIG_AFS_SEL_LENGTH 2 00218 #define MPU6050_ACONFIG_ACCEL_HPF_BIT 2 00219 #define MPU6050_ACONFIG_ACCEL_HPF_LENGTH 3 00220 00221 #define MPU6050_ACCEL_FS_2 0x00 00222 #define MPU6050_ACCEL_FS_4 0x01 00223 #define MPU6050_ACCEL_FS_8 0x02 00224 #define MPU6050_ACCEL_FS_16 0x03 00225 00226 #define MPU6050_DHPF_RESET 0x00 00227 #define MPU6050_DHPF_5 0x01 00228 #define MPU6050_DHPF_2P5 0x02 00229 #define MPU6050_DHPF_1P25 0x03 00230 #define MPU6050_DHPF_0P63 0x04 00231 #define MPU6050_DHPF_HOLD 0x07 00232 00233 #define MPU6050_TEMP_FIFO_EN_BIT 7 00234 #define MPU6050_XG_FIFO_EN_BIT 6 00235 #define MPU6050_YG_FIFO_EN_BIT 5 00236 #define MPU6050_ZG_FIFO_EN_BIT 4 00237 #define MPU6050_ACCEL_FIFO_EN_BIT 3 00238 #define MPU6050_SLV2_FIFO_EN_BIT 2 00239 #define MPU6050_SLV1_FIFO_EN_BIT 1 00240 #define MPU6050_SLV0_FIFO_EN_BIT 0 00241 00242 #define MPU6050_MULT_MST_EN_BIT 7 00243 #define MPU6050_WAIT_FOR_ES_BIT 6 00244 #define MPU6050_SLV_3_FIFO_EN_BIT 5 00245 #define MPU6050_I2C_MST_P_NSR_BIT 4 00246 #define MPU6050_I2C_MST_CLK_BIT 3 00247 #define MPU6050_I2C_MST_CLK_LENGTH 4 00248 00249 #define MPU6050_CLOCK_DIV_348 0x0 00250 #define MPU6050_CLOCK_DIV_333 0x1 00251 #define MPU6050_CLOCK_DIV_320 0x2 00252 #define MPU6050_CLOCK_DIV_308 0x3 00253 #define MPU6050_CLOCK_DIV_296 0x4 00254 #define MPU6050_CLOCK_DIV_286 0x5 00255 #define MPU6050_CLOCK_DIV_276 0x6 00256 #define MPU6050_CLOCK_DIV_267 0x7 00257 #define MPU6050_CLOCK_DIV_258 0x8 00258 #define MPU6050_CLOCK_DIV_500 0x9 00259 #define MPU6050_CLOCK_DIV_471 0xA 00260 #define MPU6050_CLOCK_DIV_444 0xB 00261 #define MPU6050_CLOCK_DIV_421 0xC 00262 #define MPU6050_CLOCK_DIV_400 0xD 00263 #define MPU6050_CLOCK_DIV_381 0xE 00264 #define MPU6050_CLOCK_DIV_364 0xF 00265 00266 #define MPU6050_I2C_SLV_RW_BIT 7 00267 #define MPU6050_I2C_SLV_ADDR_BIT 6 00268 #define MPU6050_I2C_SLV_ADDR_LENGTH 7 00269 #define MPU6050_I2C_SLV_EN_BIT 7 00270 #define MPU6050_I2C_SLV_BYTE_SW_BIT 6 00271 #define MPU6050_I2C_SLV_REG_DIS_BIT 5 00272 #define MPU6050_I2C_SLV_GRP_BIT 4 00273 #define MPU6050_I2C_SLV_LEN_BIT 3 00274 #define MPU6050_I2C_SLV_LEN_LENGTH 4 00275 00276 #define MPU6050_I2C_SLV4_RW_BIT 7 00277 #define MPU6050_I2C_SLV4_ADDR_BIT 6 00278 #define MPU6050_I2C_SLV4_ADDR_LENGTH 7 00279 #define MPU6050_I2C_SLV4_EN_BIT 7 00280 #define MPU6050_I2C_SLV4_INT_EN_BIT 6 00281 #define MPU6050_I2C_SLV4_REG_DIS_BIT 5 00282 #define MPU6050_I2C_SLV4_MST_DLY_BIT 4 00283 #define MPU6050_I2C_SLV4_MST_DLY_LENGTH 5 00284 00285 #define MPU6050_MST_PASS_THROUGH_BIT 7 00286 #define MPU6050_MST_I2C_SLV4_DONE_BIT 6 00287 #define MPU6050_MST_I2C_LOST_ARB_BIT 5 00288 #define MPU6050_MST_I2C_SLV4_NACK_BIT 4 00289 #define MPU6050_MST_I2C_SLV3_NACK_BIT 3 00290 #define MPU6050_MST_I2C_SLV2_NACK_BIT 2 00291 #define MPU6050_MST_I2C_SLV1_NACK_BIT 1 00292 #define MPU6050_MST_I2C_SLV0_NACK_BIT 0 00293 00294 #define MPU6050_INTCFG_INT_LEVEL_BIT 7 00295 #define MPU6050_INTCFG_INT_OPEN_BIT 6 00296 #define MPU6050_INTCFG_LATCH_INT_EN_BIT 5 00297 #define MPU6050_INTCFG_INT_RD_CLEAR_BIT 4 00298 #define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT 3 00299 #define MPU6050_INTCFG_FSYNC_INT_EN_BIT 2 00300 #define MPU6050_INTCFG_I2C_BYPASS_EN_BIT 1 00301 #define MPU6050_INTCFG_CLKOUT_EN_BIT 0 00302 00303 #define MPU6050_INTMODE_ACTIVEHIGH 0x00 00304 #define MPU6050_INTMODE_ACTIVELOW 0x01 00305 00306 #define MPU6050_INTDRV_PUSHPULL 0x00 00307 #define MPU6050_INTDRV_OPENDRAIN 0x01 00308 00309 #define MPU6050_INTLATCH_50USPULSE 0x00 00310 #define MPU6050_INTLATCH_WAITCLEAR 0x01 00311 00312 #define MPU6050_INTCLEAR_STATUSREAD 0x00 00313 #define MPU6050_INTCLEAR_ANYREAD 0x01 00314 00315 #define MPU6050_INTERRUPT_FF_BIT 7 00316 #define MPU6050_INTERRUPT_MOT_BIT 6 00317 #define MPU6050_INTERRUPT_ZMOT_BIT 5 00318 #define MPU6050_INTERRUPT_FIFO_OFLOW_BIT 4 00319 #define MPU6050_INTERRUPT_I2C_MST_INT_BIT 3 00320 #define MPU6050_INTERRUPT_PLL_RDY_INT_BIT 2 00321 #define MPU6050_INTERRUPT_DMP_INT_BIT 1 00322 #define MPU6050_INTERRUPT_DATA_RDY_BIT 0 00323 00324 // TODO: figure out what these actually do 00325 // UMPL source code is not very obivous 00326 #define MPU6050_DMPINT_5_BIT 5 00327 #define MPU6050_DMPINT_4_BIT 4 00328 #define MPU6050_DMPINT_3_BIT 3 00329 #define MPU6050_DMPINT_2_BIT 2 00330 #define MPU6050_DMPINT_1_BIT 1 00331 #define MPU6050_DMPINT_0_BIT 0 00332 00333 #define MPU6050_MOTION_MOT_XNEG_BIT 7 00334 #define MPU6050_MOTION_MOT_XPOS_BIT 6 00335 #define MPU6050_MOTION_MOT_YNEG_BIT 5 00336 #define MPU6050_MOTION_MOT_YPOS_BIT 4 00337 #define MPU6050_MOTION_MOT_ZNEG_BIT 3 00338 #define MPU6050_MOTION_MOT_ZPOS_BIT 2 00339 #define MPU6050_MOTION_MOT_ZRMOT_BIT 0 00340 00341 #define MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT 7 00342 #define MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT 4 00343 #define MPU6050_DELAYCTRL_I2C_SLV3_DLY_EN_BIT 3 00344 #define MPU6050_DELAYCTRL_I2C_SLV2_DLY_EN_BIT 2 00345 #define MPU6050_DELAYCTRL_I2C_SLV1_DLY_EN_BIT 1 00346 #define MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT 0 00347 00348 #define MPU6050_PATHRESET_GYRO_RESET_BIT 2 00349 #define MPU6050_PATHRESET_ACCEL_RESET_BIT 1 00350 #define MPU6050_PATHRESET_TEMP_RESET_BIT 0 00351 00352 #define MPU6050_DETECT_ACCEL_ON_DELAY_BIT 5 00353 #define MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH 2 00354 #define MPU6050_DETECT_FF_COUNT_BIT 3 00355 #define MPU6050_DETECT_FF_COUNT_LENGTH 2 00356 #define MPU6050_DETECT_MOT_COUNT_BIT 1 00357 #define MPU6050_DETECT_MOT_COUNT_LENGTH 2 00358 00359 #define MPU6050_DETECT_DECREMENT_RESET 0x0 00360 #define MPU6050_DETECT_DECREMENT_1 0x1 00361 #define MPU6050_DETECT_DECREMENT_2 0x2 00362 #define MPU6050_DETECT_DECREMENT_4 0x3 00363 00364 #define MPU6050_USERCTRL_DMP_EN_BIT 7 00365 #define MPU6050_USERCTRL_FIFO_EN_BIT 6 00366 #define MPU6050_USERCTRL_I2C_MST_EN_BIT 5 00367 #define MPU6050_USERCTRL_I2C_IF_DIS_BIT 4 00368 #define MPU6050_USERCTRL_DMP_RESET_BIT 3 00369 #define MPU6050_USERCTRL_FIFO_RESET_BIT 2 00370 #define MPU6050_USERCTRL_I2C_MST_RESET_BIT 1 00371 #define MPU6050_USERCTRL_SIG_COND_RESET_BIT 0 00372 00373 #define MPU6050_PWR1_DEVICE_RESET_BIT 7 00374 #define MPU6050_PWR1_SLEEP_BIT 6 00375 #define MPU6050_PWR1_CYCLE_BIT 5 00376 #define MPU6050_PWR1_TEMP_DIS_BIT 3 00377 #define MPU6050_PWR1_CLKSEL_BIT 2 00378 #define MPU6050_PWR1_CLKSEL_LENGTH 3 00379 00380 #define MPU6050_CLOCK_INTERNAL 0x00 00381 #define MPU6050_CLOCK_PLL_XGYRO 0x01 00382 #define MPU6050_CLOCK_PLL_YGYRO 0x02 00383 #define MPU6050_CLOCK_PLL_ZGYRO 0x03 00384 #define MPU6050_CLOCK_PLL_EXT32K 0x04 00385 #define MPU6050_CLOCK_PLL_EXT19M 0x05 00386 #define MPU6050_CLOCK_KEEP_RESET 0x07 00387 00388 #define MPU6050_PWR2_LP_WAKE_CTRL_BIT 7 00389 #define MPU6050_PWR2_LP_WAKE_CTRL_LENGTH 2 00390 #define MPU6050_PWR2_STBY_XA_BIT 5 00391 #define MPU6050_PWR2_STBY_YA_BIT 4 00392 #define MPU6050_PWR2_STBY_ZA_BIT 3 00393 #define MPU6050_PWR2_STBY_XG_BIT 2 00394 #define MPU6050_PWR2_STBY_YG_BIT 1 00395 #define MPU6050_PWR2_STBY_ZG_BIT 0 00396 00397 #define MPU6050_WAKE_FREQ_1P25 0x0 00398 #define MPU6050_WAKE_FREQ_2P5 0x1 00399 #define MPU6050_WAKE_FREQ_5 0x2 00400 #define MPU6050_WAKE_FREQ_10 0x3 00401 00402 #define MPU6050_BANKSEL_PRFTCH_EN_BIT 6 00403 #define MPU6050_BANKSEL_CFG_USER_BANK_BIT 5 00404 #define MPU6050_BANKSEL_MEM_SEL_BIT 4 00405 #define MPU6050_BANKSEL_MEM_SEL_LENGTH 5 00406 00407 #define MPU6050_WHO_AM_I_BIT 6 00408 #define MPU6050_WHO_AM_I_LENGTH 6 00409 00410 #define MPU6050_DMP_MEMORY_BANKS 8 00411 #define MPU6050_DMP_MEMORY_BANK_SIZE 256 00412 #define MPU6050_DMP_MEMORY_CHUNK_SIZE 16 00413 00414 00415 00416 #define MPU60X0_ADDRESS_AD0_LOW 0x68 // address pin low (GND), default for InvenSense evaluation board 00417 #define MPU60X0_ADDRESS_AD0_HIGH 0x69 // address pin high (VCC) 00418 #define MPU60X0_DEFAULT_ADDRESS MPU60X0_ADDRESS_AD0_LOW 00419 #define MPU60X0_DEFAULT_SS_PIN 4 00420 00421 #define MPU60X0_RA_XG_OFFS_TC 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD 00422 #define MPU60X0_RA_YG_OFFS_TC 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD 00423 #define MPU60X0_RA_ZG_OFFS_TC 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD 00424 #define MPU60X0_RA_X_FINE_GAIN 0x03 //[7:0] X_FINE_GAIN 00425 #define MPU60X0_RA_Y_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN 00426 #define MPU60X0_RA_Z_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN 00427 #define MPU60X0_RA_XA_OFFS_H 0x06 //[15:0] XA_OFFS 00428 #define MPU60X0_RA_XA_OFFS_L_TC 0x07 00429 #define MPU60X0_RA_YA_OFFS_H 0x08 //[15:0] YA_OFFS 00430 #define MPU60X0_RA_YA_OFFS_L_TC 0x09 00431 #define MPU60X0_RA_ZA_OFFS_H 0x0A //[15:0] ZA_OFFS 00432 #define MPU60X0_RA_ZA_OFFS_L_TC 0x0B 00433 #define MPU60X0_RA_XG_OFFS_USRH 0x13 //[15:0] XG_OFFS_USR 00434 #define MPU60X0_RA_XG_OFFS_USRL 0x14 00435 #define MPU60X0_RA_YG_OFFS_USRH 0x15 //[15:0] YG_OFFS_USR 00436 #define MPU60X0_RA_YG_OFFS_USRL 0x16 00437 #define MPU60X0_RA_ZG_OFFS_USRH 0x17 //[15:0] ZG_OFFS_USR 00438 #define MPU60X0_RA_ZG_OFFS_USRL 0x18 00439 #define MPU60X0_RA_SMPLRT_DIV 0x19 00440 #define MPU60X0_RA_CONFIG 0x1A 00441 #define MPU60X0_RA_GYRO_CONFIG 0x1B 00442 #define MPU60X0_RA_ACCEL_CONFIG 0x1C 00443 #define MPU9250_RA_ACCEL_CONFIG2 0x1D 00444 #define MPU60X0_RA_FF_THR 0x1D 00445 #define MPU60X0_RA_FF_DUR 0x1E 00446 #define MPU60X0_RA_MOT_THR 0x1F 00447 #define MPU60X0_RA_MOT_DUR 0x20 00448 #define MPU60X0_RA_ZRMOT_THR 0x21 00449 #define MPU60X0_RA_ZRMOT_DUR 0x22 00450 #define MPU60X0_RA_FIFO_EN 0x23 00451 #define MPU60X0_RA_I2C_MST_CTRL 0x24 00452 #define MPU60X0_RA_I2C_SLV0_ADDR 0x25 00453 #define MPU60X0_RA_I2C_SLV0_REG 0x26 00454 #define MPU60X0_RA_I2C_SLV0_CTRL 0x27 00455 #define MPU60X0_RA_I2C_SLV1_ADDR 0x28 00456 #define MPU60X0_RA_I2C_SLV1_REG 0x29 00457 #define MPU60X0_RA_I2C_SLV1_CTRL 0x2A 00458 #define MPU60X0_RA_I2C_SLV2_ADDR 0x2B 00459 #define MPU60X0_RA_I2C_SLV2_REG 0x2C 00460 #define MPU60X0_RA_I2C_SLV2_CTRL 0x2D 00461 #define MPU60X0_RA_I2C_SLV3_ADDR 0x2E 00462 #define MPU60X0_RA_I2C_SLV3_REG 0x2F 00463 #define MPU60X0_RA_I2C_SLV3_CTRL 0x30 00464 #define MPU60X0_RA_I2C_SLV4_ADDR 0x31 00465 #define MPU60X0_RA_I2C_SLV4_REG 0x32 00466 #define MPU60X0_RA_I2C_SLV4_DO 0x33 00467 #define MPU60X0_RA_I2C_SLV4_CTRL 0x34 00468 #define MPU60X0_RA_I2C_SLV4_DI 0x35 00469 #define MPU60X0_RA_I2C_MST_STATUS 0x36 00470 #define MPU60X0_RA_INT_PIN_CFG 0x37 00471 #define MPU60X0_RA_INT_ENABLE 0x38 00472 #define MPU60X0_RA_DMP_INT_STATUS 0x39 00473 #define MPU60X0_RA_INT_STATUS 0x3A 00474 #define MPU60X0_RA_ACCEL_XOUT_H 0x3B 00475 #define MPU60X0_RA_ACCEL_XOUT_L 0x3C 00476 #define MPU60X0_RA_ACCEL_YOUT_H 0x3D 00477 #define MPU60X0_RA_ACCEL_YOUT_L 0x3E 00478 #define MPU60X0_RA_ACCEL_ZOUT_H 0x3F 00479 #define MPU60X0_RA_ACCEL_ZOUT_L 0x40 00480 #define MPU60X0_RA_TEMP_OUT_H 0x41 00481 #define MPU60X0_RA_TEMP_OUT_L 0x42 00482 #define MPU60X0_RA_GYRO_XOUT_H 0x43 00483 #define MPU60X0_RA_GYRO_XOUT_L 0x44 00484 #define MPU60X0_RA_GYRO_YOUT_H 0x45 00485 #define MPU60X0_RA_GYRO_YOUT_L 0x46 00486 #define MPU60X0_RA_GYRO_ZOUT_H 0x47 00487 #define MPU60X0_RA_GYRO_ZOUT_L 0x48 00488 #define MPU60X0_RA_EXT_SENS_DATA_00 0x49 00489 #define MPU60X0_RA_EXT_SENS_DATA_01 0x4A 00490 #define MPU60X0_RA_EXT_SENS_DATA_02 0x4B 00491 #define MPU60X0_RA_EXT_SENS_DATA_03 0x4C 00492 #define MPU60X0_RA_EXT_SENS_DATA_04 0x4D 00493 #define MPU60X0_RA_EXT_SENS_DATA_05 0x4E 00494 #define MPU60X0_RA_EXT_SENS_DATA_06 0x4F 00495 #define MPU60X0_RA_EXT_SENS_DATA_07 0x50 00496 #define MPU60X0_RA_EXT_SENS_DATA_08 0x51 00497 #define MPU60X0_RA_EXT_SENS_DATA_09 0x52 00498 #define MPU60X0_RA_EXT_SENS_DATA_10 0x53 00499 #define MPU60X0_RA_EXT_SENS_DATA_11 0x54 00500 #define MPU60X0_RA_EXT_SENS_DATA_12 0x55 00501 #define MPU60X0_RA_EXT_SENS_DATA_13 0x56 00502 #define MPU60X0_RA_EXT_SENS_DATA_14 0x57 00503 #define MPU60X0_RA_EXT_SENS_DATA_15 0x58 00504 #define MPU60X0_RA_EXT_SENS_DATA_16 0x59 00505 #define MPU60X0_RA_EXT_SENS_DATA_17 0x5A 00506 #define MPU60X0_RA_EXT_SENS_DATA_18 0x5B 00507 #define MPU60X0_RA_EXT_SENS_DATA_19 0x5C 00508 #define MPU60X0_RA_EXT_SENS_DATA_20 0x5D 00509 #define MPU60X0_RA_EXT_SENS_DATA_21 0x5E 00510 #define MPU60X0_RA_EXT_SENS_DATA_22 0x5F 00511 #define MPU60X0_RA_EXT_SENS_DATA_23 0x60 00512 #define MPU60X0_RA_MOT_DETECT_STATUS 0x61 00513 #define MPU60X0_RA_I2C_SLV0_DO 0x63 00514 #define MPU60X0_RA_I2C_SLV1_DO 0x64 00515 #define MPU60X0_RA_I2C_SLV2_DO 0x65 00516 #define MPU60X0_RA_I2C_SLV3_DO 0x66 00517 #define MPU60X0_RA_I2C_MST_DELAY_CTRL 0x67 00518 #define MPU60X0_RA_SIGNAL_PATH_RESET 0x68 00519 #define MPU60X0_RA_MOT_DETECT_CTRL 0x69 00520 #define MPU60X0_RA_USER_CTRL 0x6A 00521 #define MPU60X0_RA_PWR_MGMT_1 0x6B 00522 #define MPU60X0_RA_PWR_MGMT_2 0x6C 00523 #define MPU60X0_RA_BANK_SEL 0x6D 00524 #define MPU60X0_RA_MEM_START_ADDR 0x6E 00525 #define MPU60X0_RA_MEM_R_W 0x6F 00526 #define MPU60X0_RA_DMP_CFG_1 0x70 00527 #define MPU60X0_RA_DMP_CFG_2 0x71 00528 #define MPU60X0_RA_FIFO_COUNTH 0x72 00529 #define MPU60X0_RA_FIFO_COUNTL 0x73 00530 #define MPU60X0_RA_FIFO_R_W 0x74 00531 #define MPU60X0_RA_WHO_AM_I 0x75 00532 00533 #define MPU60X0_TC_PWR_MODE_BIT 7 00534 #define MPU60X0_TC_OFFSET_BIT 6 00535 #define MPU60X0_TC_OFFSET_LENGTH 6 00536 #define MPU60X0_TC_OTP_BNK_VLD_BIT 0 00537 00538 #define MPU60X0_VDDIO_LEVEL_VLOGIC 0 00539 #define MPU60X0_VDDIO_LEVEL_VDD 1 00540 00541 #define MPU60X0_CFG_EXT_SYNC_SET_BIT 5 00542 #define MPU60X0_CFG_EXT_SYNC_SET_LENGTH 3 00543 #define MPU60X0_CFG_DLPF_CFG_BIT 2 00544 #define MPU60X0_CFG_DLPF_CFG_LENGTH 3 00545 00546 #define MPU60X0_EXT_SYNC_DISABLED 0x0 00547 #define MPU60X0_EXT_SYNC_TEMP_OUT_L 0x1 00548 #define MPU60X0_EXT_SYNC_GYRO_XOUT_L 0x2 00549 #define MPU60X0_EXT_SYNC_GYRO_YOUT_L 0x3 00550 #define MPU60X0_EXT_SYNC_GYRO_ZOUT_L 0x4 00551 #define MPU60X0_EXT_SYNC_ACCEL_XOUT_L 0x5 00552 #define MPU60X0_EXT_SYNC_ACCEL_YOUT_L 0x6 00553 #define MPU60X0_EXT_SYNC_ACCEL_ZOUT_L 0x7 00554 00555 #define MPU60X0_DLPF_BW_256 0x00 00556 #define MPU60X0_DLPF_BW_184 0x01 00557 #define MPU60X0_DLPF_BW_98 0x02 00558 #define MPU60X0_DLPF_BW_42 0x03 00559 #define MPU60X0_DLPF_BW_20 0x04 00560 #define MPU60X0_DLPF_BW_10 0x05 00561 #define MPU60X0_DLPF_BW_5 0x06 00562 00563 #define MPU60X0_GCONFIG_FS_SEL_BIT 4 00564 #define MPU60X0_GCONFIG_FS_SEL_LENGTH 2 00565 00566 #define MPU60X0_GYRO_FS_250 0x00 00567 #define MPU60X0_GYRO_FS_500 0x01 00568 #define MPU60X0_GYRO_FS_1000 0x02 00569 #define MPU60X0_GYRO_FS_2000 0x03 00570 00571 #define MPU60X0_ACONFIG_XA_ST_BIT 7 00572 #define MPU60X0_ACONFIG_YA_ST_BIT 6 00573 #define MPU60X0_ACONFIG_ZA_ST_BIT 5 00574 #define MPU60X0_ACONFIG_AFS_SEL_BIT 4 00575 #define MPU60X0_ACONFIG_AFS_SEL_LENGTH 2 00576 #define MPU60X0_ACONFIG_ACCEL_HPF_BIT 2 00577 #define MPU60X0_ACONFIG_ACCEL_HPF_LENGTH 3 00578 00579 #define MPU60X0_ACCEL_FS_2 0x00 00580 #define MPU60X0_ACCEL_FS_4 0x01 00581 #define MPU60X0_ACCEL_FS_8 0x02 00582 #define MPU60X0_ACCEL_FS_16 0x03 00583 00584 #define MPU60X0_DHPF_RESET 0x00 00585 #define MPU60X0_DHPF_5 0x01 00586 #define MPU60X0_DHPF_2P5 0x02 00587 #define MPU60X0_DHPF_1P25 0x03 00588 #define MPU60X0_DHPF_0P63 0x04 00589 #define MPU60X0_DHPF_HOLD 0x07 00590 00591 #define MPU60X0_TEMP_FIFO_EN_BIT 7 00592 #define MPU60X0_XG_FIFO_EN_BIT 6 00593 #define MPU60X0_YG_FIFO_EN_BIT 5 00594 #define MPU60X0_ZG_FIFO_EN_BIT 4 00595 #define MPU60X0_ACCEL_FIFO_EN_BIT 3 00596 #define MPU60X0_SLV2_FIFO_EN_BIT 2 00597 #define MPU60X0_SLV1_FIFO_EN_BIT 1 00598 #define MPU60X0_SLV0_FIFO_EN_BIT 0 00599 00600 #define MPU60X0_MULT_MST_EN_BIT 7 00601 #define MPU60X0_WAIT_FOR_ES_BIT 6 00602 #define MPU60X0_SLV_3_FIFO_EN_BIT 5 00603 #define MPU60X0_I2C_MST_P_NSR_BIT 4 00604 #define MPU60X0_I2C_MST_CLK_BIT 3 00605 #define MPU60X0_I2C_MST_CLK_LENGTH 4 00606 00607 #define MPU60X0_CLOCK_DIV_348 0x0 00608 #define MPU60X0_CLOCK_DIV_333 0x1 00609 #define MPU60X0_CLOCK_DIV_320 0x2 00610 #define MPU60X0_CLOCK_DIV_308 0x3 00611 #define MPU60X0_CLOCK_DIV_296 0x4 00612 #define MPU60X0_CLOCK_DIV_286 0x5 00613 #define MPU60X0_CLOCK_DIV_276 0x6 00614 #define MPU60X0_CLOCK_DIV_267 0x7 00615 #define MPU60X0_CLOCK_DIV_258 0x8 00616 #define MPU60X0_CLOCK_DIV_500 0x9 00617 #define MPU60X0_CLOCK_DIV_471 0xA 00618 #define MPU60X0_CLOCK_DIV_444 0xB 00619 #define MPU60X0_CLOCK_DIV_421 0xC 00620 #define MPU60X0_CLOCK_DIV_400 0xD 00621 #define MPU60X0_CLOCK_DIV_381 0xE 00622 #define MPU60X0_CLOCK_DIV_364 0xF 00623 00624 #define MPU60X0_I2C_SLV_RW_BIT 7 00625 #define MPU60X0_I2C_SLV_ADDR_BIT 6 00626 #define MPU60X0_I2C_SLV_ADDR_LENGTH 7 00627 #define MPU60X0_I2C_SLV_EN_BIT 7 00628 #define MPU60X0_I2C_SLV_BYTE_SW_BIT 6 00629 #define MPU60X0_I2C_SLV_REG_DIS_BIT 5 00630 #define MPU60X0_I2C_SLV_GRP_BIT 4 00631 #define MPU60X0_I2C_SLV_LEN_BIT 3 00632 #define MPU60X0_I2C_SLV_LEN_LENGTH 4 00633 00634 #define MPU60X0_I2C_SLV4_RW_BIT 7 00635 #define MPU60X0_I2C_SLV4_ADDR_BIT 6 00636 #define MPU60X0_I2C_SLV4_ADDR_LENGTH 7 00637 #define MPU60X0_I2C_SLV4_EN_BIT 7 00638 #define MPU60X0_I2C_SLV4_INT_EN_BIT 6 00639 #define MPU60X0_I2C_SLV4_REG_DIS_BIT 5 00640 #define MPU60X0_I2C_SLV4_MST_DLY_BIT 4 00641 #define MPU60X0_I2C_SLV4_MST_DLY_LENGTH 5 00642 00643 #define MPU60X0_MST_PASS_THROUGH_BIT 7 00644 #define MPU60X0_MST_I2C_SLV4_DONE_BIT 6 00645 #define MPU60X0_MST_I2C_LOST_ARB_BIT 5 00646 #define MPU60X0_MST_I2C_SLV4_NACK_BIT 4 00647 #define MPU60X0_MST_I2C_SLV3_NACK_BIT 3 00648 #define MPU60X0_MST_I2C_SLV2_NACK_BIT 2 00649 #define MPU60X0_MST_I2C_SLV1_NACK_BIT 1 00650 #define MPU60X0_MST_I2C_SLV0_NACK_BIT 0 00651 00652 #define MPU60X0_INTCFG_INT_LEVEL_BIT 7 00653 #define MPU60X0_INTCFG_INT_OPEN_BIT 6 00654 #define MPU60X0_INTCFG_LATCH_INT_EN_BIT 5 00655 #define MPU60X0_INTCFG_INT_RD_CLEAR_BIT 4 00656 #define MPU60X0_INTCFG_FSYNC_INT_LEVEL_BIT 3 00657 #define MPU60X0_INTCFG_FSYNC_INT_EN_BIT 2 00658 #define MPU60X0_INTCFG_I2C_BYPASS_EN_BIT 1 00659 #define MPU60X0_INTCFG_CLKOUT_EN_BIT 0 00660 00661 #define MPU60X0_INTMODE_ACTIVEHIGH 0x00 00662 #define MPU60X0_INTMODE_ACTIVELOW 0x01 00663 00664 #define MPU60X0_INTDRV_PUSHPULL 0x00 00665 #define MPU60X0_INTDRV_OPENDRAIN 0x01 00666 00667 #define MPU60X0_INTLATCH_50USPULSE 0x00 00668 #define MPU60X0_INTLATCH_WAITCLEAR 0x01 00669 00670 #define MPU60X0_INTCLEAR_STATUSREAD 0x00 00671 #define MPU60X0_INTCLEAR_ANYREAD 0x01 00672 00673 #define MPU60X0_INTERRUPT_FF_BIT 7 00674 #define MPU60X0_INTERRUPT_MOT_BIT 6 00675 #define MPU60X0_INTERRUPT_ZMOT_BIT 5 00676 #define MPU60X0_INTERRUPT_FIFO_OFLOW_BIT 4 00677 #define MPU60X0_INTERRUPT_I2C_MST_INT_BIT 3 00678 #define MPU60X0_INTERRUPT_PLL_RDY_INT_BIT 2 00679 #define MPU60X0_INTERRUPT_DMP_INT_BIT 1 00680 #define MPU60X0_INTERRUPT_DATA_RDY_BIT 0 00681 00682 #define MPU60X0_INTERRUPT_FF 0x80 00683 #define MPU60X0_INTERRUPT_MOT 0x40 00684 #define MPU60X0_INTERRUPT_ZMOT 0x20 00685 #define MPU60X0_INTERRUPT_FIFO_OFLOW 0x10 00686 #define MPU60X0_INTERRUPT_I2C_MST_INT 0x08 00687 #define MPU60X0_INTERRUPT_PLL_RDY_INT 0x04 00688 #define MPU60X0_INTERRUPT_DMP_INT 0x02 00689 #define MPU60X0_INTERRUPT_DATA_RDY 0x01 00690 00691 // TODO: figure out what these actually do 00692 // UMPL source code is not very obivous 00693 #define MPU60X0_DMPINT_5_BIT 5 00694 #define MPU60X0_DMPINT_4_BIT 4 00695 #define MPU60X0_DMPINT_3_BIT 3 00696 #define MPU60X0_DMPINT_2_BIT 2 00697 #define MPU60X0_DMPINT_1_BIT 1 00698 #define MPU60X0_DMPINT_0_BIT 0 00699 00700 #define MPU60X0_MOTION_MOT_XNEG_BIT 7 00701 #define MPU60X0_MOTION_MOT_XPOS_BIT 6 00702 #define MPU60X0_MOTION_MOT_YNEG_BIT 5 00703 #define MPU60X0_MOTION_MOT_YPOS_BIT 4 00704 #define MPU60X0_MOTION_MOT_ZNEG_BIT 3 00705 #define MPU60X0_MOTION_MOT_ZPOS_BIT 2 00706 #define MPU60X0_MOTION_MOT_ZRMOT_BIT 0 00707 00708 #define MPU60X0_DELAYCTRL_DELAY_ES_SHADOW_BIT 7 00709 #define MPU60X0_DELAYCTRL_I2C_SLV4_DLY_EN_BIT 4 00710 #define MPU60X0_DELAYCTRL_I2C_SLV3_DLY_EN_BIT 3 00711 #define MPU60X0_DELAYCTRL_I2C_SLV2_DLY_EN_BIT 2 00712 #define MPU60X0_DELAYCTRL_I2C_SLV1_DLY_EN_BIT 1 00713 #define MPU60X0_DELAYCTRL_I2C_SLV0_DLY_EN_BIT 0 00714 00715 #define MPU60X0_PATHRESET_GYRO_RESET_BIT 2 00716 #define MPU60X0_PATHRESET_ACCEL_RESET_BIT 1 00717 #define MPU60X0_PATHRESET_TEMP_RESET_BIT 0 00718 00719 #define MPU60X0_DETECT_ACCEL_ON_DELAY_BIT 5 00720 #define MPU60X0_DETECT_ACCEL_ON_DELAY_LENGTH 2 00721 #define MPU60X0_DETECT_FF_COUNT_BIT 3 00722 #define MPU60X0_DETECT_FF_COUNT_LENGTH 2 00723 #define MPU60X0_DETECT_MOT_COUNT_BIT 1 00724 #define MPU60X0_DETECT_MOT_COUNT_LENGTH 2 00725 00726 #define MPU60X0_DETECT_DECREMENT_RESET 0x0 00727 #define MPU60X0_DETECT_DECREMENT_1 0x1 00728 #define MPU60X0_DETECT_DECREMENT_2 0x2 00729 #define MPU60X0_DETECT_DECREMENT_4 0x3 00730 00731 #define MPU60X0_USERCTRL_DMP_EN_BIT 7 00732 #define MPU60X0_USERCTRL_FIFO_EN_BIT 6 00733 #define MPU60X0_USERCTRL_I2C_MST_EN_BIT 5 00734 #define MPU60X0_USERCTRL_I2C_IF_DIS_BIT 4 00735 #define MPU60X0_USERCTRL_DMP_RESET_BIT 3 00736 #define MPU60X0_USERCTRL_FIFO_RESET_BIT 2 00737 #define MPU60X0_USERCTRL_I2C_MST_RESET_BIT 1 00738 #define MPU60X0_USERCTRL_SIG_COND_RESET_BIT 0 00739 00740 #define MPU60X0_PWR1_DEVICE_RESET_BIT 7 00741 #define MPU60X0_PWR1_SLEEP_BIT 6 00742 #define MPU60X0_PWR1_CYCLE_BIT 5 00743 #define MPU60X0_PWR1_TEMP_DIS_BIT 3 00744 #define MPU60X0_PWR1_CLKSEL_BIT 2 00745 #define MPU60X0_PWR1_CLKSEL_LENGTH 3 00746 00747 #define MPU60X0_CLOCK_INTERNAL 0x00 00748 #define MPU60X0_CLOCK_PLL_XGYRO 0x01 00749 #define MPU60X0_CLOCK_PLL_YGYRO 0x02 00750 #define MPU60X0_CLOCK_PLL_ZGYRO 0x03 00751 #define MPU60X0_CLOCK_PLL_EXT32K 0x04 00752 #define MPU60X0_CLOCK_PLL_EXT19M 0x05 00753 #define MPU60X0_CLOCK_KEEP_RESET 0x07 00754 00755 #define MPU60X0_PWR2_LP_WAKE_CTRL_BIT 7 00756 #define MPU60X0_PWR2_LP_WAKE_CTRL_LENGTH 2 00757 #define MPU60X0_PWR2_STBY_XA_BIT 5 00758 #define MPU60X0_PWR2_STBY_YA_BIT 4 00759 #define MPU60X0_PWR2_STBY_ZA_BIT 3 00760 #define MPU60X0_PWR2_STBY_XG_BIT 2 00761 #define MPU60X0_PWR2_STBY_YG_BIT 1 00762 #define MPU60X0_PWR2_STBY_ZG_BIT 0 00763 00764 #define MPU60X0_WAKE_FREQ_1P25 0x0 00765 #define MPU60X0_WAKE_FREQ_2P5 0x1 00766 #define MPU60X0_WAKE_FREQ_5 0x2 00767 #define MPU60X0_WAKE_FREQ_10 0x3 00768 00769 #define MPU60X0_BANKSEL_PRFTCH_EN_BIT 6 00770 #define MPU60X0_BANKSEL_CFG_USER_BANK_BIT 5 00771 #define MPU60X0_BANKSEL_MEM_SEL_BIT 4 00772 #define MPU60X0_BANKSEL_MEM_SEL_LENGTH 5 00773 00774 #define MPU60X0_WHO_AM_I_BIT 6 00775 #define MPU60X0_WHO_AM_I_LENGTH 6 00776 00777 #define MPU60X0_DMP_MEMORY_BANKS 8 00778 #define MPU60X0_DMP_MEMORY_BANK_SIZE 256 00779 #define MPU60X0_DMP_MEMORY_CHUNK_SIZE 16 00780 00781 00782 #define I2C_SLV0_EN 0x80 00783 #define I2C_SLV4_EN 0x80 00784 #define I2C_READ_FLAG 0x80 00785 #define SEN_ENABLE 0x00 00786 #define I2C_MST_EN 0x20 00787 #define I2C_MST_CLK 0x0D 00788 #define PWR_RESET 0x80 00789 00790 #define INT_DISABLE 0x00 00791 #define INT_PULSE_50US 0x00 00792 #define INT_RAW_RDY_EN 0x01 00793 00794 enum mpu9250_dlpf_bandwidth 00795 { 00796 DLPF_BANDWIDTH_184HZ, 00797 DLPF_BANDWIDTH_92HZ, 00798 DLPF_BANDWIDTH_41HZ, 00799 DLPF_BANDWIDTH_20HZ, 00800 DLPF_BANDWIDTH_10HZ, 00801 DLPF_BANDWIDTH_5HZ 00802 }; 00803 00804 // note: DMP code memory blocks defined at end of header file 00805 00806 class MPU6050 { 00807 private: 00808 I2Cdev i2Cdev; 00809 Serial debugSerial; 00810 bool sampling; // flag to indicate whether sampling ticker is running 00811 00812 public: 00813 MPU6050(); 00814 MPU6050(MODI2C i2c); 00815 MPU6050(uint8_t address); 00816 00817 void mpu_sample_func(); 00818 volatile int16_t ax_cache, ay_cache, az_cache, gx_cache, gy_cache, gz_cache; 00819 #ifdef MPU9250 00820 volatile int16_t hx_cache, hy_cache, hz_cache; 00821 #endif 00822 Ticker mpu_sampling; 00823 char mpu_cmd; 00824 #ifdef MPU9250 00825 uint8_t mpu_buffer[21]; 00826 #else 00827 uint8_t mpu_buffer[14]; 00828 #endif 00829 00830 void start_sampling(); 00831 00832 bool testConnection(); 00833 00834 // AUX_VDDIO register 00835 uint8_t getAuxVDDIOLevel(); 00836 void setAuxVDDIOLevel(uint8_t level); 00837 00838 // SMPLRT_DIV register 00839 uint8_t getRate(); 00840 void setRate(uint8_t rate); 00841 00842 // turn sampling on or off 00843 void sample(bool sampling); 00844 00845 // CONFIG register 00846 uint8_t getExternalFrameSync(); 00847 void setExternalFrameSync(uint8_t sync); 00848 uint8_t getDLPFMode(); 00849 void setDLPFMode(uint8_t bandwidth); 00850 00851 // GYRO_CONFIG register 00852 uint8_t getFullScaleGyroRange(); 00853 void setFullScaleGyroRange(uint8_t range); 00854 00855 // ACCEL_CONFIG register 00856 bool getAccelXSelfTest(); 00857 void setAccelXSelfTest(bool enabled); 00858 bool getAccelYSelfTest(); 00859 void setAccelYSelfTest(bool enabled); 00860 bool getAccelZSelfTest(); 00861 void setAccelZSelfTest(bool enabled); 00862 uint8_t getFullScaleAccelRange(); 00863 void setFullScaleAccelRange(uint8_t range); 00864 uint8_t getDHPFMode(); 00865 void setDHPFMode(uint8_t mode); 00866 00867 // FF_THR register 00868 uint8_t getFreefallDetectionThreshold(); 00869 void setFreefallDetectionThreshold(uint8_t threshold); 00870 00871 // FF_DUR register 00872 uint8_t getFreefallDetectionDuration(); 00873 void setFreefallDetectionDuration(uint8_t duration); 00874 00875 // MOT_THR register 00876 uint8_t getMotionDetectionThreshold(); 00877 void setMotionDetectionThreshold(uint8_t threshold); 00878 00879 // MOT_DUR register 00880 uint8_t getMotionDetectionDuration(); 00881 void setMotionDetectionDuration(uint8_t duration); 00882 00883 // ZRMOT_THR register 00884 uint8_t getZeroMotionDetectionThreshold(); 00885 void setZeroMotionDetectionThreshold(uint8_t threshold); 00886 00887 // ZRMOT_DUR register 00888 uint8_t getZeroMotionDetectionDuration(); 00889 void setZeroMotionDetectionDuration(uint8_t duration); 00890 00891 // FIFO_EN register 00892 bool getTempFIFOEnabled(); 00893 void setTempFIFOEnabled(bool enabled); 00894 bool getXGyroFIFOEnabled(); 00895 void setXGyroFIFOEnabled(bool enabled); 00896 bool getYGyroFIFOEnabled(); 00897 void setYGyroFIFOEnabled(bool enabled); 00898 bool getZGyroFIFOEnabled(); 00899 void setZGyroFIFOEnabled(bool enabled); 00900 bool getAccelFIFOEnabled(); 00901 void setAccelFIFOEnabled(bool enabled); 00902 bool getSlave2FIFOEnabled(); 00903 void setSlave2FIFOEnabled(bool enabled); 00904 bool getSlave1FIFOEnabled(); 00905 void setSlave1FIFOEnabled(bool enabled); 00906 bool getSlave0FIFOEnabled(); 00907 void setSlave0FIFOEnabled(bool enabled); 00908 00909 // I2C_MST_CTRL register 00910 bool getMultiMasterEnabled(); 00911 void setMultiMasterEnabled(bool enabled); 00912 bool getWaitForExternalSensorEnabled(); 00913 void setWaitForExternalSensorEnabled(bool enabled); 00914 bool getSlave3FIFOEnabled(); 00915 void setSlave3FIFOEnabled(bool enabled); 00916 bool getSlaveReadWriteTransitionEnabled(); 00917 void setSlaveReadWriteTransitionEnabled(bool enabled); 00918 uint8_t getMasterClockSpeed(); 00919 void setMasterClockSpeed(uint8_t speed); 00920 00921 // I2C_SLV* registers (Slave 0-3) 00922 uint8_t getSlaveAddress(uint8_t num); 00923 void setSlaveAddress(uint8_t num, uint8_t address); 00924 uint8_t getSlaveRegister(uint8_t num); 00925 void setSlaveRegister(uint8_t num, uint8_t reg); 00926 bool getSlaveEnabled(uint8_t num); 00927 void setSlaveEnabled(uint8_t num, bool enabled); 00928 bool getSlaveWordByteSwap(uint8_t num); 00929 void setSlaveWordByteSwap(uint8_t num, bool enabled); 00930 bool getSlaveWriteMode(uint8_t num); 00931 void setSlaveWriteMode(uint8_t num, bool mode); 00932 bool getSlaveWordGroupOffset(uint8_t num); 00933 void setSlaveWordGroupOffset(uint8_t num, bool enabled); 00934 uint8_t getSlaveDataLength(uint8_t num); 00935 void setSlaveDataLength(uint8_t num, uint8_t length); 00936 00937 // I2C_SLV* registers (Slave 4) 00938 uint8_t getSlave4Address(); 00939 void setSlave4Address(uint8_t address); 00940 uint8_t getSlave4Register(); 00941 void setSlave4Register(uint8_t reg); 00942 void setSlave4OutputByte(uint8_t data); 00943 bool getSlave4Enabled(); 00944 void setSlave4Enabled(bool enabled); 00945 bool getSlave4InterruptEnabled(); 00946 void setSlave4InterruptEnabled(bool enabled); 00947 bool getSlave4WriteMode(); 00948 void setSlave4WriteMode(bool mode); 00949 uint8_t getSlave4MasterDelay(); 00950 void setSlave4MasterDelay(uint8_t delay); 00951 uint8_t getSlate4InputByte(); 00952 00953 // I2C_MST_STATUS register 00954 bool getPassthroughStatus(); 00955 bool getSlave4IsDone(); 00956 bool getLostArbitration(); 00957 bool getSlave4Nack(); 00958 bool getSlave3Nack(); 00959 bool getSlave2Nack(); 00960 bool getSlave1Nack(); 00961 bool getSlave0Nack(); 00962 00963 // INT_PIN_CFG register 00964 bool getInterruptMode(); 00965 void setInterruptMode(bool mode); 00966 bool getInterruptDrive(); 00967 void setInterruptDrive(bool drive); 00968 bool getInterruptLatch(); 00969 void setInterruptLatch(bool latch); 00970 bool getInterruptLatchClear(); 00971 void setInterruptLatchClear(bool clear); 00972 bool getFSyncInterruptLevel(); 00973 void setFSyncInterruptLevel(bool level); 00974 bool getFSyncInterruptEnabled(); 00975 void setFSyncInterruptEnabled(bool enabled); 00976 bool getI2CBypassEnabled(); 00977 void setI2CBypassEnabled(bool enabled); 00978 bool getClockOutputEnabled(); 00979 void setClockOutputEnabled(bool enabled); 00980 00981 // INT_ENABLE register 00982 uint8_t getIntEnabled(); 00983 void setIntEnabled(uint8_t enabled); 00984 bool getIntFreefallEnabled(); 00985 void setIntFreefallEnabled(bool enabled); 00986 bool getIntMotionEnabled(); 00987 void setIntMotionEnabled(bool enabled); 00988 bool getIntZeroMotionEnabled(); 00989 void setIntZeroMotionEnabled(bool enabled); 00990 bool getIntFIFOBufferOverflowEnabled(); 00991 void setIntFIFOBufferOverflowEnabled(bool enabled); 00992 bool getIntI2CMasterEnabled(); 00993 void setIntI2CMasterEnabled(bool enabled); 00994 bool getIntDataReadyEnabled(); 00995 void setIntDataReadyEnabled(bool enabled); 00996 00997 // INT_STATUS register 00998 uint8_t getIntStatus(); 00999 bool getIntFreefallStatus(); 01000 bool getIntMotionStatus(); 01001 bool getIntZeroMotionStatus(); 01002 bool getIntFIFOBufferOverflowStatus(); 01003 bool getIntI2CMasterStatus(); 01004 bool getIntDataReadyStatus(); 01005 01006 // ACCEL_*OUT_* registers 01007 void getMotion9(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* mx, int16_t* my, int16_t* mz); 01008 void getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz); 01009 void getAcceleration(int16_t* x, int16_t* y, int16_t* z); 01010 int16_t getAccelerationX(); 01011 int16_t getAccelerationY(); 01012 int16_t getAccelerationZ(); 01013 01014 // TEMP_OUT_* registers 01015 int16_t getTemperature(); 01016 01017 // GYRO_*OUT_* registers 01018 void getRotation(int16_t* x, int16_t* y, int16_t* z); 01019 int16_t getRotationX(); 01020 int16_t getRotationY(); 01021 int16_t getRotationZ(); 01022 01023 // EXT_SENS_DATA_* registers 01024 uint8_t getExternalSensorByte(int position); 01025 uint16_t getExternalSensorWord(int position); 01026 uint32_t getExternalSensorDWord(int position); 01027 01028 // MOT_DETECT_STATUS register 01029 bool getXNegMotionDetected(); 01030 bool getXPosMotionDetected(); 01031 bool getYNegMotionDetected(); 01032 bool getYPosMotionDetected(); 01033 bool getZNegMotionDetected(); 01034 bool getZPosMotionDetected(); 01035 bool getZeroMotionDetected(); 01036 01037 // I2C_SLV*_DO register 01038 void setSlaveOutputByte(uint8_t num, uint8_t data); 01039 01040 // I2C_MST_DELAY_CTRL register 01041 bool getExternalShadowDelayEnabled(); 01042 void setExternalShadowDelayEnabled(bool enabled); 01043 bool getSlaveDelayEnabled(uint8_t num); 01044 void setSlaveDelayEnabled(uint8_t num, bool enabled); 01045 01046 // SIGNAL_PATH_RESET register 01047 void resetGyroscopePath(); 01048 void resetAccelerometerPath(); 01049 void resetTemperaturePath(); 01050 01051 // MOT_DETECT_CTRL register 01052 uint8_t getAccelerometerPowerOnDelay(); 01053 void setAccelerometerPowerOnDelay(uint8_t delay); 01054 uint8_t getFreefallDetectionCounterDecrement(); 01055 void setFreefallDetectionCounterDecrement(uint8_t decrement); 01056 uint8_t getMotionDetectionCounterDecrement(); 01057 void setMotionDetectionCounterDecrement(uint8_t decrement); 01058 01059 // USER_CTRL register 01060 bool getFIFOEnabled(); 01061 void setFIFOEnabled(bool enabled); 01062 bool getI2CMasterModeEnabled(); 01063 void setI2CMasterModeEnabled(bool enabled); 01064 void switchSPIEnabled(bool enabled); 01065 void resetFIFO(); 01066 void resetI2CMaster(); 01067 void resetSensors(); 01068 01069 // PWR_MGMT_1 register 01070 void reset(); 01071 bool getSleepEnabled(); 01072 void setSleepEnabled(bool enabled); 01073 bool getWakeCycleEnabled(); 01074 void setWakeCycleEnabled(bool enabled); 01075 bool getTempSensorEnabled(); 01076 void setTempSensorEnabled(bool enabled); 01077 uint8_t getClockSource(); 01078 void setClockSource(uint8_t source); 01079 01080 // PWR_MGMT_2 register 01081 uint8_t getWakeFrequency(); 01082 void setWakeFrequency(uint8_t frequency); 01083 bool getStandbyXAccelEnabled(); 01084 void setStandbyXAccelEnabled(bool enabled); 01085 bool getStandbyYAccelEnabled(); 01086 void setStandbyYAccelEnabled(bool enabled); 01087 bool getStandbyZAccelEnabled(); 01088 void setStandbyZAccelEnabled(bool enabled); 01089 bool getStandbyXGyroEnabled(); 01090 void setStandbyXGyroEnabled(bool enabled); 01091 bool getStandbyYGyroEnabled(); 01092 void setStandbyYGyroEnabled(bool enabled); 01093 bool getStandbyZGyroEnabled(); 01094 void setStandbyZGyroEnabled(bool enabled); 01095 01096 // FIFO_COUNT_* registers 01097 uint16_t getFIFOCount(); 01098 01099 // FIFO_R_W register 01100 uint8_t getFIFOByte(); 01101 void setFIFOByte(uint8_t data); 01102 void getFIFOBytes(uint8_t *data, uint8_t length); 01103 01104 // WHO_AM_I register 01105 uint8_t getDeviceID(); 01106 void setDeviceID(uint8_t id); 01107 01108 // ======== UNDOCUMENTED/DMP REGISTERS/METHODS ======== 01109 01110 // XG_OFFS_TC register 01111 uint8_t getOTPBankValid(); 01112 void setOTPBankValid(bool enabled); 01113 int8_t getXGyroOffset(); 01114 void setXGyroOffset(int8_t offset); 01115 01116 // YG_OFFS_TC register 01117 int8_t getYGyroOffset(); 01118 void setYGyroOffset(int8_t offset); 01119 01120 // ZG_OFFS_TC register 01121 int8_t getZGyroOffset(); 01122 void setZGyroOffset(int8_t offset); 01123 01124 // X_FINE_GAIN register 01125 int8_t getXFineGain(); 01126 void setXFineGain(int8_t gain); 01127 01128 // Y_FINE_GAIN register 01129 int8_t getYFineGain(); 01130 void setYFineGain(int8_t gain); 01131 01132 // Z_FINE_GAIN register 01133 int8_t getZFineGain(); 01134 void setZFineGain(int8_t gain); 01135 01136 // XA_OFFS_* registers 01137 int16_t getXAccelOffset(); 01138 void setXAccelOffset(int16_t offset); 01139 01140 // YA_OFFS_* register 01141 int16_t getYAccelOffset(); 01142 void setYAccelOffset(int16_t offset); 01143 01144 // ZA_OFFS_* register 01145 int16_t getZAccelOffset(); 01146 void setZAccelOffset(int16_t offset); 01147 01148 // XG_OFFS_USR* registers 01149 int16_t getXGyroOffsetUser(); 01150 void setXGyroOffsetUser(int16_t offset); 01151 01152 // YG_OFFS_USR* register 01153 int16_t getYGyroOffsetUser(); 01154 void setYGyroOffsetUser(int16_t offset); 01155 01156 // ZG_OFFS_USR* register 01157 int16_t getZGyroOffsetUser(); 01158 void setZGyroOffsetUser(int16_t offset); 01159 01160 // INT_ENABLE register (DMP functions) 01161 bool getIntPLLReadyEnabled(); 01162 void setIntPLLReadyEnabled(bool enabled); 01163 bool getIntDMPEnabled(); 01164 void setIntDMPEnabled(bool enabled); 01165 01166 // DMP_INT_STATUS 01167 bool getDMPInt5Status(); 01168 bool getDMPInt4Status(); 01169 bool getDMPInt3Status(); 01170 bool getDMPInt2Status(); 01171 bool getDMPInt1Status(); 01172 bool getDMPInt0Status(); 01173 01174 // INT_STATUS register (DMP functions) 01175 bool getIntPLLReadyStatus(); 01176 bool getIntDMPStatus(); 01177 01178 // USER_CTRL register (DMP functions) 01179 bool getDMPEnabled(); 01180 void setDMPEnabled(bool enabled); 01181 void resetDMP(); 01182 01183 // BANK_SEL register 01184 void setMemoryBank(uint8_t bank, bool prefetchEnabled=false, bool userBank=false); 01185 01186 // MEM_START_ADDR register 01187 void setMemoryStartAddress(uint8_t address); 01188 01189 // MEM_R_W register 01190 uint8_t readMemoryByte(); 01191 void writeMemoryByte(uint8_t data); 01192 void readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0); 01193 bool writeMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true, bool useProgMem=false); 01194 bool writeProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true); 01195 01196 bool writeDMPConfigurationSet(const uint8_t *data, uint16_t dataSize, bool useProgMem=false); 01197 bool writeProgDMPConfigurationSet(const uint8_t *data, uint16_t dataSize); 01198 01199 // DMP_CFG_1 register 01200 uint8_t getDMPConfig1(); 01201 void setDMPConfig1(uint8_t config); 01202 01203 // DMP_CFG_2 register 01204 uint8_t getDMPConfig2(); 01205 void setDMPConfig2(uint8_t config); 01206 01207 void initialize(); 01208 01209 #ifdef MPU9250 01210 void initialize9250(); 01211 void initialize9250MasterMode(); 01212 void get9250Motion9Counts(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* hx, int16_t* hy, int16_t* hz); 01213 void get9250Motion9(float* ax, float* ay, float* az, float* gx, float* gy, float* gz, float* hx, float* hy, float* hz); 01214 void get9250AccelCounts(int16_t* ax, int16_t* ay, int16_t* az); 01215 void get9250GyroCounts(int16_t* gx, int16_t* gy, int16_t* gz); 01216 void get9250MagCounts(int16_t* hx, int16_t* hy, int16_t* hz); 01217 void get9250TempCounts(int16_t* t); 01218 int setFilt9250(mpu9250_dlpf_bandwidth bandwidth, uint8_t SRD); 01219 int enableInt9250(bool enable); 01220 void readAKRegisters(uint8_t subAddress, uint8_t count, uint8_t* dest); 01221 bool writeAKRegister(uint8_t subAddress, uint8_t data); 01222 bool writeRegister(uint8_t subAddress, uint8_t data); 01223 void readRegister(uint8_t subAddress, uint8_t count, uint8_t* dest); 01224 void setStandbyDisable(); 01225 #endif 01226 01227 // special methods for MotionApps 2.0 implementation 01228 #ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS20 01229 uint8_t *dmpPacketBuffer; 01230 uint16_t dmpPacketSize; 01231 01232 uint8_t dmpInitialize(); 01233 bool dmpPacketAvailable(); 01234 01235 uint8_t dmpSetFIFORate(uint8_t fifoRate); 01236 uint8_t dmpGetFIFORate(); 01237 uint8_t dmpGetSampleStepSizeMS(); 01238 uint8_t dmpGetSampleFrequency(); 01239 int32_t dmpDecodeTemperature(int8_t tempReg); 01240 01241 // Register callbacks after a packet of FIFO data is processed 01242 //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority); 01243 //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func); 01244 uint8_t dmpRunFIFORateProcesses(); 01245 01246 // Setup FIFO for various output 01247 uint8_t dmpSendQuaternion(uint_fast16_t accuracy); 01248 uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy); 01249 uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy); 01250 uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy); 01251 uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy); 01252 uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy); 01253 uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy); 01254 uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy); 01255 uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy); 01256 uint8_t dmpSendPacketNumber(uint_fast16_t accuracy); 01257 uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy); 01258 uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy); 01259 01260 // Get Fixed Point data from FIFO 01261 uint8_t dmpGetAccel(int32_t *data, const uint8_t* packet=0); 01262 uint8_t dmpGetAccel(int16_t *data, const uint8_t* packet=0); 01263 uint8_t dmpGetAccel(VectorInt16 *v, const uint8_t* packet=0); 01264 uint8_t dmpGetQuaternion(int32_t *data, const uint8_t* packet=0); 01265 uint8_t dmpGetQuaternion(int16_t *data, const uint8_t* packet=0); 01266 uint8_t dmpGetQuaternion(Quaternion *q, const uint8_t* packet=0); 01267 uint8_t dmpGet6AxisQuaternion(int32_t *data, const uint8_t* packet=0); 01268 uint8_t dmpGet6AxisQuaternion(int16_t *data, const uint8_t* packet=0); 01269 uint8_t dmpGet6AxisQuaternion(Quaternion *q, const uint8_t* packet=0); 01270 uint8_t dmpGetRelativeQuaternion(int32_t *data, const uint8_t* packet=0); 01271 uint8_t dmpGetRelativeQuaternion(int16_t *data, const uint8_t* packet=0); 01272 uint8_t dmpGetRelativeQuaternion(Quaternion *data, const uint8_t* packet=0); 01273 uint8_t dmpGetGyro(int32_t *data, const uint8_t* packet=0); 01274 uint8_t dmpGetGyro(int16_t *data, const uint8_t* packet=0); 01275 uint8_t dmpGetGyro(VectorInt16 *v, const uint8_t* packet=0); 01276 uint8_t dmpSetLinearAccelFilterCoefficient(float coef); 01277 uint8_t dmpGetLinearAccel(int32_t *data, const uint8_t* packet=0); 01278 uint8_t dmpGetLinearAccel(int16_t *data, const uint8_t* packet=0); 01279 uint8_t dmpGetLinearAccel(VectorInt16 *v, const uint8_t* packet=0); 01280 uint8_t dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity); 01281 uint8_t dmpGetLinearAccelInWorld(int32_t *data, const uint8_t* packet=0); 01282 uint8_t dmpGetLinearAccelInWorld(int16_t *data, const uint8_t* packet=0); 01283 uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, const uint8_t* packet=0); 01284 uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q); 01285 uint8_t dmpGetGyroAndAccelSensor(int32_t *data, const uint8_t* packet=0); 01286 uint8_t dmpGetGyroAndAccelSensor(int16_t *data, const uint8_t* packet=0); 01287 uint8_t dmpGetGyroAndAccelSensor(VectorInt16 *g, VectorInt16 *a, const uint8_t* packet=0); 01288 uint8_t dmpGetGyroSensor(int32_t *data, const uint8_t* packet=0); 01289 uint8_t dmpGetGyroSensor(int16_t *data, const uint8_t* packet=0); 01290 uint8_t dmpGetGyroSensor(VectorInt16 *v, const uint8_t* packet=0); 01291 uint8_t dmpGetControlData(int32_t *data, const uint8_t* packet=0); 01292 uint8_t dmpGetTemperature(int32_t *data, const uint8_t* packet=0); 01293 uint8_t dmpGetGravity(int32_t *data, const uint8_t* packet=0); 01294 uint8_t dmpGetGravity(int16_t *data, const uint8_t* packet=0); 01295 uint8_t dmpGetGravity(VectorInt16 *v, const uint8_t* packet=0); 01296 uint8_t dmpGetGravity(VectorFloat *v, Quaternion *q); 01297 uint8_t dmpGetUnquantizedAccel(int32_t *data, const uint8_t* packet=0); 01298 uint8_t dmpGetUnquantizedAccel(int16_t *data, const uint8_t* packet=0); 01299 uint8_t dmpGetUnquantizedAccel(VectorInt16 *v, const uint8_t* packet=0); 01300 uint8_t dmpGetQuantizedAccel(int32_t *data, const uint8_t* packet=0); 01301 uint8_t dmpGetQuantizedAccel(int16_t *data, const uint8_t* packet=0); 01302 uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0); 01303 uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0); 01304 uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0); 01305 01306 uint8_t dmpGetEuler(float *data, Quaternion *q); 01307 uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity); 01308 01309 // Get Floating Point data from FIFO 01310 uint8_t dmpGetAccelFloat(float *data, const uint8_t* packet=0); 01311 uint8_t dmpGetQuaternionFloat(float *data, const uint8_t* packet=0); 01312 01313 uint8_t dmpProcessFIFOPacket(const unsigned char *dmpData); 01314 uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *processed=NULL); 01315 01316 uint8_t dmpSetFIFOProcessedCallback(void (*func) (void)); 01317 01318 uint8_t dmpInitFIFOParam(); 01319 uint8_t dmpCloseFIFO(); 01320 uint8_t dmpSetGyroDataSource(uint8_t source); 01321 uint8_t dmpDecodeQuantizedAccel(); 01322 uint32_t dmpGetGyroSumOfSquare(); 01323 uint32_t dmpGetAccelSumOfSquare(); 01324 void dmpOverrideQuaternion(long *q); 01325 uint16_t dmpGetFIFOPacketSize(); 01326 #endif 01327 01328 // special methods for MotionApps 4.1 implementation 01329 #ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS41 01330 uint8_t *dmpPacketBuffer; 01331 uint16_t dmpPacketSize; 01332 01333 uint8_t dmpInitialize(); 01334 bool dmpPacketAvailable(); 01335 01336 uint8_t dmpSetFIFORate(uint8_t fifoRate); 01337 uint8_t dmpGetFIFORate(); 01338 uint8_t dmpGetSampleStepSizeMS(); 01339 uint8_t dmpGetSampleFrequency(); 01340 int32_t dmpDecodeTemperature(int8_t tempReg); 01341 01342 // Register callbacks after a packet of FIFO data is processed 01343 //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority); 01344 //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func); 01345 uint8_t dmpRunFIFORateProcesses(); 01346 01347 // Setup FIFO for various output 01348 uint8_t dmpSendQuaternion(uint_fast16_t accuracy); 01349 uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy); 01350 uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy); 01351 uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy); 01352 uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy); 01353 uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy); 01354 uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy); 01355 uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy); 01356 uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy); 01357 uint8_t dmpSendPacketNumber(uint_fast16_t accuracy); 01358 uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy); 01359 uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy); 01360 01361 // Get Fixed Point data from FIFO 01362 uint8_t dmpGetAccel(int32_t *data, const uint8_t* packet=0); 01363 uint8_t dmpGetAccel(int16_t *data, const uint8_t* packet=0); 01364 uint8_t dmpGetAccel(VectorInt16 *v, const uint8_t* packet=0); 01365 uint8_t dmpGetQuaternion(int32_t *data, const uint8_t* packet=0); 01366 uint8_t dmpGetQuaternion(int16_t *data, const uint8_t* packet=0); 01367 uint8_t dmpGetQuaternion(Quaternion *q, const uint8_t* packet=0); 01368 uint8_t dmpGet6AxisQuaternion(int32_t *data, const uint8_t* packet=0); 01369 uint8_t dmpGet6AxisQuaternion(int16_t *data, const uint8_t* packet=0); 01370 uint8_t dmpGet6AxisQuaternion(Quaternion *q, const uint8_t* packet=0); 01371 uint8_t dmpGetRelativeQuaternion(int32_t *data, const uint8_t* packet=0); 01372 uint8_t dmpGetRelativeQuaternion(int16_t *data, const uint8_t* packet=0); 01373 uint8_t dmpGetRelativeQuaternion(Quaternion *data, const uint8_t* packet=0); 01374 uint8_t dmpGetGyro(int32_t *data, const uint8_t* packet=0); 01375 uint8_t dmpGetGyro(int16_t *data, const uint8_t* packet=0); 01376 uint8_t dmpGetGyro(VectorInt16 *v, const uint8_t* packet=0); 01377 uint8_t dmpGetMag(int16_t *data, const uint8_t* packet=0); 01378 uint8_t dmpSetLinearAccelFilterCoefficient(float coef); 01379 uint8_t dmpGetLinearAccel(int32_t *data, const uint8_t* packet=0); 01380 uint8_t dmpGetLinearAccel(int16_t *data, const uint8_t* packet=0); 01381 uint8_t dmpGetLinearAccel(VectorInt16 *v, const uint8_t* packet=0); 01382 uint8_t dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity); 01383 uint8_t dmpGetLinearAccelInWorld(int32_t *data, const uint8_t* packet=0); 01384 uint8_t dmpGetLinearAccelInWorld(int16_t *data, const uint8_t* packet=0); 01385 uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, const uint8_t* packet=0); 01386 uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q); 01387 uint8_t dmpGetGyroAndAccelSensor(int32_t *data, const uint8_t* packet=0); 01388 uint8_t dmpGetGyroAndAccelSensor(int16_t *data, const uint8_t* packet=0); 01389 uint8_t dmpGetGyroAndAccelSensor(VectorInt16 *g, VectorInt16 *a, const uint8_t* packet=0); 01390 uint8_t dmpGetGyroSensor(int32_t *data, const uint8_t* packet=0); 01391 uint8_t dmpGetGyroSensor(int16_t *data, const uint8_t* packet=0); 01392 uint8_t dmpGetGyroSensor(VectorInt16 *v, const uint8_t* packet=0); 01393 uint8_t dmpGetControlData(int32_t *data, const uint8_t* packet=0); 01394 uint8_t dmpGetTemperature(int32_t *data, const uint8_t* packet=0); 01395 uint8_t dmpGetGravity(int32_t *data, const uint8_t* packet=0); 01396 uint8_t dmpGetGravity(int16_t *data, const uint8_t* packet=0); 01397 uint8_t dmpGetGravity(VectorInt16 *v, const uint8_t* packet=0); 01398 uint8_t dmpGetGravity(VectorFloat *v, Quaternion *q); 01399 uint8_t dmpGetUnquantizedAccel(int32_t *data, const uint8_t* packet=0); 01400 uint8_t dmpGetUnquantizedAccel(int16_t *data, const uint8_t* packet=0); 01401 uint8_t dmpGetUnquantizedAccel(VectorInt16 *v, const uint8_t* packet=0); 01402 uint8_t dmpGetQuantizedAccel(int32_t *data, const uint8_t* packet=0); 01403 uint8_t dmpGetQuantizedAccel(int16_t *data, const uint8_t* packet=0); 01404 uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0); 01405 uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0); 01406 uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0); 01407 01408 uint8_t dmpGetEuler(float *data, Quaternion *q); 01409 uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity); 01410 01411 // Get Floating Point data from FIFO 01412 uint8_t dmpGetAccelFloat(float *data, const uint8_t* packet=0); 01413 uint8_t dmpGetQuaternionFloat(float *data, const uint8_t* packet=0); 01414 01415 uint8_t dmpProcessFIFOPacket(const unsigned char *dmpData); 01416 uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *processed=NULL); 01417 01418 uint8_t dmpSetFIFOProcessedCallback(void (*func) (void)); 01419 01420 uint8_t dmpInitFIFOParam(); 01421 uint8_t dmpCloseFIFO(); 01422 uint8_t dmpSetGyroDataSource(uint8_t source); 01423 uint8_t dmpDecodeQuantizedAccel(); 01424 uint32_t dmpGetGyroSumOfSquare(); 01425 uint32_t dmpGetAccelSumOfSquare(); 01426 void dmpOverrideQuaternion(long *q); 01427 uint16_t dmpGetFIFOPacketSize(); 01428 #endif 01429 01430 private: 01431 uint8_t devAddr; 01432 #ifdef MPU9250 01433 uint8_t buffer[21]; 01434 #else 01435 uint8_t buffer[14]; 01436 #endif 01437 uint8_t magDevAddr; 01438 01439 #ifdef MPU9250 01440 // transformation matrix 01441 /* transform the accel and gyro axes to match the magnetometer axes */ 01442 int16_t tX[3];// = {0, 1, 0}; 01443 int16_t tY[3];// = {1, 0, 0}; 01444 int16_t tZ[3];// = {0, 0, 1}; //was -1 transformation is done within lib. 01445 #endif 01446 }; 01447 01448 #endif /* _MPU6050_H_ */
Generated on Tue Jul 12 2022 21:34:31 by 1.7.2