sa

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MPU6050.h Source File

MPU6050.h

00001 
00002 //ported from arduino library: https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
00003 //written by szymon gaertig (email: szymon@gaertig.com.pl)
00004 //
00005 //Changelog: 
00006 //2013-01-08 - first beta release
00007 
00008 // I2Cdev library collection - MPU6050 I2C device class
00009 // Based on InvenSense MPU-6050 register map document rev. 2.0, 5/19/2011 (RM-MPU-6000A-00)
00010 // 10/3/2011 by Jeff Rowberg <jeff@rowberg.net>
00011 // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
00012 //
00013 // Changelog:
00014 //     ... - ongoing debug release
00015 
00016 // NOTE: THIS IS ONLY A PARIAL RELEASE. THIS DEVICE CLASS IS CURRENTLY UNDERGOING ACTIVE
00017 // DEVELOPMENT AND IS STILL MISSING SOME IMPORTANT FEATURES. PLEASE KEEP THIS IN MIND IF
00018 // YOU DECIDE TO USE THIS PARTICULAR CODE FOR ANYTHING.
00019 
00020 /* ============================================
00021 I2Cdev device library code is placed under the MIT license
00022 Copyright (c) 2012 Jeff Rowberg
00023 
00024 Permission is hereby granted, free of charge, to any person obtaining a copy
00025 of this software and associated documentation files (the "Software"), to deal
00026 in the Software without restriction, including without limitation the rights
00027 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00028 copies of the Software, and to permit persons to whom the Software is
00029 furnished to do so, subject to the following conditions:
00030 
00031 The above copyright notice and this permission notice shall be included in
00032 all copies or substantial portions of the Software.
00033 
00034 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00035 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00036 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00037 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00038 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00039 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00040 THE SOFTWARE.
00041 ===============================================
00042 */
00043 
00044 #ifndef _MPU6050_H_
00045 #define _MPU6050_H_
00046 
00047 #include "I2Cdev.h"
00048 #include "helper_3dmath.h"
00049 
00050 #define MPU6050_ADDRESS_AD0_LOW     0x68 // address pin low (GND), default for InvenSense evaluation board
00051 #define MPU6050_ADDRESS_AD0_HIGH    0x69 // address pin high (VCC)
00052 #define MPU6050_DEFAULT_ADDRESS     MPU6050_ADDRESS_AD0_LOW
00053 
00054 
00055 //#define ADO 0
00056 //#if ADO
00057 //#define MPU6050_DEFAULT_ADDRESS 0x69<<1  // Device address when ADO = 1
00058 //#else
00059 //#define MPU6050_DEFAULT_ADDRESS 0x68<<1  // Device address when ADO = 0
00060 //#endif
00061 
00062 
00063 
00064 
00065 
00066 #define MPU6050_RA_XG_OFFS_TC       0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
00067 #define MPU6050_RA_YG_OFFS_TC       0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
00068 #define MPU6050_RA_ZG_OFFS_TC       0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
00069 #define MPU6050_RA_X_FINE_GAIN      0x03 //[7:0] X_FINE_GAIN
00070 #define MPU6050_RA_Y_FINE_GAIN      0x04 //[7:0] Y_FINE_GAIN
00071 #define MPU6050_RA_Z_FINE_GAIN      0x05 //[7:0] Z_FINE_GAIN
00072 #define MPU6050_RA_XA_OFFS_H        0x06 //[15:0] XA_OFFS
00073 #define MPU6050_RA_XA_OFFS_L_TC     0x07
00074 #define MPU6050_RA_YA_OFFS_H        0x08 //[15:0] YA_OFFS
00075 #define MPU6050_RA_YA_OFFS_L_TC     0x09
00076 #define MPU6050_RA_ZA_OFFS_H        0x0A //[15:0] ZA_OFFS
00077 #define MPU6050_RA_ZA_OFFS_L_TC     0x0B
00078 #define MPU6050_RA_XG_OFFS_USRH     0x13 //[15:0] XG_OFFS_USR
00079 #define MPU6050_RA_XG_OFFS_USRL     0x14
00080 #define MPU6050_RA_YG_OFFS_USRH     0x15 //[15:0] YG_OFFS_USR
00081 #define MPU6050_RA_YG_OFFS_USRL     0x16
00082 #define MPU6050_RA_ZG_OFFS_USRH     0x17 //[15:0] ZG_OFFS_USR
00083 #define MPU6050_RA_ZG_OFFS_USRL     0x18
00084 #define MPU6050_RA_SMPLRT_DIV       0x19
00085 #define MPU6050_RA_CONFIG           0x1A
00086 #define MPU6050_RA_GYRO_CONFIG      0x1B
00087 #define MPU6050_RA_ACCEL_CONFIG     0x1C
00088 #define MPU6050_RA_FF_THR           0x1D
00089 #define MPU6050_RA_FF_DUR           0x1E
00090 #define MPU6050_RA_MOT_THR          0x1F
00091 #define MPU6050_RA_MOT_DUR          0x20
00092 #define MPU6050_RA_ZRMOT_THR        0x21
00093 #define MPU6050_RA_ZRMOT_DUR        0x22
00094 #define MPU6050_RA_FIFO_EN          0x23
00095 #define MPU6050_RA_I2C_MST_CTRL     0x24
00096 #define MPU6050_RA_I2C_SLV0_ADDR    0x25
00097 #define MPU6050_RA_I2C_SLV0_REG     0x26
00098 #define MPU6050_RA_I2C_SLV0_CTRL    0x27
00099 #define MPU6050_RA_I2C_SLV1_ADDR    0x28
00100 #define MPU6050_RA_I2C_SLV1_REG     0x29
00101 #define MPU6050_RA_I2C_SLV1_CTRL    0x2A
00102 #define MPU6050_RA_I2C_SLV2_ADDR    0x2B
00103 #define MPU6050_RA_I2C_SLV2_REG     0x2C
00104 #define MPU6050_RA_I2C_SLV2_CTRL    0x2D
00105 #define MPU6050_RA_I2C_SLV3_ADDR    0x2E
00106 #define MPU6050_RA_I2C_SLV3_REG     0x2F
00107 #define MPU6050_RA_I2C_SLV3_CTRL    0x30
00108 #define MPU6050_RA_I2C_SLV4_ADDR    0x31
00109 #define MPU6050_RA_I2C_SLV4_REG     0x32
00110 #define MPU6050_RA_I2C_SLV4_DO      0x33
00111 #define MPU6050_RA_I2C_SLV4_CTRL    0x34
00112 #define MPU6050_RA_I2C_SLV4_DI      0x35
00113 #define MPU6050_RA_I2C_MST_STATUS   0x36
00114 #define MPU6050_RA_INT_PIN_CFG      0x37
00115 #define MPU6050_RA_INT_ENABLE       0x38
00116 #define MPU6050_RA_DMP_INT_STATUS   0x39
00117 #define MPU6050_RA_INT_STATUS       0x3A
00118 #define MPU6050_RA_ACCEL_XOUT_H     0x3B
00119 #define MPU6050_RA_ACCEL_XOUT_L     0x3C
00120 #define MPU6050_RA_ACCEL_YOUT_H     0x3D
00121 #define MPU6050_RA_ACCEL_YOUT_L     0x3E
00122 #define MPU6050_RA_ACCEL_ZOUT_H     0x3F
00123 #define MPU6050_RA_ACCEL_ZOUT_L     0x40
00124 #define MPU6050_RA_TEMP_OUT_H       0x41
00125 #define MPU6050_RA_TEMP_OUT_L       0x42
00126 #define MPU6050_RA_GYRO_XOUT_H      0x43
00127 #define MPU6050_RA_GYRO_XOUT_L      0x44
00128 #define MPU6050_RA_GYRO_YOUT_H      0x45
00129 #define MPU6050_RA_GYRO_YOUT_L      0x46
00130 #define MPU6050_RA_GYRO_ZOUT_H      0x47
00131 #define MPU6050_RA_GYRO_ZOUT_L      0x48
00132 #define MPU6050_RA_EXT_SENS_DATA_00 0x49
00133 #define MPU6050_RA_EXT_SENS_DATA_01 0x4A
00134 #define MPU6050_RA_EXT_SENS_DATA_02 0x4B
00135 #define MPU6050_RA_EXT_SENS_DATA_03 0x4C
00136 #define MPU6050_RA_EXT_SENS_DATA_04 0x4D
00137 #define MPU6050_RA_EXT_SENS_DATA_05 0x4E
00138 #define MPU6050_RA_EXT_SENS_DATA_06 0x4F
00139 #define MPU6050_RA_EXT_SENS_DATA_07 0x50
00140 #define MPU6050_RA_EXT_SENS_DATA_08 0x51
00141 #define MPU6050_RA_EXT_SENS_DATA_09 0x52
00142 #define MPU6050_RA_EXT_SENS_DATA_10 0x53
00143 #define MPU6050_RA_EXT_SENS_DATA_11 0x54
00144 #define MPU6050_RA_EXT_SENS_DATA_12 0x55
00145 #define MPU6050_RA_EXT_SENS_DATA_13 0x56
00146 #define MPU6050_RA_EXT_SENS_DATA_14 0x57
00147 #define MPU6050_RA_EXT_SENS_DATA_15 0x58
00148 #define MPU6050_RA_EXT_SENS_DATA_16 0x59
00149 #define MPU6050_RA_EXT_SENS_DATA_17 0x5A
00150 #define MPU6050_RA_EXT_SENS_DATA_18 0x5B
00151 #define MPU6050_RA_EXT_SENS_DATA_19 0x5C
00152 #define MPU6050_RA_EXT_SENS_DATA_20 0x5D
00153 #define MPU6050_RA_EXT_SENS_DATA_21 0x5E
00154 #define MPU6050_RA_EXT_SENS_DATA_22 0x5F
00155 #define MPU6050_RA_EXT_SENS_DATA_23 0x60
00156 #define MPU6050_RA_MOT_DETECT_STATUS    0x61
00157 #define MPU6050_RA_I2C_SLV0_DO      0x63
00158 #define MPU6050_RA_I2C_SLV1_DO      0x64
00159 #define MPU6050_RA_I2C_SLV2_DO      0x65
00160 #define MPU6050_RA_I2C_SLV3_DO      0x66
00161 #define MPU6050_RA_I2C_MST_DELAY_CTRL   0x67
00162 #define MPU6050_RA_SIGNAL_PATH_RESET    0x68
00163 #define MPU6050_RA_MOT_DETECT_CTRL      0x69
00164 #define MPU6050_RA_USER_CTRL        0x6A
00165 #define MPU6050_RA_PWR_MGMT_1       0x6B
00166 #define MPU6050_RA_PWR_MGMT_2       0x6C
00167 #define MPU6050_RA_BANK_SEL         0x6D
00168 #define MPU6050_RA_MEM_START_ADDR   0x6E
00169 #define MPU6050_RA_MEM_R_W          0x6F
00170 #define MPU6050_RA_DMP_CFG_1        0x70
00171 #define MPU6050_RA_DMP_CFG_2        0x71
00172 #define MPU6050_RA_FIFO_COUNTH      0x72
00173 #define MPU6050_RA_FIFO_COUNTL      0x73
00174 #define MPU6050_RA_FIFO_R_W         0x74
00175 #define MPU6050_RA_WHO_AM_I         0x75
00176 
00177 #define MPU6050_TC_PWR_MODE_BIT     7
00178 #define MPU6050_TC_OFFSET_BIT       6
00179 #define MPU6050_TC_OFFSET_LENGTH    6
00180 #define MPU6050_TC_OTP_BNK_VLD_BIT  0
00181 
00182 #define MPU6050_VDDIO_LEVEL_VLOGIC  0
00183 #define MPU6050_VDDIO_LEVEL_VDD     1
00184 
00185 #define MPU6050_CFG_EXT_SYNC_SET_BIT    5
00186 #define MPU6050_CFG_EXT_SYNC_SET_LENGTH 3
00187 #define MPU6050_CFG_DLPF_CFG_BIT    2
00188 #define MPU6050_CFG_DLPF_CFG_LENGTH 3
00189 
00190 #define MPU6050_EXT_SYNC_DISABLED       0x0
00191 #define MPU6050_EXT_SYNC_TEMP_OUT_L     0x1
00192 #define MPU6050_EXT_SYNC_GYRO_XOUT_L    0x2
00193 #define MPU6050_EXT_SYNC_GYRO_YOUT_L    0x3
00194 #define MPU6050_EXT_SYNC_GYRO_ZOUT_L    0x4
00195 #define MPU6050_EXT_SYNC_ACCEL_XOUT_L   0x5
00196 #define MPU6050_EXT_SYNC_ACCEL_YOUT_L   0x6
00197 #define MPU6050_EXT_SYNC_ACCEL_ZOUT_L   0x7
00198 
00199 #define MPU6050_DLPF_BW_256         0x00
00200 #define MPU6050_DLPF_BW_188         0x01
00201 #define MPU6050_DLPF_BW_98          0x02
00202 #define MPU6050_DLPF_BW_42          0x03
00203 #define MPU6050_DLPF_BW_20          0x04
00204 #define MPU6050_DLPF_BW_10          0x05
00205 #define MPU6050_DLPF_BW_5           0x06
00206 
00207 #define MPU6050_GCONFIG_FS_SEL_BIT      4
00208 #define MPU6050_GCONFIG_FS_SEL_LENGTH   2
00209 
00210 #define MPU6050_GYRO_FS_250         0x00
00211 #define MPU6050_GYRO_FS_500         0x01
00212 #define MPU6050_GYRO_FS_1000        0x02
00213 #define MPU6050_GYRO_FS_2000        0x03
00214 
00215 #define MPU6050_ACONFIG_XA_ST_BIT           7
00216 #define MPU6050_ACONFIG_YA_ST_BIT           6
00217 #define MPU6050_ACONFIG_ZA_ST_BIT           5
00218 #define MPU6050_ACONFIG_AFS_SEL_BIT         4
00219 #define MPU6050_ACONFIG_AFS_SEL_LENGTH      2
00220 #define MPU6050_ACONFIG_ACCEL_HPF_BIT       2
00221 #define MPU6050_ACONFIG_ACCEL_HPF_LENGTH    3
00222 
00223 #define MPU6050_ACCEL_FS_2          0x00
00224 #define MPU6050_ACCEL_FS_4          0x01
00225 #define MPU6050_ACCEL_FS_8          0x02
00226 #define MPU6050_ACCEL_FS_16         0x03
00227 
00228 #define MPU6050_DHPF_RESET          0x00
00229 #define MPU6050_DHPF_5              0x01
00230 #define MPU6050_DHPF_2P5            0x02
00231 #define MPU6050_DHPF_1P25           0x03
00232 #define MPU6050_DHPF_0P63           0x04
00233 #define MPU6050_DHPF_HOLD           0x07
00234 
00235 #define MPU6050_TEMP_FIFO_EN_BIT    7
00236 #define MPU6050_XG_FIFO_EN_BIT      6
00237 #define MPU6050_YG_FIFO_EN_BIT      5
00238 #define MPU6050_ZG_FIFO_EN_BIT      4
00239 #define MPU6050_ACCEL_FIFO_EN_BIT   3
00240 #define MPU6050_SLV2_FIFO_EN_BIT    2
00241 #define MPU6050_SLV1_FIFO_EN_BIT    1
00242 #define MPU6050_SLV0_FIFO_EN_BIT    0
00243 
00244 #define MPU6050_MULT_MST_EN_BIT     7
00245 #define MPU6050_WAIT_FOR_ES_BIT     6
00246 #define MPU6050_SLV_3_FIFO_EN_BIT   5
00247 #define MPU6050_I2C_MST_P_NSR_BIT   4
00248 #define MPU6050_I2C_MST_CLK_BIT     3
00249 #define MPU6050_I2C_MST_CLK_LENGTH  4
00250 
00251 #define MPU6050_CLOCK_DIV_348       0x0
00252 #define MPU6050_CLOCK_DIV_333       0x1
00253 #define MPU6050_CLOCK_DIV_320       0x2
00254 #define MPU6050_CLOCK_DIV_308       0x3
00255 #define MPU6050_CLOCK_DIV_296       0x4
00256 #define MPU6050_CLOCK_DIV_286       0x5
00257 #define MPU6050_CLOCK_DIV_276       0x6
00258 #define MPU6050_CLOCK_DIV_267       0x7
00259 #define MPU6050_CLOCK_DIV_258       0x8
00260 #define MPU6050_CLOCK_DIV_500       0x9
00261 #define MPU6050_CLOCK_DIV_471       0xA
00262 #define MPU6050_CLOCK_DIV_444       0xB
00263 #define MPU6050_CLOCK_DIV_421       0xC
00264 #define MPU6050_CLOCK_DIV_400       0xD
00265 #define MPU6050_CLOCK_DIV_381       0xE
00266 #define MPU6050_CLOCK_DIV_364       0xF
00267 
00268 #define MPU6050_I2C_SLV_RW_BIT      7
00269 #define MPU6050_I2C_SLV_ADDR_BIT    6
00270 #define MPU6050_I2C_SLV_ADDR_LENGTH 7
00271 #define MPU6050_I2C_SLV_EN_BIT      7
00272 #define MPU6050_I2C_SLV_BYTE_SW_BIT 6
00273 #define MPU6050_I2C_SLV_REG_DIS_BIT 5
00274 #define MPU6050_I2C_SLV_GRP_BIT     4
00275 #define MPU6050_I2C_SLV_LEN_BIT     3
00276 #define MPU6050_I2C_SLV_LEN_LENGTH  4
00277 
00278 #define MPU6050_I2C_SLV4_RW_BIT         7
00279 #define MPU6050_I2C_SLV4_ADDR_BIT       6
00280 #define MPU6050_I2C_SLV4_ADDR_LENGTH    7
00281 #define MPU6050_I2C_SLV4_EN_BIT         7
00282 #define MPU6050_I2C_SLV4_INT_EN_BIT     6
00283 #define MPU6050_I2C_SLV4_REG_DIS_BIT    5
00284 #define MPU6050_I2C_SLV4_MST_DLY_BIT    4
00285 #define MPU6050_I2C_SLV4_MST_DLY_LENGTH 5
00286 
00287 #define MPU6050_MST_PASS_THROUGH_BIT    7
00288 #define MPU6050_MST_I2C_SLV4_DONE_BIT   6
00289 #define MPU6050_MST_I2C_LOST_ARB_BIT    5
00290 #define MPU6050_MST_I2C_SLV4_NACK_BIT   4
00291 #define MPU6050_MST_I2C_SLV3_NACK_BIT   3
00292 #define MPU6050_MST_I2C_SLV2_NACK_BIT   2
00293 #define MPU6050_MST_I2C_SLV1_NACK_BIT   1
00294 #define MPU6050_MST_I2C_SLV0_NACK_BIT   0
00295 
00296 #define MPU6050_INTCFG_INT_LEVEL_BIT        7
00297 #define MPU6050_INTCFG_INT_OPEN_BIT         6
00298 #define MPU6050_INTCFG_LATCH_INT_EN_BIT     5
00299 #define MPU6050_INTCFG_INT_RD_CLEAR_BIT     4
00300 #define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT  3
00301 #define MPU6050_INTCFG_FSYNC_INT_EN_BIT     2
00302 #define MPU6050_INTCFG_I2C_BYPASS_EN_BIT    1
00303 #define MPU6050_INTCFG_CLKOUT_EN_BIT        0
00304 
00305 #define MPU6050_INTMODE_ACTIVEHIGH  0x00
00306 #define MPU6050_INTMODE_ACTIVELOW   0x01
00307 
00308 #define MPU6050_INTDRV_PUSHPULL     0x00
00309 #define MPU6050_INTDRV_OPENDRAIN    0x01
00310 
00311 #define MPU6050_INTLATCH_50USPULSE  0x00
00312 #define MPU6050_INTLATCH_WAITCLEAR  0x01
00313 
00314 #define MPU6050_INTCLEAR_STATUSREAD 0x00
00315 #define MPU6050_INTCLEAR_ANYREAD    0x01
00316 
00317 #define MPU6050_INTERRUPT_FF_BIT            7
00318 #define MPU6050_INTERRUPT_MOT_BIT           6
00319 #define MPU6050_INTERRUPT_ZMOT_BIT          5
00320 #define MPU6050_INTERRUPT_FIFO_OFLOW_BIT    4
00321 #define MPU6050_INTERRUPT_I2C_MST_INT_BIT   3
00322 #define MPU6050_INTERRUPT_PLL_RDY_INT_BIT   2
00323 #define MPU6050_INTERRUPT_DMP_INT_BIT       1
00324 #define MPU6050_INTERRUPT_DATA_RDY_BIT      0
00325 
00326 // TODO: figure out what these actually do
00327 // UMPL source code is not very obivous
00328 #define MPU6050_DMPINT_5_BIT            5
00329 #define MPU6050_DMPINT_4_BIT            4
00330 #define MPU6050_DMPINT_3_BIT            3
00331 #define MPU6050_DMPINT_2_BIT            2
00332 #define MPU6050_DMPINT_1_BIT            1
00333 #define MPU6050_DMPINT_0_BIT            0
00334 
00335 #define MPU6050_MOTION_MOT_XNEG_BIT     7
00336 #define MPU6050_MOTION_MOT_XPOS_BIT     6
00337 #define MPU6050_MOTION_MOT_YNEG_BIT     5
00338 #define MPU6050_MOTION_MOT_YPOS_BIT     4
00339 #define MPU6050_MOTION_MOT_ZNEG_BIT     3
00340 #define MPU6050_MOTION_MOT_ZPOS_BIT     2
00341 #define MPU6050_MOTION_MOT_ZRMOT_BIT    0
00342 
00343 #define MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT   7
00344 #define MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT   4
00345 #define MPU6050_DELAYCTRL_I2C_SLV3_DLY_EN_BIT   3
00346 #define MPU6050_DELAYCTRL_I2C_SLV2_DLY_EN_BIT   2
00347 #define MPU6050_DELAYCTRL_I2C_SLV1_DLY_EN_BIT   1
00348 #define MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT   0
00349 
00350 #define MPU6050_PATHRESET_GYRO_RESET_BIT    2
00351 #define MPU6050_PATHRESET_ACCEL_RESET_BIT   1
00352 #define MPU6050_PATHRESET_TEMP_RESET_BIT    0
00353 
00354 #define MPU6050_DETECT_ACCEL_ON_DELAY_BIT       5
00355 #define MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH    2
00356 #define MPU6050_DETECT_FF_COUNT_BIT             3
00357 #define MPU6050_DETECT_FF_COUNT_LENGTH          2
00358 #define MPU6050_DETECT_MOT_COUNT_BIT            1
00359 #define MPU6050_DETECT_MOT_COUNT_LENGTH         2
00360 
00361 #define MPU6050_DETECT_DECREMENT_RESET  0x0
00362 #define MPU6050_DETECT_DECREMENT_1      0x1
00363 #define MPU6050_DETECT_DECREMENT_2      0x2
00364 #define MPU6050_DETECT_DECREMENT_4      0x3
00365 
00366 #define MPU6050_USERCTRL_DMP_EN_BIT             7
00367 #define MPU6050_USERCTRL_FIFO_EN_BIT            6
00368 #define MPU6050_USERCTRL_I2C_MST_EN_BIT         5
00369 #define MPU6050_USERCTRL_I2C_IF_DIS_BIT         4
00370 #define MPU6050_USERCTRL_DMP_RESET_BIT          3
00371 #define MPU6050_USERCTRL_FIFO_RESET_BIT         2
00372 #define MPU6050_USERCTRL_I2C_MST_RESET_BIT      1
00373 #define MPU6050_USERCTRL_SIG_COND_RESET_BIT     0
00374 
00375 #define MPU6050_PWR1_DEVICE_RESET_BIT   7
00376 #define MPU6050_PWR1_SLEEP_BIT          6
00377 #define MPU6050_PWR1_CYCLE_BIT          5
00378 #define MPU6050_PWR1_TEMP_DIS_BIT       3
00379 #define MPU6050_PWR1_CLKSEL_BIT         2
00380 #define MPU6050_PWR1_CLKSEL_LENGTH      3
00381 
00382 #define MPU6050_CLOCK_INTERNAL          0x00
00383 #define MPU6050_CLOCK_PLL_XGYRO         0x01
00384 #define MPU6050_CLOCK_PLL_YGYRO         0x02
00385 #define MPU6050_CLOCK_PLL_ZGYRO         0x03
00386 #define MPU6050_CLOCK_PLL_EXT32K        0x04
00387 #define MPU6050_CLOCK_PLL_EXT19M        0x05
00388 #define MPU6050_CLOCK_KEEP_RESET        0x07
00389 
00390 #define MPU6050_PWR2_LP_WAKE_CTRL_BIT       7
00391 #define MPU6050_PWR2_LP_WAKE_CTRL_LENGTH    2
00392 #define MPU6050_PWR2_STBY_XA_BIT            5
00393 #define MPU6050_PWR2_STBY_YA_BIT            4
00394 #define MPU6050_PWR2_STBY_ZA_BIT            3
00395 #define MPU6050_PWR2_STBY_XG_BIT            2
00396 #define MPU6050_PWR2_STBY_YG_BIT            1
00397 #define MPU6050_PWR2_STBY_ZG_BIT            0
00398 
00399 #define MPU6050_WAKE_FREQ_1P25      0x0
00400 #define MPU6050_WAKE_FREQ_2P5       0x1
00401 #define MPU6050_WAKE_FREQ_5         0x2
00402 #define MPU6050_WAKE_FREQ_10        0x3
00403 
00404 #define MPU6050_BANKSEL_PRFTCH_EN_BIT       6
00405 #define MPU6050_BANKSEL_CFG_USER_BANK_BIT   5
00406 #define MPU6050_BANKSEL_MEM_SEL_BIT         4
00407 #define MPU6050_BANKSEL_MEM_SEL_LENGTH      5
00408 
00409 #define MPU6050_WHO_AM_I_BIT        6
00410 #define MPU6050_WHO_AM_I_LENGTH     6
00411 
00412 #define MPU6050_DMP_MEMORY_BANKS        8
00413 #define MPU6050_DMP_MEMORY_BANK_SIZE    256
00414 #define MPU6050_DMP_MEMORY_CHUNK_SIZE   16
00415 extern float aRes, gRes; 
00416  
00417 //extern DigitalOut LED2;
00418 
00419 /* Sensor datas to be used in program */
00420 
00421 //extern int16_t ax,ay,az;
00422 //extern int16_t gx,gy,gz;
00423 
00424 extern float ax,ay,az;
00425 extern float gx,gy,gz;
00426 
00427 extern Serial pc;
00428 extern int16_t accelData[3],gyroData[3],tempData;
00429 extern float accelBias[3], gyroBias[3];
00430 // note: DMP code memory blocks defined at end of header file
00431 
00432 class MPU6050 {
00433     private:
00434         I2Cdev i2Cdev;
00435         //Serial debugSerial;
00436     public:
00437         MPU6050();
00438         MPU6050(uint8_t address);
00439 
00440         void initialize();
00441         bool testConnection();
00442         void calibrate(float* dest1, float* dest2);
00443         void getAres();
00444         void readAccelData(int16_t* dest);
00445         void getGres();
00446         void readGyroData(int16_t* dest);
00447         uint8_t readThisByte(uint8_t address);
00448         // AUX_VDDIO register
00449         uint8_t getAuxVDDIOLevel();
00450         void setAuxVDDIOLevel(uint8_t level);
00451 
00452         // SMPLRT_DIV register
00453         uint8_t getRate();
00454         void setRate(uint8_t rate);
00455 
00456         // CONFIG register
00457         uint8_t getExternalFrameSync();
00458         void setExternalFrameSync(uint8_t sync);
00459         uint8_t getDLPFMode();
00460         void setDLPFMode(uint8_t bandwidth);
00461 
00462         // GYRO_CONFIG register
00463         uint8_t getFullScaleGyroRange();
00464         void setFullScaleGyroRange(uint8_t range);
00465 
00466         // ACCEL_CONFIG register
00467         bool getAccelXSelfTest();
00468         void setAccelXSelfTest(bool enabled);
00469         bool getAccelYSelfTest();
00470         void setAccelYSelfTest(bool enabled);
00471         bool getAccelZSelfTest();
00472         void setAccelZSelfTest(bool enabled);
00473         uint8_t getFullScaleAccelRange();
00474         void setFullScaleAccelRange(uint8_t range);
00475         uint8_t getDHPFMode();
00476         void setDHPFMode(uint8_t mode);
00477 
00478         // FF_THR register
00479         uint8_t getFreefallDetectionThreshold();
00480         void setFreefallDetectionThreshold(uint8_t threshold);
00481 
00482         // FF_DUR register
00483         uint8_t getFreefallDetectionDuration();
00484         void setFreefallDetectionDuration(uint8_t duration);
00485 
00486         // MOT_THR register
00487         uint8_t getMotionDetectionThreshold();
00488         void setMotionDetectionThreshold(uint8_t threshold);
00489 
00490         // MOT_DUR register
00491         uint8_t getMotionDetectionDuration();
00492         void setMotionDetectionDuration(uint8_t duration);
00493 
00494         // ZRMOT_THR register
00495         uint8_t getZeroMotionDetectionThreshold();
00496         void setZeroMotionDetectionThreshold(uint8_t threshold);
00497 
00498         // ZRMOT_DUR register
00499         uint8_t getZeroMotionDetectionDuration();
00500         void setZeroMotionDetectionDuration(uint8_t duration);
00501 
00502         // FIFO_EN register
00503         bool getTempFIFOEnabled();
00504         void setTempFIFOEnabled(bool enabled);
00505         bool getXGyroFIFOEnabled();
00506         void setXGyroFIFOEnabled(bool enabled);
00507         bool getYGyroFIFOEnabled();
00508         void setYGyroFIFOEnabled(bool enabled);
00509         bool getZGyroFIFOEnabled();
00510         void setZGyroFIFOEnabled(bool enabled);
00511         bool getAccelFIFOEnabled();
00512         void setAccelFIFOEnabled(bool enabled);
00513         bool getSlave2FIFOEnabled();
00514         void setSlave2FIFOEnabled(bool enabled);
00515         bool getSlave1FIFOEnabled();
00516         void setSlave1FIFOEnabled(bool enabled);
00517         bool getSlave0FIFOEnabled();
00518         void setSlave0FIFOEnabled(bool enabled);
00519 
00520         // I2C_MST_CTRL register
00521         bool getMultiMasterEnabled();
00522         void setMultiMasterEnabled(bool enabled);
00523         bool getWaitForExternalSensorEnabled();
00524         void setWaitForExternalSensorEnabled(bool enabled);
00525         bool getSlave3FIFOEnabled();
00526         void setSlave3FIFOEnabled(bool enabled);
00527         bool getSlaveReadWriteTransitionEnabled();
00528         void setSlaveReadWriteTransitionEnabled(bool enabled);
00529         uint8_t getMasterClockSpeed();
00530         void setMasterClockSpeed(uint8_t speed);
00531 
00532         // I2C_SLV* registers (Slave 0-3)
00533         uint8_t getSlaveAddress(uint8_t num);
00534         void setSlaveAddress(uint8_t num, uint8_t address);
00535         uint8_t getSlaveRegister(uint8_t num);
00536         void setSlaveRegister(uint8_t num, uint8_t reg);
00537         bool getSlaveEnabled(uint8_t num);
00538         void setSlaveEnabled(uint8_t num, bool enabled);
00539         bool getSlaveWordByteSwap(uint8_t num);
00540         void setSlaveWordByteSwap(uint8_t num, bool enabled);
00541         bool getSlaveWriteMode(uint8_t num);
00542         void setSlaveWriteMode(uint8_t num, bool mode);
00543         bool getSlaveWordGroupOffset(uint8_t num);
00544         void setSlaveWordGroupOffset(uint8_t num, bool enabled);
00545         uint8_t getSlaveDataLength(uint8_t num);
00546         void setSlaveDataLength(uint8_t num, uint8_t length);
00547 
00548         // I2C_SLV* registers (Slave 4)
00549         uint8_t getSlave4Address();
00550         void setSlave4Address(uint8_t address);
00551         uint8_t getSlave4Register();
00552         void setSlave4Register(uint8_t reg);
00553         void setSlave4OutputByte(uint8_t data);
00554         bool getSlave4Enabled();
00555         void setSlave4Enabled(bool enabled);
00556         bool getSlave4InterruptEnabled();
00557         void setSlave4InterruptEnabled(bool enabled);
00558         bool getSlave4WriteMode();
00559         void setSlave4WriteMode(bool mode);
00560         uint8_t getSlave4MasterDelay();
00561         void setSlave4MasterDelay(uint8_t delay);
00562         uint8_t getSlate4InputByte();
00563 
00564         // I2C_MST_STATUS register
00565         bool getPassthroughStatus();
00566         bool getSlave4IsDone();
00567         bool getLostArbitration();
00568         bool getSlave4Nack();
00569         bool getSlave3Nack();
00570         bool getSlave2Nack();
00571         bool getSlave1Nack();
00572         bool getSlave0Nack();
00573 
00574         // INT_PIN_CFG register
00575         bool getInterruptMode();
00576         void setInterruptMode(bool mode);
00577         bool getInterruptDrive();
00578         void setInterruptDrive(bool drive);
00579         bool getInterruptLatch();
00580         void setInterruptLatch(bool latch);
00581         bool getInterruptLatchClear();
00582         void setInterruptLatchClear(bool clear);
00583         bool getFSyncInterruptLevel();
00584         void setFSyncInterruptLevel(bool level);
00585         bool getFSyncInterruptEnabled();
00586         void setFSyncInterruptEnabled(bool enabled);
00587         bool getI2CBypassEnabled();
00588         void setI2CBypassEnabled(bool enabled);
00589         bool getClockOutputEnabled();
00590         void setClockOutputEnabled(bool enabled);
00591 
00592         // INT_ENABLE register
00593         uint8_t getIntEnabled();
00594         void setIntEnabled(uint8_t enabled);
00595         bool getIntFreefallEnabled();
00596         void setIntFreefallEnabled(bool enabled);
00597         bool getIntMotionEnabled();
00598         void setIntMotionEnabled(bool enabled);
00599         bool getIntZeroMotionEnabled();
00600         void setIntZeroMotionEnabled(bool enabled);
00601         bool getIntFIFOBufferOverflowEnabled();
00602         void setIntFIFOBufferOverflowEnabled(bool enabled);
00603         bool getIntI2CMasterEnabled();
00604         void setIntI2CMasterEnabled(bool enabled);
00605         bool getIntDataReadyEnabled();
00606         void setIntDataReadyEnabled(bool enabled);
00607 
00608         // INT_STATUS register
00609         uint8_t getIntStatus();
00610         bool getIntFreefallStatus();
00611         bool getIntMotionStatus();
00612         bool getIntZeroMotionStatus();
00613         bool getIntFIFOBufferOverflowStatus();
00614         bool getIntI2CMasterStatus();
00615         bool getIntDataReadyStatus();
00616 
00617         // ACCEL_*OUT_* registers
00618         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);
00619         void getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz);
00620         void getAcceleration(int16_t* x, int16_t* y, int16_t* z);
00621         int16_t getAccelerationX();
00622         int16_t getAccelerationY();
00623         int16_t getAccelerationZ();
00624 
00625         // TEMP_OUT_* registers
00626         int16_t getTemperature();
00627 
00628         // GYRO_*OUT_* registers
00629         void getRotation(int16_t* x, int16_t* y, int16_t* z);
00630         int16_t getRotationX();
00631         int16_t getRotationY();
00632         int16_t getRotationZ();
00633 
00634         // EXT_SENS_DATA_* registers
00635         uint8_t getExternalSensorByte(int position);
00636         uint16_t getExternalSensorWord(int position);
00637         uint32_t getExternalSensorDWord(int position);
00638 
00639         // MOT_DETECT_STATUS register
00640         bool getXNegMotionDetected();
00641         bool getXPosMotionDetected();
00642         bool getYNegMotionDetected();
00643         bool getYPosMotionDetected();
00644         bool getZNegMotionDetected();
00645         bool getZPosMotionDetected();
00646         bool getZeroMotionDetected();
00647 
00648         // I2C_SLV*_DO register
00649         void setSlaveOutputByte(uint8_t num, uint8_t data);
00650 
00651         // I2C_MST_DELAY_CTRL register
00652         bool getExternalShadowDelayEnabled();
00653         void setExternalShadowDelayEnabled(bool enabled);
00654         bool getSlaveDelayEnabled(uint8_t num);
00655         void setSlaveDelayEnabled(uint8_t num, bool enabled);
00656 
00657         // SIGNAL_PATH_RESET register
00658         void resetGyroscopePath();
00659         void resetAccelerometerPath();
00660         void resetTemperaturePath();
00661 
00662         // MOT_DETECT_CTRL register
00663         uint8_t getAccelerometerPowerOnDelay();
00664         void setAccelerometerPowerOnDelay(uint8_t delay);
00665         uint8_t getFreefallDetectionCounterDecrement();
00666         void setFreefallDetectionCounterDecrement(uint8_t decrement);
00667         uint8_t getMotionDetectionCounterDecrement();
00668         void setMotionDetectionCounterDecrement(uint8_t decrement);
00669 
00670         // USER_CTRL register
00671         bool getFIFOEnabled();
00672         void setFIFOEnabled(bool enabled);
00673         bool getI2CMasterModeEnabled();
00674         void setI2CMasterModeEnabled(bool enabled);
00675         void switchSPIEnabled(bool enabled);
00676         void resetFIFO();
00677         void resetI2CMaster();
00678         void resetSensors();
00679 
00680         // PWR_MGMT_1 register
00681         void reset();
00682         bool getSleepEnabled();
00683         void setSleepEnabled(bool enabled);
00684         bool getWakeCycleEnabled();
00685         void setWakeCycleEnabled(bool enabled);
00686         bool getTempSensorEnabled();
00687         void setTempSensorEnabled(bool enabled);
00688         uint8_t getClockSource();
00689         void setClockSource(uint8_t source);
00690 
00691         // PWR_MGMT_2 register
00692         uint8_t getWakeFrequency();
00693         void setWakeFrequency(uint8_t frequency);
00694         bool getStandbyXAccelEnabled();
00695         void setStandbyXAccelEnabled(bool enabled);
00696         bool getStandbyYAccelEnabled();
00697         void setStandbyYAccelEnabled(bool enabled);
00698         bool getStandbyZAccelEnabled();
00699         void setStandbyZAccelEnabled(bool enabled);
00700         bool getStandbyXGyroEnabled();
00701         void setStandbyXGyroEnabled(bool enabled);
00702         bool getStandbyYGyroEnabled();
00703         void setStandbyYGyroEnabled(bool enabled);
00704         bool getStandbyZGyroEnabled();
00705         void setStandbyZGyroEnabled(bool enabled);
00706 
00707         // FIFO_COUNT_* registers
00708         uint16_t getFIFOCount();
00709 
00710         // FIFO_R_W register
00711         uint8_t getFIFOByte();
00712         void setFIFOByte(uint8_t data);
00713         void getFIFOBytes(uint8_t *data, uint8_t length);
00714 
00715         // WHO_AM_I register
00716         uint8_t getDeviceID();
00717         void setDeviceID(uint8_t id);
00718         
00719         // ======== UNDOCUMENTED/DMP REGISTERS/METHODS ========
00720         
00721         // XG_OFFS_TC register
00722         uint8_t getOTPBankValid();
00723         void setOTPBankValid(bool enabled);
00724         int8_t getXGyroOffset();
00725         void setXGyroOffset(int8_t offset);
00726 
00727         // YG_OFFS_TC register
00728         int8_t getYGyroOffset();
00729         void setYGyroOffset(int8_t offset);
00730 
00731         // ZG_OFFS_TC register
00732         int8_t getZGyroOffset();
00733         void setZGyroOffset(int8_t offset);
00734 
00735         // X_FINE_GAIN register
00736         int8_t getXFineGain();
00737         void setXFineGain(int8_t gain);
00738 
00739         // Y_FINE_GAIN register
00740         int8_t getYFineGain();
00741         void setYFineGain(int8_t gain);
00742 
00743         // Z_FINE_GAIN register
00744         int8_t getZFineGain();
00745         void setZFineGain(int8_t gain);
00746 
00747         // XA_OFFS_* registers
00748         int16_t getXAccelOffset();
00749         void setXAccelOffset(int16_t offset);
00750 
00751         // YA_OFFS_* register
00752         int16_t getYAccelOffset();
00753         void setYAccelOffset(int16_t offset);
00754 
00755         // ZA_OFFS_* register
00756         int16_t getZAccelOffset();
00757         void setZAccelOffset(int16_t offset);
00758 
00759         // XG_OFFS_USR* registers
00760         int16_t getXGyroOffsetUser();
00761         void setXGyroOffsetUser(int16_t offset);
00762 
00763         // YG_OFFS_USR* register
00764         int16_t getYGyroOffsetUser();
00765         void setYGyroOffsetUser(int16_t offset);
00766 
00767         // ZG_OFFS_USR* register
00768         int16_t getZGyroOffsetUser();
00769         void setZGyroOffsetUser(int16_t offset);
00770         
00771         // INT_ENABLE register (DMP functions)
00772         bool getIntPLLReadyEnabled();
00773         void setIntPLLReadyEnabled(bool enabled);
00774         bool getIntDMPEnabled();
00775         void setIntDMPEnabled(bool enabled);
00776         
00777         // DMP_INT_STATUS
00778         bool getDMPInt5Status();
00779         bool getDMPInt4Status();
00780         bool getDMPInt3Status();
00781         bool getDMPInt2Status();
00782         bool getDMPInt1Status();
00783         bool getDMPInt0Status();
00784 
00785         // INT_STATUS register (DMP functions)
00786         bool getIntPLLReadyStatus();
00787         bool getIntDMPStatus();
00788         
00789         // USER_CTRL register (DMP functions)
00790         bool getDMPEnabled();
00791         void setDMPEnabled(bool enabled);
00792         void resetDMP();
00793         
00794         // BANK_SEL register
00795         void setMemoryBank(uint8_t bank, bool prefetchEnabled=false, bool userBank=false);
00796         
00797         // MEM_START_ADDR register
00798         void setMemoryStartAddress(uint8_t address);
00799         
00800         // MEM_R_W register
00801         uint8_t readMemoryByte();
00802         void writeMemoryByte(uint8_t data);
00803         void readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0);
00804         bool writeMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true, bool useProgMem=false);
00805         bool writeProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true);
00806 
00807         bool writeDMPConfigurationSet(const uint8_t *data, uint16_t dataSize, bool useProgMem=false);
00808         bool writeProgDMPConfigurationSet(const uint8_t *data, uint16_t dataSize);
00809 
00810         // DMP_CFG_1 register
00811         uint8_t getDMPConfig1();
00812         void setDMPConfig1(uint8_t config);
00813 
00814         // DMP_CFG_2 register
00815         uint8_t getDMPConfig2();
00816         void setDMPConfig2(uint8_t config);
00817 
00818         // special methods for MotionApps 2.0 implementation
00819         #ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS20
00820             uint8_t *dmpPacketBuffer;
00821             uint16_t dmpPacketSize;
00822 
00823             uint8_t dmpInitialize();
00824             bool dmpPacketAvailable();
00825 
00826             uint8_t dmpSetFIFORate(uint8_t fifoRate);
00827             uint8_t dmpGetFIFORate();
00828             uint8_t dmpGetSampleStepSizeMS();
00829             uint8_t dmpGetSampleFrequency();
00830             int32_t dmpDecodeTemperature(int8_t tempReg);
00831             
00832             // Register callbacks after a packet of FIFO data is processed
00833             //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority);
00834             //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func);
00835             uint8_t dmpRunFIFORateProcesses();
00836             
00837             // Setup FIFO for various output
00838             uint8_t dmpSendQuaternion(uint_fast16_t accuracy);
00839             uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy);
00840             uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00841             uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00842             uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);
00843             uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy);
00844             uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00845             uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00846             uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy);
00847             uint8_t dmpSendPacketNumber(uint_fast16_t accuracy);
00848             uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00849             uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);
00850 
00851             // Get Fixed Point data from FIFO
00852             uint8_t dmpGetAccel(int32_t *data, const uint8_t* packet=0);
00853             uint8_t dmpGetAccel(int16_t *data, const uint8_t* packet=0);
00854             uint8_t dmpGetAccel(VectorInt16 *v, const uint8_t* packet=0);
00855             uint8_t dmpGetQuaternion(int32_t *data, const uint8_t* packet=0);
00856             uint8_t dmpGetQuaternion(int16_t *data, const uint8_t* packet=0);
00857             uint8_t dmpGetQuaternion(Quaternion *q, const uint8_t* packet=0);
00858             uint8_t dmpGet6AxisQuaternion(int32_t *data, const uint8_t* packet=0);
00859             uint8_t dmpGet6AxisQuaternion(int16_t *data, const uint8_t* packet=0);
00860             uint8_t dmpGet6AxisQuaternion(Quaternion *q, const uint8_t* packet=0);
00861             uint8_t dmpGetRelativeQuaternion(int32_t *data, const uint8_t* packet=0);
00862             uint8_t dmpGetRelativeQuaternion(int16_t *data, const uint8_t* packet=0);
00863             uint8_t dmpGetRelativeQuaternion(Quaternion *data, const uint8_t* packet=0);
00864             uint8_t dmpGetGyro(int32_t *data, const uint8_t* packet=0);
00865             uint8_t dmpGetGyro(int16_t *data, const uint8_t* packet=0);
00866             uint8_t dmpGetGyro(VectorInt16 *v, const uint8_t* packet=0);
00867             uint8_t dmpSetLinearAccelFilterCoefficient(float coef);
00868             uint8_t dmpGetLinearAccel(int32_t *data, const uint8_t* packet=0);
00869             uint8_t dmpGetLinearAccel(int16_t *data, const uint8_t* packet=0);
00870             uint8_t dmpGetLinearAccel(VectorInt16 *v, const uint8_t* packet=0);
00871             uint8_t dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity);
00872             uint8_t dmpGetLinearAccelInWorld(int32_t *data, const uint8_t* packet=0);
00873             uint8_t dmpGetLinearAccelInWorld(int16_t *data, const uint8_t* packet=0);
00874             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, const uint8_t* packet=0);
00875             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q);
00876             uint8_t dmpGetGyroAndAccelSensor(int32_t *data, const uint8_t* packet=0);
00877             uint8_t dmpGetGyroAndAccelSensor(int16_t *data, const uint8_t* packet=0);
00878             uint8_t dmpGetGyroAndAccelSensor(VectorInt16 *g, VectorInt16 *a, const uint8_t* packet=0);
00879             uint8_t dmpGetGyroSensor(int32_t *data, const uint8_t* packet=0);
00880             uint8_t dmpGetGyroSensor(int16_t *data, const uint8_t* packet=0);
00881             uint8_t dmpGetGyroSensor(VectorInt16 *v, const uint8_t* packet=0);
00882             uint8_t dmpGetControlData(int32_t *data, const uint8_t* packet=0);
00883             uint8_t dm  pGetTemperature(int32_t *data, const uint8_t* packet=0);
00884             uint8_t dmpGetGravity(int32_t *data, const uint8_t* packet=0);
00885             uint8_t dmpGetGravity(int16_t *data, const uint8_t* packet=0);
00886             uint8_t dmpGetGravity(VectorInt16 *v, const uint8_t* packet=0);
00887             uint8_t dmpGetGravity(VectorFloat *v, Quaternion *q);
00888             uint8_t dmpGetUnquantizedAccel(int32_t *data, const uint8_t* packet=0);
00889             uint8_t dmpGetUnquantizedAccel(int16_t *data, const uint8_t* packet=0);
00890             uint8_t dmpGetUnquantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00891             uint8_t dmpGetQuantizedAccel(int32_t *data, const uint8_t* packet=0);
00892             uint8_t dmpGetQuantizedAccel(int16_t *data, const uint8_t* packet=0);
00893             uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00894             uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0);
00895             uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0);
00896             
00897             uint8_t dmpGetEuler(float *data, Quaternion *q);
00898             uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity);
00899 
00900             // Get Floating Point data from FIFO
00901             uint8_t dmpGetAccelFloat(float *data, const uint8_t* packet=0);
00902             uint8_t dmpGetQuaternionFloat(float *data, const uint8_t* packet=0);
00903 
00904             uint8_t dmpProcessFIFOPacket(const unsigned char *dmpData);
00905             uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *processed=NULL);
00906 
00907             uint8_t dmpSetFIFOProcessedCallback(void (*func) (void));
00908 
00909             uint8_t dmpInitFIFOParam();
00910             uint8_t dmpCloseFIFO();
00911             uint8_t dmpSetGyroDataSource(uint8_t source);
00912             uint8_t dmpDecodeQuantizedAccel();
00913             uint32_t dmpGetGyroSumOfSquare();
00914             uint32_t dmpGetAccelSumOfSquare();
00915             void dmpOverrideQuaternion(long *q);
00916             uint16_t dmpGetFIFOPacketSize();
00917         #endif
00918 
00919         // special methods for MotionApps 4.1 implementation
00920         #ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS41
00921             uint8_t *dmpPacketBuffer;
00922             uint16_t dmpPacketSize;
00923 
00924             uint8_t dmpInitialize();
00925             bool dmpPacketAvailable();
00926 
00927             uint8_t dmpSetFIFORate(uint8_t fifoRate);
00928             uint8_t dmpGetFIFORate();
00929             uint8_t dmpGetSampleStepSizeMS();
00930             uint8_t dmpGetSampleFrequency();
00931             int32_t dmpDecodeTemperature(int8_t tempReg);
00932             
00933             // Register callbacks after a packet of FIFO data is processed
00934             //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority);
00935             //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func);
00936             uint8_t dmpRunFIFORateProcesses();
00937             
00938             // Setup FIFO for various output
00939             uint8_t dmpSendQuaternion(uint_fast16_t accuracy);
00940             uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy);
00941             uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00942             uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00943             uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);
00944             uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy);
00945             uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00946             uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00947             uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy);
00948             uint8_t dmpSendPacketNumber(uint_fast16_t accuracy);
00949             uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00950             uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);
00951 
00952             // Get Fixed Point data from FIFO
00953             uint8_t dmpGetAccel(int32_t *data, const uint8_t* packet=0);
00954             uint8_t dmpGetAccel(int16_t *data, const uint8_t* packet=0);
00955             uint8_t dmpGetAccel(VectorInt16 *v, const uint8_t* packet=0);
00956             uint8_t dmpGetQuaternion(int32_t *data, const uint8_t* packet=0);
00957             uint8_t dmpGetQuaternion(int16_t *data, const uint8_t* packet=0);
00958             uint8_t dmpGetQuaternion(Quaternion *q, const uint8_t* packet=0);
00959             uint8_t dmpGet6AxisQuaternion(int32_t *data, const uint8_t* packet=0);
00960             uint8_t dmpGet6AxisQuaternion(int16_t *data, const uint8_t* packet=0);
00961             uint8_t dmpGet6AxisQuaternion(Quaternion *q, const uint8_t* packet=0);
00962             uint8_t dmpGetRelativeQuaternion(int32_t *data, const uint8_t* packet=0);
00963             uint8_t dmpGetRelativeQuaternion(int16_t *data, const uint8_t* packet=0);
00964             uint8_t dmpGetRelativeQuaternion(Quaternion *data, const uint8_t* packet=0);
00965             uint8_t dmpGetGyro(int32_t *data, const uint8_t* packet=0);
00966             uint8_t dmpGetGyro(int16_t *data, const uint8_t* packet=0);
00967             uint8_t dmpGetGyro(VectorInt16 *v, const uint8_t* packet=0);
00968             uint8_t dmpGetMag(int16_t *data, const uint8_t* packet=0);
00969             uint8_t dmpSetLinearAccelFilterCoefficient(float coef);
00970             uint8_t dmpGetLinearAccel(int32_t *data, const uint8_t* packet=0);
00971             uint8_t dmpGetLinearAccel(int16_t *data, const uint8_t* packet=0);
00972             uint8_t dmpGetLinearAccel(VectorInt16 *v, const uint8_t* packet=0);
00973             uint8_t dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity);
00974             uint8_t dmpGetLinearAccelInWorld(int32_t *data, const uint8_t* packet=0);
00975             uint8_t dmpGetLinearAccelInWorld(int16_t *data, const uint8_t* packet=0);
00976             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, const uint8_t* packet=0);
00977             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q);
00978             uint8_t dmpGetGyroAndAccelSensor(int32_t *data, const uint8_t* packet=0);
00979             uint8_t dmpGetGyroAndAccelSensor(int16_t *data, const uint8_t* packet=0);
00980             uint8_t dmpGetGyroAndAccelSensor(VectorInt16 *g, VectorInt16 *a, const uint8_t* packet=0);
00981             uint8_t dmpGetGyroSensor(int32_t *data, const uint8_t* packet=0);
00982             uint8_t dmpGetGyroSensor(int16_t *data, const uint8_t* packet=0);
00983             uint8_t dmpGetGyroSensor(VectorInt16 *v, const uint8_t* packet=0);
00984             uint8_t dmpGetControlData(int32_t *data, const uint8_t* packet=0);
00985             uint8_t dmpGetTemperature(int32_t *data, const uint8_t* packet=0);
00986             uint8_t dmpGetGravity(int32_t *data, const uint8_t* packet=0);
00987             uint8_t dmpGetGravity(int16_t *data, const uint8_t* packet=0);
00988             uint8_t dmpGetGravity(VectorInt16 *v, const uint8_t* packet=0);
00989             uint8_t dmpGetGravity(VectorFloat *v, Quaternion *q);
00990             uint8_t dmpGetUnquantizedAccel(int32_t *data, const uint8_t* packet=0);
00991             uint8_t dmpGetUnquantizedAccel(int16_t *data, const uint8_t* packet=0);
00992             uint8_t dmpGetUnquantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00993             uint8_t dmpGetQuantizedAccel(int32_t *data, const uint8_t* packet=0);
00994             uint8_t dmpGetQuantizedAccel(int16_t *data, const uint8_t* packet=0);
00995             uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00996             uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0);
00997             uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0);
00998             
00999             uint8_t dmpGetEuler(float *data, Quaternion *q);
01000             uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity);
01001 
01002             // Get Floating Point data from FIFO
01003             uint8_t dmpGetAccelFloat(float *data, const uint8_t* packet=0);
01004             uint8_t dmpGetQuaternionFloat(float *data, const uint8_t* packet=0);
01005 
01006             uint8_t dmpProcessFIFOPacket(const unsigned char *dmpData);
01007             uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *processed=NULL);
01008 
01009             uint8_t dmpSetFIFOProcessedCallback(void (*func) (void));
01010 
01011             uint8_t dmpInitFIFOParam();
01012             uint8_t dmpCloseFIFO();
01013             uint8_t dmpSetGyroDataSource(uint8_t source);
01014             uint8_t dmpDecodeQuantizedAccel();
01015             uint32_t dmpGetGyroSumOfSquare();
01016             uint32_t dmpGetAccelSumOfSquare();
01017             void dmpOverrideQuaternion(long *q);
01018             uint16_t dmpGetFIFOPacketSize();
01019         #endif
01020 
01021     private:
01022         uint8_t devAddr;
01023         uint8_t buffer[14];
01024 };
01025 
01026 #endif /* _MPU6050_H_ */