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#include "IMU.h"
32
33#define PI 3.14159265
34
35// BNO055
36// 7bit address = 0b010100x(0x28 or 0x29 depends on COM3)
37#define BNO055_G_CHIP_ADDR (0x28 << 1) // COM3 = GND
38#define BNO055_V_CHIP_ADDR (0x29 << 1) // COM3 = Vdd
39
40// Fusion mode
41#define CONFIGMODE 0x00
42#define MODE_IMU 0x08
43#define MODE_COMPASS 0x09
44#define MODE_M4G 0x0a
45#define MODE_NDOF_FMC_OFF 0x0b
46#define MODE_NDOF 0x0c
47
48// UNIT
49#define UNIT_ACC_MSS 0x00 // acc m/s2
50#define UNIT_ACC_MG 0x01 // acc mg
51#define UNIT_GYR_DPS 0x00 // gyro Dps
52#define UNIT_GYR_RPS 0x02 // gyro Rps
53#define UNIT_EULER_DEG 0x00 // euler Degrees
54#define UNIT_EULER_RAD 0x04 // euler Radians
55#define UNIT_TEMP_C 0x00 // temperature degC
56#define UNIT_TEMP_F 0x10 // temperature degF
57#define UNIT_ORI_WIN 0x00 // Windows orientation
58#define UNIT_ORI_ANDROID 0x80 // Android orientation
59
60// ID's
61#define I_AM_BNO055_CHIP 0xa0 // CHIP ID
62#define I_AM_BNO055_ACC 0xfb // ACC ID
63#define I_AM_BNO055_MAG 0x32 // MAG ID
64#define I_AM_BNO055_GYR 0x0f // GYR ID
65
67typedef struct {
68 uint8_t chip_id;
69 uint8_t acc_id;
70 uint8_t mag_id;
71 uint8_t gyr_id;
73 uint16_t sw_rev_id;
75
76typedef struct {
77 double h;
78 double r;
79 double p;
81
82typedef struct {
83 double x;
84 double y;
85 double z;
86 double w;
88
89typedef struct{
90 double yaw;
91 double roll;
92 double pitch;
94
95typedef struct {
96 double x;
97 double y;
98 double z;
100
101typedef struct {
102 int8_t acc_chip;
103 int8_t gyr_chip;
105
107
141class BNO055: public IMU
142{
143public:
144 // Unconfigured IMU
146
151 BNO055(PinName p_sda, PinName p_scl, PinName p_reset, uint8_t addr, uint8_t mode);
152
157 BNO055(PinName p_sda, PinName p_scl, PinName p_reset);
158
163 BNO055(I2C& p_i2c, PinName p_reset, uint8_t addr, uint8_t mode);
164
169 BNO055(I2C& p_i2c, PinName p_reset, uint8_t mode);
170
175
180
185
190
195
200
205
210
215
220 void change_fusion_mode(uint8_t mode);
221
228 void set_mounting_position(uint8_t position);
229
235
240 uint8_t chip_ready(void);
241
246 void calibrate(void);
247
252 uint8_t read_calib_status(void);
253
258 uint8_t reset(void);
259
264 void frequency(int hz);
265
270 uint8_t read_reg0(uint8_t addr);
271
277 uint8_t write_reg0(uint8_t addr, uint8_t data);
278
283 uint8_t read_reg1(uint8_t addr);
284
290 uint8_t write_reg1(uint8_t addr, uint8_t data);
291
295 bool use_degrees();
296
300 bool use_mss();
301
305 bool use_dps();
306
310 bool use_celsius();
311
313
314 IMU::EulerAngles read() override;
315
317
318protected:
319 void initialize(void);
320 void initialize_reset_pin(void);
321 void get_id(void);
322 void set_initial_dt_to_regs(void);
323 void unit_selection(void);
324 uint8_t get_operating_mode(void);
325 uint8_t select_page(uint8_t page);
326
327 I2C *_i2c_p;
328 I2C &_i2c;
329 DigitalOut _res;
330
331private:
332 Mutex mutex_;
333
334 char dt[10]; // working buffer
335 uint8_t chip_addr;
336 uint8_t chip_mode;
337 uint8_t ready_flag;
338 uint8_t page_flag;
339
340 uint8_t chip_id;
341 uint8_t acc_id;
342 uint8_t mag_id;
343 uint8_t gyr_id;
344 uint8_t bootldr_rev_id;
345 uint16_t sw_rev_id;
346
347 IMU::EulerAngles imuAngles;
348
349 bool unit_flag_is_set(uint8_t flag);
350};
351
352//---------------------------------------------------------
353//----- Register's definition -----------------------------
354//---------------------------------------------------------
355// Page id register definition
356#define BNO055_PAGE_ID 0x07
357
358//----- page0 ---------------------------------------------
359#define BNO055_CHIP_ID 0x00
360#define BNO055_ACCEL_REV_ID 0x01
361#define BNO055_MAG_REV_ID 0x02
362#define BNO055_GYRO_REV_ID 0x03
363#define BNO055_SW_REV_ID_LSB 0x04
364#define BNO055_SW_REV_ID_MSB 0x05
365#define BNO055_BL_REV_ID 0x06
366
367// Accel data register*/
368#define BNO055_ACC_X_LSB 0x08
369#define BNO055_ACC_X_MSB 0x09
370#define BNO055_ACC_Y_LSB 0x0a
371#define BNO055_ACC_Y_MSB 0x0b
372#define BNO055_ACC_Z_LSB 0x0c
373#define BNO055_ACC_Z_MSB 0x0d
374
375// Mag data register
376#define BNO055_MAG_X_LSB 0x0e
377#define BNO055_MAG_X_MSB 0x0f
378#define BNO055_MAG_Y_LSB 0x10
379#define BNO055_MAG_Y_MSB 0x11
380#define BNO055_MAG_Z_LSB 0x12
381#define BNO055_MAG_Z_MSB 0x13
382
383// Gyro data registers
384#define BNO055_GYR_X_LSB 0x14
385#define BNO055_GYR_X_MSB 0x15
386#define BNO055_GYR_Y_LSB 0x16
387#define BNO055_GYR_Y_MSB 0x17
388#define BNO055_GYR_Z_LSB 0x18
389#define BNO055_GYR_Z_MSB 0x19
390
391// Euler data registers
392#define BNO055_EULER_H_LSB 0x1a
393#define BNO055_EULER_H_MSB 0x1b
394
395#define BNO055_EULER_R_LSB 0x1c
396#define BNO055_EULER_R_MSB 0x1d
397
398#define BNO055_EULER_P_LSB 0x1e
399#define BNO055_EULER_P_MSB 0x1f
400
401// Quaternion data registers
402#define BNO055_QUATERNION_W_LSB 0x20
403#define BNO055_QUATERNION_W_MSB 0x21
404#define BNO055_QUATERNION_X_LSB 0x22
405#define BNO055_QUATERNION_X_MSB 0x23
406#define BNO055_QUATERNION_Y_LSB 0x24
407#define BNO055_QUATERNION_Y_MSB 0x25
408#define BNO055_QUATERNION_Z_LSB 0x26
409#define BNO055_QUATERNION_Z_MSB 0x27
410
411// Linear acceleration data registers
412#define BNO055_LINEAR_ACC_X_LSB 0x28
413#define BNO055_LINEAR_ACC_X_MSB 0x29
414#define BNO055_LINEAR_ACC_Y_LSB 0x2a
415#define BNO055_LINEAR_ACC_Y_MSB 0x2b
416#define BNO055_LINEAR_ACC_Z_LSB 0x2c
417#define BNO055_LINEAR_ACC_Z_MSB 0x2d
418
419// Gravity data registers
420#define BNO055_GRAVITY_X_LSB 0x2e
421#define BNO055_GRAVITY_X_MSB 0x2f
422#define BNO055_GRAVITY_Y_LSB 0x30
423#define BNO055_GRAVITY_Y_MSB 0x31
424#define BNO055_GRAVITY_Z_LSB 0x32
425#define BNO055_GRAVITY_Z_MSB 0x33
426
427// Temperature data register
428#define BNO055_TEMP 0x34
429
430// Status registers
431#define BNO055_CALIB_STAT 0x35
432#define BNO055_SELFTEST_RESULT 0x36
433#define BNO055_INTR_STAT 0x37
434#define BNO055_SYS_CLK_STAT 0x38
435#define BNO055_SYS_STAT 0x39
436#define BNO055_SYS_ERR 0x3a
437
438// Unit selection register
439#define BNO055_UNIT_SEL 0x3b
440#define BNO055_DATA_SELECT 0x3c
441
442// Mode registers
443#define BNO055_OPR_MODE 0x3d
444#define BNO055_PWR_MODE 0x3e
445#define BNO055_SYS_TRIGGER 0x3f
446#define BNO055_TEMP_SOURCE 0x40
447
448// Axis remap registers
449#define BNO055_AXIS_MAP_CONFIG 0x41
450#define BNO055_AXIS_MAP_SIGN 0x42
451
452// SIC registers
453#define BNO055_SIC_MTRX_0_LSB 0x43
454#define BNO055_SIC_MTRX_0_MSB 0x44
455#define BNO055_SIC_MTRX_1_LSB 0x45
456#define BNO055_SIC_MTRX_1_MSB 0x46
457#define BNO055_SIC_MTRX_2_LSB 0x47
458#define BNO055_SIC_MTRX_2_MSB 0x48
459#define BNO055_SIC_MTRX_3_LSB 0x49
460#define BNO055_SIC_MTRX_3_MSB 0x4a
461#define BNO055_SIC_MTRX_4_LSB 0x4b
462#define BNO055_SIC_MTRX_4_MSB 0x4c
463#define BNO055_SIC_MTRX_5_LSB 0x4d
464#define BNO055_SIC_MTRX_5_MSB 0x4e
465#define BNO055_SIC_MTRX_6_LSB 0x4f
466#define BNO055_SIC_MTRX_6_MSB 0x50
467#define BNO055_SIC_MTRX_7_LSB 0x51
468#define BNO055_SIC_MTRX_7_MSB 0x52
469#define BNO055_SIC_MTRX_8_LSB 0x53
470#define BNO055_SIC_MTRX_8_MSB 0x54
471
472// Accelerometer Offset registers
473#define ACCEL_OFFSET_X_LSB 0x55
474#define ACCEL_OFFSET_X_MSB 0x56
475#define ACCEL_OFFSET_Y_LSB 0x57
476#define ACCEL_OFFSET_Y_MSB 0x58
477#define ACCEL_OFFSET_Z_LSB 0x59
478#define ACCEL_OFFSET_Z_MSB 0x5a
479
480// Magnetometer Offset registers
481#define MAG_OFFSET_X_LSB 0x5b
482#define MAG_OFFSET_X_MSB 0x5c
483#define MAG_OFFSET_Y_LSB 0x5d
484#define MAG_OFFSET_Y_MSB 0x5e
485#define MAG_OFFSET_Z_LSB 0x5f
486#define MAG_OFFSET_Z_MSB 0x60
487
488// Gyroscope Offset registers
489#define GYRO_OFFSET_X_LSB 0x61
490#define GYRO_OFFSET_X_MSB 0x62
491#define GYRO_OFFSET_Y_LSB 0x63
492#define GYRO_OFFSET_Y_MSB 0x64
493#define GYRO_OFFSET_Z_LSB 0x65
494#define GYRO_OFFSET_Z_MSB 0x66
495
496// Radius registers
497#define ACCEL_RADIUS_LSB 0x67
498#define ACCEL_RADIUS_MSB 0x68
499#define MAG_RADIUS_LSB 0x69
500#define MAG_RADIUS_MSB 0x6a
501
502//----- page1 ---------------------------------------------
503// Configuration registers
504#define ACCEL_CONFIG 0x08
505#define MAG_CONFIG 0x09
506#define GYRO_CONFIG 0x0a
507#define GYRO_MODE_CONFIG 0x0b
508#define ACCEL_SLEEP_CONFIG 0x0c
509#define GYRO_SLEEP_CONFIG 0x0d
510#define MAG_SLEEP_CONFIG 0x0e
511
512// Interrupt registers
513#define INT_MASK 0x0f
514#define INT 0x10
515#define ACCEL_ANY_MOTION_THRES 0x11
516#define ACCEL_INTR_SETTINGS 0x12
517#define ACCEL_HIGH_G_DURN 0x13
518#define ACCEL_HIGH_G_THRES 0x14
519#define ACCEL_NO_MOTION_THRES 0x15
520#define ACCEL_NO_MOTION_SET 0x16
521#define GYRO_INTR_SETING 0x17
522#define GYRO_HIGHRATE_X_SET 0x18
523#define GYRO_DURN_X 0x19
524#define GYRO_HIGHRATE_Y_SET 0x1a
525#define GYRO_DURN_Y 0x1b
526#define GYRO_HIGHRATE_Z_SET 0x1c
527#define GYRO_DURN_Z 0x1d
528#define GYRO_ANY_MOTION_THRES 0x1e
529#define GYRO_ANY_MOTION_SET 0x1f
530
531#endif // BNO055_H
532
@ MT_P7
Definition BNO055.h:106
@ MT_P0
Definition BNO055.h:106
@ MT_P6
Definition BNO055.h:106
@ MT_P1
Definition BNO055.h:106
@ MT_P4
Definition BNO055.h:106
@ MT_P5
Definition BNO055.h:106
@ MT_P3
Definition BNO055.h:106
@ MT_P2
Definition BNO055.h:106
Definition BNO055.h:142
void get_euler_angles(BNO055_EULER_TypeDef *el)
Definition BNO055.cpp:57
bool use_dps()
Definition BNO055.cpp:342
int cantReadDataCount
Definition BNO055.h:312
uint8_t read_calib_status(void)
Definition BNO055.cpp:551
void get_chip_temperature(BNO055_TEMPERATURE_TypeDef *tmp)
Definition BNO055.cpp:255
void unit_selection(void)
Definition BNO055.cpp:318
void get_gravity(BNO055_VECTOR_TypeDef *gr)
Definition BNO055.cpp:170
void get_id(void)
Definition BNO055.cpp:419
void get_gyro(BNO055_VECTOR_TypeDef *gr)
Definition BNO055.cpp:233
void get_accel(BNO055_VECTOR_TypeDef *la)
Definition BNO055.cpp:210
void get_quaternion(BNO055_QUATERNION_TypeDef *qua)
Definition BNO055.cpp:80
uint8_t write_reg0(uint8_t addr, uint8_t data)
Definition BNO055.cpp:671
void frequency(int hz)
Definition BNO055.cpp:656
void calibrate(void)
Definition BNO055.cpp:468
void change_fusion_mode(uint8_t mode)
Definition BNO055.cpp:561
DigitalOut _res
Definition BNO055.h:329
void get_angular_position_quat(IMU::EulerAngles *an_pos)
Definition BNO055.cpp:115
uint8_t chip_ready(void)
Definition BNO055.cpp:459
uint8_t write_reg1(uint8_t addr, uint8_t data)
Definition BNO055.cpp:695
void initialize_reset_pin(void)
Definition BNO055.cpp:312
uint8_t read_reg0(uint8_t addr)
Definition BNO055.cpp:662
IMU::EulerAngles read() override
Definition BNO055.cpp:136
void set_mounting_position(uint8_t position)
Definition BNO055.cpp:605
void read_id_inf(BNO055_ID_INF_TypeDef *id)
Definition BNO055.cpp:448
void set_initial_dt_to_regs(void)
Definition BNO055.cpp:412
uint8_t reset(void)
Definition BNO055.cpp:388
bool use_degrees()
Definition BNO055.cpp:326
bool use_celsius()
Definition BNO055.cpp:350
bool use_mss()
Definition BNO055.cpp:334
I2C * _i2c_p
Definition BNO055.h:327
uint8_t read_reg1(uint8_t addr)
Definition BNO055.cpp:686
uint8_t select_page(uint8_t page)
Definition BNO055.cpp:370
uint8_t get_operating_mode(void)
Definition BNO055.cpp:595
IMU::EulerAngles getImuAngles() override
Definition BNO055.cpp:142
void initialize(void)
Definition BNO055.cpp:292
I2C & _i2c
Definition BNO055.h:328
void get_linear_accel(BNO055_VECTOR_TypeDef *la)
Definition BNO055.cpp:147
void get_mag(BNO055_VECTOR_TypeDef *qua)
Definition BNO055.cpp:193
Definition IMU.h:5
Definition BNO055.h:89
double yaw
Definition BNO055.h:90
double pitch
Definition BNO055.h:92
double roll
Definition BNO055.h:91
Definition BNO055.h:76
double h
Definition BNO055.h:77
double r
Definition BNO055.h:78
double p
Definition BNO055.h:79
Definition BNO055.h:67
uint8_t acc_id
Definition BNO055.h:69
uint8_t bootldr_rev_id
Definition BNO055.h:72
uint8_t chip_id
Definition BNO055.h:68
uint8_t mag_id
Definition BNO055.h:70
uint16_t sw_rev_id
Definition BNO055.h:73
uint8_t gyr_id
Definition BNO055.h:71
Definition BNO055.h:82
double y
Definition BNO055.h:84
double x
Definition BNO055.h:83
double w
Definition BNO055.h:86
double z
Definition BNO055.h:85
Definition BNO055.h:101
int8_t acc_chip
Definition BNO055.h:102
int8_t gyr_chip
Definition BNO055.h:103
Definition BNO055.h:95
double z
Definition BNO055.h:98
double x
Definition BNO055.h:96
double y
Definition BNO055.h:97
Definition IMU.h:8