I2C library for Bosch BNO055 sensor

Dependents:   BNO055_HelloWorld robfish_test_IMU_and_hallsensor SCRIBE_stepper SCRIBE_servo ... more

Based off the Bosch Sensortec driver stored at GitHub. I've broken out the main control functions out as separate functions, save for the interrupt setting up, Configuration for the separate sensors not yet enabled.

Committer:
StressedDave
Date:
Thu May 28 19:22:25 2015 +0000
Revision:
0:24f23c36dd24
Child:
1:2c3322a8d417
Initial upload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
StressedDave 0:24f23c36dd24 1 #ifndef BNO055_H
StressedDave 0:24f23c36dd24 2 #define BNO055_H
StressedDave 0:24f23c36dd24 3
StressedDave 0:24f23c36dd24 4 #include "mbed.h"
StressedDave 0:24f23c36dd24 5 //
StressedDave 0:24f23c36dd24 6 #define BNOAddress (0x28 << 1)
StressedDave 0:24f23c36dd24 7 //Register definitions
StressedDave 0:24f23c36dd24 8 /* Page id register definition */
StressedDave 0:24f23c36dd24 9 #define BNO055_PAGE_ID_ADDR 0x07
StressedDave 0:24f23c36dd24 10 /* PAGE0 REGISTER DEFINITION START*/
StressedDave 0:24f23c36dd24 11 #define BNO055_CHIP_ID_ADDR 0x00
StressedDave 0:24f23c36dd24 12 #define BNO055_ACCEL_REV_ID_ADDR 0x01
StressedDave 0:24f23c36dd24 13 #define BNO055_MAG_REV_ID_ADDR 0x02
StressedDave 0:24f23c36dd24 14 #define BNO055_GYRO_REV_ID_ADDR 0x03
StressedDave 0:24f23c36dd24 15 #define BNO055_SW_REV_ID_LSB_ADDR 0x04
StressedDave 0:24f23c36dd24 16 #define BNO055_SW_REV_ID_MSB_ADDR 0x05
StressedDave 0:24f23c36dd24 17 #define BNO055_BL_REV_ID_ADDR 0x06
StressedDave 0:24f23c36dd24 18 /* Accel data register */
StressedDave 0:24f23c36dd24 19 #define BNO055_ACCEL_DATA_X_LSB_ADDR 0x08
StressedDave 0:24f23c36dd24 20 #define BNO055_ACCEL_DATA_X_MSB_ADDR 0x09
StressedDave 0:24f23c36dd24 21 #define BNO055_ACCEL_DATA_Y_LSB_ADDR 0x0A
StressedDave 0:24f23c36dd24 22 #define BNO055_ACCEL_DATA_Y_MSB_ADDR 0x0B
StressedDave 0:24f23c36dd24 23 #define BNO055_ACCEL_DATA_Z_LSB_ADDR 0x0C
StressedDave 0:24f23c36dd24 24 #define BNO055_ACCEL_DATA_Z_MSB_ADDR 0x0D
StressedDave 0:24f23c36dd24 25 /* Mag data register */
StressedDave 0:24f23c36dd24 26 #define BNO055_MAG_DATA_X_LSB_ADDR 0x0E
StressedDave 0:24f23c36dd24 27 #define BNO055_MAG_DATA_X_MSB_ADDR 0x0F
StressedDave 0:24f23c36dd24 28 #define BNO055_MAG_DATA_Y_LSB_ADDR 0x10
StressedDave 0:24f23c36dd24 29 #define BNO055_MAG_DATA_Y_MSB_ADDR 0x11
StressedDave 0:24f23c36dd24 30 #define BNO055_MAG_DATA_Z_LSB_ADDR 0x12
StressedDave 0:24f23c36dd24 31 #define BNO055_MAG_DATA_Z_MSB_ADDR 0x13
StressedDave 0:24f23c36dd24 32 /* Gyro data registers */
StressedDave 0:24f23c36dd24 33 #define BNO055_GYRO_DATA_X_LSB_ADDR 0x14
StressedDave 0:24f23c36dd24 34 #define BNO055_GYRO_DATA_X_MSB_ADDR 0x15
StressedDave 0:24f23c36dd24 35 #define BNO055_GYRO_DATA_Y_LSB_ADDR 0x16
StressedDave 0:24f23c36dd24 36 #define BNO055_GYRO_DATA_Y_MSB_ADDR 0x17
StressedDave 0:24f23c36dd24 37 #define BNO055_GYRO_DATA_Z_LSB_ADDR 0x18
StressedDave 0:24f23c36dd24 38 #define BNO055_GYRO_DATA_Z_MSB_ADDR 0x19
StressedDave 0:24f23c36dd24 39 /* Euler data registers */
StressedDave 0:24f23c36dd24 40 #define BNO055_EULER_H_LSB_ADDR 0x1A
StressedDave 0:24f23c36dd24 41 #define BNO055_EULER_H_MSB_ADDR 0x1B
StressedDave 0:24f23c36dd24 42 #define BNO055_EULER_R_LSB_ADDR 0x1C
StressedDave 0:24f23c36dd24 43 #define BNO055_EULER_R_MSB_ADDR 0x1D
StressedDave 0:24f23c36dd24 44 #define BNO055_EULER_P_LSB_ADDR 0x1E
StressedDave 0:24f23c36dd24 45 #define BNO055_EULER_P_MSB_ADDR 0x1F
StressedDave 0:24f23c36dd24 46 /* Quaternion data registers */
StressedDave 0:24f23c36dd24 47 #define BNO055_QUATERNION_DATA_W_LSB_ADDR 0x20
StressedDave 0:24f23c36dd24 48 #define BNO055_QUATERNION_DATA_W_MSB_ADDR 0x21
StressedDave 0:24f23c36dd24 49 #define BNO055_QUATERNION_DATA_X_LSB_ADDR 0x22
StressedDave 0:24f23c36dd24 50 #define BNO055_QUATERNION_DATA_X_MSB_ADDR 0x23
StressedDave 0:24f23c36dd24 51 #define BNO055_QUATERNION_DATA_Y_LSB_ADDR 0x24
StressedDave 0:24f23c36dd24 52 #define BNO055_QUATERNION_DATA_Y_MSB_ADDR 0x25
StressedDave 0:24f23c36dd24 53 #define BNO055_QUATERNION_DATA_Z_LSB_ADDR 0x26
StressedDave 0:24f23c36dd24 54 #define BNO055_QUATERNION_DATA_Z_MSB_ADDR 0x27
StressedDave 0:24f23c36dd24 55 /* Linear acceleration data registers */
StressedDave 0:24f23c36dd24 56 #define BNO055_LINEAR_ACCEL_DATA_X_LSB_ADDR 0x28
StressedDave 0:24f23c36dd24 57 #define BNO055_LINEAR_ACCEL_DATA_X_MSB_ADDR 0x29
StressedDave 0:24f23c36dd24 58 #define BNO055_LINEAR_ACCEL_DATA_Y_LSB_ADDR 0x2A
StressedDave 0:24f23c36dd24 59 #define BNO055_LINEAR_ACCEL_DATA_Y_MSB_ADDR 0x2B
StressedDave 0:24f23c36dd24 60 #define BNO055_LINEAR_ACCEL_DATA_Z_LSB_ADDR 0x2C
StressedDave 0:24f23c36dd24 61 #define BNO055_LINEAR_ACCEL_DATA_Z_MSB_ADDR 0x2D
StressedDave 0:24f23c36dd24 62 /* Gravity data registers */
StressedDave 0:24f23c36dd24 63 #define BNO055_GRAVITY_DATA_X_LSB_ADDR 0x2E
StressedDave 0:24f23c36dd24 64 #define BNO055_GRAVITY_DATA_X_MSB_ADDR 0x2F
StressedDave 0:24f23c36dd24 65 #define BNO055_GRAVITY_DATA_Y_LSB_ADDR 0x30
StressedDave 0:24f23c36dd24 66 #define BNO055_GRAVITY_DATA_Y_MSB_ADDR 0x31
StressedDave 0:24f23c36dd24 67 #define BNO055_GRAVITY_DATA_Z_LSB_ADDR 0x32
StressedDave 0:24f23c36dd24 68 #define BNO055_GRAVITY_DATA_Z_MSB_ADDR 0x33
StressedDave 0:24f23c36dd24 69 /* Temperature data register */
StressedDave 0:24f23c36dd24 70 #define BNO055_TEMP_ADDR 0x34
StressedDave 0:24f23c36dd24 71 /* Status registers */
StressedDave 0:24f23c36dd24 72 #define BNO055_CALIB_STAT_ADDR 0x35
StressedDave 0:24f23c36dd24 73 #define BNO055_SELFTEST_RESULT_ADDR 0x36
StressedDave 0:24f23c36dd24 74 #define BNO055_INTR_STAT_ADDR 0x37
StressedDave 0:24f23c36dd24 75 #define BNO055_SYS_CLK_STAT_ADDR 0x38
StressedDave 0:24f23c36dd24 76 #define BNO055_SYS_STAT_ADDR 0x39
StressedDave 0:24f23c36dd24 77 #define BNO055_SYS_ERR_ADDR 0x3A
StressedDave 0:24f23c36dd24 78 /* Unit selection register */
StressedDave 0:24f23c36dd24 79 #define BNO055_UNIT_SEL_ADDR 0x3B
StressedDave 0:24f23c36dd24 80 #define BNO055_DATA_SELECT_ADDR 0x3C
StressedDave 0:24f23c36dd24 81 /* Mode registers */
StressedDave 0:24f23c36dd24 82 #define BNO055_OPR_MODE_ADDR 0x3D
StressedDave 0:24f23c36dd24 83 #define BNO055_PWR_MODE_ADDR 0x3E
StressedDave 0:24f23c36dd24 84 #define BNO055_SYS_TRIGGER_ADDR 0x3F
StressedDave 0:24f23c36dd24 85 #define BNO055_TEMP_SOURCE_ADDR 0x40
StressedDave 0:24f23c36dd24 86 /* Axis remap registers */
StressedDave 0:24f23c36dd24 87 #define BNO055_AXIS_MAP_CONFIG_ADDR 0x41
StressedDave 0:24f23c36dd24 88 #define BNO055_AXIS_MAP_SIGN_ADDR 0x42
StressedDave 0:24f23c36dd24 89 /* Accelerometer Offset registers */
StressedDave 0:24f23c36dd24 90 #define ACCEL_OFFSET_X_LSB_ADDR 0x55
StressedDave 0:24f23c36dd24 91 #define ACCEL_OFFSET_X_MSB_ADDR 0x56
StressedDave 0:24f23c36dd24 92 #define ACCEL_OFFSET_Y_LSB_ADDR 0x57
StressedDave 0:24f23c36dd24 93 #define ACCEL_OFFSET_Y_MSB_ADDR 0x58
StressedDave 0:24f23c36dd24 94 #define ACCEL_OFFSET_Z_LSB_ADDR 0x59
StressedDave 0:24f23c36dd24 95 #define ACCEL_OFFSET_Z_MSB_ADDR 0x5A
StressedDave 0:24f23c36dd24 96 /* Magnetometer Offset registers */
StressedDave 0:24f23c36dd24 97 #define MAG_OFFSET_X_LSB_ADDR 0x5B
StressedDave 0:24f23c36dd24 98 #define MAG_OFFSET_X_MSB_ADDR 0x5C
StressedDave 0:24f23c36dd24 99 #define MAG_OFFSET_Y_LSB_ADDR 0x5D
StressedDave 0:24f23c36dd24 100 #define MAG_OFFSET_Y_MSB_ADDR 0x5E
StressedDave 0:24f23c36dd24 101 #define MAG_OFFSET_Z_LSB_ADDR 0x5F
StressedDave 0:24f23c36dd24 102 #define MAG_OFFSET_Z_MSB_ADDR 0x60
StressedDave 0:24f23c36dd24 103 /* Gyroscope Offset registers*/
StressedDave 0:24f23c36dd24 104 #define GYRO_OFFSET_X_LSB_ADDR 0x61
StressedDave 0:24f23c36dd24 105 #define GYRO_OFFSET_X_MSB_ADDR 0x62
StressedDave 0:24f23c36dd24 106 #define GYRO_OFFSET_Y_LSB_ADDR 0x63
StressedDave 0:24f23c36dd24 107 #define GYRO_OFFSET_Y_MSB_ADDR 0x64
StressedDave 0:24f23c36dd24 108 #define GYRO_OFFSET_Z_LSB_ADDR 0x65
StressedDave 0:24f23c36dd24 109 #define GYRO_OFFSET_Z_MSB_ADDR 0x66
StressedDave 0:24f23c36dd24 110 /* Radius registers */
StressedDave 0:24f23c36dd24 111 #define ACCEL_RADIUS_LSB_ADDR 0x67
StressedDave 0:24f23c36dd24 112 #define ACCEL_RADIUS_MSB_ADDR 0x68
StressedDave 0:24f23c36dd24 113 #define MAG_RADIUS_LSB_ADDR 0x69
StressedDave 0:24f23c36dd24 114 #define MAG_RADIUS_MSB_ADDR 0x6A
StressedDave 0:24f23c36dd24 115
StressedDave 0:24f23c36dd24 116 /* Page 1 registers */
StressedDave 0:24f23c36dd24 117 #define BNO055_UNIQUE_ID_ADDR 0x50
StressedDave 0:24f23c36dd24 118
StressedDave 0:24f23c36dd24 119 //Definitions for unit selection
StressedDave 0:24f23c36dd24 120 #define MPERSPERS 0x00
StressedDave 0:24f23c36dd24 121 #define MILLIG 0x01
StressedDave 0:24f23c36dd24 122 #define DEG_PER_SEC 0x00
StressedDave 0:24f23c36dd24 123 #define RAD_PER_SEC 0x02
StressedDave 0:24f23c36dd24 124 #define DEGREES 0x00
StressedDave 0:24f23c36dd24 125 #define RADIANS 0x40
StressedDave 0:24f23c36dd24 126 #define CENTIGRADE 0x00
StressedDave 0:24f23c36dd24 127 #define FAHRENHEIT 0x80
StressedDave 0:24f23c36dd24 128
StressedDave 0:24f23c36dd24 129 //Definitions for power mode
StressedDave 0:24f23c36dd24 130 #define POWER_MODE_NORMAL 0x00
StressedDave 0:24f23c36dd24 131 #define POWER_MODE_LOWPOWER 0x01
StressedDave 0:24f23c36dd24 132 #define POWER_MODE_SUSPEND 0x02
StressedDave 0:24f23c36dd24 133
StressedDave 0:24f23c36dd24 134 //Definitions for operating mode
StressedDave 0:24f23c36dd24 135 #define OPERATION_MODE_CONFIG 0x00
StressedDave 0:24f23c36dd24 136 #define OPERATION_MODE_ACCONLY 0x01
StressedDave 0:24f23c36dd24 137 #define OPERATION_MODE_MAGONLY 0x02
StressedDave 0:24f23c36dd24 138 #define OPERATION_MODE_GYRONLY 0x03
StressedDave 0:24f23c36dd24 139 #define OPERATION_MODE_ACCMAG 0x04
StressedDave 0:24f23c36dd24 140 #define OPERATION_MODE_ACCGYRO 0x05
StressedDave 0:24f23c36dd24 141 #define OPERATION_MODE_MAGGYRO 0x06
StressedDave 0:24f23c36dd24 142 #define OPERATION_MODE_AMG 0x07
StressedDave 0:24f23c36dd24 143 #define OPERATION_MODE_IMUPLUS 0x08
StressedDave 0:24f23c36dd24 144 #define OPERATION_MODE_COMPASS 0x09
StressedDave 0:24f23c36dd24 145 #define OPERATION_MODE_M4G 0x0A
StressedDave 0:24f23c36dd24 146 #define OPERATION_MODE_NDOF_FMC_OFF 0x0B
StressedDave 0:24f23c36dd24 147 #define OPERATION_MODE_NDOF 0x0C
StressedDave 0:24f23c36dd24 148
StressedDave 0:24f23c36dd24 149 typedef struct values{
StressedDave 0:24f23c36dd24 150 int16_t rawx,rawy,rawz;
StressedDave 0:24f23c36dd24 151 float x,y,z;
StressedDave 0:24f23c36dd24 152 }values;
StressedDave 0:24f23c36dd24 153
StressedDave 0:24f23c36dd24 154 typedef struct angles{
StressedDave 0:24f23c36dd24 155 int16_t rawroll,rawpitch,rawyaw;
StressedDave 0:24f23c36dd24 156 float roll, pitch, yaw;
StressedDave 0:24f23c36dd24 157 } angles;
StressedDave 0:24f23c36dd24 158
StressedDave 0:24f23c36dd24 159 typedef struct quaternion{
StressedDave 0:24f23c36dd24 160 int16_t raww,rawx,rawy,rawz;
StressedDave 0:24f23c36dd24 161 float w,x,y,z;
StressedDave 0:24f23c36dd24 162 }quaternion;
StressedDave 0:24f23c36dd24 163
StressedDave 0:24f23c36dd24 164 typedef struct chip{
StressedDave 0:24f23c36dd24 165 char id;
StressedDave 0:24f23c36dd24 166 char accel;
StressedDave 0:24f23c36dd24 167 char gyro;
StressedDave 0:24f23c36dd24 168 char mag;
StressedDave 0:24f23c36dd24 169 char sw[2];
StressedDave 0:24f23c36dd24 170 char bootload;
StressedDave 0:24f23c36dd24 171 char serial[16];
StressedDave 0:24f23c36dd24 172 }chip;
StressedDave 0:24f23c36dd24 173
StressedDave 0:24f23c36dd24 174
StressedDave 0:24f23c36dd24 175 class BNO055
StressedDave 0:24f23c36dd24 176 {
StressedDave 0:24f23c36dd24 177 public:
StressedDave 0:24f23c36dd24 178
StressedDave 0:24f23c36dd24 179 BNO055(PinName SDA, PinName SCL);
StressedDave 0:24f23c36dd24 180 void reset();
StressedDave 0:24f23c36dd24 181 bool check();
StressedDave 0:24f23c36dd24 182 void SetExternalCrystal(bool yn);
StressedDave 0:24f23c36dd24 183
StressedDave 0:24f23c36dd24 184 void setmode(char mode);
StressedDave 0:24f23c36dd24 185 void setpowermode(char mode);
StressedDave 0:24f23c36dd24 186
StressedDave 0:24f23c36dd24 187 void set_accel_units(char units);
StressedDave 0:24f23c36dd24 188 void set_anglerate_units(char units);
StressedDave 0:24f23c36dd24 189 void set_angle_units(char units);
StressedDave 0:24f23c36dd24 190 void set_temp_units(char units);
StressedDave 0:24f23c36dd24 191 void get_accel(void);
StressedDave 0:24f23c36dd24 192 void get_gyro(void);
StressedDave 0:24f23c36dd24 193 void get_mag(void);
StressedDave 0:24f23c36dd24 194 void get_lia(void);
StressedDave 0:24f23c36dd24 195 void get_grv(void);
StressedDave 0:24f23c36dd24 196 void get_quat(void);
StressedDave 0:24f23c36dd24 197 void get_calib(void);
StressedDave 0:24f23c36dd24 198
StressedDave 0:24f23c36dd24 199 values accel,gyro,mag,lia,gravity;
StressedDave 0:24f23c36dd24 200 angles euler;
StressedDave 0:24f23c36dd24 201 quaternion quat;
StressedDave 0:24f23c36dd24 202 char calib;
StressedDave 0:24f23c36dd24 203 char status;
StressedDave 0:24f23c36dd24 204 char calibration[22];
StressedDave 0:24f23c36dd24 205 chip ID;
StressedDave 0:24f23c36dd24 206 private:
StressedDave 0:24f23c36dd24 207
StressedDave 0:24f23c36dd24 208 I2C _i2c;
StressedDave 0:24f23c36dd24 209 char rx,tx[2],address; //I2C variables
StressedDave 0:24f23c36dd24 210 char rawdata[16]; //Temporary array for input data values
StressedDave 0:24f23c36dd24 211 char op_mode;
StressedDave 0:24f23c36dd24 212 char pwr_mode;
StressedDave 0:24f23c36dd24 213 float accel_scale,rate_scale,angle_scale,temp_scale;
StressedDave 0:24f23c36dd24 214
StressedDave 0:24f23c36dd24 215 void readchar(char location){
StressedDave 0:24f23c36dd24 216 tx[0] = location;
StressedDave 0:24f23c36dd24 217 _i2c.write(address,tx,1,true);
StressedDave 0:24f23c36dd24 218 _i2c.read(address,&rx,1,false);
StressedDave 0:24f23c36dd24 219 }
StressedDave 0:24f23c36dd24 220
StressedDave 0:24f23c36dd24 221 void writechar(char location, char value){
StressedDave 0:24f23c36dd24 222 tx[0] = location;
StressedDave 0:24f23c36dd24 223 tx[1] = value;
StressedDave 0:24f23c36dd24 224 _i2c.write(address,tx,2);
StressedDave 0:24f23c36dd24 225 }
StressedDave 0:24f23c36dd24 226
StressedDave 0:24f23c36dd24 227 void setpage(char value){
StressedDave 0:24f23c36dd24 228 writechar(BNO055_PAGE_ID_ADDR,value);
StressedDave 0:24f23c36dd24 229 }
StressedDave 0:24f23c36dd24 230 };
StressedDave 0:24f23c36dd24 231 #endif