Bosch Sensortec Community

    Showing results for 
    Search instead for 
    Did you mean: 

    Is it Possible to Manually Recalibrate the BNO055?

    Is it Possible to Manually Recalibrate the BNO055?


    I am using the BNO055 in accelerometer only mode and have saved calibration offsets to EEPROM. The calibration offsets are successfully restored upon powering on the device.

    Would it be possible to add a button (in software or hardware) that can be used to recalibrate the BNO? So when you press the button, the BNO resets its calibration values to 0 for system, gryo, accel, and mag and goes through the entire calibration process again. I've tried adding a button that enters a fusion mode and sets the calibration values to 0, but it seems like that isn't enough to make the BNO look for new offsets.

    The ideal solution would not require me to power off the device or load a separate firmware in order to recalibrate.

    EDIT: I took another look at the BNO055 Data Sheet 1.4 and saw in section 3.11.4 it mentions "the internal calibration routine". I think this calibration routine is what I would like to manually invoke.


    Thank you

    5 REPLIES 5

    Ok I got to a solution:

    I had to partially give up one of my ideal conditions in not having to restart the device.

    I have a C++ application that can communicate to/from the BNO055 via an Arduino Micro. I added a button to this C++ application that sent a command over serial to my microcontroller setup. That command triggered the following logic in the Arduino code:

    resetIdentifier(); // Reset the stored BNO ID to 0.
    resetOffsets(); // Reset the stored BNO calibration offsets to 0s.
    wdt_enable(WDTO_15MS); // turn on the WatchDog and let it go.
    while(true) {} // Wait until the device restarts.

     So I reset all of the EEPROM data for the BNO and then used the watchdog to restart the device.

    On setup(), it checks the EEPROM to see if the BNO ID is listed in EEPROM and then grabs its calibration offsets. Since these were cleared, it goes through the calibration process again and stores the new offsets upon completion.

    This solution worked out great, except I also had to add a re-initialization for the serial connection in my C++ application before trying to send another command.


    Thank you very much for your help!