SmartWheels self-driving race car. Designed for NXP Cup. Uses FRDM-KL25Z, area-scan camera, and simple image processing to detect and navigate any NXP spec track.

Dependencies:   TSI USBDevice mbed-dev

Fork of SmartWheels by haofan Zheng

Committer:
hazheng
Date:
Sun Apr 09 22:08:34 2017 +0000
Revision:
63:d9a81b3d69f5
Parent:
62:bc5caf59fe39
Child:
64:43ab429a37e0
Finished the code for Accelerometer.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hazheng 59:b709711bc566 1 #pragma once
hazheng 59:b709711bc566 2 #ifndef IMU_MANAGER_H
hazheng 59:b709711bc566 3 #define IMU_MANAGER_H
hazheng 59:b709711bc566 4
hazheng 59:b709711bc566 5 #define ACCEL_MAG_SA0_0
hazheng 59:b709711bc566 6 //#define ACCEL_MAG_SA0_1
hazheng 59:b709711bc566 7 #define ACCEL_MAG_SA1_0
hazheng 59:b709711bc566 8 //#define ACCEL_MAG_SA1_1
hazheng 59:b709711bc566 9
hazheng 59:b709711bc566 10 #if defined(ACCEL_MAG_SA1_0) && defined(ACCEL_MAG_SA0_0)
hazheng 59:b709711bc566 11 #define ACCEL_MAG_SA1 0
hazheng 59:b709711bc566 12 #define ACCEL_MAG_SA0 0
hazheng 59:b709711bc566 13 #define FXOS8700CQ_SLAVE_ADDR 0x1E
hazheng 59:b709711bc566 14 #elif defined(ACCEL_MAG_SA1_0) && defined(ACCEL_MAG_SA0_1)
hazheng 59:b709711bc566 15 #define ACCEL_MAG_SA1 0
hazheng 59:b709711bc566 16 #define ACCEL_MAG_SA0 1
hazheng 59:b709711bc566 17 #define FXOS8700CQ_SLAVE_ADDR 0x1D
hazheng 59:b709711bc566 18 #elif defined(ACCEL_MAG_SA1_1) && defined(ACCEL_MAG_SA0_0)
hazheng 59:b709711bc566 19 #define ACCEL_MAG_SA1 1
hazheng 59:b709711bc566 20 #define ACCEL_MAG_SA0 0
hazheng 59:b709711bc566 21 #define FXOS8700CQ_SLAVE_ADDR 0x1C
hazheng 59:b709711bc566 22 #elif defined(ACCEL_MAG_SA1_1) && defined(ACCEL_MAG_SA0_1)
hazheng 59:b709711bc566 23 #define ACCEL_MAG_SA1 1
hazheng 59:b709711bc566 24 #define ACCEL_MAG_SA0 1
hazheng 59:b709711bc566 25 #define FXOS8700CQ_SLAVE_ADDR 0x1F
hazheng 59:b709711bc566 26 #else
hazheng 59:b709711bc566 27 #error Must choose a SA0 and SA1 value for Accel and Mag
hazheng 59:b709711bc566 28 #endif
hazheng 59:b709711bc566 29
hazheng 62:bc5caf59fe39 30 #define FXOS8700CQ_STATUS 0x00
hazheng 62:bc5caf59fe39 31
hazheng 62:bc5caf59fe39 32 #define FXOS8700CQ_F_SETUP 0x09
hazheng 59:b709711bc566 33
hazheng 62:bc5caf59fe39 34 #define FXOS8700CQ_SYSMOD 0x0B
hazheng 62:bc5caf59fe39 35
hazheng 62:bc5caf59fe39 36 #define FXOS8700CQ_WHOAMI 0x0D
hazheng 62:bc5caf59fe39 37 #define FXOS8700CQ_WHOAMI_VAL 0xC7
hazheng 59:b709711bc566 38
hazheng 59:b709711bc566 39 #define FXOS8700CQ_XYZ_DATA_CFG 0x0E
hazheng 62:bc5caf59fe39 40 #define FXOS8700CQ_XYZ_DATA_2G 0x00
hazheng 62:bc5caf59fe39 41 #define FXOS8700CQ_XYZ_DATA_4G 0x01
hazheng 62:bc5caf59fe39 42 #define FXOS8700CQ_XYZ_DATA_8G 0x02
hazheng 59:b709711bc566 43
hazheng 62:bc5caf59fe39 44 #define FXOS8700CQ_XYZ_DATA_SC FXOS8700CQ_XYZ_DATA_2G
hazheng 59:b709711bc566 45
hazheng 62:bc5caf59fe39 46 #if FXOS8700CQ_XYZ_DATA_SC == FXOS8700CQ_XYZ_DATA_2G
hazheng 63:d9a81b3d69f5 47 #define ACCELER_SCALE_F_MG 0.244f
hazheng 62:bc5caf59fe39 48 #elif FXOS8700CQ_XYZ_DATA_SC == FXOS8700CQ_XYZ_DATA_4G
hazheng 63:d9a81b3d69f5 49 #define ACCELER_SCALE_F_MG 0.488f
hazheng 62:bc5caf59fe39 50 #elif FXOS8700CQ_XYZ_DATA_SC == FXOS8700CQ_XYZ_DATA_8G
hazheng 63:d9a81b3d69f5 51 #define ACCELER_SCALE_F_MG 0.976f
hazheng 62:bc5caf59fe39 52 #else
hazheng 62:bc5caf59fe39 53 #error Must define a scale for accelerometer!
hazheng 62:bc5caf59fe39 54 #endif
hazheng 59:b709711bc566 55
hazheng 62:bc5caf59fe39 56 #define FXOS8700CQ_CTRL_REG1 0x2A
hazheng 63:d9a81b3d69f5 57 #define FXOS8700CQ_CTRL_REG1_v 0x05
hazheng 63:d9a81b3d69f5 58
hazheng 63:d9a81b3d69f5 59 #define FXOS8700CQ_CTRL_REG2 0x2B
hazheng 63:d9a81b3d69f5 60 #define FXOS8700CQ_RESET_MASK 0x40
hazheng 63:d9a81b3d69f5 61
hazheng 63:d9a81b3d69f5 62 #define FXOS8700CQ_OFF_X 0x2F
hazheng 63:d9a81b3d69f5 63
hazheng 63:d9a81b3d69f5 64 #define FXOS8700CQ_OFF_Y 0x30
hazheng 63:d9a81b3d69f5 65
hazheng 63:d9a81b3d69f5 66 #define FXOS8700CQ_OFF_Z 0x31
hazheng 63:d9a81b3d69f5 67 #define OFFSET_SCALE_F 2.0f
hazheng 62:bc5caf59fe39 68
hazheng 62:bc5caf59fe39 69 #define FXOS8700CQ_M_CTRL_REG1 0x5B
hazheng 62:bc5caf59fe39 70
hazheng 62:bc5caf59fe39 71 #define FXOS8700CQ_M_CTRL_REG2 0x5C
hazheng 59:b709711bc566 72
hazheng 59:b709711bc566 73 #define FXOS8700CQ_READ_LEN 13 // status plus 6 channels = 13 bytes
hazheng 59:b709711bc566 74
hazheng 63:d9a81b3d69f5 75 #define IMU_UPDATE_TICK_RATE 0.002f
hazheng 63:d9a81b3d69f5 76 #define IMU_DEFAULT_G 9.8f
hazheng 63:d9a81b3d69f5 77
hazheng 59:b709711bc566 78 #include <mbed.h>
hazheng 59:b709711bc566 79
hazheng 59:b709711bc566 80 #ifdef __cplusplus
hazheng 59:b709711bc566 81 extern "C" {
hazheng 59:b709711bc566 82 #endif
hazheng 59:b709711bc566 83
hazheng 59:b709711bc566 84 struct imu_vec3
hazheng 59:b709711bc566 85 {
hazheng 62:bc5caf59fe39 86 float x;
hazheng 62:bc5caf59fe39 87 float y;
hazheng 62:bc5caf59fe39 88 float z;
hazheng 59:b709711bc566 89 };
hazheng 59:b709711bc566 90
hazheng 59:b709711bc566 91 uint8_t imu_manager_init();
hazheng 59:b709711bc566 92
hazheng 63:d9a81b3d69f5 93 void imu_manager_calibrate();
hazheng 63:d9a81b3d69f5 94
hazheng 63:d9a81b3d69f5 95 void imu_manager_begin_tick();
hazheng 63:d9a81b3d69f5 96
hazheng 59:b709711bc566 97 void imu_manager_update();
hazheng 59:b709711bc566 98
hazheng 59:b709711bc566 99 const volatile struct imu_vec3* imu_manager_get_accl();
hazheng 59:b709711bc566 100
hazheng 63:d9a81b3d69f5 101 const volatile struct imu_vec3* imu_manager_get_velocity();
hazheng 63:d9a81b3d69f5 102
hazheng 63:d9a81b3d69f5 103 const volatile struct imu_vec3* imu_manager_get_position();
hazheng 63:d9a81b3d69f5 104
hazheng 62:bc5caf59fe39 105 //const volatile struct imu_vec3* imu_manager_get_magt();
hazheng 59:b709711bc566 106
hazheng 59:b709711bc566 107 #ifdef __cplusplus
hazheng 59:b709711bc566 108 }
hazheng 59:b709711bc566 109 #endif
hazheng 59:b709711bc566 110
hazheng 59:b709711bc566 111 #endif //IMU_MANAGER_H