Statistics
| Branch: | Revision:

adafruit_bno055 / Adafruit_BNO055.h @ 5dd991c7

History | View | Annotate | Download (10.173 KB)

1 55e2f6d1 Jan Hoffmann
/*!
2 5d8d461e Jan Hoffmann
 *  @file Adafruit_BNO055.h
3 55e2f6d1 Jan Hoffmann
 *
4 f51cf589 Jan Hoffmann
 *  This is a library for the BNO055 orientation sensor
5 55e2f6d1 Jan Hoffmann
 *
6 f51cf589 Jan Hoffmann
 *  Designed specifically to work with the Adafruit BNO055 Breakout.
7 55e2f6d1 Jan Hoffmann
 *
8 f51cf589 Jan Hoffmann
 *  Pick one up today in the adafruit shop!
9
 *  ------> https://www.adafruit.com/product/2472
10 55e2f6d1 Jan Hoffmann
 *
11 f51cf589 Jan Hoffmann
 *  These sensors use I2C to communicate, 2 pins are required to interface.
12 55e2f6d1 Jan Hoffmann
 *
13 f51cf589 Jan Hoffmann
 *  Adafruit invests time and resources providing this open source code,
14
 *  please support Adafruit andopen-source hardware by purchasing products
15
 *  from Adafruit!
16 55e2f6d1 Jan Hoffmann
 *
17 75f03d2e Szymon Kaliski
 *  K.Townsend (Adafruit Industries)
18 55e2f6d1 Jan Hoffmann
 *
19 f51cf589 Jan Hoffmann
 *  MIT license, all text above must be included in any redistribution
20 55e2f6d1 Jan Hoffmann
 */
21 4bc1c0c1 Kevin Townsend
22
#ifndef __ADAFRUIT_BNO055_H__
23
#define __ADAFRUIT_BNO055_H__
24
25 55e2f6d1 Jan Hoffmann
#include "Arduino.h"
26
#include <Wire.h>
27 4bc1c0c1 Kevin Townsend
28
#include <Adafruit_Sensor.h>
29 05b57936 ulysse314
#include "utility/imumaths.h"
30 4bc1c0c1 Kevin Townsend
31 5d8d461e Jan Hoffmann
/** BNO055 Address A **/
32 4bc1c0c1 Kevin Townsend
#define BNO055_ADDRESS_A (0x28)
33 5d8d461e Jan Hoffmann
/** BNO055 Address B **/
34 4bc1c0c1 Kevin Townsend
#define BNO055_ADDRESS_B (0x29)
35 5d8d461e Jan Hoffmann
/** BNO055 ID **/
36 55e2f6d1 Jan Hoffmann
#define BNO055_ID (0xA0)
37 4bc1c0c1 Kevin Townsend
38 5d8d461e Jan Hoffmann
/** Offsets registers **/
39 312a5b9e Wetmelon
#define NUM_BNO055_OFFSET_REGISTERS (22)
40
41 55e2f6d1 Jan Hoffmann
/** A structure to represent offsets **/
42
typedef struct {
43
  int16_t accel_offset_x; /**< x acceleration offset */
44
  int16_t accel_offset_y; /**< y acceleration offset */
45
  int16_t accel_offset_z; /**< z acceleration offset */
46
47
  int16_t mag_offset_x; /**< x magnetometer offset */
48
  int16_t mag_offset_y; /**< y magnetometer offset */
49
  int16_t mag_offset_z; /**< z magnetometer offset */
50
51
  int16_t gyro_offset_x; /**< x gyroscrope offset */
52
  int16_t gyro_offset_y; /**< y gyroscrope offset */
53
  int16_t gyro_offset_z; /**< z gyroscrope offset */
54
55
  int16_t accel_radius; /**< acceleration radius */
56
57
  int16_t mag_radius; /**< magnetometer radius */
58 312a5b9e Wetmelon
} adafruit_bno055_offsets_t;
59
60 55e2f6d1 Jan Hoffmann
/*!
61
 *  @brief  Class that stores state and functions for interacting with
62
 *          BNO055 Sensor
63
 */
64
class Adafruit_BNO055 : public Adafruit_Sensor {
65
public:
66
  /** BNO055 Registers **/
67
  typedef enum {
68
    /* Page id register definition */
69
    BNO055_PAGE_ID_ADDR = 0X07,
70
71
    /* PAGE0 REGISTER DEFINITION START*/
72
    BNO055_CHIP_ID_ADDR = 0x00,
73
    BNO055_ACCEL_REV_ID_ADDR = 0x01,
74
    BNO055_MAG_REV_ID_ADDR = 0x02,
75
    BNO055_GYRO_REV_ID_ADDR = 0x03,
76
    BNO055_SW_REV_ID_LSB_ADDR = 0x04,
77
    BNO055_SW_REV_ID_MSB_ADDR = 0x05,
78
    BNO055_BL_REV_ID_ADDR = 0X06,
79
80
    /* Accel data register */
81
    BNO055_ACCEL_DATA_X_LSB_ADDR = 0X08,
82
    BNO055_ACCEL_DATA_X_MSB_ADDR = 0X09,
83
    BNO055_ACCEL_DATA_Y_LSB_ADDR = 0X0A,
84
    BNO055_ACCEL_DATA_Y_MSB_ADDR = 0X0B,
85
    BNO055_ACCEL_DATA_Z_LSB_ADDR = 0X0C,
86
    BNO055_ACCEL_DATA_Z_MSB_ADDR = 0X0D,
87
88
    /* Mag data register */
89
    BNO055_MAG_DATA_X_LSB_ADDR = 0X0E,
90
    BNO055_MAG_DATA_X_MSB_ADDR = 0X0F,
91
    BNO055_MAG_DATA_Y_LSB_ADDR = 0X10,
92
    BNO055_MAG_DATA_Y_MSB_ADDR = 0X11,
93
    BNO055_MAG_DATA_Z_LSB_ADDR = 0X12,
94
    BNO055_MAG_DATA_Z_MSB_ADDR = 0X13,
95
96
    /* Gyro data registers */
97
    BNO055_GYRO_DATA_X_LSB_ADDR = 0X14,
98
    BNO055_GYRO_DATA_X_MSB_ADDR = 0X15,
99
    BNO055_GYRO_DATA_Y_LSB_ADDR = 0X16,
100
    BNO055_GYRO_DATA_Y_MSB_ADDR = 0X17,
101
    BNO055_GYRO_DATA_Z_LSB_ADDR = 0X18,
102
    BNO055_GYRO_DATA_Z_MSB_ADDR = 0X19,
103
104
    /* Euler data registers */
105
    BNO055_EULER_H_LSB_ADDR = 0X1A,
106
    BNO055_EULER_H_MSB_ADDR = 0X1B,
107
    BNO055_EULER_R_LSB_ADDR = 0X1C,
108
    BNO055_EULER_R_MSB_ADDR = 0X1D,
109
    BNO055_EULER_P_LSB_ADDR = 0X1E,
110
    BNO055_EULER_P_MSB_ADDR = 0X1F,
111
112
    /* Quaternion data registers */
113
    BNO055_QUATERNION_DATA_W_LSB_ADDR = 0X20,
114
    BNO055_QUATERNION_DATA_W_MSB_ADDR = 0X21,
115
    BNO055_QUATERNION_DATA_X_LSB_ADDR = 0X22,
116
    BNO055_QUATERNION_DATA_X_MSB_ADDR = 0X23,
117
    BNO055_QUATERNION_DATA_Y_LSB_ADDR = 0X24,
118
    BNO055_QUATERNION_DATA_Y_MSB_ADDR = 0X25,
119
    BNO055_QUATERNION_DATA_Z_LSB_ADDR = 0X26,
120
    BNO055_QUATERNION_DATA_Z_MSB_ADDR = 0X27,
121
122
    /* Linear acceleration data registers */
123
    BNO055_LINEAR_ACCEL_DATA_X_LSB_ADDR = 0X28,
124
    BNO055_LINEAR_ACCEL_DATA_X_MSB_ADDR = 0X29,
125
    BNO055_LINEAR_ACCEL_DATA_Y_LSB_ADDR = 0X2A,
126
    BNO055_LINEAR_ACCEL_DATA_Y_MSB_ADDR = 0X2B,
127
    BNO055_LINEAR_ACCEL_DATA_Z_LSB_ADDR = 0X2C,
128
    BNO055_LINEAR_ACCEL_DATA_Z_MSB_ADDR = 0X2D,
129
130
    /* Gravity data registers */
131
    BNO055_GRAVITY_DATA_X_LSB_ADDR = 0X2E,
132
    BNO055_GRAVITY_DATA_X_MSB_ADDR = 0X2F,
133
    BNO055_GRAVITY_DATA_Y_LSB_ADDR = 0X30,
134
    BNO055_GRAVITY_DATA_Y_MSB_ADDR = 0X31,
135
    BNO055_GRAVITY_DATA_Z_LSB_ADDR = 0X32,
136
    BNO055_GRAVITY_DATA_Z_MSB_ADDR = 0X33,
137
138
    /* Temperature data register */
139
    BNO055_TEMP_ADDR = 0X34,
140
141
    /* Status registers */
142
    BNO055_CALIB_STAT_ADDR = 0X35,
143
    BNO055_SELFTEST_RESULT_ADDR = 0X36,
144
    BNO055_INTR_STAT_ADDR = 0X37,
145
146
    BNO055_SYS_CLK_STAT_ADDR = 0X38,
147
    BNO055_SYS_STAT_ADDR = 0X39,
148
    BNO055_SYS_ERR_ADDR = 0X3A,
149
150
    /* Unit selection register */
151
    BNO055_UNIT_SEL_ADDR = 0X3B,
152
    BNO055_DATA_SELECT_ADDR = 0X3C,
153
154
    /* Mode registers */
155
    BNO055_OPR_MODE_ADDR = 0X3D,
156
    BNO055_PWR_MODE_ADDR = 0X3E,
157
158
    BNO055_SYS_TRIGGER_ADDR = 0X3F,
159
    BNO055_TEMP_SOURCE_ADDR = 0X40,
160
161
    /* Axis remap registers */
162
    BNO055_AXIS_MAP_CONFIG_ADDR = 0X41,
163
    BNO055_AXIS_MAP_SIGN_ADDR = 0X42,
164
165
    /* SIC registers */
166
    BNO055_SIC_MATRIX_0_LSB_ADDR = 0X43,
167
    BNO055_SIC_MATRIX_0_MSB_ADDR = 0X44,
168
    BNO055_SIC_MATRIX_1_LSB_ADDR = 0X45,
169
    BNO055_SIC_MATRIX_1_MSB_ADDR = 0X46,
170
    BNO055_SIC_MATRIX_2_LSB_ADDR = 0X47,
171
    BNO055_SIC_MATRIX_2_MSB_ADDR = 0X48,
172
    BNO055_SIC_MATRIX_3_LSB_ADDR = 0X49,
173
    BNO055_SIC_MATRIX_3_MSB_ADDR = 0X4A,
174
    BNO055_SIC_MATRIX_4_LSB_ADDR = 0X4B,
175
    BNO055_SIC_MATRIX_4_MSB_ADDR = 0X4C,
176
    BNO055_SIC_MATRIX_5_LSB_ADDR = 0X4D,
177
    BNO055_SIC_MATRIX_5_MSB_ADDR = 0X4E,
178
    BNO055_SIC_MATRIX_6_LSB_ADDR = 0X4F,
179
    BNO055_SIC_MATRIX_6_MSB_ADDR = 0X50,
180
    BNO055_SIC_MATRIX_7_LSB_ADDR = 0X51,
181
    BNO055_SIC_MATRIX_7_MSB_ADDR = 0X52,
182
    BNO055_SIC_MATRIX_8_LSB_ADDR = 0X53,
183
    BNO055_SIC_MATRIX_8_MSB_ADDR = 0X54,
184
185
    /* Accelerometer Offset registers */
186
    ACCEL_OFFSET_X_LSB_ADDR = 0X55,
187
    ACCEL_OFFSET_X_MSB_ADDR = 0X56,
188
    ACCEL_OFFSET_Y_LSB_ADDR = 0X57,
189
    ACCEL_OFFSET_Y_MSB_ADDR = 0X58,
190
    ACCEL_OFFSET_Z_LSB_ADDR = 0X59,
191
    ACCEL_OFFSET_Z_MSB_ADDR = 0X5A,
192
193
    /* Magnetometer Offset registers */
194
    MAG_OFFSET_X_LSB_ADDR = 0X5B,
195
    MAG_OFFSET_X_MSB_ADDR = 0X5C,
196
    MAG_OFFSET_Y_LSB_ADDR = 0X5D,
197
    MAG_OFFSET_Y_MSB_ADDR = 0X5E,
198
    MAG_OFFSET_Z_LSB_ADDR = 0X5F,
199
    MAG_OFFSET_Z_MSB_ADDR = 0X60,
200
201
    /* Gyroscope Offset register s*/
202
    GYRO_OFFSET_X_LSB_ADDR = 0X61,
203
    GYRO_OFFSET_X_MSB_ADDR = 0X62,
204
    GYRO_OFFSET_Y_LSB_ADDR = 0X63,
205
    GYRO_OFFSET_Y_MSB_ADDR = 0X64,
206
    GYRO_OFFSET_Z_LSB_ADDR = 0X65,
207
    GYRO_OFFSET_Z_MSB_ADDR = 0X66,
208
209
    /* Radius registers */
210
    ACCEL_RADIUS_LSB_ADDR = 0X67,
211
    ACCEL_RADIUS_MSB_ADDR = 0X68,
212
    MAG_RADIUS_LSB_ADDR = 0X69,
213
    MAG_RADIUS_MSB_ADDR = 0X6A
214
  } adafruit_bno055_reg_t;
215
216
  /** BNO055 power settings */
217
  typedef enum {
218
    POWER_MODE_NORMAL = 0X00,
219
    POWER_MODE_LOWPOWER = 0X01,
220
    POWER_MODE_SUSPEND = 0X02
221
  } adafruit_bno055_powermode_t;
222
223
  /** Operation mode settings **/
224
  typedef enum {
225
    OPERATION_MODE_CONFIG = 0X00,
226
    OPERATION_MODE_ACCONLY = 0X01,
227
    OPERATION_MODE_MAGONLY = 0X02,
228
    OPERATION_MODE_GYRONLY = 0X03,
229
    OPERATION_MODE_ACCMAG = 0X04,
230
    OPERATION_MODE_ACCGYRO = 0X05,
231
    OPERATION_MODE_MAGGYRO = 0X06,
232
    OPERATION_MODE_AMG = 0X07,
233
    OPERATION_MODE_IMUPLUS = 0X08,
234
    OPERATION_MODE_COMPASS = 0X09,
235
    OPERATION_MODE_M4G = 0X0A,
236
    OPERATION_MODE_NDOF_FMC_OFF = 0X0B,
237
    OPERATION_MODE_NDOF = 0X0C
238
  } adafruit_bno055_opmode_t;
239
240
  /** Remap settings **/
241
  typedef enum {
242
    REMAP_CONFIG_P0 = 0x21,
243
    REMAP_CONFIG_P1 = 0x24, // default
244
    REMAP_CONFIG_P2 = 0x24,
245
    REMAP_CONFIG_P3 = 0x21,
246
    REMAP_CONFIG_P4 = 0x24,
247
    REMAP_CONFIG_P5 = 0x21,
248
    REMAP_CONFIG_P6 = 0x21,
249
    REMAP_CONFIG_P7 = 0x24
250
  } adafruit_bno055_axis_remap_config_t;
251
252
  /** Remap Signs **/
253
  typedef enum {
254
    REMAP_SIGN_P0 = 0x04,
255
    REMAP_SIGN_P1 = 0x00, // default
256
    REMAP_SIGN_P2 = 0x06,
257
    REMAP_SIGN_P3 = 0x02,
258
    REMAP_SIGN_P4 = 0x03,
259
    REMAP_SIGN_P5 = 0x01,
260
    REMAP_SIGN_P6 = 0x07,
261
    REMAP_SIGN_P7 = 0x05
262
  } adafruit_bno055_axis_remap_sign_t;
263
264
  /** A structure to represent revisions **/
265
  typedef struct {
266
    uint8_t accel_rev; /**< acceleration rev */
267
    uint8_t mag_rev;   /**< magnetometer rev */
268
    uint8_t gyro_rev;  /**< gyroscrope rev */
269
    uint16_t sw_rev;   /**< SW rev */
270
    uint8_t bl_rev;    /**< bootloader rev */
271
  } adafruit_bno055_rev_info_t;
272
273
  /** Vector Mappings **/
274
  typedef enum {
275
    VECTOR_ACCELEROMETER = BNO055_ACCEL_DATA_X_LSB_ADDR,
276
    VECTOR_MAGNETOMETER = BNO055_MAG_DATA_X_LSB_ADDR,
277
    VECTOR_GYROSCOPE = BNO055_GYRO_DATA_X_LSB_ADDR,
278
    VECTOR_EULER = BNO055_EULER_H_LSB_ADDR,
279
    VECTOR_LINEARACCEL = BNO055_LINEAR_ACCEL_DATA_X_LSB_ADDR,
280
    VECTOR_GRAVITY = BNO055_GRAVITY_DATA_X_LSB_ADDR
281
  } adafruit_vector_type_t;
282
283 9a8e8b26 Jan Hoffmann
  Adafruit_BNO055(int32_t sensorID = -1, uint8_t address = BNO055_ADDRESS_A,
284
                  TwoWire *theWire = &Wire);
285 f7556b0d Jan Hoffmann
286 9a8e8b26 Jan Hoffmann
  bool begin(adafruit_bno055_opmode_t mode = OPERATION_MODE_NDOF);
287 55e2f6d1 Jan Hoffmann
  void setMode(adafruit_bno055_opmode_t mode);
288
  void setAxisRemap(adafruit_bno055_axis_remap_config_t remapcode);
289
  void setAxisSign(adafruit_bno055_axis_remap_sign_t remapsign);
290
  void getRevInfo(adafruit_bno055_rev_info_t *);
291
  void setExtCrystalUse(boolean usextal);
292
  void getSystemStatus(uint8_t *system_status, uint8_t *self_test_result,
293
                       uint8_t *system_error);
294
  void getCalibration(uint8_t *system, uint8_t *gyro, uint8_t *accel,
295
                      uint8_t *mag);
296
297
  imu::Vector<3> getVector(adafruit_vector_type_t vector_type);
298
  imu::Quaternion getQuat();
299
  int8_t getTemp();
300
301
  /* Adafruit_Sensor implementation */
302
  bool getEvent(sensors_event_t *);
303 f0ebdf46 Jan Hoffmann
  bool getEvent(sensors_event_t *, adafruit_vector_type_t);
304 55e2f6d1 Jan Hoffmann
  void getSensor(sensor_t *);
305
306
  /* Functions to deal with raw calibration data */
307
  bool getSensorOffsets(uint8_t *calibData);
308
  bool getSensorOffsets(adafruit_bno055_offsets_t &offsets_type);
309
  void setSensorOffsets(const uint8_t *calibData);
310
  void setSensorOffsets(const adafruit_bno055_offsets_t &offsets_type);
311
  bool isFullyCalibrated();
312
313 f0ebdf46 Jan Hoffmann
  /* Power managments functions */
314
  void enterSuspendMode();
315
  void enterNormalMode();
316
317 55e2f6d1 Jan Hoffmann
private:
318
  byte read8(adafruit_bno055_reg_t);
319
  bool readLen(adafruit_bno055_reg_t, byte *buffer, uint8_t len);
320
  bool write8(adafruit_bno055_reg_t, byte value);
321
322
  uint8_t _address;
323 f7556b0d Jan Hoffmann
  TwoWire *_wire;
324
325 55e2f6d1 Jan Hoffmann
  int32_t _sensorID;
326
  adafruit_bno055_opmode_t _mode;
327 4bc1c0c1 Kevin Townsend
};
328
329
#endif