@@ -3321,7 +3321,11 @@ void MPU6050_Base::PID(uint8_t ReadAddress, float kP,float kI, uint8_t Loops){
33213321 if (ReadAddress == 0x3B ) gravity = 16384 >> getFullScaleAccelRange ();
33223322 Serial.write (' >' );
33233323 for (int i = 0 ; i < 3 ; i++) {
3324- I2Cdev::readWords (devAddr, SaveAddress + (i * shift), 1 , (uint16_t *)&Data, I2Cdev::readTimeout, wireObj); // reads 1 or more 16 bit integers (Word)
3324+ if (I2Cdev::readWords (devAddr, SaveAddress + (i * shift), 1 , (uint16_t *)&Data, I2Cdev::readTimeout, wireObj) != 1 ) {
3325+ Serial.print (F (" I2C read error at " ));
3326+ Serial.println (i);
3327+ return ;
3328+ }
33253329 Reading = Data;
33263330 if (SaveAddress != 0x13 ){
33273331 BitZero[i] = Data & 1 ; // Capture Bit Zero to properly handle Accelerometer calibration
@@ -3335,7 +3339,11 @@ void MPU6050_Base::PID(uint8_t ReadAddress, float kP,float kI, uint8_t Loops){
33353339 for (int c = 0 ; c < 100 ; c++) {// 100 PI Calculations
33363340 eSum = 0 ;
33373341 for (int i = 0 ; i < 3 ; i++) {
3338- I2Cdev::readWords (devAddr, ReadAddress + (i * 2 ), 1 , (uint16_t *)&Data, I2Cdev::readTimeout, wireObj); // reads 1 or more 16 bit integers (Word)
3342+ if (I2Cdev::readWords (devAddr, ReadAddress + (i * 2 ), 1 , (uint16_t *)&Data, I2Cdev::readTimeout, wireObj) != 1 ) {
3343+ Serial.print (F (" I2C read error, PID, axis " ));
3344+ Serial.println (i);
3345+ return ;
3346+ }
33393347 Reading = Data;
33403348 if ((ReadAddress == 0x3B )&&(i == 2 )) Reading -= gravity; // remove Gravity
33413349 Error = -Reading;
@@ -3346,7 +3354,11 @@ void MPU6050_Base::PID(uint8_t ReadAddress, float kP,float kI, uint8_t Loops){
33463354 Data = round ((PTerm + ITerm[i] ) / 8 ); // Compute PID Output
33473355 Data = ((Data)&0xFFFE ) |BitZero[i]; // Insert Bit0 Saved at beginning
33483356 } else Data = round ((PTerm + ITerm[i] ) / 4 ); // Compute PID Output
3349- I2Cdev::writeWords (devAddr, SaveAddress + (i * shift), 1 , (uint16_t *)&Data, wireObj);
3357+ if (I2Cdev::writeWords (devAddr, SaveAddress + (i * shift), 1 , (uint16_t *)&Data, wireObj) != 1 ) {
3358+ Serial.print (F (" I2C write error, PID, axis " ));
3359+ Serial.println (i);
3360+ return ;
3361+ }
33503362 }
33513363 if ((c == 99 ) && eSum > 1000 ){ // Error is still to great to continue
33523364 c = 0 ;
@@ -3371,27 +3383,37 @@ void MPU6050_Base::PID(uint8_t ReadAddress, float kP,float kI, uint8_t Loops){
33713383 resetDMP ();
33723384}
33733385
3374- int16_t * MPU6050_Base::GetActiveOffsets () {
3375- uint8_t AOffsetRegister = (getDeviceID () < 0x38 )? MPU6050_RA_XA_OFFS_H:0x77 ;
3376- if (AOffsetRegister == 0x06 ) I2Cdev::readWords (devAddr, AOffsetRegister, 3 , (uint16_t *)offsets, I2Cdev::readTimeout, wireObj);
3377- else {
3378- I2Cdev::readWords (devAddr, AOffsetRegister, 1 , (uint16_t *)offsets, I2Cdev::readTimeout, wireObj);
3379- I2Cdev::readWords (devAddr, AOffsetRegister+3 , 1 , (uint16_t *)(offsets+1 ), I2Cdev::readTimeout, wireObj);
3380- I2Cdev::readWords (devAddr, AOffsetRegister+6 , 1 , (uint16_t *)(offsets+2 ), I2Cdev::readTimeout, wireObj);
3381- }
3382- I2Cdev::readWords (devAddr, 0x13 , 3 , (uint16_t *)(offsets+3 ), I2Cdev::readTimeout, wireObj);
3383- return offsets;
3384- }
33853386
33863387void MPU6050_Base::PrintActiveOffsets () {
3387- GetActiveOffsets ();
3388- // A_OFFSET_H_READ_A_OFFS(Data);
3389- Serial.print ((float )offsets[0 ], 5 ); Serial.print (" ,\t " );
3390- Serial.print ((float )offsets[1 ], 5 ); Serial.print (" ,\t " );
3391- Serial.print ((float )offsets[2 ], 5 ); Serial.print (" ,\t " );
3392-
3393- // XG_OFFSET_H_READ_OFFS_USR(Data);
3394- Serial.print ((float )offsets[3 ], 5 ); Serial.print (" ,\t " );
3395- Serial.print ((float )offsets[4 ], 5 ); Serial.print (" ,\t " );
3396- Serial.print ((float )offsets[5 ], 5 ); Serial.print (" \n\n " );
3388+ uint8_t deviceID = getDeviceID ();
3389+ uint8_t AOffsetRegister = (deviceID < 0x38 )? MPU6050_RA_XA_OFFS_H:0x77 ;
3390+ int16_t accelOffsets[3 ], gyroOffsets[3 ];
3391+
3392+ Serial.print (F (" who: 0x" ));
3393+ Serial.print (deviceID, HEX);
3394+
3395+ if (AOffsetRegister == 0x06 ) {
3396+ I2Cdev::readWords (devAddr, AOffsetRegister, 3 , (uint16_t *)accelOffsets, I2Cdev::readTimeout, wireObj);
3397+ } else {
3398+ I2Cdev::readWords (devAddr, AOffsetRegister, 1 , (uint16_t *)accelOffsets, I2Cdev::readTimeout, wireObj);
3399+ I2Cdev::readWords (devAddr, AOffsetRegister+3 , 1 , (uint16_t *)(accelOffsets+1 ), I2Cdev::readTimeout, wireObj);
3400+ I2Cdev::readWords (devAddr, AOffsetRegister+6 , 1 , (uint16_t *)(accelOffsets+2 ), I2Cdev::readTimeout, wireObj);
3401+ }
3402+
3403+ Serial.print (F (" , accel: " ));
3404+ Serial.print ((float )accelOffsets[0 ], 5 );
3405+ Serial.print (F (" , " ));
3406+ Serial.print ((float )accelOffsets[1 ], 5 );
3407+ Serial.print (F (" , " ));
3408+ Serial.print ((float )accelOffsets[2 ], 5 );
3409+
3410+ I2Cdev::readWords (devAddr, 0x13 , 3 , (uint16_t *)gyroOffsets, I2Cdev::readTimeout, wireObj);
3411+
3412+ Serial.print (F (" , gyro: " ));
3413+ Serial.print ((float )gyroOffsets[0 ], 5 );
3414+ Serial.print (F (" , " ));
3415+ Serial.print ((float )gyroOffsets[1 ], 5 );
3416+ Serial.print (F (" , " ));
3417+ Serial.print ((float )gyroOffsets[2 ], 5 );
3418+ Serial.print (" \n " );
33973419}
0 commit comments