Preamble
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
Links
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:
- Adafruit BNO005
- Explore Labs BNO055 is a derivative, with the
ADR
pin on the opposite side
- Explore Labs BNO055 is a derivative, with the
- GY-BN0055 – Cheap Chinese clone
- CJMCU-055 – David Piling’s Chinese clone (for want of a better description)
- BNO-055 9-axis motion sensor with hardware fusion
- BME680 / BNO055 Breakout Board
- Bosch Sensortec BNO055-SHUTL
- 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.
Deductions
- 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 (or1
). - 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 isPS0
.
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:
BNO055
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; bno.getRevInfo(&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 // https://www.davidpilling.com/wiki/index.php/BNO055 /* Adafruit_BNO055::adafruit_bno055_rev_info_t data; bno.getRevInfo(&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() { Serial.begin(115200); bno.begin(); delay(1000); int8_t temp = bno.getTemp(); Serial.println("Temperature: "); Serial.println(temp); bno.setExtCrystalUse(true); } void loop() { Adafruit_BNO055::adafruit_bno055_rev_info_t data; bno.getRevInfo(&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.println("Revisions:"); Serial.print("acc "); Serial.println(data.accel_rev); Serial.print("mag "); Serial.println(data.mag_rev); Serial.print("sw "); Serial.println(data.sw_rev); Serial.print("bl "); Serial.println(data.bl_rev); }
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 https://gps-pie.com/pi_i2c_config.htm
LikeLike
What do you mean by cheap Chinese clone. Is the BN0055 a clone. If not then what is cheap. The pcb in all cases are probably made in China. The so called cheap Chinese clone looks like it does not have the ENIG plating. So I would suspect the plating thickness is greater than the other boards. Also a board this size and for the intended purpose (basically playing around), quality is not an issue. The adafruit cost is $34.95. On amazon not adafruit version $13.73. I think I will order one of these at $13.73 play around with it then throw it in a draw never to be seen again.
LikeLike