I have a project where I need to have several IMUs, the BNO055 shuttle board (I explained my project here), I manage to get the Euler angles from one BNO055 sensor, which have the address 0x29, because I linked the I2C_MODE_ADR_SEL to a HIGH level.

I would like to have another sensor with the address 0x28. As the datasheet says, I must link the I2C_MODE_ADR_SEL to a LOW level (to the GND) the i2c Scanner from the Arduino Playground does not recognize any i2c device.

I don't know how to change my sensor address, can anyone help me with this issue ?


I've built MotioSuit, a mocap suit based on the BNO055 which currently has 9 sensors but could go up to 18.


The sensor board and library are open-source and documented in the link, I hope it helps!

| improve this answer | |
  • You might mention that it uses multiplexing using the TI ti.com/product/PCA9548A chip and github.com/bqlabs/I2C-multiplexer code. – Dave X Feb 28 '16 at 18:54
  • 1
    Wow sorry, I've just seen it. Indeed, it is all explained in the text linked. Just to clarify, that is a fork from github.com/alvaroferran/I2C-multiplexer which I actually wrote for that very project :) – alvaroferran Aug 7 '17 at 9:26
  • Oops. I missed that you were the author of the interface code. I was looking for BN055 code got distracted by the hackaday project and skipped to google to find the BN055 code. Thanks for the links. – Dave X Aug 8 '17 at 15:11
  • No worries, glad it was useful :) – alvaroferran Aug 9 '17 at 7:50

According to Table 4-7 on page 90 of the BNO055 datasheet at adafruit.com, the BNO055 supports three I2C addresses: 0x28 or 0x29 in slave mode (selected by COM3 being low or high, respectively), or 0x40 in the HID-I2C configuration.

According to the diagram on page 2 in file BNO055_Shuttleboard_Flyer.pdf (Bosch's description of the BNO055 Shuttle Board), COM3 on pin 17 of the BNO055 (or, PSERCOM3) is wired via 0Ω jumper R106 to the middle pin of J102.

If you plan to get data from five different BNO055's, you may need to use a multiplexer (or several I/O's) to set COM3 on one BNO055 board to a different level than on the other four, to select one of the five boards for access. For example, you could use a 7438 (eg, an MM74HC138 or DM74LS138). When you set the 7438's address input to j, line Yⱼ (from among Y₀ to Y₇) will go low while the the other Yᵢ remain high. The BNO055 with COM3 attached to Yⱼ then would be the only BNO055 that would respond to I2C address 0x28.

For testing, you could set up several BNO055's and use several separate I/O lines to control several COM3 inputs. Using separate I/O lines takes five I/O lines for five COM3's, vs three I/O lines using a 7438 multiplexer; saving two lines might not be worth the extra effort of obtaining and using a multiplexer.

Another approach is to use two more Arduino (eg Pro Mini or Micro) units to support separate I2C busses for additional BNO055's. These auxiliary Arduinos could do some data reduction before sending data (via serial or I2C) to the principal Arduino.

Note, it is not clear to me that using more than one or two BNO055's makes sense. If the assemblage of BNO055's moves through space more or less as a unit, but with attitudes, roll rates, etc differing between BNO055's, then 3/4 or so of the data from different BNO055's will be the same. Possibly less-general sensors (eg, without magnetometer) with different I2C addresses could be used instead.

| improve this answer | |
  • The project aim to monitor the movements of the upper limb. For the moment I want to monitor only one arm I just need 3 sensors (One on the arm, one on the forearm and one on the chest), so I don't need a multiplexer. My problem is I can't get the sensor working when I put a low level on the pin that select address. I tried wiring it to the GND, or on a digital pin of the Arduino, that send a low level, and everytime the i2c scanner does not detect the sensor. – BunkSB Aug 6 '15 at 7:25
  • I would recheck (with a meter or scope) that pin 6 PS0 and pin 5 PS1 are low, and that pin 17 COM3 goes low or high as you connect or disconnect it from ground, and also would try reading at address 0x28 even if the I2C scanner doesn't see that address. Which I2C scanner program are you using? – James Waldby - jwpat7 Aug 6 '15 at 16:09
  • I use this one playground.arduino.cc/Main/I2cScanner – BunkSB Aug 7 '15 at 7:51
  • I checked with a scope, the PS0 and PS1 are low (0V each), and COM3 is at 3.3V when connected to the source and 0V when connected to the ground. I read that maybe I should use pull up resistors, would i be useful in my case ? – BunkSB Aug 7 '15 at 7:55
  • No pullups needed. See p. 89 of BST_BNO055_DS000_12.pdf, table 4.6 which says COM3 has an internal pullup, typ. 40K. Note, after table 4.4 it says “It is not allowed to keep the protocol select pins floating” ie the PS pins should be tied high or low. Have you tried using address 0x28 with only one BNO055 connected up? – James Waldby - jwpat7 Aug 7 '15 at 18:43

Although this is an older question, I believe there may be people still looking for a solution to this problem. Documentation for the BNO055 Shuttle board is pretty thin. I've added a bit of the schematic below.

BNO055 Com3 (pin 17) is presented on pin 22 of the shuttle board (12C_MODE_ADR_SEL). This pin must be connected through a resistor either to shuttleboard pin 4 (SD0, GND) or to shuttleboard pin 5 (SD1). The datasheet makes mention of 2-position jumper J102 which should accomplish this, but there are versions of the Shuttle board that do not include this jumper or any place to mount it. In the photo of the OP's setup (pasted at bottom in case his link goes away) the jumper header would be installed across the three holes adjacent to pin 3 (GND), and jumping the center pin to the left or right-side pin would set the address to 0x028 or 0x029.

If you don't have the jumper, just connect the pins directly: when I connect pin 17 to pin 4 through a 10K resistor, the Arduino "example" scanner does see it at I2C address 0x28.

Personally I like the Adafruit BNO055 board a lot better than the Shuttle -- it has a voltage regulator and a lot of other additions, and it uses 0x028 as its default I2C address.

For those working in the Arduino code environment and wishing to incorporate more than two BNO055 devices and who do not wish to use a multiplexer, I might suggest looking at the Teensy family of 32-bit ARM cortex CPU boards. These are completely code-compatible with Arduino, but offer more than one I2C bus. In fact the Teensy 3.6 (180 MHz!! with 1M Flash, 256K Ram, 4K eeprom, an FPU) offers four* separate I2C Wire interfaces on different ports, which would permit 8 of the BNO055 devices to be used.

I've personally been very happy with the performance and functionality of the Teensy boards when used with multiple BNO055 devices.

BNO055 Shuttle Board Pinout The OP's Shuttle Board

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.