TR-mbed 1.0
Loading...
Searching...
No Matches
BNO055.h
Go to the documentation of this file.
1/*
2 * mbed library program
3 * BNO055 Intelligent 9-axis absolute orientation sensor
4 * by Bosch Sensortec
5 *
6 * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
7 * http://www.page.sannet.ne.jp/kenjia/index.html
8 * http://mbed.org/users/kenjiArai/
9 * Created: March 30th, 2015
10 * Revised: August 23rd, 2017
11 */
12/*
13 *---------------- REFERENCE ----------------------------------------------------------------------
14 * Original Information
15 * https://www.bosch-sensortec.com/en/homepage/products_3/sensor_hubs/iot_solutions/bno055_1/bno055_4
16 * Intelligent 9-axis absolute orientation sensor / Data Sheet BST_BNO055_DS000_12 Nov. 2014 rev.1.2
17 * Sample software https://github.com/BoschSensortec/BNO055_driver
18 * Sensor board
19 * https://www.rutronik24.com/product/bosch+se/bno055+shuttle+board+mems/6431291.html
20 * http://microcontrollershop.com/product_info.php?products_id=7140&osCsid=10645k86db2crld4tfi0vol5g5
21 */
22
23/*
24 * This library has been modified. Original can be found here: https://os.mbed.com/users/AlexanderLill/code/BNO055_fusion/
25 */
26
27#ifndef BNO055_H
28#define BNO055_H
29
30#include "mbed.h"
31
32#define PI 3.14159265
33
34// BNO055
35// 7bit address = 0b010100x(0x28 or 0x29 depends on COM3)
36#define BNO055_G_CHIP_ADDR (0x28 << 1) // COM3 = GND
37#define BNO055_V_CHIP_ADDR (0x29 << 1) // COM3 = Vdd
38
39// Fusion mode
40#define CONFIGMODE 0x00
41#define MODE_IMU 0x08
42#define MODE_COMPASS 0x09
43#define MODE_M4G 0x0a
44#define MODE_NDOF_FMC_OFF 0x0b
45#define MODE_NDOF 0x0c
46
47// UNIT
48#define UNIT_ACC_MSS 0x00 // acc m/s2
49#define UNIT_ACC_MG 0x01 // acc mg
50#define UNIT_GYR_DPS 0x00 // gyro Dps
51#define UNIT_GYR_RPS 0x02 // gyro Rps
52#define UNIT_EULER_DEG 0x00 // euler Degrees
53#define UNIT_EULER_RAD 0x04 // euler Radians
54#define UNIT_TEMP_C 0x00 // temperature degC
55#define UNIT_TEMP_F 0x10 // temperature degF
56#define UNIT_ORI_WIN 0x00 // Windows orientation
57#define UNIT_ORI_ANDROID 0x80 // Android orientation
58
59// ID's
60#define I_AM_BNO055_CHIP 0xa0 // CHIP ID
61#define I_AM_BNO055_ACC 0xfb // ACC ID
62#define I_AM_BNO055_MAG 0x32 // MAG ID
63#define I_AM_BNO055_GYR 0x0f // GYR ID
64
66typedef struct {
67 uint8_t chip_id;
68 uint8_t acc_id;
69 uint8_t mag_id;
70 uint8_t gyr_id;
72 uint16_t sw_rev_id;
74
75typedef struct {
76 double h;
77 double r;
78 double p;
80
81typedef struct {
82 double x;
83 double y;
84 double z;
85 double w;
87
88typedef struct{
89 double yaw;
90 double roll;
91 double pitch;
93
94typedef struct {
95 double x;
96 double y;
97 double z;
99
100typedef struct {
101 int8_t acc_chip;
102 int8_t gyr_chip;
104
106
141{
142public:
147 BNO055(PinName p_sda, PinName p_scl, PinName p_reset, uint8_t addr, uint8_t mode);
148
153 BNO055(PinName p_sda, PinName p_scl, PinName p_reset);
154
159 BNO055(I2C& p_i2c, PinName p_reset, uint8_t addr, uint8_t mode);
160
165 BNO055(I2C& p_i2c, PinName p_reset, uint8_t mode);
166
171
176
181
186
191
196
201
206
211
216 void change_fusion_mode(uint8_t mode);
217
224 void set_mounting_position(uint8_t position);
225
231
236 uint8_t chip_ready(void);
237
242 void calibrate(void);
243
248 uint8_t read_calib_status(void);
249
254 uint8_t reset(void);
255
260 void frequency(int hz);
261
266 uint8_t read_reg0(uint8_t addr);
267
273 uint8_t write_reg0(uint8_t addr, uint8_t data);
274
279 uint8_t read_reg1(uint8_t addr);
280
286 uint8_t write_reg1(uint8_t addr, uint8_t data);
287
291 bool use_degrees();
292
296 bool use_mss();
297
301 bool use_dps();
302
306 bool use_celsius();
307
309
311
312protected:
313 void initialize(void);
314 void initialize_reset_pin(void);
315 void get_id(void);
316 void set_initial_dt_to_regs(void);
317 void unit_selection(void);
318 uint8_t get_operating_mode(void);
319 uint8_t select_page(uint8_t page);
320
321 I2C *_i2c_p;
322 I2C &_i2c;
323 DigitalOut _res;
324
325private:
326 char dt[10]; // working buffer
327 uint8_t chip_addr;
328 uint8_t chip_mode;
329 uint8_t ready_flag;
330 uint8_t page_flag;
331
332 uint8_t chip_id;
333 uint8_t acc_id;
334 uint8_t mag_id;
335 uint8_t gyr_id;
336 uint8_t bootldr_rev_id;
337 uint16_t sw_rev_id;
338
339 bool unit_flag_is_set(uint8_t flag);
340};
341
342//---------------------------------------------------------
343//----- Register's definition -----------------------------
344//---------------------------------------------------------
345// Page id register definition
346#define BNO055_PAGE_ID 0x07
347
348//----- page0 ---------------------------------------------
349#define BNO055_CHIP_ID 0x00
350#define BNO055_ACCEL_REV_ID 0x01
351#define BNO055_MAG_REV_ID 0x02
352#define BNO055_GYRO_REV_ID 0x03
353#define BNO055_SW_REV_ID_LSB 0x04
354#define BNO055_SW_REV_ID_MSB 0x05
355#define BNO055_BL_REV_ID 0x06
356
357// Accel data register*/
358#define BNO055_ACC_X_LSB 0x08
359#define BNO055_ACC_X_MSB 0x09
360#define BNO055_ACC_Y_LSB 0x0a
361#define BNO055_ACC_Y_MSB 0x0b
362#define BNO055_ACC_Z_LSB 0x0c
363#define BNO055_ACC_Z_MSB 0x0d
364
365// Mag data register
366#define BNO055_MAG_X_LSB 0x0e
367#define BNO055_MAG_X_MSB 0x0f
368#define BNO055_MAG_Y_LSB 0x10
369#define BNO055_MAG_Y_MSB 0x11
370#define BNO055_MAG_Z_LSB 0x12
371#define BNO055_MAG_Z_MSB 0x13
372
373// Gyro data registers
374#define BNO055_GYR_X_LSB 0x14
375#define BNO055_GYR_X_MSB 0x15
376#define BNO055_GYR_Y_LSB 0x16
377#define BNO055_GYR_Y_MSB 0x17
378#define BNO055_GYR_Z_LSB 0x18
379#define BNO055_GYR_Z_MSB 0x19
380
381// Euler data registers
382#define BNO055_EULER_H_LSB 0x1a
383#define BNO055_EULER_H_MSB 0x1b
384
385#define BNO055_EULER_R_LSB 0x1c
386#define BNO055_EULER_R_MSB 0x1d
387
388#define BNO055_EULER_P_LSB 0x1e
389#define BNO055_EULER_P_MSB 0x1f
390
391// Quaternion data registers
392#define BNO055_QUATERNION_W_LSB 0x20
393#define BNO055_QUATERNION_W_MSB 0x21
394#define BNO055_QUATERNION_X_LSB 0x22
395#define BNO055_QUATERNION_X_MSB 0x23
396#define BNO055_QUATERNION_Y_LSB 0x24
397#define BNO055_QUATERNION_Y_MSB 0x25
398#define BNO055_QUATERNION_Z_LSB 0x26
399#define BNO055_QUATERNION_Z_MSB 0x27
400
401// Linear acceleration data registers
402#define BNO055_LINEAR_ACC_X_LSB 0x28
403#define BNO055_LINEAR_ACC_X_MSB 0x29
404#define BNO055_LINEAR_ACC_Y_LSB 0x2a
405#define BNO055_LINEAR_ACC_Y_MSB 0x2b
406#define BNO055_LINEAR_ACC_Z_LSB 0x2c
407#define BNO055_LINEAR_ACC_Z_MSB 0x2d
408
409// Gravity data registers
410#define BNO055_GRAVITY_X_LSB 0x2e
411#define BNO055_GRAVITY_X_MSB 0x2f
412#define BNO055_GRAVITY_Y_LSB 0x30
413#define BNO055_GRAVITY_Y_MSB 0x31
414#define BNO055_GRAVITY_Z_LSB 0x32
415#define BNO055_GRAVITY_Z_MSB 0x33
416
417// Temperature data register
418#define BNO055_TEMP 0x34
419
420// Status registers
421#define BNO055_CALIB_STAT 0x35
422#define BNO055_SELFTEST_RESULT 0x36
423#define BNO055_INTR_STAT 0x37
424#define BNO055_SYS_CLK_STAT 0x38
425#define BNO055_SYS_STAT 0x39
426#define BNO055_SYS_ERR 0x3a
427
428// Unit selection register
429#define BNO055_UNIT_SEL 0x3b
430#define BNO055_DATA_SELECT 0x3c
431
432// Mode registers
433#define BNO055_OPR_MODE 0x3d
434#define BNO055_PWR_MODE 0x3e
435#define BNO055_SYS_TRIGGER 0x3f
436#define BNO055_TEMP_SOURCE 0x40
437
438// Axis remap registers
439#define BNO055_AXIS_MAP_CONFIG 0x41
440#define BNO055_AXIS_MAP_SIGN 0x42
441
442// SIC registers
443#define BNO055_SIC_MTRX_0_LSB 0x43
444#define BNO055_SIC_MTRX_0_MSB 0x44
445#define BNO055_SIC_MTRX_1_LSB 0x45
446#define BNO055_SIC_MTRX_1_MSB 0x46
447#define BNO055_SIC_MTRX_2_LSB 0x47
448#define BNO055_SIC_MTRX_2_MSB 0x48
449#define BNO055_SIC_MTRX_3_LSB 0x49
450#define BNO055_SIC_MTRX_3_MSB 0x4a
451#define BNO055_SIC_MTRX_4_LSB 0x4b
452#define BNO055_SIC_MTRX_4_MSB 0x4c
453#define BNO055_SIC_MTRX_5_LSB 0x4d
454#define BNO055_SIC_MTRX_5_MSB 0x4e
455#define BNO055_SIC_MTRX_6_LSB 0x4f
456#define BNO055_SIC_MTRX_6_MSB 0x50
457#define BNO055_SIC_MTRX_7_LSB 0x51
458#define BNO055_SIC_MTRX_7_MSB 0x52
459#define BNO055_SIC_MTRX_8_LSB 0x53
460#define BNO055_SIC_MTRX_8_MSB 0x54
461
462// Accelerometer Offset registers
463#define ACCEL_OFFSET_X_LSB 0x55
464#define ACCEL_OFFSET_X_MSB 0x56
465#define ACCEL_OFFSET_Y_LSB 0x57
466#define ACCEL_OFFSET_Y_MSB 0x58
467#define ACCEL_OFFSET_Z_LSB 0x59
468#define ACCEL_OFFSET_Z_MSB 0x5a
469
470// Magnetometer Offset registers
471#define MAG_OFFSET_X_LSB 0x5b
472#define MAG_OFFSET_X_MSB 0x5c
473#define MAG_OFFSET_Y_LSB 0x5d
474#define MAG_OFFSET_Y_MSB 0x5e
475#define MAG_OFFSET_Z_LSB 0x5f
476#define MAG_OFFSET_Z_MSB 0x60
477
478// Gyroscope Offset registers
479#define GYRO_OFFSET_X_LSB 0x61
480#define GYRO_OFFSET_X_MSB 0x62
481#define GYRO_OFFSET_Y_LSB 0x63
482#define GYRO_OFFSET_Y_MSB 0x64
483#define GYRO_OFFSET_Z_LSB 0x65
484#define GYRO_OFFSET_Z_MSB 0x66
485
486// Radius registers
487#define ACCEL_RADIUS_LSB 0x67
488#define ACCEL_RADIUS_MSB 0x68
489#define MAG_RADIUS_LSB 0x69
490#define MAG_RADIUS_MSB 0x6a
491
492//----- page1 ---------------------------------------------
493// Configuration registers
494#define ACCEL_CONFIG 0x08
495#define MAG_CONFIG 0x09
496#define GYRO_CONFIG 0x0a
497#define GYRO_MODE_CONFIG 0x0b
498#define ACCEL_SLEEP_CONFIG 0x0c
499#define GYRO_SLEEP_CONFIG 0x0d
500#define MAG_SLEEP_CONFIG 0x0e
501
502// Interrupt registers
503#define INT_MASK 0x0f
504#define INT 0x10
505#define ACCEL_ANY_MOTION_THRES 0x11
506#define ACCEL_INTR_SETTINGS 0x12
507#define ACCEL_HIGH_G_DURN 0x13
508#define ACCEL_HIGH_G_THRES 0x14
509#define ACCEL_NO_MOTION_THRES 0x15
510#define ACCEL_NO_MOTION_SET 0x16
511#define GYRO_INTR_SETING 0x17
512#define GYRO_HIGHRATE_X_SET 0x18
513#define GYRO_DURN_X 0x19
514#define GYRO_HIGHRATE_Y_SET 0x1a
515#define GYRO_DURN_Y 0x1b
516#define GYRO_HIGHRATE_Z_SET 0x1c
517#define GYRO_DURN_Z 0x1d
518#define GYRO_ANY_MOTION_THRES 0x1e
519#define GYRO_ANY_MOTION_SET 0x1f
520
521#endif // BNO055_H
522
@ MT_P7
Definition BNO055.h:105
@ MT_P0
Definition BNO055.h:105
@ MT_P6
Definition BNO055.h:105
@ MT_P1
Definition BNO055.h:105
@ MT_P4
Definition BNO055.h:105
@ MT_P5
Definition BNO055.h:105
@ MT_P3
Definition BNO055.h:105
@ MT_P2
Definition BNO055.h:105
int data[]
Definition Map_placement_new.cpp:1
Definition BNO055.h:141
void get_euler_angles(BNO055_EULER_TypeDef *el)
Definition BNO055.cpp:61
bool use_dps()
Definition BNO055.cpp:334
int cantReadDataCount
Definition BNO055.h:308
uint8_t read_calib_status(void)
Definition BNO055.cpp:543
void get_chip_temperature(BNO055_TEMPERATURE_TypeDef *tmp)
Definition BNO055.cpp:247
void unit_selection(void)
Definition BNO055.cpp:310
void get_gravity(BNO055_VECTOR_TypeDef *gr)
Definition BNO055.cpp:162
void get_id(void)
Definition BNO055.cpp:411
void get_angular_position_quat(BNO055_ANGULAR_POSITION_typedef *an_pos)
Definition BNO055.cpp:118
void get_gyro(BNO055_VECTOR_TypeDef *gr)
Definition BNO055.cpp:225
void get_accel(BNO055_VECTOR_TypeDef *la)
Definition BNO055.cpp:202
void get_quaternion(BNO055_QUATERNION_TypeDef *qua)
Definition BNO055.cpp:84
uint8_t write_reg0(uint8_t addr, uint8_t data)
Definition BNO055.cpp:663
void frequency(int hz)
Definition BNO055.cpp:648
void calibrate(void)
Definition BNO055.cpp:460
void change_fusion_mode(uint8_t mode)
Definition BNO055.cpp:553
DigitalOut _res
Definition BNO055.h:323
uint8_t chip_ready(void)
Definition BNO055.cpp:451
uint8_t write_reg1(uint8_t addr, uint8_t data)
Definition BNO055.cpp:687
void initialize_reset_pin(void)
Definition BNO055.cpp:304
uint8_t read_reg0(uint8_t addr)
Definition BNO055.cpp:654
void set_mounting_position(uint8_t position)
Definition BNO055.cpp:597
void read_id_inf(BNO055_ID_INF_TypeDef *id)
Definition BNO055.cpp:440
void set_initial_dt_to_regs(void)
Definition BNO055.cpp:404
uint8_t reset(void)
Definition BNO055.cpp:380
bool use_degrees()
Definition BNO055.cpp:318
bool use_celsius()
Definition BNO055.cpp:342
bool use_mss()
Definition BNO055.cpp:326
I2C * _i2c_p
Definition BNO055.h:321
uint8_t read_reg1(uint8_t addr)
Definition BNO055.cpp:678
uint8_t select_page(uint8_t page)
Definition BNO055.cpp:362
uint8_t get_operating_mode(void)
Definition BNO055.cpp:587
void initialize(void)
Definition BNO055.cpp:284
I2C & _i2c
Definition BNO055.h:322
void get_linear_accel(BNO055_VECTOR_TypeDef *la)
Definition BNO055.cpp:139
double multiturnYaw
Definition BNO055.h:310
void get_mag(BNO055_VECTOR_TypeDef *qua)
Definition BNO055.cpp:185
Definition BNO055.h:88
double yaw
Definition BNO055.h:89
double pitch
Definition BNO055.h:91
double roll
Definition BNO055.h:90
Definition BNO055.h:75
double h
Definition BNO055.h:76
double r
Definition BNO055.h:77
double p
Definition BNO055.h:78
Definition BNO055.h:66
uint8_t acc_id
Definition BNO055.h:68
uint8_t bootldr_rev_id
Definition BNO055.h:71
uint8_t chip_id
Definition BNO055.h:67
uint8_t mag_id
Definition BNO055.h:69
uint16_t sw_rev_id
Definition BNO055.h:72
uint8_t gyr_id
Definition BNO055.h:70
Definition BNO055.h:81
double y
Definition BNO055.h:83
double x
Definition BNO055.h:82
double w
Definition BNO055.h:85
double z
Definition BNO055.h:84
Definition BNO055.h:100
int8_t acc_chip
Definition BNO055.h:101
int8_t gyr_chip
Definition BNO055.h:102
Definition BNO055.h:94
double z
Definition BNO055.h:97
double x
Definition BNO055.h:95
double y
Definition BNO055.h:96