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
| Parameter | Value |
|---|---|
| Supply Voltage | 2.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 Rate | 100 Hz |
| Interface | I2C (up to 400 kHz) / UART |
| On-Chip Processor | ARM Cortex-M0 (sensor fusion) |
| Current Draw | 12.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.
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.
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.