

The Adafruit BNO055 is a sophisticated Inertial Measurement Unit (IMU) that integrates accelerometers, gyroscopes, and a magnetometer into a single package. Unlike traditional IMUs, the BNO055 features an onboard microcontroller that performs sensor fusion, providing orientation data directly without requiring complex calculations on the host microcontroller. This makes it an excellent choice for applications requiring precise motion tracking and orientation sensing.








The following table outlines the key technical details of the Adafruit BNO055 IMU:
| Parameter | Value |
|---|---|
| Manufacturer | Adafruit |
| Part ID | BNO055 |
| Operating Voltage | 3.3V to 5V |
| Communication Interfaces | I²C, UART |
| Accelerometer Range | ±2g, ±4g, ±8g, ±16g |
| Gyroscope Range | ±125°/s, ±250°/s, ±500°/s, ±2000°/s |
| Magnetometer Range | ±1300 µT |
| Operating Temperature | -40°C to +85°C |
| Dimensions | 3.8mm x 5.2mm x 1.1mm |
The BNO055 module has the following pinout:
| Pin Name | Description |
|---|---|
| VIN | Power input (3.3V to 5V) |
| GND | Ground |
| SDA | I²C data line |
| SCL | I²C clock line |
| TX | UART transmit line |
| RX | UART receive line |
| PS0 | Protocol selection pin (I²C or UART) |
| PS1 | Protocol selection pin (I²C or UART) |
| RST | Reset pin (active low) |
| INT | Interrupt pin |
To use the BNO055 with an Arduino UNO, follow these steps:
Wiring:
VIN pin of the BNO055 to the 5V pin on the Arduino.GND pin of the BNO055 to the GND pin on the Arduino.SDA pin of the BNO055 to the A4 pin on the Arduino.SCL pin of the BNO055 to the A5 pin on the Arduino.PS0 and PS1 pins are configured for I²C mode (both pulled low).Install Required Libraries:
Sketch > Include Library > Manage Libraries.Example Code: Use the following example code to read orientation data from the BNO055:
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
// Create an instance of the BNO055 sensor
Adafruit_BNO055 bno = Adafruit_BNO055(55);
void setup() {
Serial.begin(9600);
// Initialize the BNO055 sensor
if (!bno.begin()) {
Serial.println("Error: BNO055 not detected. Check wiring or I2C address.");
while (1);
}
Serial.println("BNO055 initialized successfully!");
bno.setExtCrystalUse(true); // Use external crystal for better accuracy
}
void loop() {
// Get orientation data (Euler angles)
sensors_event_t event;
bno.getEvent(&event);
// Print orientation data to the Serial Monitor
Serial.print("Heading: ");
Serial.print(event.orientation.x);
Serial.print("°, Pitch: ");
Serial.print(event.orientation.y);
Serial.print("°, Roll: ");
Serial.print(event.orientation.z);
Serial.println("°");
delay(500); // Wait 500ms before the next reading
}
SDA and SCL lines.setExtCrystalUse(true) function.BNO055 Not Detected:
PS0 and PS1 pins are configured for I²C mode. Verify the I²C address (default is 0x28).Inaccurate Readings:
Sensor Freezes or Stops Responding:
Q: Can the BNO055 be used with a Raspberry Pi?
A: Yes, the BNO055 can be used with a Raspberry Pi via I²C or UART. Use the Adafruit CircuitPython library for easy integration.
Q: How do I calibrate the BNO055?
A: The Adafruit library provides functions to retrieve and save calibration data. Follow the library's examples to perform calibration.
Q: What is the maximum update rate of the BNO055?
A: The BNO055 can provide data at up to 100 Hz, depending on the operating mode and configuration.
Q: Can I disable specific sensors (e.g., magnetometer)?
A: Yes, the BNO055 allows you to configure its operating mode to use only the desired sensors (e.g., accelerometer + gyroscope).
By following this documentation, you can effectively integrate the Adafruit BNO055 IMU into your projects for accurate motion and orientation sensing.