Adafruit driver converted to Mbed OS 6.x.

Dependents:   Adafruit-BNO055-test

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Adafruit_BNO055.h Source File

Adafruit_BNO055.h

00001 /***************************************************************************
00002   This is a library for the BNO055 orientation sensor
00003 
00004   Designed specifically to work with the Adafruit BNO055 Breakout.
00005 
00006   Pick one up today in the adafruit shop!
00007   ------> http://www.adafruit.com/products
00008 
00009   These sensors use I2C to communicate, 2 pins are required to interface.
00010 
00011   Adafruit invests time and resources providing this open source code,
00012   please support Adafruit andopen-source hardware by purchasing products
00013   from Adafruit!
00014 
00015   Written by KTOWN for Adafruit Industries.
00016 
00017   MIT license, all text above must be included in any redistribution
00018  ***************************************************************************/
00019 
00020 #ifndef __ADAFRUIT_BNO055_H__
00021 #define __ADAFRUIT_BNO055_H__
00022 
00023 #include "Adafruit_Sensor.h"
00024 #include "imumaths.h"
00025 #include "mbed.h"
00026 
00027 #define BNO055_ADDRESS_A (0x28)
00028 #define BNO055_ADDRESS_B (0x29)
00029 #define BNO055_ID        (0xA0)
00030 
00031 class Adafruit_BNO055 : public Adafruit_Sensor
00032 {
00033   public:
00034     typedef enum
00035     {
00036       /* Page id register definition */
00037       BNO055_PAGE_ID_ADDR                                     = 0X07,
00038 
00039       /* PAGE0 REGISTER DEFINITION START*/
00040       BNO055_CHIP_ID_ADDR                                     = 0x00,
00041       BNO055_ACCEL_REV_ID_ADDR                                = 0x01,
00042       BNO055_MAG_REV_ID_ADDR                                  = 0x02,
00043       BNO055_GYRO_REV_ID_ADDR                                 = 0x03,
00044       BNO055_SW_REV_ID_LSB_ADDR                               = 0x04,
00045       BNO055_SW_REV_ID_MSB_ADDR                               = 0x05,
00046       BNO055_BL_REV_ID_ADDR                                   = 0X06,
00047 
00048       /* Accel data register */
00049       BNO055_ACCEL_DATA_X_LSB_ADDR                            = 0X08,
00050       BNO055_ACCEL_DATA_X_MSB_ADDR                            = 0X09,
00051       BNO055_ACCEL_DATA_Y_LSB_ADDR                            = 0X0A,
00052       BNO055_ACCEL_DATA_Y_MSB_ADDR                            = 0X0B,
00053       BNO055_ACCEL_DATA_Z_LSB_ADDR                            = 0X0C,
00054       BNO055_ACCEL_DATA_Z_MSB_ADDR                            = 0X0D,
00055 
00056       /* Mag data register */
00057       BNO055_MAG_DATA_X_LSB_ADDR                              = 0X0E,
00058       BNO055_MAG_DATA_X_MSB_ADDR                              = 0X0F,
00059       BNO055_MAG_DATA_Y_LSB_ADDR                              = 0X10,
00060       BNO055_MAG_DATA_Y_MSB_ADDR                              = 0X11,
00061       BNO055_MAG_DATA_Z_LSB_ADDR                              = 0X12,
00062       BNO055_MAG_DATA_Z_MSB_ADDR                              = 0X13,
00063 
00064       /* Gyro data registers */
00065       BNO055_GYRO_DATA_X_LSB_ADDR                             = 0X14,
00066       BNO055_GYRO_DATA_X_MSB_ADDR                             = 0X15,
00067       BNO055_GYRO_DATA_Y_LSB_ADDR                             = 0X16,
00068       BNO055_GYRO_DATA_Y_MSB_ADDR                             = 0X17,
00069       BNO055_GYRO_DATA_Z_LSB_ADDR                             = 0X18,
00070       BNO055_GYRO_DATA_Z_MSB_ADDR                             = 0X19,
00071 
00072       /* Euler data registers */
00073       BNO055_EULER_H_LSB_ADDR                                 = 0X1A,
00074       BNO055_EULER_H_MSB_ADDR                                 = 0X1B,
00075       BNO055_EULER_R_LSB_ADDR                                 = 0X1C,
00076       BNO055_EULER_R_MSB_ADDR                                 = 0X1D,
00077       BNO055_EULER_P_LSB_ADDR                                 = 0X1E,
00078       BNO055_EULER_P_MSB_ADDR                                 = 0X1F,
00079 
00080       /* Quaternion data registers */
00081       BNO055_QUATERNION_DATA_W_LSB_ADDR                       = 0X20,
00082       BNO055_QUATERNION_DATA_W_MSB_ADDR                       = 0X21,
00083       BNO055_QUATERNION_DATA_X_LSB_ADDR                       = 0X22,
00084       BNO055_QUATERNION_DATA_X_MSB_ADDR                       = 0X23,
00085       BNO055_QUATERNION_DATA_Y_LSB_ADDR                       = 0X24,
00086       BNO055_QUATERNION_DATA_Y_MSB_ADDR                       = 0X25,
00087       BNO055_QUATERNION_DATA_Z_LSB_ADDR                       = 0X26,
00088       BNO055_QUATERNION_DATA_Z_MSB_ADDR                       = 0X27,
00089 
00090       /* Linear acceleration data registers */
00091       BNO055_LINEAR_ACCEL_DATA_X_LSB_ADDR                     = 0X28,
00092       BNO055_LINEAR_ACCEL_DATA_X_MSB_ADDR                     = 0X29,
00093       BNO055_LINEAR_ACCEL_DATA_Y_LSB_ADDR                     = 0X2A,
00094       BNO055_LINEAR_ACCEL_DATA_Y_MSB_ADDR                     = 0X2B,
00095       BNO055_LINEAR_ACCEL_DATA_Z_LSB_ADDR                     = 0X2C,
00096       BNO055_LINEAR_ACCEL_DATA_Z_MSB_ADDR                     = 0X2D,
00097 
00098       /* Gravity data registers */
00099       BNO055_GRAVITY_DATA_X_LSB_ADDR                          = 0X2E,
00100       BNO055_GRAVITY_DATA_X_MSB_ADDR                          = 0X2F,
00101       BNO055_GRAVITY_DATA_Y_LSB_ADDR                          = 0X30,
00102       BNO055_GRAVITY_DATA_Y_MSB_ADDR                          = 0X31,
00103       BNO055_GRAVITY_DATA_Z_LSB_ADDR                          = 0X32,
00104       BNO055_GRAVITY_DATA_Z_MSB_ADDR                          = 0X33,
00105 
00106       /* Temperature data register */
00107       BNO055_TEMP_ADDR                                        = 0X34,
00108 
00109       /* Status registers */
00110       BNO055_CALIB_STAT_ADDR                                  = 0X35,
00111       BNO055_SELFTEST_RESULT_ADDR                             = 0X36,
00112       BNO055_INTR_STAT_ADDR                                   = 0X37,
00113 
00114       BNO055_SYS_CLK_STAT_ADDR                                = 0X38,
00115       BNO055_SYS_STAT_ADDR                                    = 0X39,
00116       BNO055_SYS_ERR_ADDR                                     = 0X3A,
00117 
00118       /* Unit selection register */
00119       BNO055_UNIT_SEL_ADDR                                    = 0X3B,
00120       BNO055_DATA_SELECT_ADDR                                 = 0X3C,
00121 
00122       /* Mode registers */
00123       BNO055_OPR_MODE_ADDR                                    = 0X3D,
00124       BNO055_PWR_MODE_ADDR                                    = 0X3E,
00125 
00126       BNO055_SYS_TRIGGER_ADDR                                 = 0X3F,
00127       BNO055_TEMP_SOURCE_ADDR                                 = 0X40,
00128 
00129       /* Axis remap registers */
00130       BNO055_AXIS_MAP_CONFIG_ADDR                             = 0X41,
00131       BNO055_AXIS_MAP_SIGN_ADDR                               = 0X42,
00132 
00133       /* SIC registers */
00134       BNO055_SIC_MATRIX_0_LSB_ADDR                            = 0X43,
00135       BNO055_SIC_MATRIX_0_MSB_ADDR                            = 0X44,
00136       BNO055_SIC_MATRIX_1_LSB_ADDR                            = 0X45,
00137       BNO055_SIC_MATRIX_1_MSB_ADDR                            = 0X46,
00138       BNO055_SIC_MATRIX_2_LSB_ADDR                            = 0X47,
00139       BNO055_SIC_MATRIX_2_MSB_ADDR                            = 0X48,
00140       BNO055_SIC_MATRIX_3_LSB_ADDR                            = 0X49,
00141       BNO055_SIC_MATRIX_3_MSB_ADDR                            = 0X4A,
00142       BNO055_SIC_MATRIX_4_LSB_ADDR                            = 0X4B,
00143       BNO055_SIC_MATRIX_4_MSB_ADDR                            = 0X4C,
00144       BNO055_SIC_MATRIX_5_LSB_ADDR                            = 0X4D,
00145       BNO055_SIC_MATRIX_5_MSB_ADDR                            = 0X4E,
00146       BNO055_SIC_MATRIX_6_LSB_ADDR                            = 0X4F,
00147       BNO055_SIC_MATRIX_6_MSB_ADDR                            = 0X50,
00148       BNO055_SIC_MATRIX_7_LSB_ADDR                            = 0X51,
00149       BNO055_SIC_MATRIX_7_MSB_ADDR                            = 0X52,
00150       BNO055_SIC_MATRIX_8_LSB_ADDR                            = 0X53,
00151       BNO055_SIC_MATRIX_8_MSB_ADDR                            = 0X54,
00152 
00153       /* Accelerometer Offset registers */
00154       ACCEL_OFFSET_X_LSB_ADDR                                 = 0X55,
00155       ACCEL_OFFSET_X_MSB_ADDR                                 = 0X56,
00156       ACCEL_OFFSET_Y_LSB_ADDR                                 = 0X57,
00157       ACCEL_OFFSET_Y_MSB_ADDR                                 = 0X58,
00158       ACCEL_OFFSET_Z_LSB_ADDR                                 = 0X59,
00159       ACCEL_OFFSET_Z_MSB_ADDR                                 = 0X5A,
00160 
00161       /* Magnetometer Offset registers */
00162       MAG_OFFSET_X_LSB_ADDR                                   = 0X5B,
00163       MAG_OFFSET_X_MSB_ADDR                                   = 0X5C,
00164       MAG_OFFSET_Y_LSB_ADDR                                   = 0X5D,
00165       MAG_OFFSET_Y_MSB_ADDR                                   = 0X5E,
00166       MAG_OFFSET_Z_LSB_ADDR                                   = 0X5F,
00167       MAG_OFFSET_Z_MSB_ADDR                                   = 0X60,
00168 
00169       /* Gyroscope Offset register s*/
00170       GYRO_OFFSET_X_LSB_ADDR                                  = 0X61,
00171       GYRO_OFFSET_X_MSB_ADDR                                  = 0X62,
00172       GYRO_OFFSET_Y_LSB_ADDR                                  = 0X63,
00173       GYRO_OFFSET_Y_MSB_ADDR                                  = 0X64,
00174       GYRO_OFFSET_Z_LSB_ADDR                                  = 0X65,
00175       GYRO_OFFSET_Z_MSB_ADDR                                  = 0X66,
00176 
00177       /* Radius registers */
00178       ACCEL_RADIUS_LSB_ADDR                                   = 0X67,
00179       ACCEL_RADIUS_MSB_ADDR                                   = 0X68,
00180       MAG_RADIUS_LSB_ADDR                                     = 0X69,
00181       MAG_RADIUS_MSB_ADDR                                     = 0X6A
00182     } adafruit_bno055_reg_t;
00183 
00184     typedef enum
00185     {
00186       POWER_MODE_NORMAL                                       = 0X00,
00187       POWER_MODE_LOWPOWER                                     = 0X01,
00188       POWER_MODE_SUSPEND                                      = 0X02
00189     } adafruit_bno055_powermode_t;
00190 
00191     typedef enum
00192     {
00193       /* Operation mode settings*/
00194       OPERATION_MODE_CONFIG                                   = 0X00,
00195       OPERATION_MODE_ACCONLY                                  = 0X01,
00196       OPERATION_MODE_MAGONLY                                  = 0X02,
00197       OPERATION_MODE_GYRONLY                                  = 0X03,
00198       OPERATION_MODE_ACCMAG                                   = 0X04,
00199       OPERATION_MODE_ACCGYRO                                  = 0X05,
00200       OPERATION_MODE_MAGGYRO                                  = 0X06,
00201       OPERATION_MODE_AMG                                      = 0X07,
00202       OPERATION_MODE_IMUPLUS                                  = 0X08,
00203       OPERATION_MODE_COMPASS                                  = 0X09,
00204       OPERATION_MODE_M4G                                      = 0X0A,
00205       OPERATION_MODE_NDOF_FMC_OFF                             = 0X0B,
00206       OPERATION_MODE_NDOF                                     = 0X0C
00207     } adafruit_bno055_opmode_t;
00208 
00209     typedef struct
00210     {
00211       uint8_t  accel_rev;
00212       uint8_t  mag_rev;
00213       uint8_t  gyro_rev;
00214       uint16_t sw_rev;
00215       uint8_t  bl_rev;
00216     } adafruit_bno055_rev_info_t;
00217 
00218     typedef enum
00219     {
00220       VECTOR_ACCELEROMETER = BNO055_ACCEL_DATA_X_LSB_ADDR,
00221       VECTOR_MAGNETOMETER  = BNO055_MAG_DATA_X_LSB_ADDR,
00222       VECTOR_GYROSCOPE     = BNO055_GYRO_DATA_X_LSB_ADDR,
00223       VECTOR_EULER         = BNO055_EULER_H_LSB_ADDR,
00224       VECTOR_LINEARACCEL   = BNO055_LINEAR_ACCEL_DATA_X_LSB_ADDR,
00225       VECTOR_GRAVITY       = BNO055_GRAVITY_DATA_X_LSB_ADDR
00226     } adafruit_vector_type_t;
00227 
00228     Adafruit_BNO055 ( int32_t sensorID = -1, uint8_t address = BNO055_ADDRESS_A, I2C* i2c_ptr = 0 );
00229 
00230     bool  begin               ( adafruit_bno055_opmode_t mode = OPERATION_MODE_NDOF );
00231     void  setMode             ( adafruit_bno055_opmode_t mode );
00232     void  getRevInfo          ( adafruit_bno055_rev_info_t* );
00233     void  displayRevInfo      ( void );
00234     void  setExtCrystalUse    ( bool usextal );
00235     void  getSystemStatus     ( uint8_t *system_status,
00236                                 uint8_t *self_test_result,
00237                                 uint8_t *system_error);
00238     void  displaySystemStatus ( void );
00239     void  getCalibration      ( uint8_t* system, uint8_t* gyro, uint8_t* accel, uint8_t* mag);
00240 
00241     imu::Vector<3>  getVector ( adafruit_vector_type_t vector_type );
00242     imu::Quaternion getQuat   ( void );
00243     int8_t          getTemp   ( void );
00244 
00245     /* Adafruit_Sensor implementation */
00246     bool  getEvent  ( sensors_event_t* );
00247     void  getSensor ( sensor_t* );
00248 
00249   private:
00250     char  read8   ( adafruit_bno055_reg_t );
00251     bool  readLen ( adafruit_bno055_reg_t, char* buffer, int len );
00252     bool  write8  ( adafruit_bno055_reg_t, char value );
00253 
00254     uint8_t _address;
00255     int32_t _sensorID;
00256     adafruit_bno055_opmode_t _mode;
00257     I2C* i2c;
00258 };
00259 
00260 #endif