This is for our FYDP project. 2 MPU6050s are used

Dependencies:   Servo mbed

Committer:
majik
Date:
Sat Mar 21 21:31:29 2015 +0000
Revision:
0:21019d94ad33
Both IMUs work now

Who changed what in which revision?

UserRevisionLine numberNew contents of line
majik 0:21019d94ad33 1 // I2Cdev library collection - MPU6050 I2C device class, 6-axis MotionApps 2.0 implementation
majik 0:21019d94ad33 2 // Based on InvenSense MPU-6050 register map document rev. 2.0, 5/19/2011 (RM-MPU-6000A-00)
majik 0:21019d94ad33 3 // 5/20/2013 by Jeff Rowberg <jeff@rowberg.net>
majik 0:21019d94ad33 4 // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
majik 0:21019d94ad33 5 //
majik 0:21019d94ad33 6 // Changelog:
majik 0:21019d94ad33 7 // ... - ongoing debug release
majik 0:21019d94ad33 8
majik 0:21019d94ad33 9 /* ============================================
majik 0:21019d94ad33 10 I2Cdev device library code is placed under the MIT license
majik 0:21019d94ad33 11 Copyright (c) 2012 Jeff Rowberg
majik 0:21019d94ad33 12
majik 0:21019d94ad33 13 Permission is hereby granted, free of charge, to any person obtaining a copy
majik 0:21019d94ad33 14 of this software and associated documentation files (the "Software"), to deal
majik 0:21019d94ad33 15 in the Software without restriction, including without limitation the rights
majik 0:21019d94ad33 16 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
majik 0:21019d94ad33 17 copies of the Software, and to permit persons to whom the Software is
majik 0:21019d94ad33 18 furnished to do so, subject to the following conditions:
majik 0:21019d94ad33 19
majik 0:21019d94ad33 20 The above copyright notice and this permission notice shall be included in
majik 0:21019d94ad33 21 all copies or substantial portions of the Software.
majik 0:21019d94ad33 22
majik 0:21019d94ad33 23 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
majik 0:21019d94ad33 24 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
majik 0:21019d94ad33 25 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
majik 0:21019d94ad33 26 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
majik 0:21019d94ad33 27 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
majik 0:21019d94ad33 28 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
majik 0:21019d94ad33 29 THE SOFTWARE.
majik 0:21019d94ad33 30 ===============================================
majik 0:21019d94ad33 31 */
majik 0:21019d94ad33 32
majik 0:21019d94ad33 33 #include "MPU6050_6Axis_MotionApps20.h"
majik 0:21019d94ad33 34
majik 0:21019d94ad33 35 uint8_t MPU6050::dmpInitialize()
majik 0:21019d94ad33 36 {
majik 0:21019d94ad33 37 // reset device
majik 0:21019d94ad33 38 wait_ms(50);
majik 0:21019d94ad33 39 reset();
majik 0:21019d94ad33 40 wait_ms(30);
majik 0:21019d94ad33 41
majik 0:21019d94ad33 42 // enable sleep mode and wake cycle
majik 0:21019d94ad33 43 /*Serial.println(F("Enabling sleep mode..."));
majik 0:21019d94ad33 44 setSleepEnabled(true);
majik 0:21019d94ad33 45 Serial.println(F("Enabling wake cycle..."));
majik 0:21019d94ad33 46 setWakeCycleEnabled(true);*/
majik 0:21019d94ad33 47
majik 0:21019d94ad33 48 // disable sleep mode
majik 0:21019d94ad33 49 //DEBUG_PRINT("Disabling sleep mode...\n");
majik 0:21019d94ad33 50 setSleepEnabled(false);
majik 0:21019d94ad33 51
majik 0:21019d94ad33 52 // get MPU hardware revision
majik 0:21019d94ad33 53 //DEBUG_PRINT("Selecting user bank 16...\n");
majik 0:21019d94ad33 54 setMemoryBank(0x10, true, true);
majik 0:21019d94ad33 55 //DEBUG_PRINT("Selecting memory byte 6...\n");
majik 0:21019d94ad33 56 setMemoryStartAddress(0x06);
majik 0:21019d94ad33 57 //DEBUG_PRINT("Checking hardware revision...\n");
majik 0:21019d94ad33 58 uint8_t hwRevision = readMemoryByte();
majik 0:21019d94ad33 59 //DEBUG_PRINT("Revision @ user[16][6] = ");
majik 0:21019d94ad33 60 //DEBUG_PRINTF("%x\n",hwRevision);
majik 0:21019d94ad33 61 //DEBUG_PRINT("Resetting memory bank selection to 0...\n");
majik 0:21019d94ad33 62 setMemoryBank(0, false, false);
majik 0:21019d94ad33 63
majik 0:21019d94ad33 64 // check OTP bank valid
majik 0:21019d94ad33 65 //DEBUG_PRINT("Reading OTP bank valid flag...\n");
majik 0:21019d94ad33 66 uint8_t otpValid = getOTPBankValid();
majik 0:21019d94ad33 67
majik 0:21019d94ad33 68 //DEBUG_PRINT("OTP bank is ");
majik 0:21019d94ad33 69 if(otpValid); //DEBUG_PRINT("valid!\n");
majik 0:21019d94ad33 70 else; //DEBUG_PRINT("invalid!\n");
majik 0:21019d94ad33 71
majik 0:21019d94ad33 72 // get X/Y/Z gyro offsets
majik 0:21019d94ad33 73 /*
majik 0:21019d94ad33 74 DEBUG_PRINT("\nReading gyro offset TC values...\n");
majik 0:21019d94ad33 75 int8_t xgOffsetTC = mpu.getXGyroOffsetTC();
majik 0:21019d94ad33 76 int8_t ygOffsetTC = getYGyroOffsetTC();
majik 0:21019d94ad33 77 int8_t zgOffsetTC = getZGyroOffsetTC();
majik 0:21019d94ad33 78 DEBUG_PRINTF("X gyro offset = %u\n",xgOffset);
majik 0:21019d94ad33 79 DEBUG_PRINTF("Y gyro offset = %u\n",ygOffset);
majik 0:21019d94ad33 80 DEBUG_PRINTF("Z gyro offset = %u\n",zgOffset);
majik 0:21019d94ad33 81 */
majik 0:21019d94ad33 82 // setup weird slave stuff (?)
majik 0:21019d94ad33 83 //DEBUG_PRINT("Setting slave 0 address to 0x7F...\n");
majik 0:21019d94ad33 84 setSlaveAddress(0, 0x7F);
majik 0:21019d94ad33 85
majik 0:21019d94ad33 86 //DEBUG_PRINT("Disabling I2C Master mode...");
majik 0:21019d94ad33 87 setI2CMasterModeEnabled(false);
majik 0:21019d94ad33 88 //DEBUG_PRINT("Setting slave 0 address to 0x68 (self)...");
majik 0:21019d94ad33 89 setSlaveAddress(0, 0x68);
majik 0:21019d94ad33 90 //DEBUG_PRINT("Resetting I2C Master control...\n");
majik 0:21019d94ad33 91 resetI2CMaster();
majik 0:21019d94ad33 92
majik 0:21019d94ad33 93 wait_ms(20);
majik 0:21019d94ad33 94
majik 0:21019d94ad33 95 // load DMP code into memory banks
majik 0:21019d94ad33 96 //DEBUG_PRINT("Writing DMP code to MPU memory banks (");
majik 0:21019d94ad33 97 //DEBUG_PRINTF("%u",MPU6050_DMP_CODE_SIZE);
majik 0:21019d94ad33 98 //DEBUG_PRINT(" bytes)\n");
majik 0:21019d94ad33 99 if (writeProgMemoryBlock(dmpMemory, MPU6050_DMP_CODE_SIZE)) {
majik 0:21019d94ad33 100 //DEBUG_PRINT("Success! DMP code written and verified.\n");
majik 0:21019d94ad33 101
majik 0:21019d94ad33 102 // write DMP configuration
majik 0:21019d94ad33 103 //DEBUG_PRINT("Writing DMP configuration to MPU memory banks (");
majik 0:21019d94ad33 104 //DEBUG_PRINTF("%u",MPU6050_DMP_CONFIG_SIZE);
majik 0:21019d94ad33 105 //DEBUG_PRINT(" bytes in config def)\n");
majik 0:21019d94ad33 106 if (writeProgDMPConfigurationSet(dmpConfig, MPU6050_DMP_CONFIG_SIZE)) {
majik 0:21019d94ad33 107 //DEBUG_PRINT("Success! DMP configuration written and verified.\n");
majik 0:21019d94ad33 108
majik 0:21019d94ad33 109 //DEBUG_PRINT("Setting clock source to Z Gyro...\n");
majik 0:21019d94ad33 110 setClockSource(MPU6050_CLOCK_PLL_ZGYRO);
majik 0:21019d94ad33 111
majik 0:21019d94ad33 112 //DEBUG_PRINT("Setting DMP and FIFO_OFLOW interrupts enabled...\n");
majik 0:21019d94ad33 113 setIntEnabled(0x12);
majik 0:21019d94ad33 114
majik 0:21019d94ad33 115 //DEBUG_PRINT("Setting sample rate to 200Hz...");
majik 0:21019d94ad33 116 setRate(4); // 1khz / (1 + 4) = 200 Hz
majik 0:21019d94ad33 117
majik 0:21019d94ad33 118 //DEBUG_PRINT("Setting external frame sync to TEMP_OUT_L[0]...\n");
majik 0:21019d94ad33 119 setExternalFrameSync(MPU6050_EXT_SYNC_TEMP_OUT_L);
majik 0:21019d94ad33 120
majik 0:21019d94ad33 121 //DEBUG_PRINT("Setting DLPF bandwidth to 42Hz...\n");
majik 0:21019d94ad33 122 setDLPFMode(MPU6050_DLPF_BW_42);
majik 0:21019d94ad33 123
majik 0:21019d94ad33 124 //DEBUG_PRINT("Setting gyro sensitivity to +/- 2000 deg/sec...\n");
majik 0:21019d94ad33 125 setFullScaleGyroRange(MPU6050_GYRO_FS_2000);
majik 0:21019d94ad33 126
majik 0:21019d94ad33 127 //DEBUG_PRINT("Setting DMP configuration bytes (function unknown)...\n");
majik 0:21019d94ad33 128 setDMPConfig1(0x03);
majik 0:21019d94ad33 129 setDMPConfig2(0x00);
majik 0:21019d94ad33 130
majik 0:21019d94ad33 131 //DEBUG_PRINT("Clearing OTP Bank flag...");
majik 0:21019d94ad33 132 setOTPBankValid(false);
majik 0:21019d94ad33 133
majik 0:21019d94ad33 134 //DEBUG_PRINT("Setting X/Y/Z gyro offset TCs to previous values...\n");
majik 0:21019d94ad33 135 //setXGyroOffsetTC(xgOffsetTC);
majik 0:21019d94ad33 136 //setYGyroOffsetTC(ygOffsetTC);
majik 0:21019d94ad33 137 //setZGyroOffsetTC(zgOffsetTC);
majik 0:21019d94ad33 138
majik 0:21019d94ad33 139 //DEBUG_PRINTLN(F("Setting X/Y/Z gyro user offsets to zero..."));
majik 0:21019d94ad33 140 //setXGyroOffset(0);
majik 0:21019d94ad33 141 //setYGyroOffset(0);
majik 0:21019d94ad33 142 //setZGyroOffset(0);
majik 0:21019d94ad33 143
majik 0:21019d94ad33 144 //DEBUG_PRINT("Writing final memory update 1/7 (function unknown)...\n");
majik 0:21019d94ad33 145 uint8_t dmpUpdate[16], j;
majik 0:21019d94ad33 146 uint16_t pos = 0;
majik 0:21019d94ad33 147 for (j = 0; j < 4 || j < dmpUpdate[2] + 3; j++, pos++) dmpUpdate[j] = pgm_read_byte(&dmpUpdates[pos]);
majik 0:21019d94ad33 148 writeMemoryBlock(dmpUpdate + 3, dmpUpdate[2], dmpUpdate[0], dmpUpdate[1]);
majik 0:21019d94ad33 149
majik 0:21019d94ad33 150 //DEBUG_PRINT("Writing final memory update 2/7 (function unknown)...\n");
majik 0:21019d94ad33 151 for (j = 0; j < 4 || j < dmpUpdate[2] + 3; j++, pos++) dmpUpdate[j] = pgm_read_byte(&dmpUpdates[pos]);
majik 0:21019d94ad33 152 writeMemoryBlock(dmpUpdate + 3, dmpUpdate[2], dmpUpdate[0], dmpUpdate[1]);
majik 0:21019d94ad33 153
majik 0:21019d94ad33 154 //DEBUG_PRINT("Resetting FIFO...\n");
majik 0:21019d94ad33 155 resetFIFO();
majik 0:21019d94ad33 156
majik 0:21019d94ad33 157 //DEBUG_PRINT("Reading FIFO count...\n");
majik 0:21019d94ad33 158 uint16_t fifoCount = getFIFOCount();
majik 0:21019d94ad33 159 uint8_t fifoBuffer[128];
majik 0:21019d94ad33 160
majik 0:21019d94ad33 161 //DEBUG_PRINT("Current FIFO count=");
majik 0:21019d94ad33 162 //DEBUG_PRINTF("%u\n",fifoCount);
majik 0:21019d94ad33 163 getFIFOBytes(fifoBuffer, fifoCount);
majik 0:21019d94ad33 164
majik 0:21019d94ad33 165 //DEBUG_PRINT("Setting motion detection threshold to 2...\n");
majik 0:21019d94ad33 166 setMotionDetectionThreshold(2);
majik 0:21019d94ad33 167
majik 0:21019d94ad33 168 //DEBUG_PRINT("Setting zero-motion detection threshold to 156...\n");
majik 0:21019d94ad33 169 setZeroMotionDetectionThreshold(156);
majik 0:21019d94ad33 170
majik 0:21019d94ad33 171 //DEBUG_PRINT("Setting motion detection duration to 80...");
majik 0:21019d94ad33 172 setMotionDetectionDuration(80);
majik 0:21019d94ad33 173
majik 0:21019d94ad33 174 //DEBUG_PRINT("Setting zero-motion detection duration to 0...");
majik 0:21019d94ad33 175 setZeroMotionDetectionDuration(0);
majik 0:21019d94ad33 176
majik 0:21019d94ad33 177 //DEBUG_PRINT("Resetting FIFO...\n");
majik 0:21019d94ad33 178 resetFIFO();
majik 0:21019d94ad33 179
majik 0:21019d94ad33 180 //DEBUG_PRINT("Enabling FIFO...\n");
majik 0:21019d94ad33 181 setFIFOEnabled(true);
majik 0:21019d94ad33 182
majik 0:21019d94ad33 183 //DEBUG_PRINT("Enabling DMP...\n");
majik 0:21019d94ad33 184 setDMPEnabled(true);
majik 0:21019d94ad33 185
majik 0:21019d94ad33 186 //DEBUG_PRINT("Resetting DMP...\n");
majik 0:21019d94ad33 187 resetDMP();
majik 0:21019d94ad33 188
majik 0:21019d94ad33 189 //DEBUG_PRINT("Writing final memory update 3/7 (function unknown)...\n");
majik 0:21019d94ad33 190 for (j = 0; j < 4 || j < dmpUpdate[2] + 3; j++, pos++) dmpUpdate[j] = pgm_read_byte(&dmpUpdates[pos]);
majik 0:21019d94ad33 191 writeMemoryBlock(dmpUpdate + 3, dmpUpdate[2], dmpUpdate[0], dmpUpdate[1]);
majik 0:21019d94ad33 192
majik 0:21019d94ad33 193 //DEBUG_PRINT("Writing final memory update 4/7 (function unknown)...\n");
majik 0:21019d94ad33 194 for (j = 0; j < 4 || j < dmpUpdate[2] + 3; j++, pos++) dmpUpdate[j] = pgm_read_byte(&dmpUpdates[pos]);
majik 0:21019d94ad33 195 writeMemoryBlock(dmpUpdate + 3, dmpUpdate[2], dmpUpdate[0], dmpUpdate[1]);
majik 0:21019d94ad33 196
majik 0:21019d94ad33 197 //DEBUG_PRINT("Writing final memory update 5/7 (function unknown)...\n");
majik 0:21019d94ad33 198 for (j = 0; j < 4 || j < dmpUpdate[2] + 3; j++, pos++) dmpUpdate[j] = pgm_read_byte(&dmpUpdates[pos]);
majik 0:21019d94ad33 199 writeMemoryBlock(dmpUpdate + 3, dmpUpdate[2], dmpUpdate[0], dmpUpdate[1]);
majik 0:21019d94ad33 200
majik 0:21019d94ad33 201 //DEBUG_PRINT("Waiting for FIFO count > 2...\n");
majik 0:21019d94ad33 202 while ((fifoCount = getFIFOCount()) < 3);
majik 0:21019d94ad33 203
majik 0:21019d94ad33 204 //DEBUG_PRINT("Current FIFO count=");
majik 0:21019d94ad33 205 //DEBUG_PRINTF("%u\n",fifoCount);
majik 0:21019d94ad33 206 //DEBUG_PRINT("Reading FIFO data...\n");
majik 0:21019d94ad33 207 getFIFOBytes(fifoBuffer, fifoCount);
majik 0:21019d94ad33 208
majik 0:21019d94ad33 209 //DEBUG_PRINT("Reading interrupt status...\n");
majik 0:21019d94ad33 210 uint8_t mpuIntStatus = getIntStatus();
majik 0:21019d94ad33 211
majik 0:21019d94ad33 212 //DEBUG_PRINT("Current interrupt status=");
majik 0:21019d94ad33 213 //DEBUG_PRINTF("%x\n",mpuIntStatus);
majik 0:21019d94ad33 214
majik 0:21019d94ad33 215 //DEBUG_PRINT("Reading final memory update 6/7 (function unknown)...\n");
majik 0:21019d94ad33 216 for (j = 0; j < 4 || j < dmpUpdate[2] + 3; j++, pos++) dmpUpdate[j] = pgm_read_byte(&dmpUpdates[pos]);
majik 0:21019d94ad33 217 readMemoryBlock(dmpUpdate + 3, dmpUpdate[2], dmpUpdate[0], dmpUpdate[1]);
majik 0:21019d94ad33 218
majik 0:21019d94ad33 219 //DEBUG_PRINT("Waiting for FIFO count > 2...\n");
majik 0:21019d94ad33 220 while ((fifoCount = getFIFOCount()) < 3);
majik 0:21019d94ad33 221
majik 0:21019d94ad33 222 //DEBUG_PRINT("Current FIFO count=");
majik 0:21019d94ad33 223 //DEBUG_PRINTF("%u\n",fifoCount);
majik 0:21019d94ad33 224
majik 0:21019d94ad33 225 //DEBUG_PRINT("Reading FIFO data...\n");
majik 0:21019d94ad33 226 getFIFOBytes(fifoBuffer, fifoCount);
majik 0:21019d94ad33 227
majik 0:21019d94ad33 228 //DEBUG_PRINT("Reading interrupt status...\n");
majik 0:21019d94ad33 229 mpuIntStatus = getIntStatus();
majik 0:21019d94ad33 230
majik 0:21019d94ad33 231 //DEBUG_PRINT("Current interrupt status=");
majik 0:21019d94ad33 232 //DEBUG_PRINTF("%x\n",mpuIntStatus);
majik 0:21019d94ad33 233
majik 0:21019d94ad33 234 //DEBUG_PRINT("Writing final memory update 7/7 (function unknown)...");
majik 0:21019d94ad33 235 for (j = 0; j < 4 || j < dmpUpdate[2] + 3; j++, pos++) dmpUpdate[j] = pgm_read_byte(&dmpUpdates[pos]);
majik 0:21019d94ad33 236 writeMemoryBlock(dmpUpdate + 3, dmpUpdate[2], dmpUpdate[0], dmpUpdate[1]);
majik 0:21019d94ad33 237
majik 0:21019d94ad33 238 //DEBUG_PRINT("DMP is good to go! Finally.\n");
majik 0:21019d94ad33 239
majik 0:21019d94ad33 240 //DEBUG_PRINT("Disabling DMP (you turn it on later)...\n");
majik 0:21019d94ad33 241 setDMPEnabled(false);
majik 0:21019d94ad33 242
majik 0:21019d94ad33 243 //DEBUG_PRINT("Setting up internal 42-byte (default) DMP packet buffer...\n");
majik 0:21019d94ad33 244 dmpPacketSize = 42;
majik 0:21019d94ad33 245 /*if ((dmpPacketBuffer = (uint8_t *)malloc(42)) == 0) {
majik 0:21019d94ad33 246 return 3; // TODO: proper error code for no memory
majik 0:21019d94ad33 247 }*/
majik 0:21019d94ad33 248
majik 0:21019d94ad33 249 //DEBUG_PRINT("Resetting FIFO and clearing INT status one last time...\n");
majik 0:21019d94ad33 250 resetFIFO();
majik 0:21019d94ad33 251 getIntStatus();
majik 0:21019d94ad33 252 } else {
majik 0:21019d94ad33 253 //DEBUG_PRINT("ERROR! DMP configuration verification failed.\n");
majik 0:21019d94ad33 254 return 2; // configuration block loading failed
majik 0:21019d94ad33 255 }
majik 0:21019d94ad33 256 } else {
majik 0:21019d94ad33 257 //DEBUG_PRINT("ERROR! DMP code verification failed.");
majik 0:21019d94ad33 258 return 1; // main binary block loading failed
majik 0:21019d94ad33 259 }
majik 0:21019d94ad33 260 return 0; // success
majik 0:21019d94ad33 261 }
majik 0:21019d94ad33 262
majik 0:21019d94ad33 263 bool MPU6050::dmpPacketAvailable()
majik 0:21019d94ad33 264 {
majik 0:21019d94ad33 265 return getFIFOCount() >= dmpGetFIFOPacketSize();
majik 0:21019d94ad33 266 }
majik 0:21019d94ad33 267
majik 0:21019d94ad33 268 // uint8_t MPU6050::dmpSetFIFORate(uint8_t fifoRate);
majik 0:21019d94ad33 269 // uint8_t MPU6050::dmpGetFIFORate();
majik 0:21019d94ad33 270 // uint8_t MPU6050::dmpGetSampleStepSizeMS();
majik 0:21019d94ad33 271 // uint8_t MPU6050::dmpGetSampleFrequency();
majik 0:21019d94ad33 272 // int32_t MPU6050::dmpDecodeTemperature(int8_t tempReg);
majik 0:21019d94ad33 273
majik 0:21019d94ad33 274 //uint8_t MPU6050::dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority);
majik 0:21019d94ad33 275 //uint8_t MPU6050::dmpUnregisterFIFORateProcess(inv_obj_func func);
majik 0:21019d94ad33 276 //uint8_t MPU6050::dmpRunFIFORateProcesses();
majik 0:21019d94ad33 277
majik 0:21019d94ad33 278 // uint8_t MPU6050::dmpSendQuaternion(uint_fast16_t accuracy);
majik 0:21019d94ad33 279 // uint8_t MPU6050::dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy);
majik 0:21019d94ad33 280 // uint8_t MPU6050::dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);
majik 0:21019d94ad33 281 // uint8_t MPU6050::dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy);
majik 0:21019d94ad33 282 // uint8_t MPU6050::dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);
majik 0:21019d94ad33 283 // uint8_t MPU6050::dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy);
majik 0:21019d94ad33 284 // uint8_t MPU6050::dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
majik 0:21019d94ad33 285 // uint8_t MPU6050::dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
majik 0:21019d94ad33 286 // uint8_t MPU6050::dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy);
majik 0:21019d94ad33 287 // uint8_t MPU6050::dmpSendPacketNumber(uint_fast16_t accuracy);
majik 0:21019d94ad33 288 // uint8_t MPU6050::dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy);
majik 0:21019d94ad33 289 // uint8_t MPU6050::dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);
majik 0:21019d94ad33 290
majik 0:21019d94ad33 291 uint8_t MPU6050::dmpGetAccel(int32_t *data, const uint8_t* packet)
majik 0:21019d94ad33 292 {
majik 0:21019d94ad33 293 // TODO: accommodate different arrangements of sent data (ONLY default supported now)
majik 0:21019d94ad33 294 if (packet == 0) packet = dmpPacketBuffer;
majik 0:21019d94ad33 295 data[0] = ((packet[28] << 24) + (packet[29] << 16) + (packet[30] << 8) + packet[31]);
majik 0:21019d94ad33 296 data[1] = ((packet[32] << 24) + (packet[33] << 16) + (packet[34] << 8) + packet[35]);
majik 0:21019d94ad33 297 data[2] = ((packet[36] << 24) + (packet[37] << 16) + (packet[38] << 8) + packet[39]);
majik 0:21019d94ad33 298 return 0;
majik 0:21019d94ad33 299 }
majik 0:21019d94ad33 300 uint8_t MPU6050::dmpGetAccel(int16_t *data, const uint8_t* packet)
majik 0:21019d94ad33 301 {
majik 0:21019d94ad33 302 // TODO: accommodate different arrangements of sent data (ONLY default supported now)
majik 0:21019d94ad33 303 if (packet == 0) packet = dmpPacketBuffer;
majik 0:21019d94ad33 304 data[0] = (packet[28] << 8) + packet[29];
majik 0:21019d94ad33 305 data[1] = (packet[32] << 8) + packet[33];
majik 0:21019d94ad33 306 data[2] = (packet[36] << 8) + packet[37];
majik 0:21019d94ad33 307 return 0;
majik 0:21019d94ad33 308 }
majik 0:21019d94ad33 309 uint8_t MPU6050::dmpGetAccel(VectorInt16 *v, const uint8_t* packet)
majik 0:21019d94ad33 310 {
majik 0:21019d94ad33 311 // TODO: accommodate different arrangements of sent data (ONLY default supported now)
majik 0:21019d94ad33 312 if (packet == 0) packet = dmpPacketBuffer;
majik 0:21019d94ad33 313 v -> x = (packet[28] << 8) + packet[29];
majik 0:21019d94ad33 314 v -> y = (packet[32] << 8) + packet[33];
majik 0:21019d94ad33 315 v -> z = (packet[36] << 8) + packet[37];
majik 0:21019d94ad33 316 return 0;
majik 0:21019d94ad33 317 }
majik 0:21019d94ad33 318 uint8_t MPU6050::dmpGetQuaternion(int32_t *data, const uint8_t* packet)
majik 0:21019d94ad33 319 {
majik 0:21019d94ad33 320 // TODO: accommodate different arrangements of sent data (ONLY default supported now)
majik 0:21019d94ad33 321 if (packet == 0) packet = dmpPacketBuffer;
majik 0:21019d94ad33 322 data[0] = ((packet[0] << 24) + (packet[1] << 16) + (packet[2] << 8) + packet[3]);
majik 0:21019d94ad33 323 data[1] = ((packet[4] << 24) + (packet[5] << 16) + (packet[6] << 8) + packet[7]);
majik 0:21019d94ad33 324 data[2] = ((packet[8] << 24) + (packet[9] << 16) + (packet[10] << 8) + packet[11]);
majik 0:21019d94ad33 325 data[3] = ((packet[12] << 24) + (packet[13] << 16) + (packet[14] << 8) + packet[15]);
majik 0:21019d94ad33 326 return 0;
majik 0:21019d94ad33 327 }
majik 0:21019d94ad33 328 uint8_t MPU6050::dmpGetQuaternion(int16_t *data, const uint8_t* packet)
majik 0:21019d94ad33 329 {
majik 0:21019d94ad33 330 // TODO: accommodate different arrangements of sent data (ONLY default supported now)
majik 0:21019d94ad33 331 if (packet == 0) packet = dmpPacketBuffer;
majik 0:21019d94ad33 332 data[0] = ((packet[0] << 8) + packet[1]);
majik 0:21019d94ad33 333 data[1] = ((packet[4] << 8) + packet[5]);
majik 0:21019d94ad33 334 data[2] = ((packet[8] << 8) + packet[9]);
majik 0:21019d94ad33 335 data[3] = ((packet[12] << 8) + packet[13]);
majik 0:21019d94ad33 336 return 0;
majik 0:21019d94ad33 337 }
majik 0:21019d94ad33 338 uint8_t MPU6050::dmpGetQuaternion(Quaternion *q, const uint8_t* packet)
majik 0:21019d94ad33 339 {
majik 0:21019d94ad33 340 // TODO: accommodate different arrangements of sent data (ONLY default supported now)
majik 0:21019d94ad33 341 int16_t qI[4];
majik 0:21019d94ad33 342 uint8_t status = dmpGetQuaternion(qI, packet);
majik 0:21019d94ad33 343 if (status == 0) {
majik 0:21019d94ad33 344 q -> w = (float)qI[0] / 16384.0f;
majik 0:21019d94ad33 345 q -> x = (float)qI[1] / 16384.0f;
majik 0:21019d94ad33 346 q -> y = (float)qI[2] / 16384.0f;
majik 0:21019d94ad33 347 q -> z = (float)qI[3] / 16384.0f;
majik 0:21019d94ad33 348 return 0;
majik 0:21019d94ad33 349 }
majik 0:21019d94ad33 350 return status; // int16 return value, indicates error if this line is reached
majik 0:21019d94ad33 351 }
majik 0:21019d94ad33 352 // uint8_t MPU6050::dmpGet6AxisQuaternion(long *data, const uint8_t* packet);
majik 0:21019d94ad33 353 // uint8_t MPU6050::dmpGetRelativeQuaternion(long *data, const uint8_t* packet);
majik 0:21019d94ad33 354 uint8_t MPU6050::dmpGetGyro(int32_t *data, const uint8_t* packet)
majik 0:21019d94ad33 355 {
majik 0:21019d94ad33 356 // TODO: accommodate different arrangements of sent data (ONLY default supported now)
majik 0:21019d94ad33 357 if (packet == 0) packet = dmpPacketBuffer;
majik 0:21019d94ad33 358 data[0] = ((packet[16] << 24) + (packet[17] << 16) + (packet[18] << 8) + packet[19]);
majik 0:21019d94ad33 359 data[1] = ((packet[20] << 24) + (packet[21] << 16) + (packet[22] << 8) + packet[23]);
majik 0:21019d94ad33 360 data[2] = ((packet[24] << 24) + (packet[25] << 16) + (packet[26] << 8) + packet[27]);
majik 0:21019d94ad33 361 return 0;
majik 0:21019d94ad33 362 }
majik 0:21019d94ad33 363 uint8_t MPU6050::dmpGetGyro(int16_t *data, const uint8_t* packet)
majik 0:21019d94ad33 364 {
majik 0:21019d94ad33 365 // TODO: accommodate different arrangements of sent data (ONLY default supported now)
majik 0:21019d94ad33 366 if (packet == 0) packet = dmpPacketBuffer;
majik 0:21019d94ad33 367 data[0] = (packet[16] << 8) + packet[17];
majik 0:21019d94ad33 368 data[1] = (packet[20] << 8) + packet[21];
majik 0:21019d94ad33 369 data[2] = (packet[24] << 8) + packet[25];
majik 0:21019d94ad33 370 return 0;
majik 0:21019d94ad33 371 }
majik 0:21019d94ad33 372 // uint8_t MPU6050::dmpSetLinearAccelFilterCoefficient(float coef);
majik 0:21019d94ad33 373 // uint8_t MPU6050::dmpGetLinearAccel(long *data, const uint8_t* packet);
majik 0:21019d94ad33 374 uint8_t MPU6050::dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity)
majik 0:21019d94ad33 375 {
majik 0:21019d94ad33 376 // get rid of the gravity component (+1g = +8192 in standard DMP FIFO packet, sensitivity is 2g)
majik 0:21019d94ad33 377 v -> x = vRaw -> x - gravity -> x*8192;
majik 0:21019d94ad33 378 v -> y = vRaw -> y - gravity -> y*8192;
majik 0:21019d94ad33 379 v -> z = vRaw -> z - gravity -> z*8192;
majik 0:21019d94ad33 380 return 0;
majik 0:21019d94ad33 381 }
majik 0:21019d94ad33 382 // uint8_t MPU6050::dmpGetLinearAccelInWorld(long *data, const uint8_t* packet);
majik 0:21019d94ad33 383 uint8_t MPU6050::dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q)
majik 0:21019d94ad33 384 {
majik 0:21019d94ad33 385 // rotate measured 3D acceleration vector into original state
majik 0:21019d94ad33 386 // frame of reference based on orientation quaternion
majik 0:21019d94ad33 387 memcpy(v, vReal, sizeof(VectorInt16));
majik 0:21019d94ad33 388 v -> rotate(q);
majik 0:21019d94ad33 389 return 0;
majik 0:21019d94ad33 390 }
majik 0:21019d94ad33 391 // uint8_t MPU6050::dmpGetGyroAndAccelSensor(long *data, const uint8_t* packet);
majik 0:21019d94ad33 392 // uint8_t MPU6050::dmpGetGyroSensor(long *data, const uint8_t* packet);
majik 0:21019d94ad33 393 // uint8_t MPU6050::dmpGetControlData(long *data, const uint8_t* packet);
majik 0:21019d94ad33 394 // uint8_t MPU6050::dmpGetTemperature(long *data, const uint8_t* packet);
majik 0:21019d94ad33 395 // uint8_t MPU6050::dmpGetGravity(long *data, const uint8_t* packet);
majik 0:21019d94ad33 396 uint8_t MPU6050::dmpGetGravity(VectorFloat *v, Quaternion *q)
majik 0:21019d94ad33 397 {
majik 0:21019d94ad33 398 v -> x = 2 * (q -> x*q -> z - q -> w*q -> y);
majik 0:21019d94ad33 399 v -> y = 2 * (q -> w*q -> x + q -> y*q -> z);
majik 0:21019d94ad33 400 v -> z = q -> w*q -> w - q -> x*q -> x - q -> y*q -> y + q -> z*q -> z;
majik 0:21019d94ad33 401 return 0;
majik 0:21019d94ad33 402 }
majik 0:21019d94ad33 403 // uint8_t MPU6050::dmpGetUnquantizedAccel(long *data, const uint8_t* packet);
majik 0:21019d94ad33 404 // uint8_t MPU6050::dmpGetQuantizedAccel(long *data, const uint8_t* packet);
majik 0:21019d94ad33 405 // uint8_t MPU6050::dmpGetExternalSensorData(long *data, int size, const uint8_t* packet);
majik 0:21019d94ad33 406 // uint8_t MPU6050::dmpGetEIS(long *data, const uint8_t* packet);
majik 0:21019d94ad33 407
majik 0:21019d94ad33 408 uint8_t MPU6050::dmpGetEuler(float *data, Quaternion *q)
majik 0:21019d94ad33 409 {
majik 0:21019d94ad33 410 data[0] = atan2(2*q -> x*q -> y - 2*q -> w*q -> z, 2*q -> w*q -> w + 2*q -> x*q -> x - 1); // psi
majik 0:21019d94ad33 411 data[1] = -asin(2*q -> x*q -> z + 2*q -> w*q -> y); // theta
majik 0:21019d94ad33 412 data[2] = atan2(2*q -> y*q -> z - 2*q -> w*q -> x, 2*q -> w*q -> w + 2*q -> z*q -> z - 1); // phi
majik 0:21019d94ad33 413 return 0;
majik 0:21019d94ad33 414 }
majik 0:21019d94ad33 415
majik 0:21019d94ad33 416 uint8_t MPU6050::dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity)
majik 0:21019d94ad33 417 {
majik 0:21019d94ad33 418 // yaw: (about Z axis)
majik 0:21019d94ad33 419 data[0] = atan2(2*q -> x*q -> y - 2*q -> w*q -> z, 2*q -> w*q -> w + 2*q -> x*q -> x - 1);
majik 0:21019d94ad33 420 // pitch: (nose up/down, about Y axis)
majik 0:21019d94ad33 421 data[1] = atan(gravity -> x / sqrt(gravity -> y*gravity -> y + gravity -> z*gravity -> z));
majik 0:21019d94ad33 422 // roll: (tilt left/right, about X axis)
majik 0:21019d94ad33 423 data[2] = atan(gravity -> y / sqrt(gravity -> x*gravity -> x + gravity -> z*gravity -> z));
majik 0:21019d94ad33 424 return 0;
majik 0:21019d94ad33 425 }
majik 0:21019d94ad33 426
majik 0:21019d94ad33 427 // uint8_t MPU6050::dmpGetAccelFloat(float *data, const uint8_t* packet);
majik 0:21019d94ad33 428 // uint8_t MPU6050::dmpGetQuaternionFloat(float *data, const uint8_t* packet);
majik 0:21019d94ad33 429
majik 0:21019d94ad33 430 uint8_t MPU6050::dmpProcessFIFOPacket(const unsigned char *dmpData)
majik 0:21019d94ad33 431 {
majik 0:21019d94ad33 432 /*for (uint8_t k = 0; k < dmpPacketSize; k++) {
majik 0:21019d94ad33 433 if (dmpData[k] < 0x10) Serial.print("0");
majik 0:21019d94ad33 434 Serial.print(dmpData[k], HEX);
majik 0:21019d94ad33 435 Serial.print(" ");
majik 0:21019d94ad33 436 }
majik 0:21019d94ad33 437 Serial.print("\n");*/
majik 0:21019d94ad33 438 //Serial.println((uint16_t)dmpPacketBuffer);
majik 0:21019d94ad33 439 return 0;
majik 0:21019d94ad33 440 }
majik 0:21019d94ad33 441 uint8_t MPU6050::dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *processed)
majik 0:21019d94ad33 442 {
majik 0:21019d94ad33 443 uint8_t status;
majik 0:21019d94ad33 444 uint8_t buf[dmpPacketSize];
majik 0:21019d94ad33 445 for (uint8_t i = 0; i < numPackets; i++) {
majik 0:21019d94ad33 446 // read packet from FIFO
majik 0:21019d94ad33 447 getFIFOBytes(buf, dmpPacketSize);
majik 0:21019d94ad33 448
majik 0:21019d94ad33 449 // process packet
majik 0:21019d94ad33 450 if ((status = dmpProcessFIFOPacket(buf)) > 0) return status;
majik 0:21019d94ad33 451
majik 0:21019d94ad33 452 // increment external process count variable, if supplied
majik 0:21019d94ad33 453 if (processed != 0) *processed++;
majik 0:21019d94ad33 454 }
majik 0:21019d94ad33 455 return 0;
majik 0:21019d94ad33 456 }
majik 0:21019d94ad33 457
majik 0:21019d94ad33 458 // uint8_t MPU6050::dmpSetFIFOProcessedCallback(void (*func) (void));
majik 0:21019d94ad33 459
majik 0:21019d94ad33 460 // uint8_t MPU6050::dmpInitFIFOParam();
majik 0:21019d94ad33 461 // uint8_t MPU6050::dmpCloseFIFO();
majik 0:21019d94ad33 462 // uint8_t MPU6050::dmpSetGyroDataSource(uint_fast8_t source);
majik 0:21019d94ad33 463 // uint8_t MPU6050::dmpDecodeQuantizedAccel();
majik 0:21019d94ad33 464 // uint32_t MPU6050::dmpGetGyroSumOfSquare();
majik 0:21019d94ad33 465 // uint32_t MPU6050::dmpGetAccelSumOfSquare();
majik 0:21019d94ad33 466 // void MPU6050::dmpOverrideQuaternion(long *q);
majik 0:21019d94ad33 467 uint16_t MPU6050::dmpGetFIFOPacketSize()
majik 0:21019d94ad33 468 {
majik 0:21019d94ad33 469 return dmpPacketSize;
majik 0:21019d94ad33 470 }