# DFRobot_BNO055
**Repository Path**: dfrobot/DFRobot_BNO055
## Basic Information
- **Project Name**: DFRobot_BNO055
- **Description**: No description available
- **Primary Language**: C++
- **License**: LGPL-2.1
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-06-02
- **Last Updated**: 2022-05-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# DFRobot_BNO055 Intelligent 10DOF AHRS
The BNO055 is a System in Package (SiP), integrating a triaxial 14-bit accelerometer,
a triaxial 16-bit gyroscope with a range of ±2000 degrees per second, a triaxial geomagnetic sensor
and a 32-bit cortex M0+ microcontroller running Bosch Sensortec sensor fusion software, in a single package.
## DFRobot_BNO055 Library for Arduino
---------------------------------------------------------
Provides an Arduino library for reading and interpreting Bosch BNO055 data over I2C.Used to read the current pose and calculate the Euler angles.
## Table of Contents
* [Installation](#installation)
* [Methods](#methods)
* [Compatibility](#compatibility)
* [History](#history)
* [Credits](#credits)
## Installation
To use this library download the zip file, uncompress it to a folder named DFRobot_BNO055.
Download the zip file first to use this library and uncompress it to a folder named DFRobot_BNO055.
If you want to see the graphical interface using imu_show.ino,
you can download IMU_show.exe at https://github.com/DFRobot/DFRobot_IMU_Show/releases.
## Methods
```C++
class DFRobot_BNO055 {
public:
/**
* @brief global axis declare (excepet eular and quaternion)
*/
typedef enum {
eAxisAcc,
eAxisMag,
eAxisGyr,
eAxisLia,
eAxisGrv
} eAxis_t;
/**
* @brief global single axis declare
*/
typedef enum {
eSingleAxisX,
eSingleAxisY,
eSingleAxisZ
} eSingleAxis_t;
/**
* @brief enum interrupt
*/
typedef enum {
eIntGyrAm = 0x04,
eIntGyrHighRate = 0x08,
eIntAccHighG = 0x20,
eIntAccAm = 0x40,
eIntAccNm = 0x80,
eIntAll = 0xec
} eInt_t;
/**
* @brief Operation mode enum
*/
typedef enum {
eOprModeConfig,
eOprModeAccOnly,
eOprModeMagOnly,
eOprModeGyroOnly,
eOprModeAccMag,
eOprModeAccGyro,
eOprModeMagGyro,
eOprModeAMG,
eOprModeImu,
eOprModeCompass,
eOprModeM4G,
eOprModeNdofFmcOff,
eOprModeNdof
} eOprMode_t;
/**
* @brief Poewr mode enum
*/
typedef enum {
ePowerModeNormal,
ePowerModeLowPower,
ePowerModeSuspend
} ePowerMode_t;
/**
* @brief axis analog data struct
*/
typedef struct {
float x, y, z;
} sAxisAnalog_t;
/**
* @brief eular analog data struct
*/
typedef struct {
float head, roll, pitch;
} sEulAnalog_t;
/**
* @brief qua analog data struct
*/
typedef struct {
float w, x, y, z;
} sQuaAnalog_t;
/**
* @brief enum accelerometer range, unit G
*/
typedef enum {
eAccRange_2G,
eAccRange_4G,
eAccRange_8G,
eAccRange_16G
} eAccRange_t;
/**
* @brief enum accelerometer band width, unit HZ
*/
typedef enum {
eAccBandWidth_7_81, // 7.81HZ
eAccBandWidth_15_63, // 16.63HZ
eAccBandWidth_31_25,
eAccBandWidth_62_5,
eAccBandWidth_125,
eAccBandWidth_250,
eAccBandWidth_500,
eAccBandWidth_1000
} eAccBandWidth_t;
/**
* @brief enum accelerometer power mode
*/
typedef enum {
eAccPowerModeNormal,
eAccPowerModeSuspend,
eAccPowerModeLowPower1,
eAccPowerModeStandby,
eAccPowerModeLowPower2,
eAccPowerModeDeepSuspend
} eAccPowerMode_t;
/**
* @brief enum magnetometer data output rate, unit HZ
*/
typedef enum {
eMagDataRate_2,
eMagDataRate_6,
eMagDataRate_8,
eMagDataRate_10,
eMagDataRate_15,
eMagDataRate_20,
eMagDataRate_25,
eMagDataRate_30
} eMagDataRate_t;
/**
* @brief enum magnetometer operation mode
*/
typedef enum {
eMagOprModeLowPower,
eMagOprModeRegular,
eMagOprModeEnhancedRegular,
eMagOprModeHighAccuracy
} eMagOprMode_t;
/**
* @brief enum magnetometer power mode
*/
typedef enum {
eMagPowerModeNormal,
eMagPowerModeSleep,
eMagPowerModeSuspend,
eMagPowerModeForce
} eMagPowerMode_t;
/**
* @brief enum gyroscope range, unit dps
*/
typedef enum {
eGyrRange_2000,
eGyrRange_1000,
eGyrRange_500,
eGyrRange_250,
eGyrRange_125
} eGyrRange_t;
/**
* @brief enum gyroscope band width, unit HZ
*/
typedef enum {
eGyrBandWidth_523,
eGyrBandWidth_230,
eGyrBandWidth_116,
eGyrBandWidth_47,
eGyrBandWidth_23,
eGyrBandWidth_12,
eGyrBandWidth_64,
eGyrBandWidth_32
} eGyrBandWidth_t;
/**
* @brief enum gyroscope power mode
*/
typedef enum {
eGyrPowerModeNormal,
eGyrPowerModeFastPowerUp,
eGyrPowerModeDeepSuspend,
eGyrPowerModeSuspend,
eGyrPowerModeAdvancedPowersave
} eGyrPowerMode_t;
/**
* @brief Enum accelerometer interrupt settings
*/
typedef enum {
eAccIntSetAmnmXAxis = (0x01 << 2),
eAccIntSetAmnmYAxis = (0x01 << 3),
eAccIntSetAmnmZAxis = (0x01 << 4),
eAccIntSetHgXAxis = (0x01 << 5),
eAccIntSetHgYAxis = (0x01 << 6),
eAccIntSetHgZAxis = (0x01 << 7),
eAccIntSetAll = 0xfc
} eAccIntSet_t;
/**
* @brief Enum accelerometer slow motion mode or no motion mode
*/
typedef enum {
eAccNmSmnmSm, // slow motion mode
eAccNmSmnmNm // no motion mode
} eAccNmSmnm_t;
/**
* @brief Enum gyroscope interrupt settings
*/
typedef enum {
eGyrIntSetAmXAxis = (0x01 << 0),
eGyrIntSetAmYAxis = (0x01 << 1),
eGyrIntSetAmZAxis = (0x01 << 2),
eGyrIntSetHrXAxis = (0x01 << 3),
eGyrIntSetHrYAxis = (0x01 << 4),
eGyrIntSetHrZAxis = (0x01 << 5),
eGyrIntSetAmFilt = (0x01 << 6),
eGyrIntSetHrFilt = (0x01 << 7),
eGyrIntSetAll = 0x3f
} eGyrIntSet_t;
/**
* @brief Declare sensor status
*/
typedef enum {
eStatusOK, // everything OK
eStatusErr, // unknow error
eStatusErrDeviceNotDetect, // device not detected
eStatusErrDeviceReadyTimeOut, // device ready time out
eStatusErrDeviceStatus, // device internal status error
eStatusErrParameter // function parameter error
} eStatus_t;
/**
* @brief begin Sensor begin
* @return Sensor status
*/
eStatus_t begin();
/**
* @brief getAxisAnalog Get axis analog data
* @param eAxis One axis type from eAxis_t
* @return Struct sAxisAnalog_t, contains axis analog data, members unit depend on eAxis:
* case eAxisAcc, unit mg
* case eAxisLia, unit mg
* case eAxisGrv, unit mg
* case eAxisMag, unit ut
* case eAxisGyr, unit dps
*/
sAxisAnalog_t getAxis(eAxis_t eAxis);
/**
* @brief getEulAnalog Get euler analog data
* @return Struct sEulAnalog_t, contains euler analog data
*/
sEulAnalog_t getEul();
/**
* @brief getQuaAnalog Get quaternion analog data
* @return Struct sQuaAnalog_t, contains quaternion analog data
*/
sQuaAnalog_t getQua();
/**
* @brief setAccOffset Set axis offset data
* @param eAxis One axis type from eAxis_t, only support accelerometer, magnetometer and gyroscope
* @param sOffset Struct sAxisAnalog_t, contains axis analog data, members unit depend on eAxis:
* case eAxisAcc, unit mg, members can't out of acc range
* case eAxisMag, unit ut, members can't out of mag range
* case eAxisGyr, unit dps, members can't out of gyr range
*/
void setAxisOffset(eAxis_t eAxis, sAxisAnalog_t sOffset);
/**
* @brief setOprMode Set operation mode
* @param eOpr One operation mode from eOprMode_t
*/
void setOprMode(eOprMode_t eMode);
/**
* @brief setPowerMode Set power mode
* @param eMode One power mode from ePowerMode_t
*/
void setPowerMode(ePowerMode_t eMode);
/**
* @brief Reset sensor
*/
void reset();
/**
* @brief setAccRange Set accelerometer measurement range, default value is 4g
* @param eRange One range enum from eAccRange_t
*/
void setAccRange(eAccRange_t eRange);
/**
* @brief setAccBandWidth Set accelerometer band width, default value is 62.5hz
* @param eBand One band enum from eAccBandWidth_t
*/
void setAccBandWidth(eAccBandWidth_t eBand);
/**
* @brief setAccPowerMode Set accelerometer power mode, default value is eAccPowerModeNormal
* @param eMode One mode enum from eAccPowerMode_t
*/
void setAccPowerMode(eAccPowerMode_t eMode);
/**
* @brief setMagDataRate Set magnetometer data output rate, default value is 20hz
* @param eRate One rate enum from eMagDataRate_t
*/
void setMagDataRate(eMagDataRate_t eRate);
/**
* @brief setMagOprMode Set magnetometer operation mode, default value is eMagOprModeRegular
* @param eMode One mode enum from eMagOprMode_t
*/
void setMagOprMode(eMagOprMode_t eMode);
/**
* @brief setMagPowerMode Set magnetometer power mode, default value is eMagePowerModeForce
* @param eMode One mode enum from eMagPowerMode_t
*/
void setMagPowerMode(eMagPowerMode_t eMode);
/**
* @brief setGyrRange Set gyroscope range, default value is 2000
* @param eRange One range enum from eGyrRange_t
*/
void setGyrRange(eGyrRange_t eRange);
/**
* @brief setGyrBandWidth Set gyroscope band width, default value is 32HZ
* @param eBandWidth One band width enum from eGyrBandWidth_t
*/
void setGyrBandWidth(eGyrBandWidth_t eBandWidth);
/**
* @brief setGyrPowerMode Set gyroscope power mode, default value is eGyrPowerModeNormal
* @param eMode One power mode enum from eGyrPowerMode_t
*/
void setGyrPowerMode(eGyrPowerMode_t eMode);
/**
* @brief getIntState Get interrupt state, interrupt auto clear after read
* @return If result > 0, at least one interrupt triggered. Result & eIntXXX (from eInt_t) to test is triggered
*/
uint8_t getIntState();
/**
* @brief setIntMask Set interrupt mask enable, there will generate a interrupt signal (raising) on INT pin if corresponding interrupt enabled
* @param eInt One or more interrupt flags to set, input them through operate or
*/
void setIntMaskEnable(eInt_t eInt);
/**
* @brief setIntMaskDisable Set corresponding interrupt mask disable
* @param eInt One or more interrupt flags to set, input them through operate or
*/
void setIntMaskDisable(eInt_t eInt);
/**
* @brief setIntEnEnable Set corresponding interrupt enable
* @param eInt One or more interrupt flags to set, input them through operate or
*/
void setIntEnable(eInt_t eInt);
/**
* @brief setIntEnDisable Set corresponding interrupt disable
* @param eInt One or more interrupt flags to set, input them through operate or
*/
void setIntDisable(eInt_t eInt);
/**
* @brief setAccAmThres Set accelerometer any motion threshold
* @param thres Threshold to set, unit mg, value is dependent on accelerometer range selected,
* case 2g, no more than 1991
* case 4g, no more than 3985
* case 8g, no more than 7968
* case 16g, no more than 15937
* Attenion: The set value will be slightly biased according to datasheet
*/
void setAccAmThres(uint16_t thres);
/**
* @brief setAccIntDur Set accelerometer interrupt duration,
* any motion interrupt triggers if duration (dur + 1) consecutive data points are above the any motion interrupt
* threshold define in any motion threshold
* @param dur Duration to set, range form 1 to 4
*/
void setAccIntAmDur(uint8_t dur);
/**
* @brief setAccIntEnable Set accelerometer interrupt enable
* @param eInt One or more interrupt flags to set, input them through operate or
*/
void setAccIntEnable(eAccIntSet_t eInt);
/**
* @brief setAccIntDisable Set accelerometer interrupt disable
* @param eInt One or more interrupt flags to set, input them through operate or
*/
void setAccIntDisable(eAccIntSet_t eInt);
/**
* @brief setAccHighGDuration Set accelerometer high-g interrupt, the high-g interrupt delay according to [dur + 1] * 2 ms
* @param dur Duration from 2ms to 512ms
*/
void setAccHighGDuration(uint16_t dur);
/**
* @brief setAccHighGThres Set accelerometer high-g threshold
* @param thres Threshold to set, unit mg, value is dependent on accelerometer range selected,
* case 2g, no more than 1991
* case 4g, no more than 3985
* case 8g, no more than 7968
* case 16g, no more than 15937
* Attenion: The set value will be slightly biased according to datasheet
*/
void setAccHighGThres(uint16_t thres);
/**
* @brief setAccNmThres Set accelerometer no motion threshold
* @param thres Threshold to set, unit mg, value is dependent on accelerometer range selected,
* case 2g, no more than 1991
* case 4g, no more than 3985
* case 8g, no more than 7968
* case 16g, no more than 15937
* Attenion: The set value will be slightly biased according to datasheet
*/
void setAccNmThres(uint16_t thres);
/**
* @brief setAccNmSet Set accelerometer slow motion or no motion mode and duration
* @param eSmnm Enum of eAccNmSmnm_t
* @param dur Interrupt trigger delay (unit seconds), no more than 344.
* Attenion: The set value will be slightly biased according to datasheet
*/
void setAccNmSet(eAccNmSmnm_t eSmnm, uint16_t dur);
/**
* @brief setGyrIntEnable Set corresponding gyroscope interrupt enable
* @param eInt One or more interrupt flags to set, input them through operate or
*/
void setGyrIntEnable(eGyrIntSet_t eInt);
/**
* @brief setGyrIntDisable Set corresponding gyroscope interrupt disable
* @param eInt One or more interrupt flags to set, input them through operate or
*/
void setGyrIntDisable(eGyrIntSet_t eInt);
/**
* @brief setGyrHrSet Set gyroscope high rate settings
* @param eSingleAxis Single axis to set
* @param thres High rate threshold to set, unit degree/seconds, value is dependent on gyroscope range selected,
* case 2000, no more than 1937
* case 1000, no more than 968
* case 500, no more than 484
* case 250, no more than 242
* case 125, no more than 121
* Attenion: The set value will be slightly biased according to datasheet
* @param dur High rate duration to set, unit ms, duration from 2.5ms to 640ms
* Attenion: The set value will be slightly biased according to datasheet
*/
void setGyrHrSet(eSingleAxis_t eSingleAxis, uint16_t thres, uint16_t dur);
/**
* @brief setGyrAmThres Set gyroscope any motion threshold
* @param thres Threshold to set, unit mg, value is dependent on accelerometer range selected,
* case 2000, no more than 128
* case 1000, no more than 64
* case 500, no more than 32
* case 250, no more than 16
* case 125, no more than 8
* Attenion: The set value will be slightly biased according to datasheet
*/
void setGyrAmThres(uint8_t thres);
/**
* @brief lastOpreateStatus Show last operate status
*/
eStatus_t lastOpreateStatus;
};
class DFRobot_BNO055_IIC : public DFRobot_BNO055 {
public:
/**
* @brief DFRobot_BNO055_IIC class constructor
* @param pWire select One TwoWire peripheral
* @param addr Sensor address
*/
DFRobot_BNO055_IIC(TwoWire *pWire, uint8_t addr);
};
```
## Compatibility
MCU | Work Well | Work Wrong | Untested | Remarks
------------------ | :----------: | :----------: | :---------: | -----
FireBeetle-ESP32 | √ | | |
FireBeetle-ESP8266 | √ | | |
Arduino uno | √ | | |
## History
- 07/03/2019 - Version 0.2 released.
## About this Driver ##
Written by Frank [jiehan.guo@dfrobot.com](#jiehan.guo@dfrobot.com)