22/02/16
Fork of BNO055_fusion by
Diff: BNO055.h
- Revision:
- 0:86a17116e8be
- Child:
- 1:cb7e19c0a702
diff -r 000000000000 -r 86a17116e8be BNO055.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BNO055.h Sun Apr 05 04:12:58 2015 +0000 @@ -0,0 +1,454 @@ +/* + * mbed library program + * BNO055 Intelligent 9-axis absolute orientation sensor + * by Bosch Sensortec + * + * Copyright (c) 2015 Kenji Arai / JH1PJL + * http://www.page.sannet.ne.jp/kenjia/index.html + * http://mbed.org/users/kenjiArai/ + * Created: March 30th, 2015 + * Revised: April 5th, 2015 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/* + *---------------- REFERENCE ---------------------------------------------------------------------- + * Original Information + * https://www.bosch-sensortec.com/en/homepage/products_3/sensor_hubs/iot_solutions/bno055_1/bno055_4 + * Intelligent 9-axis absolute orientation sensor / Data Sheet BST_BNO055_DS000_12 Nov. 2014 rev.1.2 + * Sample software https://github.com/BoschSensortec/BNO055_driver + * Sensor board + * https://www.rutronik24.com/product/bosch+se/bno055+shuttle+board+mems/6431291.html + * http://microcontrollershop.com/product_info.php?products_id=7140&osCsid=10645k86db2crld4tfi0vol5g5 + */ + +#ifndef BNO055_H +#define BNO055_H + +#include "mbed.h" + +// BNO055 +// 7bit address = 0b010100x(0x28 or 0x29 depends on COM3) +#define BNO055_G_CHIP_ADDR (0x28 << 1) // COM3 = GND +#define BNO055_V_CHIP_ADDR (0x29 << 1) // COM3 = Vdd + +// Fusion mode +#define CONFIGMODE 0x00 +#define MODE_IMU 0x08 +#define MODE_COMPASS 0x09 +#define MODE_M4G 0x0a +#define MODE_NDOF_FMC_OFF 0x0b +#define MODE_NDOF 0x0c + +// UNIT +#define UNIT_ACC_MSS 0x00 // acc m/s2 +#define UNIT_ACC_MG 0x01 // acc mg +#define UNIT_GYR_DPS 0x00 // gyro Dps +#define UNIT_GYR_RPS 0x02 // gyro Rps +#define UNIT_EULER_DEG 0x00 // euler Degrees +#define UNIT_EULER_RAD 0x04 // euler Radians +#define UNIT_TEMP_C 0x00 // temperature degC +#define UNIT_TEMP_F 0x10 // temperature degF +#define UNIT_ORI_WIN 0x00 // Windows orientation +#define UNIT_ORI_ANDROID 0x80 // Android orientation + +// ID's +#define I_AM_BNO055_CHIP 0xa0 // CHIP ID +#define I_AM_BNO055_ACC 0xfb // ACC ID +#define I_AM_BNO055_MAG 0x32 // MAG ID +#define I_AM_BNO055_GYR 0x0f // GYR ID + +////////////// DATA TYPE DEFINITION /////////////////////// +typedef struct { + uint8_t chip_id; + uint8_t acc_id; + uint8_t mag_id; + uint8_t gyr_id; + uint8_t bootldr_rev_id; + uint16_t sw_rev_id; +} BNO055_ID_INF_TypeDef; + +typedef struct { + double h; + double r; + double p; +} BNO055_EULER_TypeDef; + +typedef struct { + int16_t x; + int16_t y; + int16_t z; + int16_t w; +} BNO055_QUATERNION_TypeDef; + +typedef struct { + double x; + double y; + double z; +} BNO055_LIN_ACC_TypeDef; + +typedef struct { + double x; + double y; + double z; +} BNO055_GRAVITY_TypeDef; + +typedef struct { + int8_t acc_chip; + int8_t gyr_chip; +} BNO055_TEMPERATURE_TypeDef; + +enum {MT_P0 = 0, MT_P1, MT_P2, MT_P3, MT_P4, MT_P5, MT_P6, MT_P7}; + +/** Interface for Bosch Sensortec Intelligent 9-axis absolute orientation sensor + * Chip: BNO055 + * + * @code + * #include "mbed.h" + * #include "BNO055.h" + * + * Serial pc(USBTX,USBRX); + * I2C i2c(PB_9, PB_8); // SDA, SCL + * BNO055 imu(i2c); + * + * BNO055_ID_INF_TypeDef bno055_id_inf; + * BNO055_EULER_TypeDef euler_angles; + * + * int main() { + * pc.printf("Bosch Sensortec BNO055 test program on " __DATE__ "/" __TIME__ "\r\n"); + * if (imu.chip_ready() == 0){ + * pc.printf("Bosch BNO055 is NOT avirable!!\r\n"); + * } + * imu.read_id_inf(&bno055_id_inf); + * pc.printf("CHIP:0x%02x, ACC:0x%02x, MAG:0x%02x, GYR:0x%02x, , SW:0x%04x, , BL:0x%02x\r\n", + * bno055_id_inf.chip_id, bno055_id_inf.acc_id, bno055_id_inf.mag_id, + * bno055_id_inf.gyr_id, bno055_id_inf.sw_rev_id, bno055_id_inf.bootldr_rev_id); + * while(1) { + * imu.get_Euler_Angles(&euler_angles); + * pc.printf("Heading:%+6.1f [deg], Roll:%+6.1f [deg], Pich:%+6.1f [deg]\r\n", + * euler_angles.h, euler_angles.r, euler_angles.p); + * wait(0.5); + * } + * } + * @endcode + */ + +class BNO055 +{ +public: + /** Configure data pin + * @param data SDA and SCL pins + * @param device address + */ + BNO055(PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode); + + /** Configure data pin + * @param data SDA and SCL pins + * @param Other parameters are set default data + */ + BNO055(PinName p_sda, PinName p_scl); + + /** Configure data pin (with other devices on I2C line) + * @param I2C previous definition + * @param device address + */ + BNO055(I2C& p_i2c, uint8_t addr, uint8_t mode); + + /** Configure data pin (with other devices on I2C line) + * @param I2C previous definition + * @param Other parameters are set default data + */ + BNO055(I2C& p_i2c); + + /** Get Euler Angles + * @param double type of 3D data address + */ + void get_Euler_Angles(BNO055_EULER_TypeDef *el); + + /** Get Quaternion XYZ&W + * @param int16_t type of 4D data address + */ + void get_quaternion(BNO055_QUATERNION_TypeDef *qua); + + /** Get Linear accel data + * @param double type of 3D data address + */ + void get_linear_accel(BNO055_LIN_ACC_TypeDef *la); + + /** Get Gravity data + * @param double type of 3D data address + */ + void get_gravity(BNO055_GRAVITY_TypeDef *gr); + + /** Get Chip temperature data both Acc & Gyro + * @param int8_t type of data address + */ + void get_chip_temperature(BNO055_TEMPERATURE_TypeDef *tmp); + + /** Change fusion mode + * @param fusion mode + * @return none + */ + void change_fusion_mode(uint8_t mode); + + /** Set Mouting position + * Please make sure your mounting direction of BNO055 chip + * refrence: BNO055 data sheet BST-BNO055-DS000-12 3.4 Axis remap + * @param Set P0 to P7 mounting position data + * @return none + */ + void set_mounting_position(uint8_t position); + + /** Read BNO055 ID information + * @param ID information address + * @return none + */ + void read_id_inf(BNO055_ID_INF_TypeDef *id); + + /** Check chip is avairable or not + * @param none + * @return OK = 1, NG = 0; + */ + uint8_t chip_ready(void); + + /** Set I2C clock frequency + * @param freq. + * @return none + */ + void frequency(int hz); + + /** Read page 0 register + * @param register's address + * @return register data + */ + uint8_t read_reg0(uint8_t addr); + + /** Write page 0 register + * @param register's address + * @param data + * @return register data + */ + uint8_t write_reg0(uint8_t addr, uint8_t data); + + /** Read page 1 register + * @param register's address + * @return register data + */ + uint8_t read_reg1(uint8_t addr); + + /** Write page 1 register + * @param register's address + * @param data + * @return register data + */ + uint8_t write_reg1(uint8_t addr, uint8_t data); + +protected: + void initialize(void); + void check_id(void); + void set_initial_dt_to_regs(void); + void unit_selection(void); + uint8_t check_operating_mode(void); + uint8_t select_page(uint8_t page); + + I2C _i2c; + +private: + char dt[10]; // working buffer + uint8_t chip_addr; + uint8_t chip_mode; + uint8_t ready_flg; + + uint8_t chip_id; + uint8_t acc_id; + uint8_t mag_id; + uint8_t gyr_id; + uint8_t bootldr_rev_id; + uint16_t sw_rev_id; + +}; + +//--------------------------------------------------------- +//----- Register's definition ----------------------------- +//--------------------------------------------------------- +// Page id register definition +#define BNO055_PAGE_ID 0x07 + +//----- page0 --------------------------------------------- +#define BNO055_CHIP_ID 0x00 +#define BNO055_ACCEL_REV_ID 0x01 +#define BNO055_MAG_REV_ID 0x02 +#define BNO055_GYRO_REV_ID 0x03 +#define BNO055_SW_REV_ID_LSB 0x04 +#define BNO055_SW_REV_ID_MSB 0x05 +#define BNO055_BL_REV_ID 0x06 + +// Accel data register*/ +#define BNO055_ACC_X_LSB 0x08 +#define BNO055_ACC_X_MSB 0x09 +#define BNO055_ACC_Y_LSB 0x0a +#define BNO055_ACC_Y_MSB 0x0b +#define BNO055_ACC_Z_LSB 0x0c +#define BNO055_ACC_Z_MSB 0x0d + +// Mag data register +#define BNO055_MAG_X_LSB 0x0e +#define BNO055_MAG_X_MSB 0x0f +#define BNO055_MAG_Y_LSB 0x10 +#define BNO055_MAG_Y_MSB 0x11 +#define BNO055_MAG_Z_LSB 0x12 +#define BNO055_MAG_Z_MSB 0x13 + +// Gyro data registers +#define BNO055_GYR_X_LSB 0x14 +#define BNO055_GYR_X_MSB 0x15 +#define BNO055_GYR_Y_LSB 0x16 +#define BNO055_GYR_Y_MSB 0x17 +#define BNO055_GYR_Z_LSB 0x18 +#define BNO055_GYR_Z_MSB 0x19 + +// Euler data registers +#define BNO055_EULER_H_LSB 0x1a +#define BNO055_EULER_H_MSB 0x1b + +#define BNO055_EULER_R_LSB 0x1c +#define BNO055_EULER_R_MSB 0x1d + +#define BNO055_EULER_P_LSB 0x1e +#define BNO055_EULER_P_MSB 0x1f + +// Quaternion data registers +#define BNO055_QUATERNION_W_LSB 0x20 +#define BNO055_QUATERNION_W_MSB 0x21 +#define BNO055_QUATERNION_X_LSB 0x22 +#define BNO055_QUATERNION_X_MSB 0x23 +#define BNO055_QUATERNION_Y_LSB 0x24 +#define BNO055_QUATERNION_Y_MSB 0x25 +#define BNO055_QUATERNION_Z_LSB 0x26 +#define BNO055_QUATERNION_Z_MSB 0x27 + +// Linear acceleration data registers +#define BNO055_LINEAR_ACC_X_LSB 0x28 +#define BNO055_LINEAR_ACC_X_MSB 0x29 +#define BNO055_LINEAR_ACC_Y_LSB 0x2a +#define BNO055_LINEAR_ACC_Y_MSB 0x2b +#define BNO055_LINEAR_ACC_Z_LSB 0x2c +#define BNO055_LINEAR_ACC_Z_MSB 0x2d + +// Gravity data registers +#define BNO055_GRAVITY_X_LSB 0x2e +#define BNO055_GRAVITY_X_MSB 0x2f +#define BNO055_GRAVITY_Y_LSB 0x30 +#define BNO055_GRAVITY_Y_MSB 0x31 +#define BNO055_GRAVITY_Z_LSB 0x32 +#define BNO055_GRAVITY_Z_MSB 0x33 + +// Temperature data register +#define BNO055_TEMP 0x34 + +// Status registers +#define BNO055_CALIB_STAT 0x35 +#define BNO055_SELFTEST_RESULT 0x36 +#define BNO055_INTR_STAT 0x37 +#define BNO055_SYS_CLK_STAT 0x38 +#define BNO055_SYS_STAT 0x39 +#define BNO055_SYS_ERR 0x3a + +// Unit selection register +#define BNO055_UNIT_SEL 0x3b +#define BNO055_DATA_SELECT 0x3c + +// Mode registers +#define BNO055_OPR_MODE 0x3d +#define BNO055_PWR_MODE 0x3e +#define BNO055_SYS_TRIGGER 0x3f +#define BNO055_TEMP_SOURCE 0x40 + +// Axis remap registers +#define BNO055_AXIS_MAP_CONFIG 0x41 +#define BNO055_AXIS_MAP_SIGN 0x42 + +// SIC registers +#define BNO055_SIC_MTRX_0_LSB 0x43 +#define BNO055_SIC_MTRX_0_MSB 0x44 +#define BNO055_SIC_MTRX_1_LSB 0x45 +#define BNO055_SIC_MTRX_1_MSB 0x46 +#define BNO055_SIC_MTRX_2_LSB 0x47 +#define BNO055_SIC_MTRX_2_MSB 0x48 +#define BNO055_SIC_MTRX_3_LSB 0x49 +#define BNO055_SIC_MTRX_3_MSB 0x4a +#define BNO055_SIC_MTRX_4_LSB 0x4b +#define BNO055_SIC_MTRX_4_MSB 0x4c +#define BNO055_SIC_MTRX_5_LSB 0x4d +#define BNO055_SIC_MTRX_5_MSB 0x4e +#define BNO055_SIC_MTRX_6_LSB 0x4f +#define BNO055_SIC_MTRX_6_MSB 0x50 +#define BNO055_SIC_MTRX_7_LSB 0x51 +#define BNO055_SIC_MTRX_7_MSB 0x52 +#define BNO055_SIC_MTRX_8_LSB 0x53 +#define BNO055_SIC_MTRX_8_MSB 0x54 + +// Accelerometer Offset registers +#define ACCEL_OFFSET_X_LSB 0x55 +#define ACCEL_OFFSET_X_MSB 0x56 +#define ACCEL_OFFSET_Y_LSB 0x57 +#define ACCEL_OFFSET_Y_MSB 0x58 +#define ACCEL_OFFSET_Z_LSB 0x59 +#define ACCEL_OFFSET_Z_MSB 0x5a + +// Magnetometer Offset registers +#define MAG_OFFSET_X_LSB 0x5b +#define MAG_OFFSET_X_MSB 0x5c +#define MAG_OFFSET_Y_LSB 0x5d +#define MAG_OFFSET_Y_MSB 0x5e +#define MAG_OFFSET_Z_LSB 0x5f +#define MAG_OFFSET_Z_MSB 0x60 + +// Gyroscope Offset registers +#define GYRO_OFFSET_X_LSB 0x61 +#define GYRO_OFFSET_X_MSB 0x62 +#define GYRO_OFFSET_Y_LSB 0x63 +#define GYRO_OFFSET_Y_MSB 0x64 +#define GYRO_OFFSET_Z_LSB 0x65 +#define GYRO_OFFSET_Z_MSB 0x66 + +// Radius registers +#define ACCEL_RADIUS_LSB 0x67 +#define ACCEL_RADIUS_MSB 0x68 +#define MAG_RADIUS_LSB 0x69 +#define MAG_RADIUS_MSB 0x6a + +//----- page1 --------------------------------------------- +// Configuration registers +#define ACCEL_CONFIG 0x08 +#define MAG_CONFIG 0x09 +#define GYRO_CONFIG 0x0a +#define GYRO_MODE_CONFIG 0x0b +#define ACCEL_SLEEP_CONFIG 0x0c +#define GYRO_SLEEP_CONFIG 0x0d +#define MAG_SLEEP_CONFIG 0x0e + +// Interrupt registers +#define INT_MASK 0x0f +#define INT 0x10 +#define ACCEL_ANY_MOTION_THRES 0x11 +#define ACCEL_INTR_SETTINGS 0x12 +#define ACCEL_HIGH_G_DURN 0x13 +#define ACCEL_HIGH_G_THRES 0x14 +#define ACCEL_NO_MOTION_THRES 0x15 +#define ACCEL_NO_MOTION_SET 0x16 +#define GYRO_INTR_SETING 0x17 +#define GYRO_HIGHRATE_X_SET 0x18 +#define GYRO_DURN_X 0x19 +#define GYRO_HIGHRATE_Y_SET 0x1a +#define GYRO_DURN_Y 0x1b +#define GYRO_HIGHRATE_Z_SET 0x1c +#define GYRO_DURN_Z 0x1d +#define GYRO_ANY_MOTION_THRES 0x1e +#define GYRO_ANY_MOTION_SET 0x1f + +#endif // BNO055_H