AHRS

Dependencies:   Eigen

Dependents:   IndNav_QK3_T265

Committer:
pmic
Date:
Mon Jan 27 10:54:13 2020 +0000
Revision:
30:9b0cd3caf0ec
Parent:
29:cd963a6d31c5
Correct magnetometer.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
altb2 25:fe14dbcef82d 1 /*
altb2 25:fe14dbcef82d 2 * mbed library program
altb2 25:fe14dbcef82d 3 * BMX055 Small, versatile 9-axis sensor module
altb2 25:fe14dbcef82d 4 * by Bosch Sensortec
altb2 25:fe14dbcef82d 5 *
altb2 25:fe14dbcef82d 6 * Copyright (c) 2018,'19 Kenji Arai / JH1PJL
altb2 25:fe14dbcef82d 7 * http://www.page.sannet.ne.jp/kenjia/index.html
altb2 25:fe14dbcef82d 8 * http://mbed.org/users/kenjiArai/
altb2 25:fe14dbcef82d 9 * Started: October 24th, 2018
altb2 25:fe14dbcef82d 10 * Revised: March 3rd, 2019
altb2 25:fe14dbcef82d 11 */
altb2 25:fe14dbcef82d 12 /*
altb2 25:fe14dbcef82d 13 *---------------- REFERENCE ---------------------------------------------------
altb2 25:fe14dbcef82d 14 * Original Information
altb2 25:fe14dbcef82d 15 * https://www.bosch-sensortec.com/bst/products/all_products/bmx055
altb2 25:fe14dbcef82d 16 * Data Sheet BST-BMX055-DS000-02 Rev.1.1 November 7th, 2014
altb2 25:fe14dbcef82d 17 * Sample software
altb2 25:fe14dbcef82d 18 * BMX055 - Combination of bma2x2 + bmg160 + bmm050 APIs
altb2 25:fe14dbcef82d 19 * https://github.com/BoschSensortec/BMA2x2_driver
altb2 25:fe14dbcef82d 20 * https://github.com/BoschSensortec/BMG160_driver
altb2 25:fe14dbcef82d 21 * https://github.com/BoschSensortec/BMM050_driver
altb2 25:fe14dbcef82d 22 * Aplied Board
altb2 25:fe14dbcef82d 23 * AE-BMX055 Module
altb2 25:fe14dbcef82d 24 * http://akizukidenshi.com/catalog/g/gK-13010/
altb2 25:fe14dbcef82d 25 */
altb2 25:fe14dbcef82d 26
altb2 25:fe14dbcef82d 27 // NO Interrupt functions are supported due to no pin on AE-BMX055 Module
altb2 25:fe14dbcef82d 28 // Only supprt normal mode (No sleep and/or standby mode)
altb2 25:fe14dbcef82d 29
altb2 25:fe14dbcef82d 30 #ifndef BMX055_H
altb2 25:fe14dbcef82d 31 #define BMX055_H
altb2 25:fe14dbcef82d 32
altb2 25:fe14dbcef82d 33 #include "mbed.h"
altb2 25:fe14dbcef82d 34
altb2 25:fe14dbcef82d 35 #define AKIZUKI_BOARD
altb2 25:fe14dbcef82d 36
altb2 25:fe14dbcef82d 37 // BMX055
altb2 25:fe14dbcef82d 38 // Automatic detection for the address!!
altb2 25:fe14dbcef82d 39 // AE-BMX055 board default setting (All jumpers are open)
altb2 25:fe14dbcef82d 40 #define BMX055_GYR_CHIP_ADDR (0x69 << 1)
altb2 25:fe14dbcef82d 41 #define BMX055_ACC_CHIP_ADDR (0x19 << 1)
altb2 25:fe14dbcef82d 42 #define BMX055_MAG_CHIP_ADDR (0x13 << 1)
altb2 25:fe14dbcef82d 43
altb2 25:fe14dbcef82d 44 // ID's
altb2 25:fe14dbcef82d 45 #define I_AM_BMX055_ACC 0xfa // ACC ID
altb2 25:fe14dbcef82d 46 #define I_AM_BMX055_GYR 0x0f // GYR ID
altb2 25:fe14dbcef82d 47 #define I_AM_BMX055_MAG 0x32 // MAG ID
altb2 25:fe14dbcef82d 48
altb2 25:fe14dbcef82d 49 ////////////// PARAMETER DEFINITION ///////////////////////
altb2 25:fe14dbcef82d 50 // ACC full scale
altb2 25:fe14dbcef82d 51 #define ACC_2G 3
altb2 25:fe14dbcef82d 52 #define ACC_4G 5
altb2 25:fe14dbcef82d 53 #define ACC_8G 8
altb2 25:fe14dbcef82d 54 #define ACC_16G 12
altb2 25:fe14dbcef82d 55
altb2 25:fe14dbcef82d 56 // Support only "filtered mode"
altb2 25:fe14dbcef82d 57 // ACC Bandwidth (BW = ODR/2 (ODR = Output Data Rate))
altb2 25:fe14dbcef82d 58 #define ACC_BW7R81Hz 8 // 64 ms
altb2 25:fe14dbcef82d 59 #define ACC_BW15R63Hz 9 // 32 ms
altb2 25:fe14dbcef82d 60 #define ACC_BW31R25Hz 10 // 16 ms
altb2 25:fe14dbcef82d 61 #define ACC_BW62R5Hz 11 // 8 ms
altb2 25:fe14dbcef82d 62 #define ACC_BW125Hz 12 // 4 ms
altb2 25:fe14dbcef82d 63 #define ACC_BW250Hz 13 // 2 ms
altb2 25:fe14dbcef82d 64 #define ACC_BW500Hz 14 // 1 ms
altb2 25:fe14dbcef82d 65 #define ACC_BW1kHz 15 // 0.5 ms
altb2 25:fe14dbcef82d 66
altb2 25:fe14dbcef82d 67 // Gyro Sampling (Data per Second)
altb2 25:fe14dbcef82d 68 #define GYR_2000DPS 0 // full scal +/- 2000 Deg/s(61.0 mDeg/sec/LSB)
altb2 25:fe14dbcef82d 69 #define GYR_1000DPS 1 // +/- 1000 Deg/s(30.5 mDeg/sec/LSB)
altb2 25:fe14dbcef82d 70 #define GYR_500DPS 2 // +/- 500 Deg/s(15.3 mDeg/sec/LSB)
altb2 25:fe14dbcef82d 71 #define GYR_250DPS 3 // +/- 250 Deg/s(7.6 mDeg/sec/LSB)
altb2 25:fe14dbcef82d 72 #define GYR_125DPS 4 // +/- 125 Deg/s(3.8 mDeg/sec/LSB)
altb2 25:fe14dbcef82d 73
altb2 25:fe14dbcef82d 74 // Gyro Bandwidth
altb2 25:fe14dbcef82d 75 #define GYR_2000Hz523Hz 0 // 2000 Hz ODR and unfiltered (BW(bandwidth) 523Hz)
altb2 25:fe14dbcef82d 76 #define GYR_2000Hz230Hz 1 // 2000 Hz ODR 230 Hz BW
altb2 25:fe14dbcef82d 77 #define GYR_1000Hz116Hz 2 // 1000 Hz ODR 116 Hz BW
altb2 25:fe14dbcef82d 78 #define GYR_400Hz47Hz 3 // 400 Hz ODR 47 Hz BW
altb2 25:fe14dbcef82d 79 #define GYR_200Hz23Hz 4 // 200 Hz ODR 23 Hz BW
altb2 25:fe14dbcef82d 80 #define GYR_100Hz12Hz 5 // 100 Hz ODR 12 Hz BW
altb2 25:fe14dbcef82d 81 #define GYR_200Hz64Hz 6 // 200 Hz ODR 64 Hz BW
altb2 25:fe14dbcef82d 82 #define GYR_100Hz32Hz 7 // 100 Hz ODR 32 Hz BW
altb2 25:fe14dbcef82d 83
altb2 25:fe14dbcef82d 84 // MAG
altb2 25:fe14dbcef82d 85 #define MAG_ODR10Hz 0 // 10 Hz ODR(default)
altb2 25:fe14dbcef82d 86 #define MAG_ODR2Hz 1 // 2 Hz ODR
altb2 25:fe14dbcef82d 87 #define MAG_ODR6Hz 2 // 6 Hz ODR
altb2 25:fe14dbcef82d 88 #define MAG_ODR8Hz 3 // 8 Hz ODR
altb2 25:fe14dbcef82d 89 #define MAG_ODR15Hz 4 // 15 Hz ODR
altb2 25:fe14dbcef82d 90 #define MAG_ODR20Hz 5 // 20 Hz ODR
altb2 25:fe14dbcef82d 91 #define MAG_ODR25Hz 6 // 25 Hz ODR
altb2 25:fe14dbcef82d 92 #define MAG_ODR30Hz 7 // 30 Hz ODR
altb2 25:fe14dbcef82d 93
altb2 25:fe14dbcef82d 94 ////////////// DATA TYPE DEFINITION ///////////////////////
altb2 25:fe14dbcef82d 95 typedef struct {
altb2 25:fe14dbcef82d 96 // ACC
altb2 25:fe14dbcef82d 97 uint8_t acc_fs; // Accelerometer full scale range
altb2 25:fe14dbcef82d 98 uint8_t acc_bw; // Accelerometer filtered bandwidth
altb2 25:fe14dbcef82d 99 // GYR
altb2 25:fe14dbcef82d 100 uint8_t gyr_fs; // Gyroscope full scale range
altb2 25:fe14dbcef82d 101 uint8_t gyr_bw; // Gyroscope filtered bandwidth
altb2 25:fe14dbcef82d 102 // MAG
altb2 25:fe14dbcef82d 103 uint8_t mag_odr; // Magnetometer Output Data Rate
altb2 25:fe14dbcef82d 104 } BMX055_TypeDef;
altb2 25:fe14dbcef82d 105
altb2 25:fe14dbcef82d 106 ////////////// DEFAULT SETTING ////////////////////////////
altb2 25:fe14dbcef82d 107 // Standard parameter for easy set-up
altb2 25:fe14dbcef82d 108 const BMX055_TypeDef bmx055_std_paramtr = {
altb2 25:fe14dbcef82d 109 // ACC
altb2 25:fe14dbcef82d 110 ACC_2G,
pmic 27:973e495f4711 111 ACC_BW31R25Hz, // ACC_BW31R25Hz -> ODR = 62.5 Hz
altb2 25:fe14dbcef82d 112 // GYR
altb2 25:fe14dbcef82d 113 GYR_500DPS,
pmic 29:cd963a6d31c5 114 GYR_200Hz23Hz,
altb2 25:fe14dbcef82d 115 // MAG
pmic 29:cd963a6d31c5 116 MAG_ODR30Hz
altb2 25:fe14dbcef82d 117 };
altb2 25:fe14dbcef82d 118
altb2 25:fe14dbcef82d 119 ////////////// DATA TYPE DEFINITION ///////////////////////
altb2 25:fe14dbcef82d 120 typedef struct {
altb2 25:fe14dbcef82d 121 uint8_t acc_addr;
altb2 25:fe14dbcef82d 122 uint8_t mag_addr;
altb2 25:fe14dbcef82d 123 uint8_t gyr_addr;
altb2 25:fe14dbcef82d 124 } BMX055_ADDR_INF_TypeDef;
altb2 25:fe14dbcef82d 125
altb2 25:fe14dbcef82d 126 typedef struct {
altb2 25:fe14dbcef82d 127 uint8_t acc_id;
altb2 25:fe14dbcef82d 128 uint8_t mag_id;
altb2 25:fe14dbcef82d 129 uint8_t gyr_id;
altb2 25:fe14dbcef82d 130 } BMX055_ID_INF_TypeDef;
altb2 25:fe14dbcef82d 131
altb2 25:fe14dbcef82d 132 typedef struct {
altb2 25:fe14dbcef82d 133 float x;
altb2 25:fe14dbcef82d 134 float y;
altb2 25:fe14dbcef82d 135 float z;
altb2 25:fe14dbcef82d 136 } BMX055_ACCEL_TypeDef;
altb2 25:fe14dbcef82d 137
altb2 25:fe14dbcef82d 138 typedef struct {
altb2 25:fe14dbcef82d 139 float x;
altb2 25:fe14dbcef82d 140 float y;
altb2 25:fe14dbcef82d 141 float z;
altb2 25:fe14dbcef82d 142 } BMX055_GRAVITY_TypeDef;
altb2 25:fe14dbcef82d 143
altb2 25:fe14dbcef82d 144 typedef struct {
altb2 25:fe14dbcef82d 145 float x;
altb2 25:fe14dbcef82d 146 float y;
altb2 25:fe14dbcef82d 147 float z;
altb2 25:fe14dbcef82d 148 } BMX055_GYRO_TypeDef;
altb2 25:fe14dbcef82d 149
altb2 25:fe14dbcef82d 150 typedef struct {
altb2 25:fe14dbcef82d 151 float x;
altb2 25:fe14dbcef82d 152 float y;
altb2 25:fe14dbcef82d 153 float z;
altb2 25:fe14dbcef82d 154 } BMX055_MAGNET_TypeDef;
altb2 25:fe14dbcef82d 155
altb2 25:fe14dbcef82d 156 /** BMX055 Small, versatile 9-axis sensor module by Bosch Sensortec
altb2 25:fe14dbcef82d 157 * @code
altb2 25:fe14dbcef82d 158 * #include "mbed.h"
altb2 25:fe14dbcef82d 159 * #include "BMX055.h"
altb2 25:fe14dbcef82d 160 *
altb2 25:fe14dbcef82d 161 * Serial pc(USBTX,USBRX);
altb2 25:fe14dbcef82d 162 * I2C (I2C_SDA, I2C_SCL);
altb2 25:fe14dbcef82d 163 * BMX055 imu(i2c);
altb2 25:fe14dbcef82d 164 *
altb2 25:fe14dbcef82d 165 * const BMX055_TypeDef bmx055_my_parameters = {
altb2 25:fe14dbcef82d 166 * // ACC
altb2 25:fe14dbcef82d 167 * ACC_2G,
altb2 25:fe14dbcef82d 168 * ACC_BW250Hz,
altb2 25:fe14dbcef82d 169 * // GYR
altb2 25:fe14dbcef82d 170 * GYR_125DPS,
altb2 25:fe14dbcef82d 171 * GYR_200Hz23Hz,
altb2 25:fe14dbcef82d 172 * // MAG
altb2 25:fe14dbcef82d 173 * MAG_ODR10Hz
altb2 25:fe14dbcef82d 174 * };
altb2 25:fe14dbcef82d 175 *
altb2 25:fe14dbcef82d 176 * int main() {
altb2 25:fe14dbcef82d 177 * BMX055_ACCEL_TypeDef acc;
altb2 25:fe14dbcef82d 178 * BMX055_GYRO_TypeDef gyr;
altb2 25:fe14dbcef82d 179 * BMX055_MAGNET_TypeDef mag;
altb2 25:fe14dbcef82d 180 *
altb2 25:fe14dbcef82d 181 * if (imu.imu.chip_ready() == 0){
altb2 25:fe14dbcef82d 182 * pc.printf("Bosch BMX055 is NOT avirable!!\r\n");
altb2 25:fe14dbcef82d 183 * }
altb2 25:fe14dbcef82d 184 * imu.set_parameter(&bmx055_my_parameters);
altb2 25:fe14dbcef82d 185 * while(1) {
altb2 25:fe14dbcef82d 186 * imu.get_accel(&acc);
altb2 25:fe14dbcef82d 187 * pc.printf("//ACC: x=%+3.2f y=%+3.2f z=%+3.2f //",
altb2 25:fe14dbcef82d 188 * acc.x, acc.y, acc.z);
altb2 25:fe14dbcef82d 189 * imu.get_gyro(&gyr);
altb2 25:fe14dbcef82d 190 * pc.printf("GYR: x=%+3.2f y=%+3.2f z=%+3.2f //",
altb2 25:fe14dbcef82d 191 * gyr.x, gyr.y, gyr.z);
altb2 25:fe14dbcef82d 192 * imu.get_magnet(&mag);
altb2 25:fe14dbcef82d 193 * pc.printf("MAG: x=%+3.2f y=%+3.2f z=%+3.2f , passed %u sec\r\n",
altb2 25:fe14dbcef82d 194 * mag.x, mag.y, mag.z, n++);
altb2 25:fe14dbcef82d 195 * wait(0.5f);
altb2 25:fe14dbcef82d 196 * }
altb2 25:fe14dbcef82d 197 * }
altb2 25:fe14dbcef82d 198 * @endcode
altb2 25:fe14dbcef82d 199 */
altb2 25:fe14dbcef82d 200
altb2 25:fe14dbcef82d 201 class BMX055
altb2 25:fe14dbcef82d 202 {
altb2 25:fe14dbcef82d 203 public:
altb2 25:fe14dbcef82d 204 /** Configure data pin
altb2 25:fe14dbcef82d 205 * @param data SDA and SCL pins
altb2 25:fe14dbcef82d 206 * @param Other parameters are set automatically
altb2 25:fe14dbcef82d 207 */
altb2 25:fe14dbcef82d 208 BMX055(I2C& i2c);
altb2 25:fe14dbcef82d 209
altb2 25:fe14dbcef82d 210 /** Configure data pin (with other devices on I2C line)
altb2 25:fe14dbcef82d 211 * @param I2C previous definition
altb2 25:fe14dbcef82d 212 * @param Other parameters are set automatically
altb2 25:fe14dbcef82d 213 */
altb2 25:fe14dbcef82d 214
altb2 25:fe14dbcef82d 215 /** Get accel data
altb2 25:fe14dbcef82d 216 * @param float type of 3D data address
altb2 25:fe14dbcef82d 217 */
altb2 25:fe14dbcef82d 218 float get_chip_temperature(void);
altb2 25:fe14dbcef82d 219
altb2 25:fe14dbcef82d 220 /** Read BMX055 ID information
altb2 25:fe14dbcef82d 221 * @param ID information address
altb2 25:fe14dbcef82d 222 * @return none
altb2 25:fe14dbcef82d 223 */
altb2 25:fe14dbcef82d 224 void read_id_inf(BMX055_ID_INF_TypeDef *id);
altb2 25:fe14dbcef82d 225
altb2 25:fe14dbcef82d 226 /** Check chip is avairable or not
altb2 25:fe14dbcef82d 227 * @param none
altb2 25:fe14dbcef82d 228 * @return OK = true, NG = false;
altb2 25:fe14dbcef82d 229 */
altb2 25:fe14dbcef82d 230 bool chip_ready(void);
altb2 25:fe14dbcef82d 231
altb2 25:fe14dbcef82d 232 /** Check chip is avairable or not
altb2 25:fe14dbcef82d 233 * @param configration parameter
altb2 25:fe14dbcef82d 234 * @return none
altb2 25:fe14dbcef82d 235 */
altb2 25:fe14dbcef82d 236 void set_parameter(const BMX055_TypeDef *bmx055_parameter);
altb2 25:fe14dbcef82d 237
altb2 25:fe14dbcef82d 238 /** Set I2C clock frequency
altb2 25:fe14dbcef82d 239 * @param freq.
altb2 25:fe14dbcef82d 240 * @return none
altb2 25:fe14dbcef82d 241 */
altb2 25:fe14dbcef82d 242 void frequency(int hz);
altb2 25:fe14dbcef82d 243
altb2 25:fe14dbcef82d 244 /** Read register
altb2 25:fe14dbcef82d 245 * @param register's address
altb2 25:fe14dbcef82d 246 * @return register data
altb2 25:fe14dbcef82d 247 */
altb2 25:fe14dbcef82d 248 uint8_t read_reg(uint8_t addr);
altb2 25:fe14dbcef82d 249
altb2 25:fe14dbcef82d 250 /** Write register
altb2 25:fe14dbcef82d 251 * @param register's address
altb2 25:fe14dbcef82d 252 * @param data
altb2 25:fe14dbcef82d 253 * @return register data
altb2 25:fe14dbcef82d 254 */
altb2 25:fe14dbcef82d 255 uint8_t write_reg(uint8_t addr, uint8_t data);
altb2 25:fe14dbcef82d 256 void readAccel(void);
altb2 25:fe14dbcef82d 257 void readGyro(void);
altb2 25:fe14dbcef82d 258 void readMag(void);
altb2 25:fe14dbcef82d 259 float gyroX, gyroY, gyroZ; // x, y, and z axis readings of the gyroscope (float value)
altb2 25:fe14dbcef82d 260 float accX, accY, accZ; // x, y, and z axis readings of the accelerometer (float value)
altb2 25:fe14dbcef82d 261 float magX, magY, magZ; // x, y, and z axis readings of the magnetometer (float value)
altb2 25:fe14dbcef82d 262 uint16_t begin();
altb2 25:fe14dbcef82d 263 protected:
altb2 25:fe14dbcef82d 264 void initialize(void);
altb2 25:fe14dbcef82d 265 void check_id(void);
altb2 25:fe14dbcef82d 266 void set_parameters_to_regs(void);
altb2 25:fe14dbcef82d 267
altb2 25:fe14dbcef82d 268 I2C &i2c;
altb2 25:fe14dbcef82d 269
altb2 25:fe14dbcef82d 270
altb2 25:fe14dbcef82d 271 private:
altb2 25:fe14dbcef82d 272 char dt[16]; // working buffer
altb2 25:fe14dbcef82d 273 uint8_t chip_addr;
altb2 25:fe14dbcef82d 274 BMX055_ADDR_INF_TypeDef inf_addr;
altb2 25:fe14dbcef82d 275 BMX055_ID_INF_TypeDef inf_id;
altb2 25:fe14dbcef82d 276 float gyr_factor, acc_factor;
altb2 25:fe14dbcef82d 277 uint8_t ready_flag;
altb2 25:fe14dbcef82d 278
altb2 25:fe14dbcef82d 279
altb2 25:fe14dbcef82d 280
altb2 25:fe14dbcef82d 281 BMX055_TypeDef bmx055_parameters;
altb2 25:fe14dbcef82d 282 uint8_t acc_id;
altb2 25:fe14dbcef82d 283 uint8_t mag_id;
altb2 25:fe14dbcef82d 284 uint8_t gyr_id;
altb2 25:fe14dbcef82d 285 };
altb2 25:fe14dbcef82d 286
altb2 25:fe14dbcef82d 287
altb2 25:fe14dbcef82d 288 #endif // BMX055_H