Small, versatile 9-axis sensor module by Bosch Sensortec 3D Accelerometer + 3D Gyroscope + 3D Magnetometer

Dependents:   Pruebas_Flex_IMU_copy BMX055_Madgwick

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BMX055.h Source File

BMX055.h

00001 /*
00002  * mbed library program
00003  *  BMX055 Small, versatile 9-axis sensor module
00004  *  by Bosch Sensortec
00005  *
00006  * Copyright (c) 2018,'19 Kenji Arai / JH1PJL
00007  *  http://www.page.sannet.ne.jp/kenjia/index.html
00008  *  http://mbed.org/users/kenjiArai/
00009  *      Started:    October   24th, 2018
00010  *      Revised:    March      3rd, 2019
00011  */
00012 /*
00013  *---------------- REFERENCE ---------------------------------------------------
00014  * Original Information
00015  *  https://www.bosch-sensortec.com/bst/products/all_products/bmx055
00016  *  Data Sheet  BST-BMX055-DS000-02 Rev.1.1 November 7th, 2014
00017  *  Sample software
00018  *      BMX055 - Combination of bma2x2 + bmg160 + bmm050 APIs
00019  *          https://github.com/BoschSensortec/BMA2x2_driver
00020  *          https://github.com/BoschSensortec/BMG160_driver
00021  *          https://github.com/BoschSensortec/BMM050_driver
00022  * Aplied Board
00023  *      AE-BMX055 Module
00024  *          http://akizukidenshi.com/catalog/g/gK-13010/
00025  */
00026 
00027 // NO Interrupt functions are supported due to no pin on AE-BMX055 Module
00028 // Only supprt normal mode (No sleep and/or standby mode)
00029 
00030 #ifndef BMX055_H
00031 #define BMX055_H
00032 
00033 #include "mbed.h"
00034 
00035 #define AKIZUKI_BOARD
00036 
00037 //  BMX055
00038 //  Automatic detection for the address!!
00039 //  AE-BMX055 board default setting (All jumpers are open)
00040 #define BMX055_GYR_CHIP_ADDR      (0x69 << 1)
00041 #define BMX055_ACC_CHIP_ADDR      (0x19 << 1)
00042 #define BMX055_MAG_CHIP_ADDR      (0x13 << 1)
00043 
00044 //  ID's
00045 #define I_AM_BMX055_ACC         0xfa    // ACC ID
00046 #define I_AM_BMX055_GYR         0x0f    // GYR ID
00047 #define I_AM_BMX055_MAG         0x32    // MAG ID
00048 
00049 ////////////// PARAMETER DEFINITION ///////////////////////
00050 //  ACC full scale
00051 #define ACC_2G      3
00052 #define ACC_4G      5
00053 #define ACC_8G      8
00054 #define ACC_16G     12
00055 
00056 // Support only "filtered mode"
00057 //  ACC Bandwidth (BW = ODR/2 (ODR = Output Data Rate))
00058 #define ACC_BW7R81Hz    8   // 64 ms
00059 #define ACC_BW15R63Hz   9   // 32 ms
00060 #define ACC_BW31R25Hz   10  // 16 ms
00061 #define ACC_BW62R5Hz    11  // 8 ms
00062 #define ACC_BW125Hz     12  // 4 ms
00063 #define ACC_BW250Hz     13  // 2 ms
00064 #define ACC_BW500Hz     14  // 1 ms
00065 #define ACC_BW1kHz      15  // 0.5 ms
00066 
00067 // Gyro Sampling (Data per Second)
00068 #define GYR_2000DPS     0   //  full scal +/- 2000 Deg/s(61.0 mDeg/sec/LSB)
00069 #define GYR_1000DPS     1   //  +/- 1000 Deg/s(30.5 mDeg/sec/LSB)
00070 #define GYR_500DPS      2   //  +/- 500 Deg/s(15.3 mDeg/sec/LSB)
00071 #define GYR_250DPS      3   //  +/- 250 Deg/s(7.6 mDeg/sec/LSB)
00072 #define GYR_125DPS      4   //  +/- 125 Deg/s(3.8 mDeg/sec/LSB)
00073 
00074 // Gyro Bandwidth
00075 #define GYR_2000Hz523Hz 0   // 2000 Hz ODR and unfiltered (BW(bandwidth) 523Hz)
00076 #define GYR_2000Hz230Hz 1   // 2000 Hz ODR 230 Hz BW
00077 #define GYR_1000Hz116Hz 2   // 1000 Hz ODR 116 Hz BW
00078 #define GYR_400Hz47Hz   3   // 400 Hz ODR 47 Hz BW
00079 #define GYR_200Hz23Hz   4   // 200 Hz ODR 23 Hz BW
00080 #define GYR_100Hz12Hz   5   // 100 Hz ODR 12 Hz BW
00081 #define GYR_200Hz64Hz   6   // 200 Hz ODR 64 Hz BW
00082 #define GYR_100Hz32Hz   7   // 100 Hz ODR 32 Hz BW
00083 
00084 // MAG
00085 #define MAG_ODR10Hz     0   // 10 Hz ODR(default)
00086 #define MAG_ODR2Hz      1   // 2 Hz ODR
00087 #define MAG_ODR6Hz      2   // 6 Hz ODR
00088 #define MAG_ODR8Hz      3   // 8 Hz ODR
00089 #define MAG_ODR15Hz     4   // 15 Hz ODR
00090 #define MAG_ODR20Hz     5   // 20 Hz ODR
00091 #define MAG_ODR25Hz     6   // 25 Hz ODR
00092 #define MAG_ODR30Hz     7   // 30 Hz ODR
00093 
00094 ////////////// DATA TYPE DEFINITION ///////////////////////
00095 typedef struct {
00096     // ACC
00097     uint8_t acc_fs;     // Accelerometer full scale range
00098     uint8_t acc_bw;     // Accelerometer filtered bandwidth
00099     // GYR
00100     uint8_t gyr_fs;     // Gyroscope full scale range
00101     uint8_t gyr_bw;     // Gyroscope filtered bandwidth
00102     // MAG
00103     uint8_t mag_odr;    // Magnetometer Output Data Rate 
00104 } BMX055_TypeDef;
00105 
00106 ////////////// DEFAULT SETTING ////////////////////////////
00107 // Standard parameter for easy set-up
00108 const BMX055_TypeDef bmx055_std_paramtr = {
00109     // ACC
00110     ACC_2G,
00111     ACC_BW250Hz,
00112     // GYR
00113     GYR_125DPS,
00114     GYR_100Hz32Hz,
00115     // MAG
00116     MAG_ODR10Hz
00117 };
00118 
00119 ////////////// DATA TYPE DEFINITION ///////////////////////
00120 typedef struct {
00121     uint8_t  acc_addr;
00122     uint8_t  mag_addr;
00123     uint8_t  gyr_addr;
00124 } BMX055_ADDR_INF_TypeDef;
00125 
00126 typedef struct {
00127     uint8_t  acc_id;
00128     uint8_t  mag_id;
00129     uint8_t  gyr_id;
00130 } BMX055_ID_INF_TypeDef;
00131 
00132 typedef struct {
00133     float x;
00134     float y;
00135     float z;
00136 } BMX055_ACCEL_TypeDef;
00137 
00138 typedef struct {
00139     float x;
00140     float y;
00141     float z;
00142 } BMX055_GRAVITY_TypeDef;
00143 
00144 typedef struct {
00145     float x;
00146     float y;
00147     float z;
00148 } BMX055_GYRO_TypeDef;
00149 
00150 typedef struct {
00151     float x;
00152     float y;
00153     float z;
00154 } BMX055_MAGNET_TypeDef;
00155 
00156 /** BMX055 Small, versatile 9-axis sensor module by Bosch Sensortec
00157  * @code
00158  * #include    "mbed.h"
00159  * #include    "BMX055.h"
00160  *
00161  * Serial pc(USBTX,USBRX);
00162  * I2C    (I2C_SDA, I2C_SCL);
00163  * BMX055 imu(i2c);
00164  *
00165  * const BMX055_TypeDef bmx055_my_parameters = {
00166  *   // ACC
00167  *   ACC_2G,
00168  *   ACC_BW250Hz,
00169  *   // GYR
00170  *   GYR_125DPS,
00171  *   GYR_200Hz23Hz,
00172  *   // MAG
00173  *   MAG_ODR10Hz
00174  * };
00175  *
00176  * int main() {
00177  *     BMX055_ACCEL_TypeDef  acc;
00178  *     BMX055_GYRO_TypeDef   gyr;
00179  *     BMX055_MAGNET_TypeDef mag;
00180  *
00181  *     if (imu.imu.chip_ready() == 0){
00182  *         pc.printf("Bosch BMX055 is NOT avirable!!\r\n");
00183  *     }
00184  *     imu.set_parameter(&bmx055_my_parameters);
00185  *     while(1) {
00186  *         imu.get_accel(&acc);
00187  *         pc.printf("//ACC: x=%+3.2f y=%+3.2f z=%+3.2f //",
00188  *                    acc.x, acc.y, acc.z);
00189  *         imu.get_gyro(&gyr);
00190  *         pc.printf("GYR: x=%+3.2f y=%+3.2f z=%+3.2f //",
00191  *                    gyr.x, gyr.y, gyr.z);
00192  *         imu.get_magnet(&mag);
00193  *         pc.printf("MAG: x=%+3.2f y=%+3.2f z=%+3.2f , passed %u sec\r\n",
00194  *                    mag.x, mag.y, mag.z, n++);
00195  *         wait(0.5f);
00196  *     }
00197  * }
00198  * @endcode
00199  */
00200 
00201 class BMX055
00202 {
00203 public:
00204     /** Configure data pin
00205       * @param data SDA and SCL pins
00206       * @param Other parameters are set automatically
00207       */
00208     BMX055(PinName p_sda, PinName p_scl);
00209 
00210     /** Configure data pin (with other devices on I2C line)
00211       * @param I2C previous definition
00212       * @param Other parameters are set automatically
00213       */
00214     BMX055(I2C& p_i2c);
00215 
00216     /** Get accel data
00217      * @param float type of 3D data address
00218      */
00219     void get_accel(BMX055_ACCEL_TypeDef *acc);
00220 
00221     /** Get gyroscope data
00222      * @param float type of 3D data address
00223      */
00224     void get_gyro(BMX055_GYRO_TypeDef *gyr);
00225 
00226     /** Get magnet data
00227      * @param float type of 3D data address
00228      */
00229     void get_magnet(BMX055_MAGNET_TypeDef *mag);
00230 
00231     /** Get Chip temperature data both Acc & Gyro
00232      * @param none
00233      * @return temperature data
00234      */
00235     float get_chip_temperature(void);
00236 
00237     /** Read BMX055 ID information
00238       * @param ID information address
00239       * @return none
00240       */
00241     void read_id_inf(BMX055_ID_INF_TypeDef *id);
00242 
00243     /** Check chip is avairable or not
00244       * @param none
00245       * @return OK = true, NG = false;
00246       */
00247     bool chip_ready(void);
00248 
00249     /** Check chip is avairable or not
00250       * @param configration parameter
00251       * @return none
00252       */
00253     void set_parameter(const BMX055_TypeDef *bmx055_parameter);
00254 
00255     /** Set I2C clock frequency
00256       * @param freq.
00257       * @return none
00258       */
00259     void frequency(int hz);
00260 
00261     /** Read register
00262       * @param register's address
00263       * @return register data
00264       */
00265     uint8_t read_reg(uint8_t addr);
00266 
00267     /** Write register
00268       * @param register's address
00269       * @param data
00270       * @return register data
00271       */
00272     uint8_t write_reg(uint8_t addr, uint8_t data);
00273 
00274 protected:
00275     void initialize(void);
00276     void check_id(void);
00277     void set_parameters_to_regs(void);
00278 
00279     I2C *_i2c_p;
00280     I2C &_i2c;
00281 
00282 private:
00283     char     dt[16];      // working buffer
00284     uint8_t  chip_addr;
00285     BMX055_ADDR_INF_TypeDef inf_addr;
00286     BMX055_ID_INF_TypeDef inf_id;
00287 
00288     uint8_t  ready_flag;
00289     
00290     
00291     
00292     BMX055_TypeDef bmx055_parameters;
00293     uint8_t  acc_id;
00294     uint8_t  mag_id;
00295     uint8_t  gyr_id;
00296 };
00297 
00298 #endif      // BMX055_H