Statistics
| Branch: | Revision:

adafruit_bno055 / Adafruit_BNO055.h @ 5d8d461e

History | View | Annotate | Download (10.448 KB)

1
/*!
2
 *  @file Adafruit_BNO055.h
3
 *
4
 *    This is a library for the BNO055 orientation sensor
5
 *
6
 *    Designed specifically to work with the Adafruit BNO055 Breakout.
7
 *
8
 *    Pick one up today in the adafruit shop!
9
 *    ------> https://www.adafruit.com/product/2472
10
 *
11
 *    These sensors use I2C to communicate, 2 pins are required to interface.
12
 *
13
 *    Adafruit invests time and resources providing this open source code,
14
 *    please support Adafruit andopen-source hardware by purchasing products
15
 *    from Adafruit!
16
 *
17
 *    K.Townsend (Adafruit Industries)*
18
 *
19
 *    MIT license, all text above must be included in any redistribution
20
 */
21

    
22
#ifndef __ADAFRUIT_BNO055_H__
23
#define __ADAFRUIT_BNO055_H__
24

    
25
#if (ARDUINO >= 100)
26
#include "Arduino.h"
27
#else
28
#include "WProgram.h"
29
#endif
30

    
31
#ifdef __AVR_ATtiny85__
32
#include <TinyWireM.h>
33
#define Wire TinyWireM
34
#else
35
#include <Wire.h>
36
#endif
37

    
38
#include <Adafruit_Sensor.h>
39
#include <utility/imumaths.h>
40

    
41
/** BNO055 Address A **/
42
#define BNO055_ADDRESS_A (0x28)
43
/** BNO055 Address B **/
44
#define BNO055_ADDRESS_B (0x29)
45
/** BNO055 ID **/
46
#define BNO055_ID (0xA0)
47

    
48
/** Offsets registers **/
49
#define NUM_BNO055_OFFSET_REGISTERS (22)
50

    
51
/** A structure to represent offsets **/
52
typedef struct {
53
  int16_t accel_offset_x; /**< x acceleration offset */
54
  int16_t accel_offset_y; /**< y acceleration offset */
55
  int16_t accel_offset_z; /**< z acceleration offset */
56

    
57
  int16_t mag_offset_x; /**< x magnetometer offset */
58
  int16_t mag_offset_y; /**< y magnetometer offset */
59
  int16_t mag_offset_z; /**< z magnetometer offset */
60

    
61
  int16_t gyro_offset_x; /**< x gyroscrope offset */
62
  int16_t gyro_offset_y; /**< y gyroscrope offset */
63
  int16_t gyro_offset_z; /**< z gyroscrope offset */
64

    
65
  int16_t accel_radius; /**< acceleration radius */
66

    
67
  int16_t mag_radius; /**< magnetometer radius */
68
} adafruit_bno055_offsets_t;
69

    
70
/*!
71
 *  @brief  Class that stores state and functions for interacting with
72
 *          BNO055 Sensor
73
 */
74
class Adafruit_BNO055 : public Adafruit_Sensor {
75
public:
76
  /** BNO055 Registers **/
77
  typedef enum {
78
    /* Page id register definition */
79
    BNO055_PAGE_ID_ADDR = 0X07,
80

    
81
    /* PAGE0 REGISTER DEFINITION START*/
82
    BNO055_CHIP_ID_ADDR = 0x00,
83
    BNO055_ACCEL_REV_ID_ADDR = 0x01,
84
    BNO055_MAG_REV_ID_ADDR = 0x02,
85
    BNO055_GYRO_REV_ID_ADDR = 0x03,
86
    BNO055_SW_REV_ID_LSB_ADDR = 0x04,
87
    BNO055_SW_REV_ID_MSB_ADDR = 0x05,
88
    BNO055_BL_REV_ID_ADDR = 0X06,
89

    
90
    /* Accel data register */
91
    BNO055_ACCEL_DATA_X_LSB_ADDR = 0X08,
92
    BNO055_ACCEL_DATA_X_MSB_ADDR = 0X09,
93
    BNO055_ACCEL_DATA_Y_LSB_ADDR = 0X0A,
94
    BNO055_ACCEL_DATA_Y_MSB_ADDR = 0X0B,
95
    BNO055_ACCEL_DATA_Z_LSB_ADDR = 0X0C,
96
    BNO055_ACCEL_DATA_Z_MSB_ADDR = 0X0D,
97

    
98
    /* Mag data register */
99
    BNO055_MAG_DATA_X_LSB_ADDR = 0X0E,
100
    BNO055_MAG_DATA_X_MSB_ADDR = 0X0F,
101
    BNO055_MAG_DATA_Y_LSB_ADDR = 0X10,
102
    BNO055_MAG_DATA_Y_MSB_ADDR = 0X11,
103
    BNO055_MAG_DATA_Z_LSB_ADDR = 0X12,
104
    BNO055_MAG_DATA_Z_MSB_ADDR = 0X13,
105

    
106
    /* Gyro data registers */
107
    BNO055_GYRO_DATA_X_LSB_ADDR = 0X14,
108
    BNO055_GYRO_DATA_X_MSB_ADDR = 0X15,
109
    BNO055_GYRO_DATA_Y_LSB_ADDR = 0X16,
110
    BNO055_GYRO_DATA_Y_MSB_ADDR = 0X17,
111
    BNO055_GYRO_DATA_Z_LSB_ADDR = 0X18,
112
    BNO055_GYRO_DATA_Z_MSB_ADDR = 0X19,
113

    
114
    /* Euler data registers */
115
    BNO055_EULER_H_LSB_ADDR = 0X1A,
116
    BNO055_EULER_H_MSB_ADDR = 0X1B,
117
    BNO055_EULER_R_LSB_ADDR = 0X1C,
118
    BNO055_EULER_R_MSB_ADDR = 0X1D,
119
    BNO055_EULER_P_LSB_ADDR = 0X1E,
120
    BNO055_EULER_P_MSB_ADDR = 0X1F,
121

    
122
    /* Quaternion data registers */
123
    BNO055_QUATERNION_DATA_W_LSB_ADDR = 0X20,
124
    BNO055_QUATERNION_DATA_W_MSB_ADDR = 0X21,
125
    BNO055_QUATERNION_DATA_X_LSB_ADDR = 0X22,
126
    BNO055_QUATERNION_DATA_X_MSB_ADDR = 0X23,
127
    BNO055_QUATERNION_DATA_Y_LSB_ADDR = 0X24,
128
    BNO055_QUATERNION_DATA_Y_MSB_ADDR = 0X25,
129
    BNO055_QUATERNION_DATA_Z_LSB_ADDR = 0X26,
130
    BNO055_QUATERNION_DATA_Z_MSB_ADDR = 0X27,
131

    
132
    /* Linear acceleration data registers */
133
    BNO055_LINEAR_ACCEL_DATA_X_LSB_ADDR = 0X28,
134
    BNO055_LINEAR_ACCEL_DATA_X_MSB_ADDR = 0X29,
135
    BNO055_LINEAR_ACCEL_DATA_Y_LSB_ADDR = 0X2A,
136
    BNO055_LINEAR_ACCEL_DATA_Y_MSB_ADDR = 0X2B,
137
    BNO055_LINEAR_ACCEL_DATA_Z_LSB_ADDR = 0X2C,
138
    BNO055_LINEAR_ACCEL_DATA_Z_MSB_ADDR = 0X2D,
139

    
140
    /* Gravity data registers */
141
    BNO055_GRAVITY_DATA_X_LSB_ADDR = 0X2E,
142
    BNO055_GRAVITY_DATA_X_MSB_ADDR = 0X2F,
143
    BNO055_GRAVITY_DATA_Y_LSB_ADDR = 0X30,
144
    BNO055_GRAVITY_DATA_Y_MSB_ADDR = 0X31,
145
    BNO055_GRAVITY_DATA_Z_LSB_ADDR = 0X32,
146
    BNO055_GRAVITY_DATA_Z_MSB_ADDR = 0X33,
147

    
148
    /* Temperature data register */
149
    BNO055_TEMP_ADDR = 0X34,
150

    
151
    /* Status registers */
152
    BNO055_CALIB_STAT_ADDR = 0X35,
153
    BNO055_SELFTEST_RESULT_ADDR = 0X36,
154
    BNO055_INTR_STAT_ADDR = 0X37,
155

    
156
    BNO055_SYS_CLK_STAT_ADDR = 0X38,
157
    BNO055_SYS_STAT_ADDR = 0X39,
158
    BNO055_SYS_ERR_ADDR = 0X3A,
159

    
160
    /* Unit selection register */
161
    BNO055_UNIT_SEL_ADDR = 0X3B,
162
    BNO055_DATA_SELECT_ADDR = 0X3C,
163

    
164
    /* Mode registers */
165
    BNO055_OPR_MODE_ADDR = 0X3D,
166
    BNO055_PWR_MODE_ADDR = 0X3E,
167

    
168
    BNO055_SYS_TRIGGER_ADDR = 0X3F,
169
    BNO055_TEMP_SOURCE_ADDR = 0X40,
170

    
171
    /* Axis remap registers */
172
    BNO055_AXIS_MAP_CONFIG_ADDR = 0X41,
173
    BNO055_AXIS_MAP_SIGN_ADDR = 0X42,
174

    
175
    /* SIC registers */
176
    BNO055_SIC_MATRIX_0_LSB_ADDR = 0X43,
177
    BNO055_SIC_MATRIX_0_MSB_ADDR = 0X44,
178
    BNO055_SIC_MATRIX_1_LSB_ADDR = 0X45,
179
    BNO055_SIC_MATRIX_1_MSB_ADDR = 0X46,
180
    BNO055_SIC_MATRIX_2_LSB_ADDR = 0X47,
181
    BNO055_SIC_MATRIX_2_MSB_ADDR = 0X48,
182
    BNO055_SIC_MATRIX_3_LSB_ADDR = 0X49,
183
    BNO055_SIC_MATRIX_3_MSB_ADDR = 0X4A,
184
    BNO055_SIC_MATRIX_4_LSB_ADDR = 0X4B,
185
    BNO055_SIC_MATRIX_4_MSB_ADDR = 0X4C,
186
    BNO055_SIC_MATRIX_5_LSB_ADDR = 0X4D,
187
    BNO055_SIC_MATRIX_5_MSB_ADDR = 0X4E,
188
    BNO055_SIC_MATRIX_6_LSB_ADDR = 0X4F,
189
    BNO055_SIC_MATRIX_6_MSB_ADDR = 0X50,
190
    BNO055_SIC_MATRIX_7_LSB_ADDR = 0X51,
191
    BNO055_SIC_MATRIX_7_MSB_ADDR = 0X52,
192
    BNO055_SIC_MATRIX_8_LSB_ADDR = 0X53,
193
    BNO055_SIC_MATRIX_8_MSB_ADDR = 0X54,
194

    
195
    /* Accelerometer Offset registers */
196
    ACCEL_OFFSET_X_LSB_ADDR = 0X55,
197
    ACCEL_OFFSET_X_MSB_ADDR = 0X56,
198
    ACCEL_OFFSET_Y_LSB_ADDR = 0X57,
199
    ACCEL_OFFSET_Y_MSB_ADDR = 0X58,
200
    ACCEL_OFFSET_Z_LSB_ADDR = 0X59,
201
    ACCEL_OFFSET_Z_MSB_ADDR = 0X5A,
202

    
203
    /* Magnetometer Offset registers */
204
    MAG_OFFSET_X_LSB_ADDR = 0X5B,
205
    MAG_OFFSET_X_MSB_ADDR = 0X5C,
206
    MAG_OFFSET_Y_LSB_ADDR = 0X5D,
207
    MAG_OFFSET_Y_MSB_ADDR = 0X5E,
208
    MAG_OFFSET_Z_LSB_ADDR = 0X5F,
209
    MAG_OFFSET_Z_MSB_ADDR = 0X60,
210

    
211
    /* Gyroscope Offset register s*/
212
    GYRO_OFFSET_X_LSB_ADDR = 0X61,
213
    GYRO_OFFSET_X_MSB_ADDR = 0X62,
214
    GYRO_OFFSET_Y_LSB_ADDR = 0X63,
215
    GYRO_OFFSET_Y_MSB_ADDR = 0X64,
216
    GYRO_OFFSET_Z_LSB_ADDR = 0X65,
217
    GYRO_OFFSET_Z_MSB_ADDR = 0X66,
218

    
219
    /* Radius registers */
220
    ACCEL_RADIUS_LSB_ADDR = 0X67,
221
    ACCEL_RADIUS_MSB_ADDR = 0X68,
222
    MAG_RADIUS_LSB_ADDR = 0X69,
223
    MAG_RADIUS_MSB_ADDR = 0X6A
224
  } adafruit_bno055_reg_t;
225

    
226
  /** BNO055 power settings */
227
  typedef enum {
228
    POWER_MODE_NORMAL = 0X00,
229
    POWER_MODE_LOWPOWER = 0X01,
230
    POWER_MODE_SUSPEND = 0X02
231
  } adafruit_bno055_powermode_t;
232

    
233
  /** Operation mode settings **/
234
  typedef enum {
235
    OPERATION_MODE_CONFIG = 0X00,
236
    OPERATION_MODE_ACCONLY = 0X01,
237
    OPERATION_MODE_MAGONLY = 0X02,
238
    OPERATION_MODE_GYRONLY = 0X03,
239
    OPERATION_MODE_ACCMAG = 0X04,
240
    OPERATION_MODE_ACCGYRO = 0X05,
241
    OPERATION_MODE_MAGGYRO = 0X06,
242
    OPERATION_MODE_AMG = 0X07,
243
    OPERATION_MODE_IMUPLUS = 0X08,
244
    OPERATION_MODE_COMPASS = 0X09,
245
    OPERATION_MODE_M4G = 0X0A,
246
    OPERATION_MODE_NDOF_FMC_OFF = 0X0B,
247
    OPERATION_MODE_NDOF = 0X0C
248
  } adafruit_bno055_opmode_t;
249

    
250
  /** Remap settings **/
251
  typedef enum {
252
    REMAP_CONFIG_P0 = 0x21,
253
    REMAP_CONFIG_P1 = 0x24, // default
254
    REMAP_CONFIG_P2 = 0x24,
255
    REMAP_CONFIG_P3 = 0x21,
256
    REMAP_CONFIG_P4 = 0x24,
257
    REMAP_CONFIG_P5 = 0x21,
258
    REMAP_CONFIG_P6 = 0x21,
259
    REMAP_CONFIG_P7 = 0x24
260
  } adafruit_bno055_axis_remap_config_t;
261

    
262
  /** Remap Signs **/
263
  typedef enum {
264
    REMAP_SIGN_P0 = 0x04,
265
    REMAP_SIGN_P1 = 0x00, // default
266
    REMAP_SIGN_P2 = 0x06,
267
    REMAP_SIGN_P3 = 0x02,
268
    REMAP_SIGN_P4 = 0x03,
269
    REMAP_SIGN_P5 = 0x01,
270
    REMAP_SIGN_P6 = 0x07,
271
    REMAP_SIGN_P7 = 0x05
272
  } adafruit_bno055_axis_remap_sign_t;
273

    
274
  /** A structure to represent revisions **/
275
  typedef struct {
276
    uint8_t accel_rev; /**< acceleration rev */
277
    uint8_t mag_rev;   /**< magnetometer rev */
278
    uint8_t gyro_rev;  /**< gyroscrope rev */
279
    uint16_t sw_rev;   /**< SW rev */
280
    uint8_t bl_rev;    /**< bootloader rev */
281
  } adafruit_bno055_rev_info_t;
282

    
283
  /** Vector Mappings **/
284
  typedef enum {
285
    VECTOR_ACCELEROMETER = BNO055_ACCEL_DATA_X_LSB_ADDR,
286
    VECTOR_MAGNETOMETER = BNO055_MAG_DATA_X_LSB_ADDR,
287
    VECTOR_GYROSCOPE = BNO055_GYRO_DATA_X_LSB_ADDR,
288
    VECTOR_EULER = BNO055_EULER_H_LSB_ADDR,
289
    VECTOR_LINEARACCEL = BNO055_LINEAR_ACCEL_DATA_X_LSB_ADDR,
290
    VECTOR_GRAVITY = BNO055_GRAVITY_DATA_X_LSB_ADDR
291
  } adafruit_vector_type_t;
292

    
293
#if defined(ARDUINO_SAMD_ZERO) && !(ARDUINO_SAMD_FEATHER_M0)
294
#error                                                                         \
295
    "On an arduino Zero, BNO055's ADR pin must be high. Fix that, then delete \
296
         this line."
297
  Adafruit_BNO055(int32_t sensorID = -1, uint8_t address = BNO055_ADDRESS_B);
298
#else
299
  Adafruit_BNO055(int32_t sensorID = -1, uint8_t address = BNO055_ADDRESS_A);
300
#endif
301
  bool begin(adafruit_bno055_opmode_t mode = OPERATION_MODE_NDOF);
302
  void setMode(adafruit_bno055_opmode_t mode);
303
  void setAxisRemap(adafruit_bno055_axis_remap_config_t remapcode);
304
  void setAxisSign(adafruit_bno055_axis_remap_sign_t remapsign);
305
  void getRevInfo(adafruit_bno055_rev_info_t *);
306
  void setExtCrystalUse(boolean usextal);
307
  void getSystemStatus(uint8_t *system_status, uint8_t *self_test_result,
308
                       uint8_t *system_error);
309
  void getCalibration(uint8_t *system, uint8_t *gyro, uint8_t *accel,
310
                      uint8_t *mag);
311

    
312
  imu::Vector<3> getVector(adafruit_vector_type_t vector_type);
313
  imu::Quaternion getQuat();
314
  int8_t getTemp();
315

    
316
  /* Adafruit_Sensor implementation */
317
  bool getEvent(sensors_event_t *);
318
  void getSensor(sensor_t *);
319

    
320
  /* Functions to deal with raw calibration data */
321
  bool getSensorOffsets(uint8_t *calibData);
322
  bool getSensorOffsets(adafruit_bno055_offsets_t &offsets_type);
323
  void setSensorOffsets(const uint8_t *calibData);
324
  void setSensorOffsets(const adafruit_bno055_offsets_t &offsets_type);
325
  bool isFullyCalibrated();
326

    
327
private:
328
  byte read8(adafruit_bno055_reg_t);
329
  bool readLen(adafruit_bno055_reg_t, byte *buffer, uint8_t len);
330
  bool write8(adafruit_bno055_reg_t, byte value);
331

    
332
  uint8_t _address;
333
  int32_t _sensorID;
334
  adafruit_bno055_opmode_t _mode;
335
};
336

    
337
#endif