DIT168 Group9  0.9
Miniature remote-controlled vehicle using OpenDavinci and Libcluon
IMU.hpp
1 //
2 // Created by Firsou on 23-Apr-18.
3 //
4 
5 #ifndef GROUP9_IMU_HPP
6 #define GROUP9_IMU_HPP
7 
8 #include <vector>
9 #include "Messages.hpp"
10 #include "cluon/OD4Session.hpp"
11 
12 uint8_t const MPU9250_ADDRESS = 0x68;
13 uint8_t const AK8963_ADDRESS = 0x76;
18 enum A_SCALE {
19  AFS_2G = 0,
20  AFS_4G,
21  AFS_8G,
22  AFS_16G
23 };
24 
28 enum G_SCALE {
29  GFS_250DPS = 0,
30  GFS_500DPS,
31  GFS_1000DPS,
32  GFS_2000DPS
33 };
34 
38 enum M_SCALE {
39  MFS_14BITS = 0, // 0.6 mG per LSB
40  MFS_16BITS // 0.15 mG per LSB
41 };
42 
46 enum M_MODE {
47  M_8HZ = 0x02, // 8 Hz update
48  M_100HZ = 0x06 // 100 Hz continuous magnetometer
49 };
50 
51 float getAscale();
52 float getGscale(bool);
53 float getMscale();
54 
55 // Specify sensor full scale
56 uint8_t m_gscale = GFS_250DPS;
57 uint8_t m_ascale = AFS_2G;
58 
59 uint8_t m_mscale = MFS_16BITS;
60 uint8_t m_mmode = M_100HZ;
66 void initializeMpu(int16_t deviceFile);
67 
72 void initializeAK8963(int16_t deviceFile);
73 
80 int8_t i2cAccessDevice(int16_t deviceFile, uint8_t const addr);
81 
90 int8_t i2cReadRegister(int16_t deviceFile, uint8_t const addr, uint8_t *data, uint8_t const length);
91 
98 int8_t i2cWriteRegister(std::vector<uint8_t> a_data, int16_t deviceFile);
99 
106 std::vector<float> calibrateMPU9250(int16_t deviceFile);
107 
108 int8_t setGyroOffset(std::vector<float> const a_offset, int16_t deviceFile);
109 
115 opendlv::proxy::AccelerationReading readAccelerometer(int16_t deviceFile);
116 
122 opendlv::proxy::MagneticFieldReading readMagnetometer(int16_t deviceFile);
123 
129 opendlv::proxy::GyroscopeReading readGyroscope(int16_t deviceFile);
130 
136 opendlv::proxy::AltitudeReading readAltimeter(int16_t deviceFile);
137 
143 opendlv::proxy::TemperatureReading readThermometer(int16_t deviceFile);
144 
145 
150 namespace MPU9250 {
151  enum RegAddr {
152 
153  // internal DMP sample rate limits
154  DMP_MAX_RATE = 200,
155  DMP_MIN_RATE = 4,
156  IMU_POLL_TIMEOUT = 300, // milliseconds
157  MAX_FIFO_BUFFER = 128,
158 
159  SELF_TEST_X_GYRO = 0x00,
160  SELF_TEST_Y_GYRO = 0x01,
161  SELF_TEST_Z_GYRO = 0x02,
162  X_FINE_GAIN = 0x03,
163  Y_FINE_GAIN = 0x04,
164  Z_FINE_GAIN = 0x05,
165  SELF_TEST_X_ACCEL = 0x0D,
166  SELF_TEST_Y_ACCEL = 0x0E,
167  SELF_TEST_Z_ACCEL = 0x0F,
168  SELF_TEST_A = 0x10,
169  XG_OFFSET_H = 0x13,
170  XG_OFFSET_L = 0x14,
171  YG_OFFSET_H = 0x15,
172  YG_OFFSET_L = 0x16,
173  ZG_OFFSET_H = 0x17,
174  ZG_OFFSET_L = 0x18,
175  SMPLRT_DIV = 0x19,
176  CONFIG = 0x1A,
177  GYRO_CONFIG = 0x1B,
178  ACCEL_CONFIG = 0x1C,
179  ACCEL_CONFIG2 = 0x1D,
180  LP_ACCEL_ODR = 0x1E,
181  WOM_THR = 0x1F,
182  MOT_DUR = 0x20,
183  ZMOT_THR = 0x21,
184  ZRMOT_DUR = 0x22,
185  FIFO_EN = 0x23,
186  I2C_MST_CTRL = 0x24,
187  I2C_SLV0_ADDR = 0x25,
188  I2C_SLV0_REG = 0x26,
189  I2C_SLV0_CTRL = 0x27,
190  I2C_SLV1_ADDR = 0x28,
191  I2C_SLV1_REG = 0x29,
192  I2C_SLV1_CTRL = 0x2A,
193  I2C_SLV2_ADDR = 0x2B,
194  I2C_SLV2_REG = 0x2C,
195  I2C_SLV2_CTRL = 0x2D,
196  I2C_SLV3_ADDR = 0x2E,
197  I2C_SLV3_REG = 0x2F,
198  I2C_SLV3_CTRL = 0x30,
199  I2C_SLV4_ADDR = 0x31,
200  I2C_SLV4_REG = 0x32,
201  I2C_SLV4_DO = 0x33,
202  I2C_SLV4_CTRL = 0x34,
203  I2C_SLV4_DI = 0x35,
204  I2C_MST_STATUS = 0x36,
205  INT_PIN_CFG = 0x37,
206  INT_ENABLE = 0x38,
207  DMP_INT_STATUS = 0x39,
208  INT_STATUS = 0x3A,
209  ACCEL_XOUT_H = 0x3B,
210  ACCEL_XOUT_L = 0x3C,
211  ACCEL_YOUT_H = 0x3D,
212  ACCEL_YOUT_L = 0x3E,
213  ACCEL_ZOUT_H = 0x3F,
214  ACCEL_ZOUT_L = 0x40,
215  TEMP_OUT_H = 0x41,
216  TEMP_OUT_L = 0x42,
217  GYRO_XOUT_H = 0x43,
218  GYRO_XOUT_L = 0x44,
219  GYRO_YOUT_H = 0x45,
220  GYRO_YOUT_L = 0x46,
221  GYRO_ZOUT_H = 0x47,
222  GYRO_ZOUT_L = 0x48,
223  EXT_SENS_DATA_00 = 0x49,
224  EXT_SENS_DATA_01 = 0x4A,
225  EXT_SENS_DATA_02 = 0x4B,
226  EXT_SENS_DATA_03 = 0x4C,
227  EXT_SENS_DATA_04 = 0x4D,
228  EXT_SENS_DATA_05 = 0x4E,
229  EXT_SENS_DATA_06 = 0x4F,
230  EXT_SENS_DATA_07 = 0x50,
231  EXT_SENS_DATA_08 = 0x51,
232  EXT_SENS_DATA_09 = 0x52,
233  EXT_SENS_DATA_10 = 0x53,
234  EXT_SENS_DATA_11 = 0x54,
235  EXT_SENS_DATA_12 = 0x55,
236  EXT_SENS_DATA_13 = 0x56,
237  EXT_SENS_DATA_14 = 0x57,
238  EXT_SENS_DATA_15 = 0x58,
239  EXT_SENS_DATA_16 = 0x59,
240  EXT_SENS_DATA_17 = 0x5A,
241  EXT_SENS_DATA_18 = 0x5B,
242  EXT_SENS_DATA_19 = 0x5C,
243  EXT_SENS_DATA_20 = 0x5D,
244  EXT_SENS_DATA_21 = 0x5E,
245  EXT_SENS_DATA_22 = 0x5F,
246  EXT_SENS_DATA_23 = 0x60,
247  MOT_DETECT_STATUS = 0x61,
248  I2C_SLV0_DO = 0x63,
249  I2C_SLV1_DO = 0x64,
250  I2C_SLV2_DO = 0x65,
251  I2C_SLV3_DO = 0x66,
252  I2C_MST_DELAY_CTRL = 0x67,
253  SIGNAL_PATH_RESET = 0x68,
254  MOT_DETECT_CTRL = 0x69,
255  USER_CTRL = 0x6A,
256  PWR_MGMT_1 = 0x6B,
257  PWR_MGMT_2 = 0x6C,
258  DMP_BANK = 0x6D,
259  DMP_RW_PNT = 0x6E,
260  DMP_REG = 0x6F,
261  DMP_REG_1 = 0x70,
262  DMP_REG_2 = 0x71,
263  FIFO_COUNTH = 0x72,
264  FIFO_COUNTL = 0x73,
265  FIFO_R_W = 0x74,
266  WHO_AM_I_MPU9250 = 0x75,// Should return = 0x71
267  XA_OFFSET_H = 0x77,
268  XA_OFFSET_L = 0x78,
269  YA_OFFSET_H = 0x7A,
270  YA_OFFSET_L = 0x7B,
271  ZA_OFFSET_H = 0x7D,
272  ZA_OFFSET_L = 0x7E,
273 
274  /*******************************************************************
275  * GYRO_CONFIG register bits
276  *******************************************************************/
277  XGYRO_CTEN = 0x01<<7,
278  YGYRO_CTEN = 0x01<<6,
279  ZGYRO_CTEN = 0x01<<5,
280  GYRO_FSR_CFG_250 = 0x00<<3,
281  GYRO_FSR_CFG_500 = 0x01<<3,
282  GYRO_FSR_CFG_1000 = 0x02<<3,
283  GYRO_FSR_CFG_2000 = 0x03<<3,
284  FCHOICE_B_DLPF_EN = 0x00,
285  FCHOICE_B_DLPF_DISABLE = 0x01,
286 
287  /*******************************************************************
288  * ACCEL_CONFIG register bits
289  *******************************************************************/
290  AX_ST_EN = 0x01<<7,
291  AY_ST_EN = 0x01<<6,
292  AZ_ST_EN = 0x01<<5,
293  ACCEL_FSR_CFG_2G = 0x00<<3,
294  ACCEL_FSR_CFG_4G = 0x01<<3,
295  ACCEL_FSR_CFG_8G = 0x02<<3,
296  ACCEL_FSR_CFG_16G = 0x03<<3,
297 
298  /*******************************************************************
299  * ACCEL_CONFIG2 register bits
300  *******************************************************************/
301  ACCEL_FCHOICE_1KHZ = 0x00<<3,
302  ACCEL_FCHOICE_4KHZ = 0x01<<3,
303 
304 
305  /*******************************************************************
306  * INT_PIN_CFG
307  *******************************************************************/
308  ACTL_ACTIVE_LOW = 0x01<<7,
309  ACTL_ACTIVE_HIGH = 0x00,
310  INT_OPEN_DRAIN = 0x00,
311  INT_PUSH_PULL = 0x00<<6,
312  LATCH_INT_EN = 0x01<<5,
313  INT_ANYRD_CLEAR = 0x01<<4,
314  ACTL_FSYNC_ACTIVE_LOW = 0x01<<3,
315  ACTL_FSYNC_ACTIVE_HIGH = 0x00<<3,
316  FSYNC_INT_MODE_EN = 0x01<<2,
317  FSYNC_INT_MODE_DIS = 0x00<<2,
318  BYPASS_EN = 0x01<<1,
319 
320  /******************************************************************
321  * Magnetometer Registers
322  ******************************************************************/
323  AK8963_ADDR = 0x0C,
324  WHO_AM_I_AK8963 = 0x00, // should return = 0x48
325  INFO = 0x01,
326  AK8963_ST1 = 0x02, // data ready status
327  AK8963_XOUT_L = 0x03, // data
328  AK8963_XOUT_H = 0x04,
329  AK8963_YOUT_L = 0x05,
330  AK8963_YOUT_H = 0x06,
331  AK8963_ZOUT_L = 0x07,
332  AK8963_ZOUT_H = 0x08,
333  AK8963_ST2 = 0x09,
334  AK8963_CNTL = 0x0A, // main mode control register
335  AK8963_ASTC = 0x0C, // Self test control
336  AK8963_I2CDIS = 0x0F, // I2C disable
337  AK8963_ASAX = 0x10, // x-axis sensitivity adjustment value
338  AK8963_ASAY = 0x11, // y-axis sensitivity adjustment value
339  AK8963_ASAZ = 0x12, // z-axis sensitivity adjustment value
340 
341  /******************************************************************
342  * Magnetometer AK8963_CNTL register Settings
343  ******************************************************************/
344  MAG_POWER_DN = 0x00, // power down magnetometer
345  MAG_SINGLE_MES = 0x01, // powers down after 1 measurement
346  MAG_CONT_MES_1 = 0x02, // 8hz continuous self-sampling
347  MAG_CONT_MES_2 = 0x06, // 100hz continuous self-sampling
348  MAG_EXT_TRIG = 0x04, // external trigger mode
349  MAG_SELF_TEST = 0x08, // self test mode
350  MAG_FUSE_ROM = 0x0F, // ROM read only mode
351  MSCALE_16 = 0x01<<4,
352  MSCALE_14 = 0x00,
353 
354  /******************************************************************
355  * Magnetometer AK8963_ST2 register definitions
356  ******************************************************************/
357  MAGNETOMETER_SATURATION = 0x01<<3,
358 
359  /******************************************************************
360  * Magnetometer AK8963_ST1 register definitions
361  ******************************************************************/
362  MAG_DATA_READY = 0x01,
363 
364  /******************************************************************
365  * Magnetometer sensitivity in micro Teslas to LSB
366  ******************************************************************/
367  // MAG_RAW_TO_uT = (4912.0/32760.0),
368 
369 
370  BIT_I2C_MST_VDDIO = 0x80,
371  BIT_FIFO_EN = 0x40,
372  BIT_DMP_EN = 0x80,
373  BIT_FIFO_RST = 0x04,
374  BIT_DMP_RST = 0x08,
375  BIT_FIFO_OVERFLOW = 0x10,
376  BIT_DATA_RDY_EN = 0x01,
377  BIT_DMP_INT_EN = 0x02,
378  BIT_MOT_INT_EN = 0x40,
379  BITS_FSR = 0x18,
380  BITS_LPF = 0x07,
381  BITS_HPF = 0x07,
382  BITS_CLK = 0x07,
383  BIT_FIFO_SIZE_1024 = 0x40,
384  BIT_FIFO_SIZE_2048 = 0x80,
385  BIT_FIFO_SIZE_4096 = 0xC0,
386  BIT_RESET = 0x80,
387  BIT_SLEEP = 0x40,
388  BIT_S0_DELAY_EN = 0x01,
389  BIT_S2_DELAY_EN = 0x04,
390  BITS_SLAVE_LENGTH = 0x0F,
391  BIT_SLAVE_BYTE_SW = 0x40,
392  BIT_SLAVE_GROUP = 0x10,
393  BIT_SLAVE_EN = 0x80,
394  BIT_I2C_READ = 0x80,
395  BITS_I2C_MASTER_DLY = 0x1F,
396  BIT_AUX_IF_EN = 0x20,
397  BIT_ACTL = 0x80,
398  BIT_LATCH_EN = 0x20,
399  BIT_ANY_RD_CLR = 0x10,
400  BIT_BYPASS_EN = 0x02,
401  BITS_WOM_EN = 0xC0,
402  BIT_LPA_CYCLE = 0x20,
403 
404  DMP_FEATURE_SEND_RAW_ACCEL = 0x040,
405  DMP_FEATURE_SEND_RAW_GYRO = 0x080,
406  DMP_FEATURE_SEND_CAL_GYRO = 0x100,
407  DMP_FEATURE_SEND_ANY_GYRO = (DMP_FEATURE_SEND_RAW_GYRO | \
408  DMP_FEATURE_SEND_CAL_GYRO)
409 
410  };
411 }
412 
413 #endif //GROUP9_IMU_HPP
Definition: IMU.hpp:150