Don’t get the wrong BNO055!


The Bosch BNO 055 IMU – a combined accelerometer, magnetometer and gyroscope with a built in ARM processor – can support both IIC communication and Serial communication, via the IIC or UART modes. However, this question on SE.Robotics, Aliexpress bought BNO055 UART connection, brought to my attention that certain breakout boards for the BNO005 can not be used in UART mode (at least not without some rework of the board) and therefore are only compatible with Arduino but not the Raspberry Pi.

See also

  • IMU BNO055 – Course notes on using the IMU with an Arduino and Python

SerialPlot related blogs


Communication Modes

PS1 PS0 Functionality
0 0 Standard/Fast I2C Interface
0 1 HID over I2C
1 0 UART Interface
1 1 Reserved

Types of breakout board

There seem to be at least three commonly available versions of the BNO005 breakout board, along with some other variations:

  1. Adafruit BNO005
    • Explore Labs BNO055 is a derivative, with the ADR pin on the opposite side
  2. GY-BN0055 – Cheap Chinese clone
  3. CJMCU-055 – David Piling’s  Chinese clone (for want of a better description)
  4. BNO-055 9-axis motion sensor with hardware fusion
  5. BME680 / BNO055 Breakout Board
  6. Bosch Sensortec BNO055-SHUTL
  7. Expansion Kit, Xplained Pro, Bosch BNO055 Intelligent 9-Axis Absolute Orientation Sensor:
    • Compatible with the Xplained Pro extension headers
    • Auto-ID for board identification in Atmel Studio
    • I2C interface to BNO055
    • One RGB LED
    • Supported with application examples inВ Atmel Gallery

Adafruit BNO055

This ubiquitous breakout board can be used in IIC mode for communication with the Arduino, as well as the RPi, in UART mode (by connecting PS1 to Vin (3V3)).


Explore Labs BNO055

This is the same as the Adafruit, but with the ADR pin moved to the other side of the board.

GY-BN0055 – The Chinese Clone

This is missing the PS1 pin which needs to be held HIGH to put the BNO055 in UART mode. There are two solder pads though

This thread, GY-BNO055 Issues, and in particular, this post shows how to set to UART mode:

On the breakout there are two unmarked jumper pads


Some manufactures are shipping these modules with the jumpers open, Others ship with the jumpers closed. To configure the module for i2c communication both jumpers should be closed.


  1. It would appear that when both solder pads (next to the XYZ axis logo) are closed then IIC communication mode is enabled. Therefore, by deduction, closing  the pads means that they are grounded (or 0), opening means they are floating (or 1).
  2. By opening the pad nearest the IC then UART mode is enabled. Therefore, by deduction, the pad closest to the IC is PS1 and the pad closest to the edge of the board is PS0.

BNO055 top PS0:1.jpg

CJMCU-055 – David’s Clone

This again is missing the PS1 and PS0 pins. However, the mode can be set via the S0 and S1 pads, by connecting to the + and/or - pads.

There are two solder pads for PS0 and PS1 which have to be bridged to either + or – pads to set the operating mode – I2C, UART serial etc. For I2C both are bridged to -.



Documentation in Chinese:



BNO-055 9-axis motion sensor with hardware fusion


BME680 / BNO055 Breakout Board

BME680 / BNO055 Breakout Board


Bosch Sensortec BNO055-SHUTL

Shuttle dev board, Bosch Sensortec BNO055-SHUTL


Moral of the story

If you require a device that you can use and easily switch between Arduino and RPi, then get the Adafruit  version. Otherwise, if you are happy with the breakout board being fixed in IIC mode, and only intend to use with Arduino (or UART mode – depending on how the pads are pre-soldered), or if you don’t mind getting handy with a soldering iron and solder sucker, then purchase a cheap Chinese clone.


Getting the version info from IMU

Note: From David Pilling – BNO 055:

Adafruit_BNO055::adafruit_bno055_rev_info_t data;
  pr("revisions acc %d madg %d gyro %d sw %d bl %d",data.accel_rev,data.mag_rev,data.gyro_rev,data.sw_rev,data.bl_rev);

In Arduino

// IMU_BNO055_DavidPilling.ino
// From David Pilling


  Adafruit_BNO055::adafruit_bno055_rev_info_t data;
  pr("revisions acc %d madg %d gyro %d sw %d bl %d",data.accel_rev,data.mag_rev,data.gyro_rev,data.sw_rev,data.bl_rev);


#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>

#define BNO055_SAMPLERATE_MS 100
Adafruit_BNO055 bno = Adafruit_BNO055();

void setup() {

  int8_t temp = bno.getTemp();
  Serial.println("Temperature: ");

void loop() {
  Adafruit_BNO055::adafruit_bno055_rev_info_t data;
  // Serial.print("revisions acc %d madg %d gyro %d sw %d bl %d",data.accel_rev,data.mag_rev,data.gyro_rev,data.sw_rev,data.bl_rev);

  Serial.print("acc ");

  Serial.print("mag ");

  Serial.print("sw ");

  Serial.print("bl ");


One thought on “Don’t get the wrong BNO055!”

  1. In your article you correctly point out that the Raspberry Pi i2c hardware has a bug which prevents the BNO055 IMU operating correctly. However this can easily be overcome by disabling the standard i2c hardware and replacing it with a device tree overlay. This will allow the BNO055 to be used with the Raspberry Pi. For full details of the procedure please see


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s