Adafruit driver converted to Mbed OS 6.x.
Dependents: Adafruit-BNO055-test
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
Generated on Wed Jul 13 2022 00:45:44 by 1.7.2