BNO085 or BNO080 IMU

https://openimu.readthedocs.io/en/latest/apps/ins.html
Very interesting project. But costly and fusion lib are closed source.

@Math this is very interesting as I’m sure the only things that causes my AOG issues are heading and roll. As soon as I run on smooth level fields the thing is really stable. Which BNO085 board are you using? I will get one and see if I can get it working with my AOG.

1 Like

More one interesting project:

Also they tested MMC5983MA with even better accuracy:

I`m wondering a little bit about the chips you are trying out. Nobody mentioned the CMPS14 yet that also uses the bno080. Or have I missed that part? At the moment Aortner and Brian prefer this CMPS14 and there is a changed ino already for it. I installed this chip and made a little test. That looks quite proimising. Heading was very stable. Sadly I have no work on field, so I can not say much about it. Did anyone do tests on that CMPS14?

Yes I believe the CMPS14 is the essentially the same thing as the Adafruit BNO08x breakout board. I had forgotten about the CMPS14.

Hello,

As @torriem said, this device provide only raw data of gyro, mag and acc. So you have to fuse this data through a specific algorithm to have yaw, pitch and roll value in degree. You can find open-source fusion algorithm like Madgwick algorithm Open source IMU and AHRS algorithms – x-io Technologies.
I try to do this 6 months ago with an MPU9250 and an Arduino running this algorithm, but never add a good result.

I use the BNO085 from Adafruit, but don’t know why, it’s currently out of stock.

I did not know that they were working on it. There is no topic about this on the forum. I work on BNO085 because I was facing some unstability from MMA (see here : Perfect straight line without MMA, slight oscillation with MMA - #4 by Math). I discovered the potential of BNO085 throught this topics originaly created by @torriem (thank to him), so it’s why I started to try it to determine if it’s a better solution than MMA (by comparing them). And as the final goal to proposed them as an alternativ to include it in AOG project as a selectable device in AOG (and ino) in future versions (and not making a duplicate .ino specific to the BNO085). And I think it’s a better device than MMA.
Too bad, we have duplicated the work.

I take a look on this board: https://www.robot-electronics.co.uk/files/cmps14.pdf. Not a lot of informations, but it’s based on a BNO080. For me, BNO080 is a Bosh BNO055 hardware, but running a specific firmware from HillcrestLabs on his microcontroler (who provided this very stable and various datas). But you had to communicate with him with the specific HillcrestLabs SHTP protocole. Very different from a classic I2C protocol which we are used to deal with (like just reading datas on differents registers: SHTP protocol as an additionnal software layer).
Looking CMPS14, it’s work like a “classic” I2C interface: reading datas on registers defines in the datasheet… But when I look on the picture of the CMPS14, we can see an additionnal PIC16 F18325 Microcontroler on it. So I’m pretty sure that this PIC controler make the interface between BNO080 and the host, “transforming” the SHTP protocol on the BNO080 side into “classic I2C protocol” at the host side.
So read datas from BNO080 is easier with this board, as you don’t have to implement SHTP protocol.
But you also had less control on the configuration of the BNO080: you can only configure what the PIC allow you. By example: BNO080 had diffrent fonctionnal modes (Rotation Vector, game rotation vector): we had no information how the PIC configure it.

My opinion is that as we add success to deal with SHTP protocol (thank to Sparkfun library), we would be interested to interface directly our Arduino with BNO080 (Adafruit or other supplier board): we add a full control of BNO080, and we don’t interface to a microcontroler which we do not fully control what he does. But it’s only my opinion.

Math

Doesn’t the BNO080 have an I2C interface? My understanding is the only difference between the 80 and 85 is a bug fix to the SPI interface.

@torriem That was my understanding too.

The Cmps14 is connected via SDA/SCL like the ADS. So that is I2C at arduino or not? Well, could it be easier?

I’ve hopefully just bought one from EXP Tech in Germany.

https://www.exp-tech.de/en/sensors/imu/10071/adafruit-9-dof-orientation-imu-fusion-breakout-bno085-bno080-stemma-qt/qwiic

Be aware of this notice here: Arduino | Adafruit 9-DOF Orientation IMU Fusion Breakout - BNO085 | Adafruit Learning System

Using the BNO08x with Arduino is a simple matter of wiring up the sensor to your Arduino-compatible microcontroller, installing the Adafruit BNO08x library, and running the provided example code.

Because of the size and complexity of the BNO08x library, you will have to use an Arduino-compatible with a larger amount of memory such as the SAMD21, SAMD51, nRF52, ESP, Mega, etc. Arduino Uno or Leonardo will not work due to minimal RAM

I found that NANO has same memory as UNO, so I assume NANO is too small.

Could be a reason to use the UART-RVC mode, since it just blasts out data on serial. Don’t need much of a library to read that. Dunno.

The Sparkfun library is smaller and works just fine on the ATMega 328p (Uno/Nano boards).

2 Likes

Yes, the AOG arduino code compiles fine with the sparkfun library included

2 Likes

I might be missing something but, looking at the sparkfun library, it seems simple enough to add into the AOG arduino code.

Hello,

@torriem: sorry my explaination wasn’t clear. Yes BNO08x (x is 0 of 5, it’s the same) has an I2C bus (I communicate with him through I2C in my testing).
But what differs with BNO08x is the format of the datas that are exchanged through the I2C bus: the data are not in a “classic format” (like we know with ADS or MMA, or BNO055): they are under “SHTP protocol” format (Hillcrestlabs protocol).

I made this little document to explain the basic of SHTP protocol trought I2C and the differences with “classic data” on I2C. Hop it can help to understand: Microsoft OneDrive - Access files anywhere. Create docs with free Office Online..

So when we read the CMPS14 datasheet, we can see that:

  • It embedded a BNO080: so BNO communicate to I2C, but in “SHTP format”
  • He embedded a PIC16 F18325 microcontroler
  • For a master connected to CMPS14, you access to data or configuration of CMPS14 in a “classic I2C way”

So it’s why I’m pretty sure that the aim of the PIC16 F18325 on the board is to make the interface between I2C with SHTP datas and “classic I2C”. Like the following diagram:
image

Advantage: it’s easier for the master to access to the data, it’s like any other I2C chip. You don’t have to implement the complex SHTP protocol on your I2C bus. The aim of the PIC16 F18325 is to “mask” to the user the complex SHTP protocol.

Drawback: you don’t have the full control of the BNO08x like if we interface directly with BNO08x. You can configure only what PIC16 F18325 will allow you. And you don’t know exactly what the PIC16 F18325 firmware do on the data.

But as we has the Sparkfun library which implements the SHTP protocol for us to direct interface with BNO08x trhough I2C, my opinion is that it is better to interface our Arduino directly to BNO08x (with Adafruit or Sparkfun board). We will keep the full control of BNO08x. And the library is easy to edit if we want to add some function (I’ve already edit it to add the possibility to read some repports that the defaut library doesn’t include).

Other adavantages: CMPS14 seems to be build by only one manufacturer (robot-electronics). Sparkfun library work indifferently with Adafruit BNO085 board or Sparkfun BNO080 board. So if we used it directly, we have a dual source (in case if one is “out of stock”).
And Adafruit board is 10$ less expensive :grin:

I work on a modification of Autosteer_USB_4.3.10.ino to include the possibilty to choose BNO08x with configuration register at the begening of the .ino: any problem with space memory of Nano as @Alan.Webb and @CQuick said.

@Alan.Webb yes easy. You just have to precise the adresse if you use the Adafruit board: 0x4A (not the same defaut adresse than the Sparkfun board).

Math

2 Likes

Great ! That’s just what i need to test bno080 on my sprayer …

Andreas discovered the CMPS14 which is a custom programmed BNO080. IT uses a dead simple I2C read structure, no library, just sends out heading, roll, pitch in decimal degrees.

In doing some reading from them, the 085, 080, and even the 055 have the same hardware. What is different is the firmware. They custom calibrate the CMPS14 from the factory and allow both the 080 default and factory zero cal to be loaded. I’m getting mine Tuesday in the mail hopefully, and i am super duper pooper excited to try this thing out. A few have been set up in Europe and are working very well.

Hopefully this thing can replace the DOGS, MMA, and brick/055.

4 Likes

Hi

For the desktop tests I used a level shifter for 3v3 I2C to 5v sda / scl from nano. On the autosteer diagram, The mma should also be used in 3v3, but only 330ohm on the lines, Should I do the same for the BNO? or rather use the level shifter …? I plan to pull a wire from the autosteer card to the waterproof box on the roof of my sprayer about 2-3m wire. 5v or 3v3 in this wire? will this have any impact? can anyone answer these questions? or should i be surprised to see if it works or not?

I did a fair bit of work on how to have an I2C link over a few meters. The best and current way I found to do it reliably is with an I2C bus extender. The one I used is the P82B96. You need one on the AOG PCB in the cab and another one in the waterproof box on the roof. I posted a schematic and pictures of the setup a few days ago :
2020-11-21 Sensors_circuit
You can use 5V instead of 12V on the bus. The level shifting is also done by the driver, so you can have 5V on one side and 3.3V on the other. Also, I only had unshielded cable at my disposal, but if you can, use a shielded cable grounded at one end to get a better immunity against noise.
With that, you can run I2C anywhere you want on the tractor !

3 Likes