Back to Sensors & Actuators Series

9-DoF Sensor Fusion IMU: BNO055

April 10, 2026 Wasil Zafar 9 min read

BNO055 deep dive — on-chip sensor fusion, quaternion output, auto-calibration, Arduino code, and robotics/drone applications.

Contents

  1. Working Principle
  2. Electrical Characteristics
  3. Interfacing with MCU
  4. Calibration
  5. Code Example
  6. Real-World Applications
  7. Limitations

Working Principle

The BNO055 from Bosch Sensortec is a 9-axis absolute orientation sensor that combines a 3-axis accelerometer, 3-axis gyroscope, and 3-axis magnetometer with an on-chip ARM Cortex-M0 running proprietary sensor fusion algorithms. Unlike raw IMUs (MPU6050), the BNO055 outputs ready-to-use Euler angles, quaternions, linear acceleration, and gravity vectors without any host-side math.

Analogy: Where the MPU6050 gives you a pile of raw ingredients, the BNO055 delivers a cooked meal — it fuses noisy accelerometer, gyroscope, and magnetometer data internally and outputs stable orientation that "just works."

Electrical Characteristics

ParameterValue
Supply Voltage2.4–3.6 V
Accelerometer Range±2/4/8/16 g
Gyroscope Range±125/250/500/1000/2000 °/s
Magnetometer Range±1300 µT (x,y), ±2500 µT (z)
Heading Accuracy±2–3° (after calibration)
Fusion Output Rate100 Hz
InterfaceI2C (up to 400 kHz) / UART
On-Chip ProcessorARM Cortex-M0 (sensor fusion)
Current Draw12.3 mA (fusion mode)

Interfacing with an MCU

Connect via I2C (SDA, SCL) with 4.7 kΩ pull-ups. Default address is 0x28 (ADR pin low) or 0x29 (ADR pin high). The BNO055 operates at 3.3 V — use level shifters with 5 V Arduinos or a 3.3 V board.

Wiring (Adafruit BNO055 breakout): Vin → 5 V (on-board regulator), GND → GND, SDA → A4, SCL → A5. Breakout includes level shifters and pull-ups.
Fusion modes: NDOF (9-axis, absolute heading), IMU (6-axis, no magnetometer — no magnetic interference), COMPASS (heading only). Choose based on your application.

Calibration

The BNO055 auto-calibrates but requires specific motions to reach full calibration:

  • Gyroscope: Hold still for a few seconds — calibrates automatically
  • Accelerometer: Rotate to 6 different orientations (each axis pointing up/down)
  • Magnetometer: Move in a figure-8 pattern to sample all orientations
  • Save/restore: Read calibration offsets via I2C and store to EEPROM to avoid recalibrating on every boot

Code Example

/*
 * BNO055 9-DoF Sensor Fusion — Arduino
 * Library: Adafruit BNO055 (install via Library Manager)
 * Wiring: SDA → A4, SCL → A5, VIN → 5V
 */
#include <Wire.h>
#include <Adafruit_BNO055.h>
#include <Adafruit_Sensor.h>

Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28);

void setup() {
    Serial.begin(115200);
    if (!bno.begin()) {
        Serial.println("BNO055 not detected!");
        while (1);
    }
    bno.setExtCrystalUse(true);
    Serial.println("BNO055 Ready — move in figure-8 to calibrate mag");
}

void loop() {
    /* Read Euler angles (heading, roll, pitch) */
    sensors_event_t event;
    bno.getEvent(&event);

    Serial.print("Heading: ");
    Serial.print(event.orientation.x, 1);
    Serial.print("  Roll: ");
    Serial.print(event.orientation.y, 1);
    Serial.print("  Pitch: ");
    Serial.print(event.orientation.z, 1);

    /* Check calibration status */
    uint8_t sys, gyro, accel, mag;
    bno.getCalibration(&sys, &gyro, &accel, &mag);
    Serial.print("  Cal: Sys=");
    Serial.print(sys);
    Serial.print(" G=");
    Serial.print(gyro);
    Serial.print(" A=");
    Serial.print(accel);
    Serial.print(" M=");
    Serial.println(mag);

    delay(100);
}

Real-World Applications

Robotics, Drones & VR Motion Tracking

The BNO055 is the go-to sensor for projects needing absolute orientation without host-side fusion code. VR headset prototypes, drone attitude controllers, robotic arm joint tracking, and autonomous vehicle heading all benefit from its calibrated quaternion output at 100 Hz with minimal drift.

RoboticsDronesVR/ARNavigation

Limitations

  • Magnetic interference: Nearby motors, magnets, or metal distort heading in NDOF mode. Use IMU mode in magnetically noisy environments.
  • Closed-source fusion: The Bosch fusion algorithm is proprietary — no tuning parameters available.
  • 3.3 V only: Requires level shifting for 5 V systems (breakout boards include this).
  • I2C clock stretching: The BNO055 uses I2C clock stretching which some MCUs (e.g., Raspberry Pi) handle poorly.
  • Discontinued: The BNO055 is being replaced by the BNO085/BNO08x series with improved fusion. Consider the newer parts for new designs.