@@ -262,6 +262,10 @@ const unsigned char dmpMemory[MPU6050_DMP_CODE_SIZE] PROGMEM = {
262
262
0xDC , 0xB9 , 0xA7 , 0xF1 , 0x26 , 0x26 , 0x26 , 0xD8 , 0xD8 , 0xFF
263
263
};
264
264
265
+ #ifndef MPU6050_DMP_FIFO_RATE_DIVISOR
266
+ #define MPU6050_DMP_FIFO_RATE_DIVISOR 0x03
267
+ #endif
268
+
265
269
const unsigned char dmpConfig [MPU6050_DMP_CONFIG_SIZE ] PROGMEM = {
266
270
// BANK OFFSET LENGTH [DATA]
267
271
0x02 , 0xEC , 0x04 , 0x00 , 0x47 , 0x7D , 0x1A , // ?
@@ -302,9 +306,9 @@ const unsigned char dmpConfig[MPU6050_DMP_CONFIG_SIZE] PROGMEM = {
302
306
0x07 , 0x67 , 0x01 , 0x9A , // ?
303
307
0x07 , 0x68 , 0x04 , 0xF1 , 0x28 , 0x30 , 0x38 , // CFG_12 inv_send_accel -> inv_construct3_fifo
304
308
0x07 , 0x8D , 0x04 , 0xF1 , 0x28 , 0x30 , 0x38 , // ??? CFG_12 inv_send_mag -> inv_construct3_fifo
305
- 0x02 , 0x16 , 0x02 , 0x00 , 0x03 // D_0_22 inv_set_fifo_rate
309
+ 0x02 , 0x16 , 0x02 , 0x00 , MPU6050_DMP_FIFO_RATE_DIVISOR // D_0_22 inv_set_fifo_rate
306
310
307
- // This very last 0x01 WAS a 0x09, which drops the FIFO rate down to 20 Hz. 0x07 is 25 Hz,
311
+ // This very last 0x03 WAS a 0x09, which drops the FIFO rate down to 20 Hz. 0x07 is 25 Hz,
308
312
// 0x01 is 100Hz. Going faster than 100Hz (0x00=200Hz) tends to result in very noisy data.
309
313
// DMP output frequency is calculated easily using this equation: (200Hz / (1 + value))
310
314
@@ -432,7 +436,7 @@ uint8_t MPU6050::dmpInitialize() {
432
436
DEBUG_PRINTLN (F ("Success! DMP configuration written and verified." ));
433
437
434
438
DEBUG_PRINTLN (F ("Setting DMP and FIFO_OFLOW interrupts enabled..." ));
435
- setIntEnabled (0x12 );
439
+ setIntEnabled (1 << MPU6050_INTERRUPT_FIFO_OFLOW_BIT | 1 << MPU6050_INTERRUPT_DMP_INT_BIT );
436
440
437
441
DEBUG_PRINTLN (F ("Setting sample rate to 200Hz..." ));
438
442
setRate (4 ); // 1khz / (1 + 4) = 200 Hz
@@ -808,6 +812,8 @@ uint8_t MPU6050::dmpGetEuler(float *data, Quaternion *q) {
808
812
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
809
813
return 0 ;
810
814
}
815
+
816
+ #ifdef USE_OLD_DMPGETYAWPITCHROLL
811
817
uint8_t MPU6050 ::dmpGetYawPitchRoll (float * data , Quaternion * q , VectorFloat * gravity ) {
812
818
// yaw: (about Z axis)
813
819
data [0 ] = atan2 (2 * q -> x * q -> y - 2 * q -> w * q -> z , 2 * q -> w * q -> w + 2 * q -> x * q -> x - 1 );
@@ -817,6 +823,24 @@ uint8_t MPU6050::dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gra
817
823
data [2 ] = atan (gravity -> y / sqrt (gravity -> x * gravity -> x + gravity -> z * gravity -> z ));
818
824
return 0 ;
819
825
}
826
+ #else
827
+ uint8_t MPU6050 ::dmpGetYawPitchRoll (float * data , Quaternion * q , VectorFloat * gravity ) {
828
+ // yaw: (about Z axis)
829
+ data [0 ] = atan2 (2 * q -> x * q -> y - 2 * q -> w * q -> z , 2 * q -> w * q -> w + 2 * q -> x * q -> x - 1 );
830
+ // pitch: (nose up/down, about Y axis)
831
+ data [1 ] = atan2 (gravity -> x , sqrt (gravity -> y * gravity -> y + gravity -> z * gravity -> z ));
832
+ // roll: (tilt left/right, about X axis)
833
+ data [2 ] = atan2 (gravity -> y , gravity -> z );
834
+ if (gravity -> z < 0 ) {
835
+ if (data [1 ]> 0 ) {
836
+ data [1 ] = PI - data [1 ];
837
+ } else {
838
+ data [1 ] = - PI - data [1 ];
839
+ }
840
+ }
841
+ return 0 ;
842
+ }
843
+ #endif
820
844
821
845
// uint8_t MPU6050::dmpGetAccelFloat(float *data, const uint8_t* packet);
822
846
// uint8_t MPU6050::dmpGetQuaternionFloat(float *data, const uint8_t* packet);
0 commit comments