Extended and refactored library for BNO055, an intelligent 9-axis absolute orientation sensor by Bosch Sensortec. It includes ACC, MAG and GYRO sensors and Cortex-M0 processor.
Fork of BNO055_fusion by
Please note: pitch and roll in get_euler_angles are switched, the code should be like this:
h = dt[1] << 8 | dt[0]; r = dt[3] << 8 | dt[2]; p = dt[5] << 8 | dt[4];
See https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bno055-ds000.pdf
BNO055.h@10:63a9849f0e97, 2018-01-28 (annotated)
- Committer:
- AlexanderLill
- Date:
- Sun Jan 28 20:55:10 2018 +0000
- Revision:
- 10:63a9849f0e97
- Parent:
- 9:e7c8d34bf79a
- Child:
- 11:17bc36c5ccbb
Refactoring: Create functions to check for selected unit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:86a17116e8be | 1 | /* |
kenjiArai | 0:86a17116e8be | 2 | * mbed library program |
kenjiArai | 0:86a17116e8be | 3 | * BNO055 Intelligent 9-axis absolute orientation sensor |
kenjiArai | 0:86a17116e8be | 4 | * by Bosch Sensortec |
kenjiArai | 0:86a17116e8be | 5 | * |
kenjiArai | 5:cf33bcfe976c | 6 | * Copyright (c) 2015,'17 Kenji Arai / JH1PJL |
kenjiArai | 0:86a17116e8be | 7 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 0:86a17116e8be | 8 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 0:86a17116e8be | 9 | * Created: March 30th, 2015 |
kenjiArai | 6:07d01bf36ad0 | 10 | * Revised: August 23rd, 2017 |
kenjiArai | 0:86a17116e8be | 11 | */ |
kenjiArai | 0:86a17116e8be | 12 | /* |
kenjiArai | 0:86a17116e8be | 13 | *---------------- REFERENCE ---------------------------------------------------------------------- |
kenjiArai | 0:86a17116e8be | 14 | * Original Information |
kenjiArai | 0:86a17116e8be | 15 | * https://www.bosch-sensortec.com/en/homepage/products_3/sensor_hubs/iot_solutions/bno055_1/bno055_4 |
kenjiArai | 0:86a17116e8be | 16 | * Intelligent 9-axis absolute orientation sensor / Data Sheet BST_BNO055_DS000_12 Nov. 2014 rev.1.2 |
kenjiArai | 0:86a17116e8be | 17 | * Sample software https://github.com/BoschSensortec/BNO055_driver |
kenjiArai | 0:86a17116e8be | 18 | * Sensor board |
kenjiArai | 0:86a17116e8be | 19 | * https://www.rutronik24.com/product/bosch+se/bno055+shuttle+board+mems/6431291.html |
kenjiArai | 0:86a17116e8be | 20 | * http://microcontrollershop.com/product_info.php?products_id=7140&osCsid=10645k86db2crld4tfi0vol5g5 |
kenjiArai | 0:86a17116e8be | 21 | */ |
kenjiArai | 0:86a17116e8be | 22 | |
kenjiArai | 0:86a17116e8be | 23 | #ifndef BNO055_H |
kenjiArai | 0:86a17116e8be | 24 | #define BNO055_H |
kenjiArai | 0:86a17116e8be | 25 | |
kenjiArai | 0:86a17116e8be | 26 | #include "mbed.h" |
kenjiArai | 0:86a17116e8be | 27 | |
kenjiArai | 0:86a17116e8be | 28 | // BNO055 |
kenjiArai | 0:86a17116e8be | 29 | // 7bit address = 0b010100x(0x28 or 0x29 depends on COM3) |
kenjiArai | 0:86a17116e8be | 30 | #define BNO055_G_CHIP_ADDR (0x28 << 1) // COM3 = GND |
kenjiArai | 0:86a17116e8be | 31 | #define BNO055_V_CHIP_ADDR (0x29 << 1) // COM3 = Vdd |
kenjiArai | 0:86a17116e8be | 32 | |
kenjiArai | 0:86a17116e8be | 33 | // Fusion mode |
kenjiArai | 0:86a17116e8be | 34 | #define CONFIGMODE 0x00 |
kenjiArai | 0:86a17116e8be | 35 | #define MODE_IMU 0x08 |
kenjiArai | 0:86a17116e8be | 36 | #define MODE_COMPASS 0x09 |
kenjiArai | 0:86a17116e8be | 37 | #define MODE_M4G 0x0a |
kenjiArai | 0:86a17116e8be | 38 | #define MODE_NDOF_FMC_OFF 0x0b |
kenjiArai | 0:86a17116e8be | 39 | #define MODE_NDOF 0x0c |
kenjiArai | 0:86a17116e8be | 40 | |
kenjiArai | 0:86a17116e8be | 41 | // UNIT |
kenjiArai | 0:86a17116e8be | 42 | #define UNIT_ACC_MSS 0x00 // acc m/s2 |
kenjiArai | 0:86a17116e8be | 43 | #define UNIT_ACC_MG 0x01 // acc mg |
kenjiArai | 0:86a17116e8be | 44 | #define UNIT_GYR_DPS 0x00 // gyro Dps |
kenjiArai | 0:86a17116e8be | 45 | #define UNIT_GYR_RPS 0x02 // gyro Rps |
kenjiArai | 0:86a17116e8be | 46 | #define UNIT_EULER_DEG 0x00 // euler Degrees |
kenjiArai | 0:86a17116e8be | 47 | #define UNIT_EULER_RAD 0x04 // euler Radians |
kenjiArai | 0:86a17116e8be | 48 | #define UNIT_TEMP_C 0x00 // temperature degC |
kenjiArai | 0:86a17116e8be | 49 | #define UNIT_TEMP_F 0x10 // temperature degF |
kenjiArai | 0:86a17116e8be | 50 | #define UNIT_ORI_WIN 0x00 // Windows orientation |
kenjiArai | 0:86a17116e8be | 51 | #define UNIT_ORI_ANDROID 0x80 // Android orientation |
kenjiArai | 0:86a17116e8be | 52 | |
kenjiArai | 0:86a17116e8be | 53 | // ID's |
kenjiArai | 0:86a17116e8be | 54 | #define I_AM_BNO055_CHIP 0xa0 // CHIP ID |
kenjiArai | 0:86a17116e8be | 55 | #define I_AM_BNO055_ACC 0xfb // ACC ID |
kenjiArai | 0:86a17116e8be | 56 | #define I_AM_BNO055_MAG 0x32 // MAG ID |
kenjiArai | 0:86a17116e8be | 57 | #define I_AM_BNO055_GYR 0x0f // GYR ID |
kenjiArai | 0:86a17116e8be | 58 | |
kenjiArai | 0:86a17116e8be | 59 | ////////////// DATA TYPE DEFINITION /////////////////////// |
kenjiArai | 0:86a17116e8be | 60 | typedef struct { |
kenjiArai | 0:86a17116e8be | 61 | uint8_t chip_id; |
kenjiArai | 0:86a17116e8be | 62 | uint8_t acc_id; |
kenjiArai | 0:86a17116e8be | 63 | uint8_t mag_id; |
kenjiArai | 0:86a17116e8be | 64 | uint8_t gyr_id; |
kenjiArai | 0:86a17116e8be | 65 | uint8_t bootldr_rev_id; |
kenjiArai | 0:86a17116e8be | 66 | uint16_t sw_rev_id; |
kenjiArai | 0:86a17116e8be | 67 | } BNO055_ID_INF_TypeDef; |
kenjiArai | 0:86a17116e8be | 68 | |
kenjiArai | 0:86a17116e8be | 69 | typedef struct { |
kenjiArai | 0:86a17116e8be | 70 | double h; |
kenjiArai | 0:86a17116e8be | 71 | double r; |
kenjiArai | 0:86a17116e8be | 72 | double p; |
kenjiArai | 0:86a17116e8be | 73 | } BNO055_EULER_TypeDef; |
kenjiArai | 0:86a17116e8be | 74 | |
kenjiArai | 0:86a17116e8be | 75 | typedef struct { |
kenjiArai | 0:86a17116e8be | 76 | int16_t x; |
kenjiArai | 0:86a17116e8be | 77 | int16_t y; |
kenjiArai | 0:86a17116e8be | 78 | int16_t z; |
kenjiArai | 0:86a17116e8be | 79 | int16_t w; |
kenjiArai | 0:86a17116e8be | 80 | } BNO055_QUATERNION_TypeDef; |
kenjiArai | 0:86a17116e8be | 81 | |
kenjiArai | 0:86a17116e8be | 82 | typedef struct { |
kenjiArai | 0:86a17116e8be | 83 | double x; |
kenjiArai | 0:86a17116e8be | 84 | double y; |
kenjiArai | 0:86a17116e8be | 85 | double z; |
AlexanderLill | 7:f0eb18503c27 | 86 | } BNO055_VECTOR_TypeDef; |
kenjiArai | 0:86a17116e8be | 87 | |
kenjiArai | 0:86a17116e8be | 88 | typedef struct { |
kenjiArai | 0:86a17116e8be | 89 | int8_t acc_chip; |
kenjiArai | 0:86a17116e8be | 90 | int8_t gyr_chip; |
kenjiArai | 0:86a17116e8be | 91 | } BNO055_TEMPERATURE_TypeDef; |
kenjiArai | 0:86a17116e8be | 92 | |
kenjiArai | 0:86a17116e8be | 93 | enum {MT_P0 = 0, MT_P1, MT_P2, MT_P3, MT_P4, MT_P5, MT_P6, MT_P7}; |
kenjiArai | 0:86a17116e8be | 94 | |
kenjiArai | 0:86a17116e8be | 95 | /** Interface for Bosch Sensortec Intelligent 9-axis absolute orientation sensor |
kenjiArai | 0:86a17116e8be | 96 | * Chip: BNO055 |
kenjiArai | 0:86a17116e8be | 97 | * |
kenjiArai | 0:86a17116e8be | 98 | * @code |
kenjiArai | 0:86a17116e8be | 99 | * #include "mbed.h" |
kenjiArai | 0:86a17116e8be | 100 | * #include "BNO055.h" |
kenjiArai | 0:86a17116e8be | 101 | * |
kenjiArai | 0:86a17116e8be | 102 | * Serial pc(USBTX,USBRX); |
kenjiArai | 0:86a17116e8be | 103 | * I2C i2c(PB_9, PB_8); // SDA, SCL |
kenjiArai | 1:cb7e19c0a702 | 104 | * BNO055 imu(i2c, PA_8); // Reset |
kenjiArai | 0:86a17116e8be | 105 | * |
kenjiArai | 0:86a17116e8be | 106 | * BNO055_ID_INF_TypeDef bno055_id_inf; |
kenjiArai | 0:86a17116e8be | 107 | * BNO055_EULER_TypeDef euler_angles; |
kenjiArai | 0:86a17116e8be | 108 | * |
kenjiArai | 0:86a17116e8be | 109 | * int main() { |
kenjiArai | 0:86a17116e8be | 110 | * pc.printf("Bosch Sensortec BNO055 test program on " __DATE__ "/" __TIME__ "\r\n"); |
kenjiArai | 0:86a17116e8be | 111 | * if (imu.chip_ready() == 0){ |
kenjiArai | 0:86a17116e8be | 112 | * pc.printf("Bosch BNO055 is NOT avirable!!\r\n"); |
kenjiArai | 0:86a17116e8be | 113 | * } |
kenjiArai | 0:86a17116e8be | 114 | * imu.read_id_inf(&bno055_id_inf); |
kenjiArai | 0:86a17116e8be | 115 | * pc.printf("CHIP:0x%02x, ACC:0x%02x, MAG:0x%02x, GYR:0x%02x, , SW:0x%04x, , BL:0x%02x\r\n", |
kenjiArai | 0:86a17116e8be | 116 | * bno055_id_inf.chip_id, bno055_id_inf.acc_id, bno055_id_inf.mag_id, |
kenjiArai | 0:86a17116e8be | 117 | * bno055_id_inf.gyr_id, bno055_id_inf.sw_rev_id, bno055_id_inf.bootldr_rev_id); |
kenjiArai | 0:86a17116e8be | 118 | * while(1) { |
kenjiArai | 0:86a17116e8be | 119 | * imu.get_Euler_Angles(&euler_angles); |
kenjiArai | 0:86a17116e8be | 120 | * pc.printf("Heading:%+6.1f [deg], Roll:%+6.1f [deg], Pich:%+6.1f [deg]\r\n", |
kenjiArai | 0:86a17116e8be | 121 | * euler_angles.h, euler_angles.r, euler_angles.p); |
kenjiArai | 0:86a17116e8be | 122 | * wait(0.5); |
kenjiArai | 0:86a17116e8be | 123 | * } |
kenjiArai | 0:86a17116e8be | 124 | * } |
kenjiArai | 0:86a17116e8be | 125 | * @endcode |
kenjiArai | 0:86a17116e8be | 126 | */ |
kenjiArai | 0:86a17116e8be | 127 | |
kenjiArai | 0:86a17116e8be | 128 | class BNO055 |
kenjiArai | 0:86a17116e8be | 129 | { |
kenjiArai | 0:86a17116e8be | 130 | public: |
kenjiArai | 0:86a17116e8be | 131 | /** Configure data pin |
kenjiArai | 0:86a17116e8be | 132 | * @param data SDA and SCL pins |
kenjiArai | 0:86a17116e8be | 133 | * @param device address |
kenjiArai | 0:86a17116e8be | 134 | */ |
kenjiArai | 1:cb7e19c0a702 | 135 | BNO055(PinName p_sda, PinName p_scl, PinName p_reset, uint8_t addr, uint8_t mode); |
kenjiArai | 0:86a17116e8be | 136 | |
kenjiArai | 0:86a17116e8be | 137 | /** Configure data pin |
kenjiArai | 0:86a17116e8be | 138 | * @param data SDA and SCL pins |
kenjiArai | 0:86a17116e8be | 139 | * @param Other parameters are set default data |
kenjiArai | 0:86a17116e8be | 140 | */ |
kenjiArai | 1:cb7e19c0a702 | 141 | BNO055(PinName p_sda, PinName p_scl, PinName p_reset); |
kenjiArai | 0:86a17116e8be | 142 | |
kenjiArai | 0:86a17116e8be | 143 | /** Configure data pin (with other devices on I2C line) |
kenjiArai | 0:86a17116e8be | 144 | * @param I2C previous definition |
kenjiArai | 0:86a17116e8be | 145 | * @param device address |
kenjiArai | 0:86a17116e8be | 146 | */ |
kenjiArai | 1:cb7e19c0a702 | 147 | BNO055(I2C& p_i2c, PinName p_reset, uint8_t addr, uint8_t mode); |
kenjiArai | 0:86a17116e8be | 148 | |
kenjiArai | 0:86a17116e8be | 149 | /** Configure data pin (with other devices on I2C line) |
kenjiArai | 0:86a17116e8be | 150 | * @param I2C previous definition |
kenjiArai | 0:86a17116e8be | 151 | * @param Other parameters are set default data |
kenjiArai | 0:86a17116e8be | 152 | */ |
kenjiArai | 1:cb7e19c0a702 | 153 | BNO055(I2C& p_i2c, PinName p_reset); |
kenjiArai | 0:86a17116e8be | 154 | |
kenjiArai | 0:86a17116e8be | 155 | /** Get Euler Angles |
kenjiArai | 0:86a17116e8be | 156 | * @param double type of 3D data address |
kenjiArai | 0:86a17116e8be | 157 | */ |
AlexanderLill | 7:f0eb18503c27 | 158 | void get_euler_angles(BNO055_EULER_TypeDef *el); |
kenjiArai | 0:86a17116e8be | 159 | |
kenjiArai | 0:86a17116e8be | 160 | /** Get Quaternion XYZ&W |
kenjiArai | 0:86a17116e8be | 161 | * @param int16_t type of 4D data address |
kenjiArai | 0:86a17116e8be | 162 | */ |
kenjiArai | 0:86a17116e8be | 163 | void get_quaternion(BNO055_QUATERNION_TypeDef *qua); |
kenjiArai | 0:86a17116e8be | 164 | |
kenjiArai | 0:86a17116e8be | 165 | /** Get Linear accel data |
kenjiArai | 0:86a17116e8be | 166 | * @param double type of 3D data address |
kenjiArai | 0:86a17116e8be | 167 | */ |
AlexanderLill | 7:f0eb18503c27 | 168 | void get_linear_accel(BNO055_VECTOR_TypeDef *la); |
kenjiArai | 0:86a17116e8be | 169 | |
AlexanderLill | 8:46134e7474e7 | 170 | /** Get Mag data |
AlexanderLill | 8:46134e7474e7 | 171 | * @param double type of 3D data address |
AlexanderLill | 8:46134e7474e7 | 172 | */ |
AlexanderLill | 8:46134e7474e7 | 173 | void get_mag(BNO055_VECTOR_TypeDef *qua); |
AlexanderLill | 8:46134e7474e7 | 174 | |
AlexanderLill | 8:46134e7474e7 | 175 | /** Get Accel data |
AlexanderLill | 8:46134e7474e7 | 176 | * @param double type of 3D data address |
AlexanderLill | 8:46134e7474e7 | 177 | */ |
AlexanderLill | 8:46134e7474e7 | 178 | void get_accel(BNO055_VECTOR_TypeDef *la); |
AlexanderLill | 8:46134e7474e7 | 179 | |
AlexanderLill | 8:46134e7474e7 | 180 | /** Get Gyro data |
AlexanderLill | 8:46134e7474e7 | 181 | * @param double type of 3D data address |
AlexanderLill | 8:46134e7474e7 | 182 | */ |
AlexanderLill | 8:46134e7474e7 | 183 | void get_gyro(BNO055_VECTOR_TypeDef *gr); |
AlexanderLill | 8:46134e7474e7 | 184 | |
kenjiArai | 0:86a17116e8be | 185 | /** Get Gravity data |
kenjiArai | 0:86a17116e8be | 186 | * @param double type of 3D data address |
kenjiArai | 0:86a17116e8be | 187 | */ |
AlexanderLill | 7:f0eb18503c27 | 188 | void get_gravity(BNO055_VECTOR_TypeDef *gr); |
kenjiArai | 0:86a17116e8be | 189 | |
kenjiArai | 0:86a17116e8be | 190 | /** Get Chip temperature data both Acc & Gyro |
kenjiArai | 0:86a17116e8be | 191 | * @param int8_t type of data address |
kenjiArai | 0:86a17116e8be | 192 | */ |
kenjiArai | 0:86a17116e8be | 193 | void get_chip_temperature(BNO055_TEMPERATURE_TypeDef *tmp); |
kenjiArai | 0:86a17116e8be | 194 | |
kenjiArai | 0:86a17116e8be | 195 | /** Change fusion mode |
kenjiArai | 0:86a17116e8be | 196 | * @param fusion mode |
kenjiArai | 0:86a17116e8be | 197 | * @return none |
kenjiArai | 0:86a17116e8be | 198 | */ |
kenjiArai | 0:86a17116e8be | 199 | void change_fusion_mode(uint8_t mode); |
kenjiArai | 0:86a17116e8be | 200 | |
kenjiArai | 0:86a17116e8be | 201 | /** Set Mouting position |
kenjiArai | 0:86a17116e8be | 202 | * Please make sure your mounting direction of BNO055 chip |
kenjiArai | 0:86a17116e8be | 203 | * refrence: BNO055 data sheet BST-BNO055-DS000-12 3.4 Axis remap |
kenjiArai | 0:86a17116e8be | 204 | * @param Set P0 to P7 mounting position data |
kenjiArai | 0:86a17116e8be | 205 | * @return none |
kenjiArai | 0:86a17116e8be | 206 | */ |
kenjiArai | 0:86a17116e8be | 207 | void set_mounting_position(uint8_t position); |
kenjiArai | 0:86a17116e8be | 208 | |
kenjiArai | 0:86a17116e8be | 209 | /** Read BNO055 ID information |
kenjiArai | 0:86a17116e8be | 210 | * @param ID information address |
kenjiArai | 0:86a17116e8be | 211 | * @return none |
kenjiArai | 0:86a17116e8be | 212 | */ |
kenjiArai | 0:86a17116e8be | 213 | void read_id_inf(BNO055_ID_INF_TypeDef *id); |
kenjiArai | 0:86a17116e8be | 214 | |
kenjiArai | 0:86a17116e8be | 215 | /** Check chip is avairable or not |
kenjiArai | 0:86a17116e8be | 216 | * @param none |
kenjiArai | 0:86a17116e8be | 217 | * @return OK = 1, NG = 0; |
kenjiArai | 0:86a17116e8be | 218 | */ |
kenjiArai | 0:86a17116e8be | 219 | uint8_t chip_ready(void); |
kenjiArai | 0:86a17116e8be | 220 | |
kenjiArai | 2:0f225b686cd5 | 221 | /** Read calibration status |
kenjiArai | 2:0f225b686cd5 | 222 | * @param none |
kenjiArai | 2:0f225b686cd5 | 223 | * @return SYS(7:6),GYR(5:4),ACC(3:2),MAG(1:0) 3 = Calibrated, 0= not yet |
kenjiArai | 2:0f225b686cd5 | 224 | */ |
kenjiArai | 2:0f225b686cd5 | 225 | uint8_t read_calib_status(void); |
kenjiArai | 2:0f225b686cd5 | 226 | |
kenjiArai | 1:cb7e19c0a702 | 227 | /** Reset |
kenjiArai | 1:cb7e19c0a702 | 228 | * @param none |
kenjiArai | 3:0ad6f85b178f | 229 | * @return 0 = sucess, 1 = Not available chip |
kenjiArai | 1:cb7e19c0a702 | 230 | */ |
kenjiArai | 1:cb7e19c0a702 | 231 | uint8_t reset(void); |
kenjiArai | 1:cb7e19c0a702 | 232 | |
kenjiArai | 0:86a17116e8be | 233 | /** Set I2C clock frequency |
kenjiArai | 0:86a17116e8be | 234 | * @param freq. |
kenjiArai | 0:86a17116e8be | 235 | * @return none |
kenjiArai | 0:86a17116e8be | 236 | */ |
kenjiArai | 0:86a17116e8be | 237 | void frequency(int hz); |
kenjiArai | 0:86a17116e8be | 238 | |
kenjiArai | 0:86a17116e8be | 239 | /** Read page 0 register |
kenjiArai | 0:86a17116e8be | 240 | * @param register's address |
kenjiArai | 0:86a17116e8be | 241 | * @return register data |
kenjiArai | 0:86a17116e8be | 242 | */ |
kenjiArai | 0:86a17116e8be | 243 | uint8_t read_reg0(uint8_t addr); |
kenjiArai | 0:86a17116e8be | 244 | |
kenjiArai | 0:86a17116e8be | 245 | /** Write page 0 register |
kenjiArai | 0:86a17116e8be | 246 | * @param register's address |
kenjiArai | 0:86a17116e8be | 247 | * @param data |
kenjiArai | 0:86a17116e8be | 248 | * @return register data |
kenjiArai | 0:86a17116e8be | 249 | */ |
kenjiArai | 0:86a17116e8be | 250 | uint8_t write_reg0(uint8_t addr, uint8_t data); |
kenjiArai | 0:86a17116e8be | 251 | |
kenjiArai | 0:86a17116e8be | 252 | /** Read page 1 register |
kenjiArai | 0:86a17116e8be | 253 | * @param register's address |
kenjiArai | 0:86a17116e8be | 254 | * @return register data |
kenjiArai | 0:86a17116e8be | 255 | */ |
kenjiArai | 0:86a17116e8be | 256 | uint8_t read_reg1(uint8_t addr); |
kenjiArai | 0:86a17116e8be | 257 | |
kenjiArai | 0:86a17116e8be | 258 | /** Write page 1 register |
kenjiArai | 0:86a17116e8be | 259 | * @param register's address |
kenjiArai | 0:86a17116e8be | 260 | * @param data |
kenjiArai | 0:86a17116e8be | 261 | * @return register data |
kenjiArai | 0:86a17116e8be | 262 | */ |
kenjiArai | 0:86a17116e8be | 263 | uint8_t write_reg1(uint8_t addr, uint8_t data); |
kenjiArai | 0:86a17116e8be | 264 | |
AlexanderLill | 10:63a9849f0e97 | 265 | /** Determine if degrees (instead of radians) are used. |
AlexanderLill | 10:63a9849f0e97 | 266 | * @return true if degrees are used |
AlexanderLill | 10:63a9849f0e97 | 267 | */ |
AlexanderLill | 10:63a9849f0e97 | 268 | bool use_degrees(); |
AlexanderLill | 10:63a9849f0e97 | 269 | |
AlexanderLill | 10:63a9849f0e97 | 270 | /** Determine if m/s*s (instead of mg) is used. |
AlexanderLill | 10:63a9849f0e97 | 271 | * @return true if m/s*s are used |
AlexanderLill | 10:63a9849f0e97 | 272 | */ |
AlexanderLill | 10:63a9849f0e97 | 273 | bool use_mss(); |
AlexanderLill | 10:63a9849f0e97 | 274 | |
AlexanderLill | 10:63a9849f0e97 | 275 | /** Determine if dps (instead of rds) are used. |
AlexanderLill | 10:63a9849f0e97 | 276 | * @return true if dps are used |
AlexanderLill | 10:63a9849f0e97 | 277 | */ |
AlexanderLill | 10:63a9849f0e97 | 278 | bool use_dps(); |
AlexanderLill | 10:63a9849f0e97 | 279 | |
AlexanderLill | 10:63a9849f0e97 | 280 | /** Determine if celsius (instead of fahrenheit) is used. |
AlexanderLill | 10:63a9849f0e97 | 281 | * @return true if celsius are used |
AlexanderLill | 10:63a9849f0e97 | 282 | */ |
AlexanderLill | 10:63a9849f0e97 | 283 | bool use_celsius(); |
AlexanderLill | 10:63a9849f0e97 | 284 | |
kenjiArai | 0:86a17116e8be | 285 | protected: |
kenjiArai | 0:86a17116e8be | 286 | void initialize(void); |
AlexanderLill | 9:e7c8d34bf79a | 287 | void get_id(void); |
kenjiArai | 0:86a17116e8be | 288 | void set_initial_dt_to_regs(void); |
kenjiArai | 0:86a17116e8be | 289 | void unit_selection(void); |
AlexanderLill | 9:e7c8d34bf79a | 290 | uint8_t get_operating_mode(void); |
kenjiArai | 0:86a17116e8be | 291 | uint8_t select_page(uint8_t page); |
kenjiArai | 0:86a17116e8be | 292 | |
kenjiArai | 5:cf33bcfe976c | 293 | I2C *_i2c_p; |
kenjiArai | 5:cf33bcfe976c | 294 | I2C &_i2c; |
kenjiArai | 1:cb7e19c0a702 | 295 | DigitalOut _res; |
kenjiArai | 0:86a17116e8be | 296 | |
kenjiArai | 0:86a17116e8be | 297 | private: |
kenjiArai | 0:86a17116e8be | 298 | char dt[10]; // working buffer |
kenjiArai | 0:86a17116e8be | 299 | uint8_t chip_addr; |
kenjiArai | 0:86a17116e8be | 300 | uint8_t chip_mode; |
kenjiArai | 3:0ad6f85b178f | 301 | uint8_t ready_flag; |
kenjiArai | 3:0ad6f85b178f | 302 | uint8_t page_flag; |
kenjiArai | 0:86a17116e8be | 303 | |
kenjiArai | 0:86a17116e8be | 304 | uint8_t chip_id; |
kenjiArai | 0:86a17116e8be | 305 | uint8_t acc_id; |
kenjiArai | 0:86a17116e8be | 306 | uint8_t mag_id; |
kenjiArai | 0:86a17116e8be | 307 | uint8_t gyr_id; |
kenjiArai | 0:86a17116e8be | 308 | uint8_t bootldr_rev_id; |
kenjiArai | 0:86a17116e8be | 309 | uint16_t sw_rev_id; |
kenjiArai | 0:86a17116e8be | 310 | |
AlexanderLill | 10:63a9849f0e97 | 311 | bool unit_flag_is_set(uint8_t flag); |
kenjiArai | 0:86a17116e8be | 312 | }; |
kenjiArai | 0:86a17116e8be | 313 | |
kenjiArai | 0:86a17116e8be | 314 | //--------------------------------------------------------- |
kenjiArai | 0:86a17116e8be | 315 | //----- Register's definition ----------------------------- |
kenjiArai | 0:86a17116e8be | 316 | //--------------------------------------------------------- |
kenjiArai | 0:86a17116e8be | 317 | // Page id register definition |
kenjiArai | 0:86a17116e8be | 318 | #define BNO055_PAGE_ID 0x07 |
kenjiArai | 0:86a17116e8be | 319 | |
kenjiArai | 0:86a17116e8be | 320 | //----- page0 --------------------------------------------- |
kenjiArai | 0:86a17116e8be | 321 | #define BNO055_CHIP_ID 0x00 |
kenjiArai | 0:86a17116e8be | 322 | #define BNO055_ACCEL_REV_ID 0x01 |
kenjiArai | 0:86a17116e8be | 323 | #define BNO055_MAG_REV_ID 0x02 |
kenjiArai | 0:86a17116e8be | 324 | #define BNO055_GYRO_REV_ID 0x03 |
kenjiArai | 0:86a17116e8be | 325 | #define BNO055_SW_REV_ID_LSB 0x04 |
kenjiArai | 0:86a17116e8be | 326 | #define BNO055_SW_REV_ID_MSB 0x05 |
kenjiArai | 0:86a17116e8be | 327 | #define BNO055_BL_REV_ID 0x06 |
kenjiArai | 0:86a17116e8be | 328 | |
kenjiArai | 0:86a17116e8be | 329 | // Accel data register*/ |
kenjiArai | 0:86a17116e8be | 330 | #define BNO055_ACC_X_LSB 0x08 |
kenjiArai | 0:86a17116e8be | 331 | #define BNO055_ACC_X_MSB 0x09 |
kenjiArai | 0:86a17116e8be | 332 | #define BNO055_ACC_Y_LSB 0x0a |
kenjiArai | 0:86a17116e8be | 333 | #define BNO055_ACC_Y_MSB 0x0b |
kenjiArai | 0:86a17116e8be | 334 | #define BNO055_ACC_Z_LSB 0x0c |
kenjiArai | 0:86a17116e8be | 335 | #define BNO055_ACC_Z_MSB 0x0d |
kenjiArai | 0:86a17116e8be | 336 | |
kenjiArai | 0:86a17116e8be | 337 | // Mag data register |
kenjiArai | 0:86a17116e8be | 338 | #define BNO055_MAG_X_LSB 0x0e |
kenjiArai | 0:86a17116e8be | 339 | #define BNO055_MAG_X_MSB 0x0f |
kenjiArai | 0:86a17116e8be | 340 | #define BNO055_MAG_Y_LSB 0x10 |
kenjiArai | 0:86a17116e8be | 341 | #define BNO055_MAG_Y_MSB 0x11 |
kenjiArai | 0:86a17116e8be | 342 | #define BNO055_MAG_Z_LSB 0x12 |
kenjiArai | 0:86a17116e8be | 343 | #define BNO055_MAG_Z_MSB 0x13 |
kenjiArai | 0:86a17116e8be | 344 | |
kenjiArai | 0:86a17116e8be | 345 | // Gyro data registers |
kenjiArai | 0:86a17116e8be | 346 | #define BNO055_GYR_X_LSB 0x14 |
kenjiArai | 0:86a17116e8be | 347 | #define BNO055_GYR_X_MSB 0x15 |
kenjiArai | 0:86a17116e8be | 348 | #define BNO055_GYR_Y_LSB 0x16 |
kenjiArai | 0:86a17116e8be | 349 | #define BNO055_GYR_Y_MSB 0x17 |
kenjiArai | 0:86a17116e8be | 350 | #define BNO055_GYR_Z_LSB 0x18 |
kenjiArai | 0:86a17116e8be | 351 | #define BNO055_GYR_Z_MSB 0x19 |
kenjiArai | 0:86a17116e8be | 352 | |
kenjiArai | 0:86a17116e8be | 353 | // Euler data registers |
kenjiArai | 0:86a17116e8be | 354 | #define BNO055_EULER_H_LSB 0x1a |
kenjiArai | 0:86a17116e8be | 355 | #define BNO055_EULER_H_MSB 0x1b |
kenjiArai | 0:86a17116e8be | 356 | |
kenjiArai | 0:86a17116e8be | 357 | #define BNO055_EULER_R_LSB 0x1c |
kenjiArai | 0:86a17116e8be | 358 | #define BNO055_EULER_R_MSB 0x1d |
kenjiArai | 0:86a17116e8be | 359 | |
kenjiArai | 0:86a17116e8be | 360 | #define BNO055_EULER_P_LSB 0x1e |
kenjiArai | 0:86a17116e8be | 361 | #define BNO055_EULER_P_MSB 0x1f |
kenjiArai | 0:86a17116e8be | 362 | |
kenjiArai | 0:86a17116e8be | 363 | // Quaternion data registers |
kenjiArai | 0:86a17116e8be | 364 | #define BNO055_QUATERNION_W_LSB 0x20 |
kenjiArai | 0:86a17116e8be | 365 | #define BNO055_QUATERNION_W_MSB 0x21 |
kenjiArai | 0:86a17116e8be | 366 | #define BNO055_QUATERNION_X_LSB 0x22 |
kenjiArai | 0:86a17116e8be | 367 | #define BNO055_QUATERNION_X_MSB 0x23 |
kenjiArai | 0:86a17116e8be | 368 | #define BNO055_QUATERNION_Y_LSB 0x24 |
kenjiArai | 0:86a17116e8be | 369 | #define BNO055_QUATERNION_Y_MSB 0x25 |
kenjiArai | 0:86a17116e8be | 370 | #define BNO055_QUATERNION_Z_LSB 0x26 |
kenjiArai | 0:86a17116e8be | 371 | #define BNO055_QUATERNION_Z_MSB 0x27 |
kenjiArai | 0:86a17116e8be | 372 | |
kenjiArai | 0:86a17116e8be | 373 | // Linear acceleration data registers |
kenjiArai | 0:86a17116e8be | 374 | #define BNO055_LINEAR_ACC_X_LSB 0x28 |
kenjiArai | 0:86a17116e8be | 375 | #define BNO055_LINEAR_ACC_X_MSB 0x29 |
kenjiArai | 0:86a17116e8be | 376 | #define BNO055_LINEAR_ACC_Y_LSB 0x2a |
kenjiArai | 0:86a17116e8be | 377 | #define BNO055_LINEAR_ACC_Y_MSB 0x2b |
kenjiArai | 0:86a17116e8be | 378 | #define BNO055_LINEAR_ACC_Z_LSB 0x2c |
kenjiArai | 0:86a17116e8be | 379 | #define BNO055_LINEAR_ACC_Z_MSB 0x2d |
kenjiArai | 0:86a17116e8be | 380 | |
kenjiArai | 0:86a17116e8be | 381 | // Gravity data registers |
kenjiArai | 0:86a17116e8be | 382 | #define BNO055_GRAVITY_X_LSB 0x2e |
kenjiArai | 0:86a17116e8be | 383 | #define BNO055_GRAVITY_X_MSB 0x2f |
kenjiArai | 0:86a17116e8be | 384 | #define BNO055_GRAVITY_Y_LSB 0x30 |
kenjiArai | 0:86a17116e8be | 385 | #define BNO055_GRAVITY_Y_MSB 0x31 |
kenjiArai | 0:86a17116e8be | 386 | #define BNO055_GRAVITY_Z_LSB 0x32 |
kenjiArai | 0:86a17116e8be | 387 | #define BNO055_GRAVITY_Z_MSB 0x33 |
kenjiArai | 0:86a17116e8be | 388 | |
kenjiArai | 0:86a17116e8be | 389 | // Temperature data register |
kenjiArai | 0:86a17116e8be | 390 | #define BNO055_TEMP 0x34 |
kenjiArai | 0:86a17116e8be | 391 | |
kenjiArai | 0:86a17116e8be | 392 | // Status registers |
kenjiArai | 0:86a17116e8be | 393 | #define BNO055_CALIB_STAT 0x35 |
kenjiArai | 0:86a17116e8be | 394 | #define BNO055_SELFTEST_RESULT 0x36 |
kenjiArai | 0:86a17116e8be | 395 | #define BNO055_INTR_STAT 0x37 |
kenjiArai | 0:86a17116e8be | 396 | #define BNO055_SYS_CLK_STAT 0x38 |
kenjiArai | 0:86a17116e8be | 397 | #define BNO055_SYS_STAT 0x39 |
kenjiArai | 0:86a17116e8be | 398 | #define BNO055_SYS_ERR 0x3a |
kenjiArai | 0:86a17116e8be | 399 | |
kenjiArai | 0:86a17116e8be | 400 | // Unit selection register |
kenjiArai | 0:86a17116e8be | 401 | #define BNO055_UNIT_SEL 0x3b |
kenjiArai | 0:86a17116e8be | 402 | #define BNO055_DATA_SELECT 0x3c |
kenjiArai | 0:86a17116e8be | 403 | |
kenjiArai | 0:86a17116e8be | 404 | // Mode registers |
kenjiArai | 0:86a17116e8be | 405 | #define BNO055_OPR_MODE 0x3d |
kenjiArai | 0:86a17116e8be | 406 | #define BNO055_PWR_MODE 0x3e |
kenjiArai | 0:86a17116e8be | 407 | #define BNO055_SYS_TRIGGER 0x3f |
kenjiArai | 0:86a17116e8be | 408 | #define BNO055_TEMP_SOURCE 0x40 |
kenjiArai | 0:86a17116e8be | 409 | |
kenjiArai | 0:86a17116e8be | 410 | // Axis remap registers |
kenjiArai | 0:86a17116e8be | 411 | #define BNO055_AXIS_MAP_CONFIG 0x41 |
kenjiArai | 0:86a17116e8be | 412 | #define BNO055_AXIS_MAP_SIGN 0x42 |
kenjiArai | 0:86a17116e8be | 413 | |
kenjiArai | 0:86a17116e8be | 414 | // SIC registers |
kenjiArai | 0:86a17116e8be | 415 | #define BNO055_SIC_MTRX_0_LSB 0x43 |
kenjiArai | 0:86a17116e8be | 416 | #define BNO055_SIC_MTRX_0_MSB 0x44 |
kenjiArai | 0:86a17116e8be | 417 | #define BNO055_SIC_MTRX_1_LSB 0x45 |
kenjiArai | 0:86a17116e8be | 418 | #define BNO055_SIC_MTRX_1_MSB 0x46 |
kenjiArai | 0:86a17116e8be | 419 | #define BNO055_SIC_MTRX_2_LSB 0x47 |
kenjiArai | 0:86a17116e8be | 420 | #define BNO055_SIC_MTRX_2_MSB 0x48 |
kenjiArai | 0:86a17116e8be | 421 | #define BNO055_SIC_MTRX_3_LSB 0x49 |
kenjiArai | 0:86a17116e8be | 422 | #define BNO055_SIC_MTRX_3_MSB 0x4a |
kenjiArai | 0:86a17116e8be | 423 | #define BNO055_SIC_MTRX_4_LSB 0x4b |
kenjiArai | 0:86a17116e8be | 424 | #define BNO055_SIC_MTRX_4_MSB 0x4c |
kenjiArai | 0:86a17116e8be | 425 | #define BNO055_SIC_MTRX_5_LSB 0x4d |
kenjiArai | 0:86a17116e8be | 426 | #define BNO055_SIC_MTRX_5_MSB 0x4e |
kenjiArai | 0:86a17116e8be | 427 | #define BNO055_SIC_MTRX_6_LSB 0x4f |
kenjiArai | 0:86a17116e8be | 428 | #define BNO055_SIC_MTRX_6_MSB 0x50 |
kenjiArai | 0:86a17116e8be | 429 | #define BNO055_SIC_MTRX_7_LSB 0x51 |
kenjiArai | 0:86a17116e8be | 430 | #define BNO055_SIC_MTRX_7_MSB 0x52 |
kenjiArai | 0:86a17116e8be | 431 | #define BNO055_SIC_MTRX_8_LSB 0x53 |
kenjiArai | 0:86a17116e8be | 432 | #define BNO055_SIC_MTRX_8_MSB 0x54 |
kenjiArai | 0:86a17116e8be | 433 | |
kenjiArai | 0:86a17116e8be | 434 | // Accelerometer Offset registers |
kenjiArai | 0:86a17116e8be | 435 | #define ACCEL_OFFSET_X_LSB 0x55 |
kenjiArai | 0:86a17116e8be | 436 | #define ACCEL_OFFSET_X_MSB 0x56 |
kenjiArai | 0:86a17116e8be | 437 | #define ACCEL_OFFSET_Y_LSB 0x57 |
kenjiArai | 0:86a17116e8be | 438 | #define ACCEL_OFFSET_Y_MSB 0x58 |
kenjiArai | 0:86a17116e8be | 439 | #define ACCEL_OFFSET_Z_LSB 0x59 |
kenjiArai | 0:86a17116e8be | 440 | #define ACCEL_OFFSET_Z_MSB 0x5a |
kenjiArai | 0:86a17116e8be | 441 | |
kenjiArai | 0:86a17116e8be | 442 | // Magnetometer Offset registers |
kenjiArai | 0:86a17116e8be | 443 | #define MAG_OFFSET_X_LSB 0x5b |
kenjiArai | 0:86a17116e8be | 444 | #define MAG_OFFSET_X_MSB 0x5c |
kenjiArai | 0:86a17116e8be | 445 | #define MAG_OFFSET_Y_LSB 0x5d |
kenjiArai | 0:86a17116e8be | 446 | #define MAG_OFFSET_Y_MSB 0x5e |
kenjiArai | 0:86a17116e8be | 447 | #define MAG_OFFSET_Z_LSB 0x5f |
kenjiArai | 0:86a17116e8be | 448 | #define MAG_OFFSET_Z_MSB 0x60 |
kenjiArai | 0:86a17116e8be | 449 | |
kenjiArai | 0:86a17116e8be | 450 | // Gyroscope Offset registers |
kenjiArai | 0:86a17116e8be | 451 | #define GYRO_OFFSET_X_LSB 0x61 |
kenjiArai | 0:86a17116e8be | 452 | #define GYRO_OFFSET_X_MSB 0x62 |
kenjiArai | 0:86a17116e8be | 453 | #define GYRO_OFFSET_Y_LSB 0x63 |
kenjiArai | 0:86a17116e8be | 454 | #define GYRO_OFFSET_Y_MSB 0x64 |
kenjiArai | 0:86a17116e8be | 455 | #define GYRO_OFFSET_Z_LSB 0x65 |
kenjiArai | 0:86a17116e8be | 456 | #define GYRO_OFFSET_Z_MSB 0x66 |
kenjiArai | 0:86a17116e8be | 457 | |
kenjiArai | 0:86a17116e8be | 458 | // Radius registers |
kenjiArai | 0:86a17116e8be | 459 | #define ACCEL_RADIUS_LSB 0x67 |
kenjiArai | 0:86a17116e8be | 460 | #define ACCEL_RADIUS_MSB 0x68 |
kenjiArai | 0:86a17116e8be | 461 | #define MAG_RADIUS_LSB 0x69 |
kenjiArai | 0:86a17116e8be | 462 | #define MAG_RADIUS_MSB 0x6a |
kenjiArai | 0:86a17116e8be | 463 | |
kenjiArai | 0:86a17116e8be | 464 | //----- page1 --------------------------------------------- |
kenjiArai | 0:86a17116e8be | 465 | // Configuration registers |
kenjiArai | 0:86a17116e8be | 466 | #define ACCEL_CONFIG 0x08 |
kenjiArai | 0:86a17116e8be | 467 | #define MAG_CONFIG 0x09 |
kenjiArai | 0:86a17116e8be | 468 | #define GYRO_CONFIG 0x0a |
kenjiArai | 0:86a17116e8be | 469 | #define GYRO_MODE_CONFIG 0x0b |
kenjiArai | 0:86a17116e8be | 470 | #define ACCEL_SLEEP_CONFIG 0x0c |
kenjiArai | 0:86a17116e8be | 471 | #define GYRO_SLEEP_CONFIG 0x0d |
kenjiArai | 0:86a17116e8be | 472 | #define MAG_SLEEP_CONFIG 0x0e |
kenjiArai | 0:86a17116e8be | 473 | |
kenjiArai | 0:86a17116e8be | 474 | // Interrupt registers |
kenjiArai | 0:86a17116e8be | 475 | #define INT_MASK 0x0f |
kenjiArai | 0:86a17116e8be | 476 | #define INT 0x10 |
kenjiArai | 0:86a17116e8be | 477 | #define ACCEL_ANY_MOTION_THRES 0x11 |
kenjiArai | 0:86a17116e8be | 478 | #define ACCEL_INTR_SETTINGS 0x12 |
kenjiArai | 0:86a17116e8be | 479 | #define ACCEL_HIGH_G_DURN 0x13 |
kenjiArai | 0:86a17116e8be | 480 | #define ACCEL_HIGH_G_THRES 0x14 |
kenjiArai | 0:86a17116e8be | 481 | #define ACCEL_NO_MOTION_THRES 0x15 |
kenjiArai | 0:86a17116e8be | 482 | #define ACCEL_NO_MOTION_SET 0x16 |
kenjiArai | 0:86a17116e8be | 483 | #define GYRO_INTR_SETING 0x17 |
kenjiArai | 0:86a17116e8be | 484 | #define GYRO_HIGHRATE_X_SET 0x18 |
kenjiArai | 0:86a17116e8be | 485 | #define GYRO_DURN_X 0x19 |
kenjiArai | 0:86a17116e8be | 486 | #define GYRO_HIGHRATE_Y_SET 0x1a |
kenjiArai | 0:86a17116e8be | 487 | #define GYRO_DURN_Y 0x1b |
kenjiArai | 0:86a17116e8be | 488 | #define GYRO_HIGHRATE_Z_SET 0x1c |
kenjiArai | 0:86a17116e8be | 489 | #define GYRO_DURN_Z 0x1d |
kenjiArai | 0:86a17116e8be | 490 | #define GYRO_ANY_MOTION_THRES 0x1e |
kenjiArai | 0:86a17116e8be | 491 | #define GYRO_ANY_MOTION_SET 0x1f |
kenjiArai | 0:86a17116e8be | 492 | |
kenjiArai | 3:0ad6f85b178f | 493 | //--------------------------------------------------------- |
kenjiArai | 3:0ad6f85b178f | 494 | //----- Calibration example ------------------------------- |
kenjiArai | 3:0ad6f85b178f | 495 | //--------------------------------------------------------- |
kenjiArai | 3:0ad6f85b178f | 496 | #if 0 |
kenjiArai | 3:0ad6f85b178f | 497 | // Calibration |
kenjiArai | 3:0ad6f85b178f | 498 | // Please refer BNO055 Data sheet 3.10 Calibration & 3.6.4 Sensor calibration data |
kenjiArai | 3:0ad6f85b178f | 499 | void bno055_calbration(void){ |
kenjiArai | 3:0ad6f85b178f | 500 | uint8_t d; |
kenjiArai | 3:0ad6f85b178f | 501 | |
kenjiArai | 3:0ad6f85b178f | 502 | pc.printf("------ Enter BNO055 Manual Calibration Mode ------\r\n"); |
kenjiArai | 3:0ad6f85b178f | 503 | //---------- Gyroscope Caliblation ------------------------------------------------------------ |
kenjiArai | 3:0ad6f85b178f | 504 | // (a) Place the device in a single stable position for a period of few seconds to allow the |
kenjiArai | 3:0ad6f85b178f | 505 | // gyroscope to calibrate |
kenjiArai | 3:0ad6f85b178f | 506 | pc.printf("Step1) Please wait few seconds\r\n"); |
kenjiArai | 3:0ad6f85b178f | 507 | t.start(); |
kenjiArai | 3:0ad6f85b178f | 508 | while (t.read() < 10){ |
kenjiArai | 3:0ad6f85b178f | 509 | d = imu.read_calib_status(); |
kenjiArai | 3:0ad6f85b178f | 510 | pc.printf("Calb dat = 0x%x target = 0x30(at least)\r\n", d); |
kenjiArai | 3:0ad6f85b178f | 511 | if ((d & 0x30) == 0x30){ |
kenjiArai | 3:0ad6f85b178f | 512 | break; |
kenjiArai | 3:0ad6f85b178f | 513 | } |
kenjiArai | 3:0ad6f85b178f | 514 | wait(1.0); |
kenjiArai | 3:0ad6f85b178f | 515 | } |
kenjiArai | 3:0ad6f85b178f | 516 | pc.printf("-> Step1) is done\r\n\r\n"); |
kenjiArai | 3:0ad6f85b178f | 517 | //---------- Magnetometer Caliblation --------------------------------------------------------- |
kenjiArai | 3:0ad6f85b178f | 518 | // (a) Make some random movements (for example: writing the number ‘8’ on air) until the |
kenjiArai | 3:0ad6f85b178f | 519 | // CALIB_STAT register indicates fully calibrated. |
kenjiArai | 3:0ad6f85b178f | 520 | // (b) It takes more calibration movements to get the magnetometer calibrated than in the |
kenjiArai | 3:0ad6f85b178f | 521 | // NDOF mode. |
kenjiArai | 3:0ad6f85b178f | 522 | pc.printf("Step2) random moving (try to change the BNO055 axis)\r\n"); |
kenjiArai | 3:0ad6f85b178f | 523 | t.start(); |
kenjiArai | 3:0ad6f85b178f | 524 | while (t.read() < 30){ |
kenjiArai | 3:0ad6f85b178f | 525 | d = imu.read_calib_status(); |
kenjiArai | 3:0ad6f85b178f | 526 | pc.printf("Calb dat = 0x%x target = 0x33(at least)\r\n", d); |
kenjiArai | 3:0ad6f85b178f | 527 | if ((d & 0x03) == 0x03){ |
kenjiArai | 3:0ad6f85b178f | 528 | break; |
kenjiArai | 3:0ad6f85b178f | 529 | } |
kenjiArai | 3:0ad6f85b178f | 530 | wait(1.0); |
kenjiArai | 3:0ad6f85b178f | 531 | } |
kenjiArai | 3:0ad6f85b178f | 532 | pc.printf("-> Step2) is done\r\n\r\n"); |
kenjiArai | 3:0ad6f85b178f | 533 | //---------- Magnetometer Caliblation --------------------------------------------------------- |
kenjiArai | 3:0ad6f85b178f | 534 | // a) Place the device in 6 different stable positions for a period of few seconds |
kenjiArai | 3:0ad6f85b178f | 535 | // to allow the accelerometer to calibrate. |
kenjiArai | 3:0ad6f85b178f | 536 | // b) Make sure that there is slow movement between 2 stable positions |
kenjiArai | 3:0ad6f85b178f | 537 | // The 6 stable positions could be in any direction, but make sure that the device is |
kenjiArai | 3:0ad6f85b178f | 538 | // lying at least once perpendicular to the x, y and z axis. |
kenjiArai | 3:0ad6f85b178f | 539 | pc.printf("Step3) Change rotation each X,Y,Z axis KEEP SLOWLY!!"); |
kenjiArai | 3:0ad6f85b178f | 540 | pc.printf(" Each 90deg stay a 5 sec and set at least 6 position.\r\n"); |
kenjiArai | 3:0ad6f85b178f | 541 | pc.printf(" e.g. (1)ACC:X0,Y0,Z-9,(2)ACC:X9,Y0,Z0,(3)ACC:X0,Y0,Z9,"); |
kenjiArai | 3:0ad6f85b178f | 542 | pc.printf("(4)ACC:X-9,Y0,Z0,(5)ACC:X0,Y-9,Z0,(6)ACC:X0,Y9,Z0,\r\n"); |
kenjiArai | 3:0ad6f85b178f | 543 | pc.printf(" If you will give up, hit any key.\r\n", d); |
kenjiArai | 3:0ad6f85b178f | 544 | t.stop(); |
kenjiArai | 3:0ad6f85b178f | 545 | while (true){ |
kenjiArai | 3:0ad6f85b178f | 546 | d = imu.read_calib_status(); |
kenjiArai | 3:0ad6f85b178f | 547 | imu.get_gravity(&gravity); |
kenjiArai | 3:0ad6f85b178f | 548 | pc.printf("Calb dat = 0x%x target = 0xff ACC:X %3.0f, Y %3.0f, Z %3.0f\r\n", |
kenjiArai | 3:0ad6f85b178f | 549 | d, gravity.x, gravity.y, gravity.z); |
kenjiArai | 3:0ad6f85b178f | 550 | if (d == 0xff){ break;} |
kenjiArai | 3:0ad6f85b178f | 551 | if (pc.readable()){ break;} |
kenjiArai | 3:0ad6f85b178f | 552 | wait(1.0); |
kenjiArai | 3:0ad6f85b178f | 553 | } |
kenjiArai | 3:0ad6f85b178f | 554 | if (imu.read_calib_status() == 0xff){ |
kenjiArai | 3:0ad6f85b178f | 555 | pc.printf("-> All of Calibration steps are done successfully!\r\n\r\n"); |
kenjiArai | 3:0ad6f85b178f | 556 | } else { |
kenjiArai | 3:0ad6f85b178f | 557 | pc.printf("-> Calibration steps are suspended!\r\n\r\n"); |
kenjiArai | 3:0ad6f85b178f | 558 | } |
kenjiArai | 3:0ad6f85b178f | 559 | t.stop(); |
kenjiArai | 3:0ad6f85b178f | 560 | } |
kenjiArai | 3:0ad6f85b178f | 561 | #endif |
kenjiArai | 3:0ad6f85b178f | 562 | |
kenjiArai | 0:86a17116e8be | 563 | #endif // BNO055_H |