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

Dependents:   Pruebas_Flex_IMU_copy BMX055_Madgwick

BMX055.h

Committer:
kenjiArai
Date:
2019-03-04
Revision:
2:1bea0ef16d84
Parent:
0:4196bd8bb88f

File content as of revision 2:1bea0ef16d84:

/*
 * 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_BW250Hz,
    // GYR
    GYR_125DPS,
    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(PinName p_sda, PinName p_scl);

    /** Configure data pin (with other devices on I2C line)
      * @param I2C previous definition
      * @param Other parameters are set automatically
      */
    BMX055(I2C& p_i2c);

    /** Get accel data
     * @param float type of 3D data address
     */
    void get_accel(BMX055_ACCEL_TypeDef *acc);

    /** Get gyroscope data
     * @param float type of 3D data address
     */
    void get_gyro(BMX055_GYRO_TypeDef *gyr);

    /** Get magnet data
     * @param float type of 3D data address
     */
    void get_magnet(BMX055_MAGNET_TypeDef *mag);

    /** Get Chip temperature data both Acc & Gyro
     * @param none
     * @return temperature data
     */
    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);

protected:
    void initialize(void);
    void check_id(void);
    void set_parameters_to_regs(void);

    I2C *_i2c_p;
    I2C &_i2c;

private:
    char     dt[16];      // working buffer
    uint8_t  chip_addr;
    BMX055_ADDR_INF_TypeDef inf_addr;
    BMX055_ID_INF_TypeDef inf_id;

    uint8_t  ready_flag;
    
    
    
    BMX055_TypeDef bmx055_parameters;
    uint8_t  acc_id;
    uint8_t  mag_id;
    uint8_t  gyr_id;
};

#endif      // BMX055_H