Reference

Last revision 2026/01/27

Principle

The Gravity: BNO055 + BMP280 10DOF AHRS module combines inertial measurement and barometric sensing to achieve orientation and altitude detection.

1. BNO055 – 9-Axis Absolute Orientation Principle

The BNO055 integrates:

  • 3-axis accelerometer (14-bit)
  • 3-axis gyroscope (16-bit)
  • 3-axis geomagnetic sensor
  • Built-in 32-bit microcontroller (MCU)

Working mechanism:

  • The accelerometer measures linear acceleration along X, Y, and Z axes.
  • The gyroscope measures angular velocity.
  • The geomagnetic sensor detects Earth's magnetic field for heading reference.

The built-in MCU performs real-time sensor fusion using embedded algorithms. It processes raw data from the three sensors and outputs high-level orientation data, including:

  • Euler angles
  • Quaternions
  • Rotation vectors
  • Linear acceleration
  • Gravity vectors
  • Heading

Because fusion is performed internally, the host controller does not need to implement complex Kalman filtering or attitude algorithms, significantly reducing system complexity.

2. BMP280 – Barometric Pressure Measurement Principle

The BMP280 is based on piezoresistive pressure sensing technology.

Working mechanism:

  • Atmospheric pressure causes mechanical deformation of the internal sensing element.
  • The resistance changes proportionally to pressure variation.
  • The internal ADC converts this change into digital pressure data.
  • Temperature is measured simultaneously for compensation.

Altitude can be calculated from pressure using the standard barometric formula.

3. 10DOF System Concept

By combining:

  • 9-axis motion and orientation sensing (BNO055)
  • 1-axis barometric pressure sensing (BMP280)

the module achieves 10 Degrees of Freedom (10DOF), enabling:

  • 3D orientation tracking
  • Heading detection
  • Motion sensing
  • Altitude estimation

All data are accessed via the Gravity I2C interface, allowing simplified integration with external microcontrollers.

API Function

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;

  // registers ----------------------------------------------------------------
  typedef struct {
    uint8_t   MAG: 2;
    uint8_t   ACC: 2;
    uint8_t   GYR: 2;
    uint8_t   SYS: 2;
  } sRegCalibState_t;

  typedef enum {
    eStResultFaild,
    eStResultPassed
  } eStResult_t;

  typedef struct {
    uint8_t   ACC: 1;
    uint8_t   MAG: 1;
    uint8_t   GYR: 1;
    uint8_t   MCU: 1;
  } sRegStResult_t;

  /**
   * @brief enum interrupt
   */
  typedef enum {
    eIntGyrAm = 0x04,
    eIntGyrHighRate = 0x08,
    eIntAccHighG = 0x20,
    eIntAccAm = 0x40,
    eIntAccNm = 0x80,
    eIntAll = 0xec
  } eInt_t;

  typedef struct {
    uint8_t   reserved1: 2;
    uint8_t   GYRO_AM: 1;
    uint8_t   HYR_HIGH_RATE: 1;
    uint8_t   reserved2: 1;
    uint8_t   ACC_HIGH_G: 1;
    uint8_t   ACC_AM: 1;
    uint8_t   ACC_NM: 1;
  } sRegIntSta_t;

  typedef struct {
    uint8_t   ST_MAIN_CLK: 1;
  } sRegSysClkStatus_t;

  typedef struct {
    uint8_t   ACC: 1;
    uint8_t   GYR: 1;
    uint8_t   EUL: 1;
    uint8_t   reserved1: 1;
    uint8_t   TEMP: 1;
    uint8_t   reserved2: 2;
    uint8_t   ORI_ANDROID_WINDOWS: 1;
  } sRegUnitSel_t;

  /**
   * @brief Operation mode enum
   */
  typedef enum {
    eOprModeConfig,
    eOprModeAccOnly,
    eOprModeMagOnly,
    eOprModeGyroOnly,
    eOprModeAccMag,
    eOprModeAccGyro,
    eOprModeMagGyro,
    eOprModeAMG,
    eOprModeImu,
    eOprModeCompass,
    eOprModeM4G,
    eOprModeNdofFmcOff,
    eOprModeNdof
  } eOprMode_t;

  typedef struct {
    uint8_t   mode: 4;
  } sRegOprMode_t;

  /**
   * @brief Poewr mode enum
   */
  typedef enum {
    ePowerModeNormal,
    ePowerModeLowPower,
    ePowerModeSuspend
  } ePowerMode_t;

  typedef struct {
    uint8_t   mode: 2;
  } sRegPowerMode_t;

  typedef struct {
    uint8_t   SELF_TEST: 1;
    uint8_t   reserved1: 4;
    uint8_t   RST_SYS: 1;
    uint8_t   RST_INT: 1;
    uint8_t   CLK_SEL: 1;
  } sRegSysTrigger_t;

  typedef struct {
    uint8_t   TEMP_SOURCE: 2;
  } sRegTempSource_t;

  typedef struct {
    //uint8_t   remappedXAxisVal: 2;
    //uint8_t   remappedYAxisVal: 2;
    //uint8_t   remappedZAxisVal: 2;
    uint8_t   remappedAxisConfig: 6;
  } sRegAxisMapConfig_t;

  typedef struct {
    //uint8_t   remappedZAxisSign: 1;
    //uint8_t   remappedYAxisSign: 1;
    //uint8_t   remappedXAxisSign: 1;
    uint8_t  remappedAxisSign: 3;
  } sRegAxisMapSign_t;

  typedef struct {
    int16_t   x, y, z;
  } sAxisData_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;

  typedef struct {
    int16_t   head, roll, pitch;
  } sEulData_t;

  /**
   * @brief qua analog data struct
   */
  typedef struct {
    float   w, x, y, z;
  } sQuaAnalog_t;

  typedef struct {
    int16_t   w, x, y, z;
  } sQuaData_t;

  typedef struct {
    uint8_t   CHIP_ID;  // 0x00
    #define   BNO055_REG_CHIP_ID_DEFAULT   0xa0
    uint8_t   ACC_ID;
    #define   BNO055_REG_ACC_ID_DEFAULT    0xfb
    uint8_t   MAG_ID;
    #define   BNO055_REG_MAG_ID_DEFAULT    0x32
    uint8_t   GYR_ID;
    #define   BNO055_REG_GYR_ID_DEFAULT    0x0f
    uint16_t  SW_REV_ID;
    #define   BNO055_REG_SW_REV_ID_DEFAULT 0x0308
    uint8_t   BL_REV;
    uint8_t   PAGE_ID;
    sAxisData_t   ACC_DATA;
    sAxisData_t   MAG_DATA;  // 0x0f
    sAxisData_t   GYR_DATA;
    sEulData_t    EUL_DATA;
    sQuaData_t    QUA_DATA;  // 0x20
    sAxisData_t   LIA_DATA;
    sAxisData_t   GRV_DATA;  // 0x2f
    uint8_t   TEMP;
    sRegCalibState_t    CALIB_STATE;
    sRegStResult_t      ST_RESULT;
    sRegIntSta_t        INT_STA;
    sRegSysClkStatus_t    SYS_CLK_STATUS;
    uint8_t   SYS_STATUS;
    uint8_t   SYS_ERR;
    sRegUnitSel_t       UNIT_SEL;
    uint8_t   reserved1;
    sRegOprMode_t       OPR_MODE;
    sRegPowerMode_t     PWR_MODE;
    sRegSysTrigger_t    SYS_TRIGGER;
    sRegTempSource_t    TEMP_SOURCE;  // 0x40
    sRegAxisMapConfig_t AXIS_MAP_CONFIG;
    sRegAxisMapSign_t   AXIS_MAP_SIGN;
    uint8_t   reserved2[(0x54 - 0x43 + 1)];
    sAxisData_t   ACC_OFFSET;  // 0x55
    sAxisData_t   MAG_OFFSET;
    sAxisData_t   GYR_OFFSET;  // 0x61
    uint16_t  ACC_RADIUS;
    uint16_t  MAG_RADIUS;
  } sRegsPage0_t;


  typedef enum {
    eMapSign_P1,
    eMapSign_P5,
    eMapSign_P3,
    eMapSign_P4,
    eMapSign_P0,
    eMapSign_P7,
    eMapSign_P2,
    eMapSign_P6,
  } eMapSign_t;

  typedef enum {
    eMapConfig_P0 = 0x21,
    eMapConfig_P1 = 0x24,
    eMapConfig_P2 = 0x24,
    eMapConfig_P3 = 0x21,
    eMapConfig_P4 = 0x24,
    eMapConfig_P5 = 0x21,
    eMapConfig_P6 = 0x21,
    eMapConfig_P7 = 0x24,
  } eMapConfig_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;

  typedef struct {
    uint8_t   ACC_RANGE: 2;
    uint8_t   ACC_BW: 3;
    uint8_t   ACC_PWR_MODE: 3;
  } sRegAccConfig_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;

  typedef struct {
    uint8_t   MAG_DATA_OUTPUT_RATE: 3;
    uint8_t   MAG_OPR_MODE: 2;
    uint8_t   MAG_POWER_MODE: 2;
  } sRegMagConfig_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;

  typedef struct {
    uint8_t   GYR_RANGE: 3;
    uint8_t   GYR_BANDWIDTH: 3;
  } sRegGyrConfig0_t;

  /**
   * @brief enum gyroscope power mode
   */
  typedef enum {
    eGyrPowerModeNormal,
    eGyrPowerModeFastPowerUp,
    eGyrPowerModeDeepSuspend,
    eGyrPowerModeSuspend,
    eGyrPowerModeAdvancedPowersave
  } eGyrPowerMode_t;

  typedef struct {
    uint8_t   GYR_POWER_MODE: 3;
  } sRegGyrConfig1_t;

  typedef enum {
    eAccSleepModeEventDriven,
    eAccSleepModeEquidstantSampling
  } eAccSleepMode_t;

  typedef enum {
    eAccSleepDuration_0_5 = 5,    // 0.5 ms
    eAccSleepDuration_1,
    eAccSleepDuration_2,
    eAccSleepDuration_4,
    eAccSleepDuration_6,
    eAccSleepDuration_10,
    eAccSleepDuration_25,
    eAccSleepDuration_50,
    eAccSleepDuration_100,
    eAccSleepDuration_500,
    eAccSleepDuration_1000
  } eAccSleepDuration_t;

  typedef struct {
    uint8_t   SLP_MODE: 1;
    uint8_t   SLP_DURATION: 4;
  } sRegAccSleepConfig_t;

  typedef enum {
    eGyrSleepDuration_2,
    eGyrSleepDuration_4,
    eGyrSleepDuration_5,
    eGyrSleepDuration_8,
    eGyrSleepDuration_10,
    eGyrSleepDuration_15,
    eGyrSleepDuration_18,
    eGyrSleepDuration_20
  } eGyrSleepDuration_t;

  typedef enum {
    eGyrAutoSleepDuration_No,
    eGyrAutoSleepDuration_4,
    eGyrAutoSleepDuration_5,
    eGyrAutoSleepDuration_8,
    eGyrAutoSleepDuration_10,
    eGyrAutoSleepDuration_15,
    eGyrAutoSleepDuration_20,
    eGyrAutoSleepDuration_40
  } eGyrAutoSleepDuration_t;

  typedef struct {
    uint8_t   SLP_DURATION: 3;
    uint8_t   AUTO_SLP_DURATION: 3;
  } sRegGyrSleepConfig_t;

  typedef struct {
    uint8_t   reserved1: 2;
    uint8_t   GYRO_AM: 1;
    uint8_t   GYR_HIGH_RATE: 1;
    uint8_t   reserved2: 1;
    uint8_t   ACC_HIGH_G: 1;
    uint8_t   ACC_AM: 1;
    uint8_t   ACC_NM: 1;
  } sRegIntMask_t;

  typedef struct {
    uint8_t   reserved1: 2;
    uint8_t   GYRO_AM: 1;
    uint8_t   GYR_HIGH_RATE: 1;
    uint8_t   reserved2: 1;
    uint8_t   ACC_HIGH_G: 1;
    uint8_t   ACC_AM: 1;
    uint8_t   ACC_NM: 1;
  } sRegIntEn_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;

  typedef struct {
    uint8_t   AM_DUR: 2;
    uint8_t   AMNM_X_AXIS: 1;
    uint8_t   AMNM_Y_AXIS: 1;
    uint8_t   AMNM_Z_AXIS: 1;
    uint8_t   HG_X_AXIS: 1;
    uint8_t   HG_Y_AXIS: 1;
    uint8_t   HG_Z_AXIS: 1;
  } sRegAccIntSet_t;

  /**
   * @brief Enum accelerometer slow motion mode or no motion mode
   */
  typedef enum {
    eAccNmSmnmSm,  // slow motion mode
    eAccNmSmnmNm   // no motion mode
  } eAccNmSmnm_t;

  typedef struct {
    uint8_t   SMNM: 2;
    uint8_t   NO_SLOW_MOTION_DURATION: 5;
  } sRegAccNmSet_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;

  typedef struct {
    uint8_t   AM_X_AXIS: 1;
    uint8_t   AM_Y_AXIS: 1;
    uint8_t   AM_Z_AXIS: 1;
    uint8_t   HR_X_AXIS: 1;
    uint8_t   HR_Y_AXIS: 1;
    uint8_t   HR_Z_AXIS: 1;
    uint8_t   AM_FILT: 1;
    uint8_t   HR_FILT: 1;
  } sRegGyrIntSetting_t;

  typedef struct {
    uint8_t   HR_THRESHOLD: 5;
    uint8_t   HR_THRES_HYST: 2;
  } sRegGyrHrSet_t;

  typedef struct {
    uint8_t   GYRO_ANY_MOTION_THRESHOLD: 7;
  } sRegGyrAmThres_t;

  typedef struct {
    uint8_t   SLOPE_SAMPLES: 2;
    uint8_t   AWAKE_DURATION: 2;
  } sRegGyrAmSet_t;

  typedef uint8_t   UniqueId_t[(0x5f - 0x50 + 1)];

  typedef struct {
    uint8_t   reserved1[(0x06 - 0x00 + 1)];
    uint8_t   PAGE_ID;  // 0x07
    sRegAccConfig_t   ACC_CONFIG;
    sRegMagConfig_t   MAG_CONFIG;
    sRegGyrConfig0_t  GYR_CONFIG0;
    sRegGyrConfig1_t  GYR_CONFIG1;
    sRegAccSleepConfig_t    ACC_SLEEP;
    sRegGyrSleepConfig_t    GYR_SLEEP;
    uint8_t   reserved2;
    sRegIntMask_t     INT_MASK;
    sRegIntEn_t       INT_EN;  // 0x10
    uint8_t   ACC_AM_THRES;
    sRegAccIntSet_t    ACC_INT_SETTINGS;
    uint8_t   ACC_HG_DURATION;
    uint8_t   ACC_HG_THRES;
    uint8_t   ACC_NM_THRES;
    sRegAccNmSet_t    ACC_NM_SET;
    sRegGyrIntSetting_t     GYR_INT_SETTING;
    sRegGyrHrSet_t    GYR_HR_X_SET;
    uint8_t   GYR_DUR_X;
    sRegGyrHrSet_t    GYR_HR_Y_SET;
    uint8_t   GYR_DUR_Y;
    sRegGyrHrSet_t    GYR_HR_Z_SET;
    uint8_t   GYR_DUR_Z;
    sRegGyrAmThres_t  GYR_AM_THRES;
    sRegGyrAmSet_t    GYR_AM_SET;  // 0x1f
    uint8_t   reserved3[(0x4f - 0x20 + 1)];
    UniqueId_t    UNIQUE_ID;  // 0x5f
  } sRegsPage1_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;



  /** Remap Signs **/
  typedef enum {
    REMAP_SIGN_P0 = 0x04,
    REMAP_SIGN_P1 = 0x00, // default
    REMAP_SIGN_P2 = 0x06,
    REMAP_SIGN_P3 = 0x02,
    REMAP_SIGN_P4 = 0x03,
    REMAP_SIGN_P5 = 0x01,
    REMAP_SIGN_P6 = 0x07,
    REMAP_SIGN_P7 = 0x05
  } eRemap_sign_t;
// functions
public:

  DFRobot_BNO055();

  /**
   * @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();



  void    setAxisMapSign(eMapSign_t eSign); 

  void    setAxisMapConfig(eMapConfig_t eConfig); 

  /**
   * @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);

protected:
  virtual void readReg(uint8_t reg, uint8_t *pBuf, uint8_t len) = 0;
  virtual void writeReg(uint8_t reg, uint8_t *pBuf, uint8_t len) = 0;

  uint8_t   getReg(uint8_t reg, uint8_t pageId);
  void      setToPage(uint8_t pageId);
  void      setUnit();
  void      writeRegBits(uint8_t reg, uint8_t flied, uint8_t val);
  uint16_t  mapAccThres(uint16_t thres);
  void      mapGyrHrThres(uint8_t *pHysteresis, uint16_t *pThres, uint16_t *pDur);
  void      mapGyrAmThres(uint8_t *pThres);

  sAxisData_t   getAxisRaw(eAxis_t eAxis);
  sEulData_t    getEulRaw();
  sQuaData_t    getQuaRaw();

// variables ----------------------------------------------------------------
public:
  /**
   * @brief lastOpreateStatus Show last operate status
   */
  eStatus_t   lastOperateStatus;

protected:
  uint8_t   _currentPage;
  eAccRange_t   _eAccRange;
  eGyrRange_t   _eGyrRange;

};

// utils class ----------------------------------------------------------------

class DFRobot_BNO055_IIC : public DFRobot_BNO055 {
public:
  /**
   * @brief The eCom3State enum, sensor address is according to pin(com3) state
   */
  typedef enum {
    eCom3Low,
    eCom3High
  } eCom3State_t;

  /**
   * @brief DFRobot_BNO055_IIC class constructor
   * @param pWire select One TwoWire peripheral
   * @param addr Sensor address
   */
  DFRobot_BNO055_IIC(TwoWire *pWire, uint8_t addr);

protected:
  void    readReg(uint8_t reg, uint8_t *pBuf, uint8_t len);
  void    writeReg(uint8_t reg, uint8_t *pBuf, uint8_t len);

protected:
  TwoWire   *_pWire;
  uint8_t   _addr;

};

Was this article helpful?

TOP