Contact Sales & After-Sales Service

Contact & Quotation

  • Inquire: Call 0086-755-23203480, or reach out via the form below/your sales contact to discuss our design, manufacturing, and assembly capabilities.
  • Quote: Email your PCB files to Sales@pcbsync.com (Preferred for large files) or submit online. We will contact you promptly. Please ensure your email is correct.
Drag & Drop Files, Choose Files to Upload You can upload up to 3 files.

Notes:
For PCB fabrication, we require PCB design file in Gerber RS-274X format (most preferred), *.PCB/DDB (Protel, inform your program version) format or *.BRD (Eagle) format. For PCB assembly, we require PCB design file in above mentioned format, drilling file and BOM. Click to download BOM template To avoid file missing, please include all files into one folder and compress it into .zip or .rar format.

Adafruit BNO055 & BNO085 IMU Sensor Guide: Setup, Calibration & Applications

Working with orientation sensors used to mean wrestling with complex sensor fusion algorithms, endless calibration routines, and hours of debugging. That changed when Bosch released the BNO055, and improved further with the BNO085. After integrating these sensors into dozens of projects—from drone stabilization systems to VR motion controllers—I can say they’ve fundamentally simplified how we approach IMU-based design. This guide covers everything you need to get these Adafruit IMU breakouts working in your projects.

Understanding IMU Technology and Sensor Fusion

Before diving into the specific sensors, it helps to understand what makes these devices special. An Inertial Measurement Unit combines multiple sensors to track motion and orientation in three-dimensional space.

A traditional 9-DOF (nine degrees of freedom) IMU includes three types of sensors: a 3-axis accelerometer measuring linear acceleration and gravity, a 3-axis gyroscope measuring rotational velocity, and a 3-axis magnetometer measuring magnetic field strength for compass heading. Each sensor has strengths and weaknesses—gyroscopes drift over time, accelerometers are noisy during motion, and magnetometers are susceptible to local magnetic interference.

The magic happens in sensor fusion algorithms that combine data from all three sensors to produce accurate orientation data. Traditionally, you’d implement something like a Kalman filter or Madgwick algorithm yourself. The Bosch BNO055 and the CEVA Hillcrest BNO085 handle this onboard, delivering ready-to-use orientation data directly.

Adafruit BNO055: The Smart 9-DOF Sensor That Started It All

The Adafruit BNO055 breakout board packages Bosch’s revolutionary sensor into a maker-friendly format. Bosch was the first company to successfully integrate MEMS accelerometer, gyroscope, and magnetometer sensors with an ARM Cortex-M0 processor running sensor fusion algorithms—all on a single die.

BNO055 Technical Specifications

ParameterSpecification
Accelerometer Range±2g, ±4g, ±8g, ±16g (configurable)
Gyroscope Range±125°/s to ±2000°/s
Magnetometer Range±1300µT (x,y), ±2500µT (z)
Fusion Data RateUp to 100Hz
Operating Voltage3.3V (2.4V to 3.6V)
Supply Current12.3mA typical
I2C Address0x28 (default) or 0x29
Package Size5.2mm × 3.8mm × 1.1mm

What the BNO055 Outputs

The sensor fusion running on the Bosch BNO055 produces several useful data types:

Absolute Orientation (Quaternion) — Four-point quaternion output at 100Hz for gimbal-lock-free rotation representation. This is the most mathematically robust way to handle 3D orientation.

Euler Angles — Heading, roll, and pitch in degrees. More intuitive for many applications but suffers from gimbal lock at certain orientations. The Euler output on the BNO055 has known limitations above 45° tilt angles.

Linear Acceleration — Acceleration with gravity removed, useful for detecting actual movement.

Gravity Vector — Isolated gravitational acceleration, helpful for determining “which way is down.”

Angular Velocity — Rotation rates in radians per second from the gyroscope.

Magnetic Field Strength — Magnetometer readings in microteslas.

BNO085: The Next Generation IMU from CEVA Hillcrest

Here’s where things get interesting. The BNO085 uses the exact same hardware as the BNO055, but runs completely different firmware developed by CEVA Hillcrest Labs. This partnership between Bosch and CEVA created a sensor that looks identical physically but behaves quite differently in practice.

BNO085 Technical Specifications

ParameterSpecification
Accelerometer Range±2g to ±16g
Gyroscope Range±125°/s to ±2000°/s
Magnetometer RangeSame as BNO055
Fusion Data RateUp to 400Hz
CommunicationI2C, SPI, UART, UART-RVC
Operating Voltage2.4V to 3.6V
I2C Address0x4A (default) or 0x4B
Package Size5.2mm × 3.8mm × 1.1mm

Key Differences: BNO055 vs BNO085

FeatureBNO055BNO085
Fusion Rate100Hz max400Hz max
Euler Angle OutputYes (limited accuracy)No (calculate from quaternions)
Dynamic Calibration ControlLimitedFull independent control per sensor
Application-Specific ModesNoYes (AR/VR, gaming modes)
TARE FunctionNoYes (reset reference orientation)
Activity DetectionNoStep counter, tap detection, stability
Calibration StorageManual EEPROMAutomatic
Communication InterfacesI2C, UARTI2C, SPI, UART, UART-RVC
Firmware OriginBoschCEVA Hillcrest SH-2

The BNO085 doesn’t output Euler angles directly—you calculate them from quaternions yourself. This is actually better because the BNO055’s Euler output had quirks at certain orientations. The BNO085’s TARE function is particularly useful for VR applications where you need to reset the “forward” direction.

Setting Up the Adafruit BNO055 with Arduino

Getting the Adafruit BNO055 running with Arduino is straightforward once you understand the wiring and library setup.

Wiring the BNO055 Arduino Connection

BNO055 PinArduino UNOArduino MegaNotes
VIN5V5VOnboard regulator accepts 3-5V
GNDGNDGNDCommon ground required
SDAA420I2C data
SCLA521I2C clock

The Adafruit breakout includes voltage regulation and level shifting, so you can safely connect to 5V Arduino boards. The STEMMA QT connectors on newer boards allow solderless connections.

Installing the Adafruit BNO055 Library

In the Arduino IDE, navigate to Sketch → Include Library → Manage Libraries. Search for “Adafruit BNO055” and install it along with the required dependencies (Adafruit Unified Sensor library).

Basic BNO055 Arduino Code Example

cpp

#include <Wire.h>#include <Adafruit_Sensor.h>#include <Adafruit_BNO055.h>#include <utility/imumaths.h>Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28);void setup() {  Serial.begin(115200);    if (!bno.begin()) {    Serial.println(“No BNO055 detected – check wiring!”);    while (1);  }    bno.setExtCrystalUse(true);}void loop() {  sensors_event_t event;  bno.getEvent(&event);    Serial.print(“Heading: “);  Serial.print(event.orientation.x);  Serial.print(” Roll: “);  Serial.print(event.orientation.y);  Serial.print(” Pitch: “);  Serial.println(event.orientation.z);    delay(100);}

Setting Up the BNO085 with Arduino

The BNO085 setup is slightly more involved due to the sensor’s additional capabilities and different communication protocol.

Important BNO085 Compatibility Notes

The BNO085 (and BNO080) I2C implementation has known protocol violations that cause issues with certain microcontrollers. Based on my testing and community feedback:

MicrocontrollerI2C ReliabilityRecommended Interface
SAMD51 (M4)GoodI2C or SPI
RP2040GoodI2C or SPI
nRF52840GoodI2C
STM32F4GoodI2C or SPI
ESP32/ESP32-S3PoorUART or SPI preferred
Arduino Uno/LeonardoRAM insufficientNot recommended

The BNO085 library requires significant RAM—Arduino Uno and Leonardo simply don’t have enough memory. Use boards with at least 32KB RAM.

BNO085 I2C Wiring

BNO085 PinSAMD51 BoardNotes
VIN3.3VMatch your board’s logic level
GNDGNDCommon ground
SDASDAI2C data
SCLSCLI2C clock
INTAny GPIOInterrupt for data ready
RSTAny GPIOReset control

Basic BNO085 Arduino Code

cpp

#include <Adafruit_BNO08x.h>#define BNO08X_RESET -1Adafruit_BNO08x bno08x(BNO08X_RESET);sh2_SensorValue_t sensorValue;void setup() {  Serial.begin(115200);    if (!bno08x.begin_I2C()) {    Serial.println(“Failed to find BNO08x chip”);    while (1) delay(10);  }    setReports();}void setReports() {  if (!bno08x.enableReport(SH2_ROTATION_VECTOR)) {    Serial.println(“Could not enable rotation vector”);  }}void loop() {  if (bno08x.wasReset()) {    setReports();  }    if (bno08x.getSensorEvent(&sensorValue)) {    switch (sensorValue.sensorId) {      case SH2_ROTATION_VECTOR:        Serial.print(“Quaternion – r: “);        Serial.print(sensorValue.un.rotationVector.real);        Serial.print(” i: “);        Serial.print(sensorValue.un.rotationVector.i);        Serial.print(” j: “);        Serial.print(sensorValue.un.rotationVector.j);        Serial.print(” k: “);        Serial.println(sensorValue.un.rotationVector.k);        break;    }  }}

IMU Calibration: Getting Accurate Data

Calibration is where many projects fail. Both sensors require calibration for accurate orientation data, but they handle it differently.

BNO055 Calibration Procedure

The BNO055 runs continuous background calibration. Each sensor (accelerometer, gyroscope, magnetometer) has a calibration status from 0 (uncalibrated) to 3 (fully calibrated). You can read this status to verify calibration quality.

Gyroscope Calibration: Simply leave the sensor stationary for a few seconds. The gyroscope calibrates itself to remove zero-rate offset.

Magnetometer Calibration: Move the sensor in figure-8 patterns through 3D space. Newer firmware versions handle this faster with normal movement. Keep the sensor away from magnetic interference during this process.

Accelerometer Calibration: This is the most demanding. Place the sensor in six stable positions corresponding to the +X, -X, +Y, -Y, +Z, and -Z orientations. A wooden block makes an excellent calibration jig—place the sensor on each face of the block for a few seconds.

Saving Calibration Data: The BNO055 loses calibration on power-off. For production applications, read the calibration offsets after calibration and store them in EEPROM, then restore them on startup:

cpp

// Read calibration offsetsadafruit_bno055_offsets_t calibrationData;bno.getSensorOffsets(calibrationData);// Store to EEPROM, then later restore with:bno.setSensorOffsets(calibrationData);

BNO085 Calibration Advantages

The BNO085 handles calibration more elegantly. It stores calibration data automatically and allows independent control over dynamic calibration for each sensor. You can enable or disable calibration updates per-sensor, which is crucial for applications where environmental conditions change.

The TARE function lets you reset the current orientation as the reference point—essential for VR headsets where “forward” needs to be whatever direction the user is facing at startup.

Practical IMU Applications and Project Ideas

These sensors open up possibilities across numerous application domains.

Robotics and Drone Stabilization

The Adafruit IMU products excel in stabilization applications. Quadcopters use IMU data to maintain level flight and execute maneuvers. The 100-400Hz fusion rates provide the responsiveness needed for flight controllers. For ground robots, IMU data helps with dead reckoning navigation when GPS is unavailable.

Virtual Reality and Motion Tracking

VR headset tracking relies heavily on IMU data for rotational tracking. The BNO085’s AR/VR optimized rotation vectors minimize latency and provide smooth, responsive head tracking. The low power modes extend battery life in wireless headsets.

Wearable Electronics and Gesture Recognition

Activity trackers, smart watches, and gesture-controlled devices use IMU data for step counting, fall detection, and gesture recognition. The BNO085’s built-in step counter and activity classification simplify wearable development.

Camera and Gimbal Stabilization

Handheld camera stabilizers use IMU feedback to counteract operator movement. The quaternion output provides smooth, gimbal-lock-free rotation data essential for professional-quality stabilization.

Navigation and Orientation Systems

Compasses, AHRS (Attitude and Heading Reference Systems), and waypoint navigation all benefit from absolute orientation data. The magnetometer provides heading relative to magnetic north when properly calibrated.

Troubleshooting Common IMU Problems

Years of working with these sensors have taught me the common failure modes and their solutions.

Sensor Not Detected on I2C Bus

First, verify your wiring—I2C requires both SDA and SCL connections plus common ground. Check the I2C address; the BNO055 defaults to 0x28 (or 0x29 if ADR pin is high), while BNO085 defaults to 0x4A.

Run an I2C scanner sketch to see what addresses respond. If nothing appears, you may have a wiring issue or the sensor may need more startup time—add a 1-second delay after power-on before attempting communication.

Erratic or Drifting Orientation Data

Poor calibration is usually the culprit. Check the calibration status registers and perform the full calibration dance. Magnetic interference from nearby motors, speakers, or metal objects can corrupt magnetometer readings. Move the sensor away from interference sources or use the IMU-only mode that excludes magnetometer data.

I2C Communication Errors with BNO085

The BNO085’s I2C implementation violates protocol specifications, causing problems with certain microcontrollers. On ESP32, try using UART or SPI instead. For Raspberry Pi, slow down the I2C clock to 400kHz by adding dtparam=i2c_arm_baudrate=400000 to /boot/config.txt.

Euler Angles Behaving Strangely

The BNO055’s Euler output has known limitations—it works poorly above approximately 45° tilt. Switch to quaternion output and calculate Euler angles yourself, or use the BNO085 which forces this approach anyway.

Resources and Downloads for Adafruit IMU Development

Official Documentation

Software Libraries

Community Resources

  • Adafruit Forums: https://forums.adafruit.com
  • Adafruit Discord: Active community for real-time help
  • Bosch Application Notes: Technical implementation guidance

Frequently Asked Questions

Which should I choose: BNO055 or BNO085?

The BNO085 is the better choice for new designs. It offers higher fusion rates (400Hz vs 100Hz), automatic calibration storage, more communication options, and additional features like step counting and activity detection. The only reasons to choose BNO055 are lower cost or if you specifically need direct Euler angle output without post-processing.

Can I use these sensors with Raspberry Pi?

Yes, but with caveats. Both sensors work with Raspberry Pi using CircuitPython libraries. The BNO055 requires I2C clock stretching support—update your Pi firmware and slow down the I2C clock if you encounter communication issues. The BNO085 works more reliably with the I2C clock set to 400kHz.

How accurate are these IMU sensors?

In controlled conditions with proper calibration, both sensors achieve heading accuracy of approximately ±3° and tilt accuracy of ±1°. Real-world accuracy depends heavily on calibration quality and magnetic interference. For high-precision applications, consider professional-grade IMUs or implement additional sensor fusion with external references.

Do I need to calibrate the sensor every time it powers on?

The BNO055 loses calibration data on power-off, so you either need to re-calibrate each startup or save/restore calibration offsets from non-volatile memory. The BNO085 stores calibration automatically, though a quick stationary period after power-on helps the gyroscope stabilize.

Can these sensors work without a magnetometer (compass)?

Yes, both sensors offer fusion modes that exclude magnetometer data. The BNO055’s IMU mode uses only accelerometer and gyroscope, providing relative orientation without absolute heading. This is useful in environments with magnetic interference. However, without the magnetometer, heading will drift over time.

Leave a Reply

Your email address will not be published. Required fields are marked *

Contact Sales & After-Sales Service

Contact & Quotation

  • Inquire: Call 0086-755-23203480, or reach out via the form below/your sales contact to discuss our design, manufacturing, and assembly capabilities.

  • Quote: Email your PCB files to Sales@pcbsync.com (Preferred for large files) or submit online. We will contact you promptly. Please ensure your email is correct.

Drag & Drop Files, Choose Files to Upload You can upload up to 3 files.

Notes:
For PCB fabrication, we require PCB design file in Gerber RS-274X format (most preferred), *.PCB/DDB (Protel, inform your program version) format or *.BRD (Eagle) format. For PCB assembly, we require PCB design file in above mentioned format, drilling file and BOM. Click to download BOM template To avoid file missing, please include all files into one folder and compress it into .zip or .rar format.