AHRS

Dependencies:   Eigen

Dependents:   IndNav_QK3_T265

Committer:
altb2
Date:
Mon Jan 20 12:41:13 2020 +0000
Revision:
28:21dfb161c67c
Parent:
27:973e495f4711
Child:
29:cd963a6d31c5
read also BMI088, only for datalogging

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 27:973e495f4711 114 GYR_400Hz47Hz,
altb2 25:fe14dbcef82d 115 // MAG
altb2 28:21dfb161c67c 116 MAG_ODR10Hz // DO NOT CHANGE THIS (pmic), DOES NOT WORK WITH 30Hz!!!
altb2 28:21dfb161c67c 117 // maybe read manual in more detail first!
altb2 25:fe14dbcef82d 118 };
altb2 25:fe14dbcef82d 119
altb2 25:fe14dbcef82d 120 ////////////// DATA TYPE DEFINITION ///////////////////////
altb2 25:fe14dbcef82d 121 typedef struct {
altb2 25:fe14dbcef82d 122 uint8_t acc_addr;
altb2 25:fe14dbcef82d 123 uint8_t mag_addr;
altb2 25:fe14dbcef82d 124 uint8_t gyr_addr;
altb2 25:fe14dbcef82d 125 } BMX055_ADDR_INF_TypeDef;
altb2 25:fe14dbcef82d 126
altb2 25:fe14dbcef82d 127 typedef struct {
altb2 25:fe14dbcef82d 128 uint8_t acc_id;
altb2 25:fe14dbcef82d 129 uint8_t mag_id;
altb2 25:fe14dbcef82d 130 uint8_t gyr_id;
altb2 25:fe14dbcef82d 131 } BMX055_ID_INF_TypeDef;
altb2 25:fe14dbcef82d 132
altb2 25:fe14dbcef82d 133 typedef struct {
altb2 25:fe14dbcef82d 134 float x;
altb2 25:fe14dbcef82d 135 float y;
altb2 25:fe14dbcef82d 136 float z;
altb2 25:fe14dbcef82d 137 } BMX055_ACCEL_TypeDef;
altb2 25:fe14dbcef82d 138
altb2 25:fe14dbcef82d 139 typedef struct {
altb2 25:fe14dbcef82d 140 float x;
altb2 25:fe14dbcef82d 141 float y;
altb2 25:fe14dbcef82d 142 float z;
altb2 25:fe14dbcef82d 143 } BMX055_GRAVITY_TypeDef;
altb2 25:fe14dbcef82d 144
altb2 25:fe14dbcef82d 145 typedef struct {
altb2 25:fe14dbcef82d 146 float x;
altb2 25:fe14dbcef82d 147 float y;
altb2 25:fe14dbcef82d 148 float z;
altb2 25:fe14dbcef82d 149 } BMX055_GYRO_TypeDef;
altb2 25:fe14dbcef82d 150
altb2 25:fe14dbcef82d 151 typedef struct {
altb2 25:fe14dbcef82d 152 float x;
altb2 25:fe14dbcef82d 153 float y;
altb2 25:fe14dbcef82d 154 float z;
altb2 25:fe14dbcef82d 155 } BMX055_MAGNET_TypeDef;
altb2 25:fe14dbcef82d 156
altb2 25:fe14dbcef82d 157 /** BMX055 Small, versatile 9-axis sensor module by Bosch Sensortec
altb2 25:fe14dbcef82d 158 * @code
altb2 25:fe14dbcef82d 159 * #include "mbed.h"
altb2 25:fe14dbcef82d 160 * #include "BMX055.h"
altb2 25:fe14dbcef82d 161 *
altb2 25:fe14dbcef82d 162 * Serial pc(USBTX,USBRX);
altb2 25:fe14dbcef82d 163 * I2C (I2C_SDA, I2C_SCL);
altb2 25:fe14dbcef82d 164 * BMX055 imu(i2c);
altb2 25:fe14dbcef82d 165 *
altb2 25:fe14dbcef82d 166 * const BMX055_TypeDef bmx055_my_parameters = {
altb2 25:fe14dbcef82d 167 * // ACC
altb2 25:fe14dbcef82d 168 * ACC_2G,
altb2 25:fe14dbcef82d 169 * ACC_BW250Hz,
altb2 25:fe14dbcef82d 170 * // GYR
altb2 25:fe14dbcef82d 171 * GYR_125DPS,
altb2 25:fe14dbcef82d 172 * GYR_200Hz23Hz,
altb2 25:fe14dbcef82d 173 * // MAG
altb2 25:fe14dbcef82d 174 * MAG_ODR10Hz
altb2 25:fe14dbcef82d 175 * };
altb2 25:fe14dbcef82d 176 *
altb2 25:fe14dbcef82d 177 * int main() {
altb2 25:fe14dbcef82d 178 * BMX055_ACCEL_TypeDef acc;
altb2 25:fe14dbcef82d 179 * BMX055_GYRO_TypeDef gyr;
altb2 25:fe14dbcef82d 180 * BMX055_MAGNET_TypeDef mag;
altb2 25:fe14dbcef82d 181 *
altb2 25:fe14dbcef82d 182 * if (imu.imu.chip_ready() == 0){
altb2 25:fe14dbcef82d 183 * pc.printf("Bosch BMX055 is NOT avirable!!\r\n");
altb2 25:fe14dbcef82d 184 * }
altb2 25:fe14dbcef82d 185 * imu.set_parameter(&bmx055_my_parameters);
altb2 25:fe14dbcef82d 186 * while(1) {
altb2 25:fe14dbcef82d 187 * imu.get_accel(&acc);
altb2 25:fe14dbcef82d 188 * pc.printf("//ACC: x=%+3.2f y=%+3.2f z=%+3.2f //",
altb2 25:fe14dbcef82d 189 * acc.x, acc.y, acc.z);
altb2 25:fe14dbcef82d 190 * imu.get_gyro(&gyr);
altb2 25:fe14dbcef82d 191 * pc.printf("GYR: x=%+3.2f y=%+3.2f z=%+3.2f //",
altb2 25:fe14dbcef82d 192 * gyr.x, gyr.y, gyr.z);
altb2 25:fe14dbcef82d 193 * imu.get_magnet(&mag);
altb2 25:fe14dbcef82d 194 * pc.printf("MAG: x=%+3.2f y=%+3.2f z=%+3.2f , passed %u sec\r\n",
altb2 25:fe14dbcef82d 195 * mag.x, mag.y, mag.z, n++);
altb2 25:fe14dbcef82d 196 * wait(0.5f);
altb2 25:fe14dbcef82d 197 * }
altb2 25:fe14dbcef82d 198 * }
altb2 25:fe14dbcef82d 199 * @endcode
altb2 25:fe14dbcef82d 200 */
altb2 25:fe14dbcef82d 201
altb2 25:fe14dbcef82d 202 class BMX055
altb2 25:fe14dbcef82d 203 {
altb2 25:fe14dbcef82d 204 public:
altb2 25:fe14dbcef82d 205 /** Configure data pin
altb2 25:fe14dbcef82d 206 * @param data SDA and SCL pins
altb2 25:fe14dbcef82d 207 * @param Other parameters are set automatically
altb2 25:fe14dbcef82d 208 */
altb2 25:fe14dbcef82d 209 BMX055(I2C& i2c);
altb2 25:fe14dbcef82d 210
altb2 25:fe14dbcef82d 211 /** Configure data pin (with other devices on I2C line)
altb2 25:fe14dbcef82d 212 * @param I2C previous definition
altb2 25:fe14dbcef82d 213 * @param Other parameters are set automatically
altb2 25:fe14dbcef82d 214 */
altb2 25:fe14dbcef82d 215
altb2 25:fe14dbcef82d 216 /** Get accel data
altb2 25:fe14dbcef82d 217 * @param float type of 3D data address
altb2 25:fe14dbcef82d 218 */
altb2 25:fe14dbcef82d 219 float get_chip_temperature(void);
altb2 25:fe14dbcef82d 220
altb2 25:fe14dbcef82d 221 /** Read BMX055 ID information
altb2 25:fe14dbcef82d 222 * @param ID information address
altb2 25:fe14dbcef82d 223 * @return none
altb2 25:fe14dbcef82d 224 */
altb2 25:fe14dbcef82d 225 void read_id_inf(BMX055_ID_INF_TypeDef *id);
altb2 25:fe14dbcef82d 226
altb2 25:fe14dbcef82d 227 /** Check chip is avairable or not
altb2 25:fe14dbcef82d 228 * @param none
altb2 25:fe14dbcef82d 229 * @return OK = true, NG = false;
altb2 25:fe14dbcef82d 230 */
altb2 25:fe14dbcef82d 231 bool chip_ready(void);
altb2 25:fe14dbcef82d 232
altb2 25:fe14dbcef82d 233 /** Check chip is avairable or not
altb2 25:fe14dbcef82d 234 * @param configration parameter
altb2 25:fe14dbcef82d 235 * @return none
altb2 25:fe14dbcef82d 236 */
altb2 25:fe14dbcef82d 237 void set_parameter(const BMX055_TypeDef *bmx055_parameter);
altb2 25:fe14dbcef82d 238
altb2 25:fe14dbcef82d 239 /** Set I2C clock frequency
altb2 25:fe14dbcef82d 240 * @param freq.
altb2 25:fe14dbcef82d 241 * @return none
altb2 25:fe14dbcef82d 242 */
altb2 25:fe14dbcef82d 243 void frequency(int hz);
altb2 25:fe14dbcef82d 244
altb2 25:fe14dbcef82d 245 /** Read register
altb2 25:fe14dbcef82d 246 * @param register's address
altb2 25:fe14dbcef82d 247 * @return register data
altb2 25:fe14dbcef82d 248 */
altb2 25:fe14dbcef82d 249 uint8_t read_reg(uint8_t addr);
altb2 25:fe14dbcef82d 250
altb2 25:fe14dbcef82d 251 /** Write register
altb2 25:fe14dbcef82d 252 * @param register's address
altb2 25:fe14dbcef82d 253 * @param data
altb2 25:fe14dbcef82d 254 * @return register data
altb2 25:fe14dbcef82d 255 */
altb2 25:fe14dbcef82d 256 uint8_t write_reg(uint8_t addr, uint8_t data);
altb2 25:fe14dbcef82d 257 void readAccel(void);
altb2 25:fe14dbcef82d 258 void readGyro(void);
altb2 25:fe14dbcef82d 259 void readMag(void);
altb2 25:fe14dbcef82d 260 float gyroX, gyroY, gyroZ; // x, y, and z axis readings of the gyroscope (float value)
altb2 25:fe14dbcef82d 261 float accX, accY, accZ; // x, y, and z axis readings of the accelerometer (float value)
altb2 25:fe14dbcef82d 262 float magX, magY, magZ; // x, y, and z axis readings of the magnetometer (float value)
altb2 25:fe14dbcef82d 263 uint16_t begin();
altb2 25:fe14dbcef82d 264 protected:
altb2 25:fe14dbcef82d 265 void initialize(void);
altb2 25:fe14dbcef82d 266 void check_id(void);
altb2 25:fe14dbcef82d 267 void set_parameters_to_regs(void);
altb2 25:fe14dbcef82d 268
altb2 25:fe14dbcef82d 269 I2C &i2c;
altb2 25:fe14dbcef82d 270
altb2 25:fe14dbcef82d 271
altb2 25:fe14dbcef82d 272 private:
altb2 25:fe14dbcef82d 273 char dt[16]; // working buffer
altb2 25:fe14dbcef82d 274 uint8_t chip_addr;
altb2 25:fe14dbcef82d 275 BMX055_ADDR_INF_TypeDef inf_addr;
altb2 25:fe14dbcef82d 276 BMX055_ID_INF_TypeDef inf_id;
altb2 25:fe14dbcef82d 277 float gyr_factor, acc_factor;
altb2 25:fe14dbcef82d 278 uint8_t ready_flag;
altb2 25:fe14dbcef82d 279
altb2 25:fe14dbcef82d 280
altb2 25:fe14dbcef82d 281
altb2 25:fe14dbcef82d 282 BMX055_TypeDef bmx055_parameters;
altb2 25:fe14dbcef82d 283 uint8_t acc_id;
altb2 25:fe14dbcef82d 284 uint8_t mag_id;
altb2 25:fe14dbcef82d 285 uint8_t gyr_id;
altb2 25:fe14dbcef82d 286 };
altb2 25:fe14dbcef82d 287
altb2 25:fe14dbcef82d 288
altb2 25:fe14dbcef82d 289 #endif // BMX055_H