diff --git a/libraries/CurieIMU/examples/RawImuDataSerial/RawImuDataSerial.ino b/libraries/CurieIMU/examples/RawImuDataSerial/RawImuDataSerial.ino index fe3524bd..d61da508 100644 --- a/libraries/CurieIMU/examples/RawImuDataSerial/RawImuDataSerial.ino +++ b/libraries/CurieIMU/examples/RawImuDataSerial/RawImuDataSerial.ino @@ -72,12 +72,12 @@ void setup() { // To manually configure offset compensation values, // use the following methods instead of the autoCalibrate...() methods below - //CurieIMU.setAccelerometerOffset(X_AXIS,128); - //CurieIMU.setAccelerometerOffset(Y_AXIS,-4); - //CurieIMU.setAccelerometerOffset(Z_AXIS,127); - //CurieIMU.setGyroOffset(X_AXIS,129); - //CurieIMU.setGyroOffset(Y_AXIS,-1); - //CurieIMU.setGyroOffset(Z_AXIS, 254); + //CurieIMU.setAccelerometerOffset(X_AXIS,495.3); + //CurieIMU.setAccelerometerOffset(Y_AXIS,-15.6); + //CurieIMU.setAccelerometerOffset(Z_AXIS,491.4); + //CurieIMU.setGyroOffset(X_AXIS,7.869); + //CurieIMU.setGyroOffset(Y_AXIS,-0.061); + //CurieIMU.setGyroOffset(Z_AXIS,15.494); Serial.println("About to calibrate. Make sure your board is stable and upright"); delay(5000); diff --git a/libraries/CurieIMU/src/CurieIMU.cpp b/libraries/CurieIMU/src/CurieIMU.cpp index 02284285..ce50a791 100644 --- a/libraries/CurieIMU/src/CurieIMU.cpp +++ b/libraries/CurieIMU/src/CurieIMU.cpp @@ -332,53 +332,77 @@ bool CurieIMUClass::accelerometerOffsetEnabled() return getAccelOffsetEnabled(); } -int CurieIMUClass::getGyroOffset(int axis) +float CurieIMUClass::getGyroOffset(int axis) { + int bmiOffset; + if (axis == X_AXIS) { - return getXGyroOffset(); + bmiOffset = getXGyroOffset(); } else if (axis == Y_AXIS) { - return getYGyroOffset(); + bmiOffset = getYGyroOffset(); } else if (axis == Z_AXIS) { - return getZGyroOffset(); + bmiOffset = getZGyroOffset(); + } else { + return -1; } - return -1; + return (bmiOffset * 0.061); } -int CurieIMUClass::getAccelerometerOffset(int axis) +float CurieIMUClass::getAccelerometerOffset(int axis) { + int bmiOffset; + if (axis == X_AXIS) { - return getXAccelOffset(); + bmiOffset = getXAccelOffset(); } else if (axis == Y_AXIS) { - return getYAccelOffset(); + bmiOffset = getYAccelOffset(); } else if (axis == Z_AXIS) { - return getZAccelOffset(); + bmiOffset = getZAccelOffset(); + } else { + return -1; } - return -1; + return (bmiOffset * 3.9); } -void CurieIMUClass::setGyroOffset(int axis, int offset) +void CurieIMUClass::setGyroOffset(int axis, float offset) { + int bmiOffset = offset / 0.061; + + if (bmiOffset < -512) { + bmiOffset = -512; + } else if (bmiOffset > 511) { + bmiOffset = 511; + } + if (axis == X_AXIS) { - setXGyroOffset(axis); + setXGyroOffset(bmiOffset); } else if (axis == Y_AXIS) { - setYGyroOffset(axis); + setYGyroOffset(bmiOffset); } else if (axis == Z_AXIS) { - setZGyroOffset(axis); + setZGyroOffset(bmiOffset); } setGyroOffsetEnabled(true); } -void CurieIMUClass::setAccelerometerOffset(int axis, int offset) +void CurieIMUClass::setAccelerometerOffset(int axis, float offset) { + int bmiOffset = offset / 3.9; + + if (bmiOffset < -128) { + bmiOffset = -128; + } else if (bmiOffset > 127) { + bmiOffset = 127; + } + if (axis == X_AXIS) { - setXAccelOffset(axis); + setXAccelOffset(bmiOffset); } else if (axis == Y_AXIS) { - setYAccelOffset(axis); + setYAccelOffset(bmiOffset); } else if (axis == Z_AXIS) { - setZAccelOffset(axis); + setZAccelOffset(bmiOffset); } setAccelOffsetEnabled(true); diff --git a/libraries/CurieIMU/src/CurieIMU.h b/libraries/CurieIMU/src/CurieIMU.h index f1c6b71f..d269f708 100644 --- a/libraries/CurieIMU/src/CurieIMU.h +++ b/libraries/CurieIMU/src/CurieIMU.h @@ -120,11 +120,14 @@ class CurieIMUClass : public BMI160Class { bool gyroOffsetEnabled(); bool accelerometerOffsetEnabled(); - int getGyroOffset(int axis); - int getAccelerometerOffset(int axis); + float getGyroOffset(int axis); + float getAccelerometerOffset(int axis); - void setGyroOffset(int axis, int offset); - void setAccelerometerOffset(int axis, int offset); + // supported values: -31.171 to 31.171 (degrees/second), in steps of 0.061 degrees/second + void setGyroOffset(int axis, float offset); + + // supported values: -495.3 (mg) to 495.3 (mg), in steps of 3.9 mg + void setAccelerometerOffset(int axis, float offset); // supported values: // CURIE_IMU_FREEFALL: 3.91 to 1995.46 (mg), in steps of 7.81 mg