AHRS

Dependencies:   Eigen

Dependents:   IndNav_QK3_T265

Revision:
25:fe14dbcef82d
Child:
27:973e495f4711
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMX055.h	Mon Jan 06 12:49:38 2020 +0000
@@ -0,0 +1,288 @@
+/*
+ * mbed library program
+ *  BMX055 Small, versatile 9-axis sensor module
+ *  by Bosch Sensortec
+ *
+ * Copyright (c) 2018,'19 Kenji Arai / JH1PJL
+ *  http://www.page.sannet.ne.jp/kenjia/index.html
+ *  http://mbed.org/users/kenjiArai/
+ *      Started:    October   24th, 2018
+ *      Revised:    March      3rd, 2019
+ */
+/*
+ *---------------- REFERENCE ---------------------------------------------------
+ * Original Information
+ *  https://www.bosch-sensortec.com/bst/products/all_products/bmx055
+ *  Data Sheet  BST-BMX055-DS000-02 Rev.1.1 November 7th, 2014
+ *  Sample software
+ *      BMX055 - Combination of bma2x2 + bmg160 + bmm050 APIs
+ *          https://github.com/BoschSensortec/BMA2x2_driver
+ *          https://github.com/BoschSensortec/BMG160_driver
+ *          https://github.com/BoschSensortec/BMM050_driver
+ * Aplied Board
+ *      AE-BMX055 Module
+ *          http://akizukidenshi.com/catalog/g/gK-13010/
+ */
+ 
+// NO Interrupt functions are supported due to no pin on AE-BMX055 Module
+// Only supprt normal mode (No sleep and/or standby mode)
+ 
+#ifndef BMX055_H
+#define BMX055_H
+ 
+#include "mbed.h"
+ 
+#define AKIZUKI_BOARD
+ 
+//  BMX055
+//  Automatic detection for the address!!
+//  AE-BMX055 board default setting (All jumpers are open)
+#define BMX055_GYR_CHIP_ADDR      (0x69 << 1)
+#define BMX055_ACC_CHIP_ADDR      (0x19 << 1)
+#define BMX055_MAG_CHIP_ADDR      (0x13 << 1)
+ 
+//  ID's
+#define I_AM_BMX055_ACC         0xfa    // ACC ID
+#define I_AM_BMX055_GYR         0x0f    // GYR ID
+#define I_AM_BMX055_MAG         0x32    // MAG ID
+ 
+////////////// PARAMETER DEFINITION ///////////////////////
+//  ACC full scale
+#define ACC_2G      3
+#define ACC_4G      5
+#define ACC_8G      8
+#define ACC_16G     12
+ 
+// Support only "filtered mode"
+//  ACC Bandwidth (BW = ODR/2 (ODR = Output Data Rate))
+#define ACC_BW7R81Hz    8   // 64 ms
+#define ACC_BW15R63Hz   9   // 32 ms
+#define ACC_BW31R25Hz   10  // 16 ms
+#define ACC_BW62R5Hz    11  // 8 ms
+#define ACC_BW125Hz     12  // 4 ms
+#define ACC_BW250Hz     13  // 2 ms
+#define ACC_BW500Hz     14  // 1 ms
+#define ACC_BW1kHz      15  // 0.5 ms
+ 
+// Gyro Sampling (Data per Second)
+#define GYR_2000DPS     0   //  full scal +/- 2000 Deg/s(61.0 mDeg/sec/LSB)
+#define GYR_1000DPS     1   //  +/- 1000 Deg/s(30.5 mDeg/sec/LSB)
+#define GYR_500DPS      2   //  +/- 500 Deg/s(15.3 mDeg/sec/LSB)
+#define GYR_250DPS      3   //  +/- 250 Deg/s(7.6 mDeg/sec/LSB)
+#define GYR_125DPS      4   //  +/- 125 Deg/s(3.8 mDeg/sec/LSB)
+ 
+// Gyro Bandwidth
+#define GYR_2000Hz523Hz 0   // 2000 Hz ODR and unfiltered (BW(bandwidth) 523Hz)
+#define GYR_2000Hz230Hz 1   // 2000 Hz ODR 230 Hz BW
+#define GYR_1000Hz116Hz 2   // 1000 Hz ODR 116 Hz BW
+#define GYR_400Hz47Hz   3   // 400 Hz ODR 47 Hz BW
+#define GYR_200Hz23Hz   4   // 200 Hz ODR 23 Hz BW
+#define GYR_100Hz12Hz   5   // 100 Hz ODR 12 Hz BW
+#define GYR_200Hz64Hz   6   // 200 Hz ODR 64 Hz BW
+#define GYR_100Hz32Hz   7   // 100 Hz ODR 32 Hz BW
+ 
+// MAG
+#define MAG_ODR10Hz     0   // 10 Hz ODR(default)
+#define MAG_ODR2Hz      1   // 2 Hz ODR
+#define MAG_ODR6Hz      2   // 6 Hz ODR
+#define MAG_ODR8Hz      3   // 8 Hz ODR
+#define MAG_ODR15Hz     4   // 15 Hz ODR
+#define MAG_ODR20Hz     5   // 20 Hz ODR
+#define MAG_ODR25Hz     6   // 25 Hz ODR
+#define MAG_ODR30Hz     7   // 30 Hz ODR
+ 
+////////////// DATA TYPE DEFINITION ///////////////////////
+typedef struct {
+    // ACC
+    uint8_t acc_fs;     // Accelerometer full scale range
+    uint8_t acc_bw;     // Accelerometer filtered bandwidth
+    // GYR
+    uint8_t gyr_fs;     // Gyroscope full scale range
+    uint8_t gyr_bw;     // Gyroscope filtered bandwidth
+    // MAG
+    uint8_t mag_odr;    // Magnetometer Output Data Rate 
+} BMX055_TypeDef;
+ 
+////////////// DEFAULT SETTING ////////////////////////////
+// Standard parameter for easy set-up
+const BMX055_TypeDef bmx055_std_paramtr = {
+    // ACC
+    ACC_2G,
+    ACC_BW62R5Hz,
+    // GYR
+    GYR_500DPS,
+    GYR_100Hz32Hz,
+    // MAG
+    MAG_ODR10Hz
+};
+ 
+////////////// DATA TYPE DEFINITION ///////////////////////
+typedef struct {
+    uint8_t  acc_addr;
+    uint8_t  mag_addr;
+    uint8_t  gyr_addr;
+} BMX055_ADDR_INF_TypeDef;
+ 
+typedef struct {
+    uint8_t  acc_id;
+    uint8_t  mag_id;
+    uint8_t  gyr_id;
+} BMX055_ID_INF_TypeDef;
+ 
+typedef struct {
+    float x;
+    float y;
+    float z;
+} BMX055_ACCEL_TypeDef;
+ 
+typedef struct {
+    float x;
+    float y;
+    float z;
+} BMX055_GRAVITY_TypeDef;
+ 
+typedef struct {
+    float x;
+    float y;
+    float z;
+} BMX055_GYRO_TypeDef;
+ 
+typedef struct {
+    float x;
+    float y;
+    float z;
+} BMX055_MAGNET_TypeDef;
+ 
+/** BMX055 Small, versatile 9-axis sensor module by Bosch Sensortec
+ * @code
+ * #include    "mbed.h"
+ * #include    "BMX055.h"
+ *
+ * Serial pc(USBTX,USBRX);
+ * I2C    (I2C_SDA, I2C_SCL);
+ * BMX055 imu(i2c);
+ *
+ * const BMX055_TypeDef bmx055_my_parameters = {
+ *   // ACC
+ *   ACC_2G,
+ *   ACC_BW250Hz,
+ *   // GYR
+ *   GYR_125DPS,
+ *   GYR_200Hz23Hz,
+ *   // MAG
+ *   MAG_ODR10Hz
+ * };
+ *
+ * int main() {
+ *     BMX055_ACCEL_TypeDef  acc;
+ *     BMX055_GYRO_TypeDef   gyr;
+ *     BMX055_MAGNET_TypeDef mag;
+ *
+ *     if (imu.imu.chip_ready() == 0){
+ *         pc.printf("Bosch BMX055 is NOT avirable!!\r\n");
+ *     }
+ *     imu.set_parameter(&bmx055_my_parameters);
+ *     while(1) {
+ *         imu.get_accel(&acc);
+ *         pc.printf("//ACC: x=%+3.2f y=%+3.2f z=%+3.2f //",
+ *                    acc.x, acc.y, acc.z);
+ *         imu.get_gyro(&gyr);
+ *         pc.printf("GYR: x=%+3.2f y=%+3.2f z=%+3.2f //",
+ *                    gyr.x, gyr.y, gyr.z);
+ *         imu.get_magnet(&mag);
+ *         pc.printf("MAG: x=%+3.2f y=%+3.2f z=%+3.2f , passed %u sec\r\n",
+ *                    mag.x, mag.y, mag.z, n++);
+ *         wait(0.5f);
+ *     }
+ * }
+ * @endcode
+ */
+ 
+class BMX055
+{
+public:
+    /** Configure data pin
+      * @param data SDA and SCL pins
+      * @param Other parameters are set automatically
+      */
+    BMX055(I2C& i2c);
+ 
+    /** Configure data pin (with other devices on I2C line)
+      * @param I2C previous definition
+      * @param Other parameters are set automatically
+      */
+ 
+    /** Get accel data
+     * @param float type of 3D data address
+     */
+    float get_chip_temperature(void);
+ 
+    /** Read BMX055 ID information
+      * @param ID information address
+      * @return none
+      */
+    void read_id_inf(BMX055_ID_INF_TypeDef *id);
+ 
+    /** Check chip is avairable or not
+      * @param none
+      * @return OK = true, NG = false;
+      */
+    bool chip_ready(void);
+ 
+    /** Check chip is avairable or not
+      * @param configration parameter
+      * @return none
+      */
+    void set_parameter(const BMX055_TypeDef *bmx055_parameter);
+ 
+    /** Set I2C clock frequency
+      * @param freq.
+      * @return none
+      */
+    void frequency(int hz);
+ 
+    /** Read register
+      * @param register's address
+      * @return register data
+      */
+    uint8_t read_reg(uint8_t addr);
+ 
+    /** Write register
+      * @param register's address
+      * @param data
+      * @return register data
+      */
+    uint8_t write_reg(uint8_t addr, uint8_t data);
+    void readAccel(void);
+    void readGyro(void);
+    void readMag(void);
+    float gyroX, gyroY, gyroZ; // x, y, and z axis readings of the gyroscope (float value)
+    float accX, accY, accZ; // x, y, and z axis readings of the accelerometer (float value)
+    float magX, magY, magZ; // x, y, and z axis readings of the magnetometer (float value)
+    uint16_t begin();
+protected:
+    void initialize(void);
+    void check_id(void);
+    void set_parameters_to_regs(void);
+ 
+     I2C &i2c;
+     
+ 
+private:
+    char     dt[16];      // working buffer
+    uint8_t  chip_addr;
+    BMX055_ADDR_INF_TypeDef inf_addr;
+    BMX055_ID_INF_TypeDef inf_id;
+    float gyr_factor, acc_factor; 
+    uint8_t  ready_flag;
+    
+    
+    
+    BMX055_TypeDef bmx055_parameters;
+    uint8_t  acc_id;
+    uint8_t  mag_id;
+    uint8_t  gyr_id;
+};
+
+
+#endif      // BMX055_H
\ No newline at end of file