Forked NO055 IMU No Changes From Origional

Fork of BNO055_fusion by Kenji Arai

Revision:
0:86a17116e8be
Child:
1:cb7e19c0a702
--- /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