SparkFun VR IMU Breakout - BNO086 (Qwiic)

Virtual reality is in, but you shouldn't have to drop hundreds of dollars to gain access to the technology behind it. Luckily, that's where the SparkFun VR IMU Breakout comes in. At its heart is CEVA’s BNO086, a combination triple-axis accelerometer/gyro/magnetometer System in Package (SiP) with a 32-bit ARM© Cortex™ M0+. The BNO086 Inertial Measurement Unit (IMU) produces accurate rotation vector headings, excellently suited for VR and other heading applications, with a two-degree or less static rotation error. The VR IMU is exactly what we’ve been waiting for; all the sensor data is combined and drift-corrected into meaningful, accurate IMU information. It’s perfect for any project that needs to sense orientation or motion.

This IMU breakout board has also been equipped with two I2C Qwiic connectors to make interfacing with the tiny QFN package a bit easier. It’s part of SparkFun’s Qwiic connect system, so you won’t have to do any soldering to figure out how things are oriented. However, we still have broken out 0.1"-spaced pins if you prefer to use a breadboard.

The BNO080 was designed to be implemented in Android-based cellular phones to handle all the computations necessary for virtual reality goggles using only your phone. With the BNO080 EOL, CEVA offers the drop-in replacement BNO086 with enhanced features (14-bit accelerometer fusion, reduced idle state power, and Interactive Calibration). The sensor is quite powerful, and with power comes a complex interface. Thanks to the solder jumpers on the board, you can select between two different I2C addresses. Still, if I2C is not your first communication choice, the sensor can communicate over SPI and UART! We’ve also written an I2C-based library that provides the rotation vector (the reading most folks want from an IMU), acceleration, gyro and magnetometer readings, step counting, and activity classifier (such as riding a bike).


The SparkFun Qwiic Connect System is an ecosystem of I2C sensors, actuators, shields and cables that make prototyping faster and less prone to error. All Qwiic-enabled boards use a common 1mm pitch, 4-pin JST connector. This reduces the amount of required PCB space, and polarized connections mean you can’t hook it up wrong.


  • Operating Voltage
    • 2.4V - 3.6V
    • Typically 3.3V via Qwiic cable
  • I2C (Default): Up to 400kHz
  • SPI: Up to 3MHz
  • UART: 3Mbps
  • Rotation Vector
    • Dynamic Error: 3.5°
    • Static Error: 2.0°
  • Gaming Rotation Vector
    • Dynamic Error: 2.5°
    • Static Error: 1.5°
    • Dynamic Heading Drift: 0.5° / min
  • Geomagnetic Rotation Vector
    • Dynamic Rotation Error: 4.5°
    • Static Rotation Error: 3.0°
  • Gravity Angle Error: 1.5°
  • Linear Acceleration Accuracy: 0.35m/s2
  • Accelerometer Accuracy: 0.3m/s2
  • Gyroscope Accuracy: 3.1° / sec
  • Magnetometer Accuracy: 1.4µT
  • 2x Qwiic Connection Ports
    • I2C Address: 0x4B (default), 0x4A
  • I2C Pull-Up Resistors (2.2kΩ)
  • Power LED
  • Jumpers
    • Power LED
    • I2C Pull-up Resistors
    • Address Select
    • Protocol Selection 0
    • Protocol Selection 1
  • Board Dimensions: 1.0in. x 1.2in. (25.4mm x 30.48mm)
  • Weight: 3g

SparkFun VR IMU Breakout - BNO086 (Qwiic) Product Help and Resources

Core Skill: Programming

If a board needs code or communicates somehow, you're going to need to know how to program or interface with it. The programming skill is all about communication and code.

3 Programming

Skill Level: Competent - The toolchain for programming is a bit more complex and will examples may not be explicitly provided for you. You will be required to have a fundamental knowledge of programming and be required to provide your own code. You may need to modify existing libraries or code to work with your specific hardware. Sensor and hardware interfaces will be SPI or I2C.
See all skill levels


Core Skill: Electrical Prototyping

If it requires power, you need to know how much, what all the pins do, and how to hook it up. You may need to reference datasheets, schematics, and know the ins and outs of electronics.

2 Electrical Prototyping

Skill Level: Rookie - You may be required to know a bit more about the component, such as orientation, or how to hook it up, in addition to power requirements. You will need to understand polarized components.
See all skill levels


Comments

Looking for answers to technical questions?

We welcome your comments and suggestions below. However, if you are looking for solutions to technical questions please see our Technical Assistance page.

  • Member #327230 / last month / 1

    Sparkfun: Do you have any plans to release a Python library for this, for use with a Raspberry Pi/Jetson Nano? P.S.: You have broken links for the Datasheet, Migration Guide, Tare Function Usage Guide, & Sensor Hub Transport Protocol.

    Long story short: I was going through my parts drawer & found a BNO080 and wondered "Why haven't I used this in my project?" It was because there's no out-of-the-box usability for my Jetson Nano project.

Customer Reviews

1.5 out of 5

Based on 2 ratings:

Currently viewing all customer reviews.

Board is good, sensor isn't.

Took BNO086 as a shift from BNO055. I needed quaternions this gives rotation vector, so basically it cannot determine weather rotation is 175 cc degrees or 185 acc, this creates lot of trouble. BNO086 IS BASICALLY DOWNGRADE FROM BNO055. Also rotation vector output is not smooth and gives all values as zero at regular intervals of few seconds which messes the calculations. If sparkfun can fix rotation vector and convert it to quaternions it will be useful.

Inconsistent Data

I am using the configuration in the guide. Using the example code I noticed that, while some of the reports work just fine e.g. EulerAngles, reading accelerometer, gyro and magnetometer data directly is very unstable and inconsistent. At sporadic intervals the measurements will report '0' in one or more of the axes across all 9-DoF messages - not always simultaneously.

On occasion, the serial output will be "BNO08x - Error decoding sensor event"; which appears to be exacerbated when the platform is moving. For this last one, my initial thought was a bad connection, but then again, this is not happening with the aforementioned example code while moving the platform.

For my application, I am looking to implement my own navigation equations and given the unreliable sensor data, this product is no good.