K64F based data logger for GPS (ublox MAX M8Q) & 6 Axis Sensor (FXOS8700Q) - Outputs to SD + UDP - Uses FRDM K64F + ublox "Cellular and positioning shield" (3G version)
Dependencies: MAX_M8Q_Capture EthernetInterface FXOS8700Q SDFileSystem eCompass_FPU_Lib mbed-rtos mbed
compass.cpp@0:77857a36b4ff, 2015-03-27 (annotated)
- Committer:
- rlinnmoran
- Date:
- Fri Mar 27 08:35:29 2015 +0000
- Revision:
- 0:77857a36b4ff
- Child:
- 2:bcd60a69583f
Initial version.; ; Working:; - Capture GPS ; - Capture 6 Axis; - Write to CVS on SD (crude); ; Issues:; - Update freq slow (5s); - No UDP; - Improve SD functions; - Clean MetaData class code + docs; - No status led, start/stop button; - Param for printf's
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rlinnmoran | 0:77857a36b4ff | 1 | #include "mbed.h" |
rlinnmoran | 0:77857a36b4ff | 2 | #include "FXOS8700Q.h" |
rlinnmoran | 0:77857a36b4ff | 3 | #include "eCompass_Lib.h" |
rlinnmoran | 0:77857a36b4ff | 4 | #include "rtos.h" |
rlinnmoran | 0:77857a36b4ff | 5 | //#include "MotionSensorDtypes.h" |
rlinnmoran | 0:77857a36b4ff | 6 | |
rlinnmoran | 0:77857a36b4ff | 7 | FXOS8700Q_acc acc( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); |
rlinnmoran | 0:77857a36b4ff | 8 | FXOS8700Q_mag mag( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); |
rlinnmoran | 0:77857a36b4ff | 9 | //Serial pc(USBTX, USBRX); |
rlinnmoran | 0:77857a36b4ff | 10 | DigitalOut gpo(D0); |
rlinnmoran | 0:77857a36b4ff | 11 | //DigitalOut led(LED_RED); |
rlinnmoran | 0:77857a36b4ff | 12 | eCompass compass; |
rlinnmoran | 0:77857a36b4ff | 13 | |
rlinnmoran | 0:77857a36b4ff | 14 | //void calibrate_thread(void const *argument); |
rlinnmoran | 0:77857a36b4ff | 15 | //void print_thread(void const *argument); |
rlinnmoran | 0:77857a36b4ff | 16 | int captureCompass(void const *argument); |
rlinnmoran | 0:77857a36b4ff | 17 | int eCompass_init(void); |
rlinnmoran | 0:77857a36b4ff | 18 | |
rlinnmoran | 0:77857a36b4ff | 19 | |
rlinnmoran | 0:77857a36b4ff | 20 | extern axis6_t axis6; |
rlinnmoran | 0:77857a36b4ff | 21 | extern uint32_t seconds; |
rlinnmoran | 0:77857a36b4ff | 22 | extern uint32_t compass_type; // optional, NED compass is default |
rlinnmoran | 0:77857a36b4ff | 23 | extern int32_t tcount; |
rlinnmoran | 0:77857a36b4ff | 24 | extern uint8_t cdebug; |
rlinnmoran | 0:77857a36b4ff | 25 | int l = 0; |
rlinnmoran | 0:77857a36b4ff | 26 | volatile int sflag = 0; |
rlinnmoran | 0:77857a36b4ff | 27 | |
rlinnmoran | 0:77857a36b4ff | 28 | MotionSensorDataCounts mag_raw; |
rlinnmoran | 0:77857a36b4ff | 29 | MotionSensorDataCounts acc_raw; |
rlinnmoran | 0:77857a36b4ff | 30 | |
rlinnmoran | 0:77857a36b4ff | 31 | void hal_map( MotionSensorDataCounts * acc_raw, MotionSensorDataCounts * mag_raw) |
rlinnmoran | 0:77857a36b4ff | 32 | { |
rlinnmoran | 0:77857a36b4ff | 33 | int16_t t; |
rlinnmoran | 0:77857a36b4ff | 34 | // swap and negate X & Y axis |
rlinnmoran | 0:77857a36b4ff | 35 | t = acc_raw->x; |
rlinnmoran | 0:77857a36b4ff | 36 | acc_raw->x = acc_raw->y * -1; |
rlinnmoran | 0:77857a36b4ff | 37 | acc_raw->y = t * -1; |
rlinnmoran | 0:77857a36b4ff | 38 | // swap mag X & Y axis |
rlinnmoran | 0:77857a36b4ff | 39 | t = mag_raw->x; |
rlinnmoran | 0:77857a36b4ff | 40 | mag_raw->x = mag_raw->y; |
rlinnmoran | 0:77857a36b4ff | 41 | mag_raw->y = t; |
rlinnmoran | 0:77857a36b4ff | 42 | // negate mag Z axis |
rlinnmoran | 0:77857a36b4ff | 43 | mag_raw->z *= -1; |
rlinnmoran | 0:77857a36b4ff | 44 | } |
rlinnmoran | 0:77857a36b4ff | 45 | |
rlinnmoran | 0:77857a36b4ff | 46 | // |
rlinnmoran | 0:77857a36b4ff | 47 | // Print data values for debug |
rlinnmoran | 0:77857a36b4ff | 48 | // |
rlinnmoran | 0:77857a36b4ff | 49 | void debug_print(void) |
rlinnmoran | 0:77857a36b4ff | 50 | { |
rlinnmoran | 0:77857a36b4ff | 51 | // Some useful printf statements for debug |
rlinnmoran | 0:77857a36b4ff | 52 | printf("roll=%d, pitch=%d, yaw=%d\r\n", axis6.roll, axis6.pitch, axis6.yaw); |
rlinnmoran | 0:77857a36b4ff | 53 | printf("Acc: X= %2.3f Y= %2.3f Z= %2.3f \r\n", axis6.fGax, axis6.fGay, axis6.fGaz); |
rlinnmoran | 0:77857a36b4ff | 54 | printf("Mag: X= %4.1f Y= %4.1f Z= %4.1f\r\n", axis6.fUTmx, axis6.fUTmy, axis6.fUTmz); |
rlinnmoran | 0:77857a36b4ff | 55 | printf("Quaternion: Q0= %1.4f Q1= %1.4f Q2= %1.4f Q3= %1.4f\r\n", axis6.q0, axis6.q1, axis6.q2, axis6.q3); |
rlinnmoran | 0:77857a36b4ff | 56 | |
rlinnmoran | 0:77857a36b4ff | 57 | |
rlinnmoran | 0:77857a36b4ff | 58 | } |
rlinnmoran | 0:77857a36b4ff | 59 | |
rlinnmoran | 0:77857a36b4ff | 60 | |
rlinnmoran | 0:77857a36b4ff | 61 | int captureCompass(void const *argument) { |
rlinnmoran | 0:77857a36b4ff | 62 | |
rlinnmoran | 0:77857a36b4ff | 63 | // get raw data from the sensors |
rlinnmoran | 0:77857a36b4ff | 64 | acc.getAxis( acc_raw); |
rlinnmoran | 0:77857a36b4ff | 65 | mag.getAxis( mag_raw); |
rlinnmoran | 0:77857a36b4ff | 66 | if(tcount) compass.run( acc_raw, mag_raw); // calculate the eCompass |
rlinnmoran | 0:77857a36b4ff | 67 | debug_print(); |
rlinnmoran | 0:77857a36b4ff | 68 | if(l++ >= 50) { // take car of business once a second |
rlinnmoran | 0:77857a36b4ff | 69 | seconds++; |
rlinnmoran | 0:77857a36b4ff | 70 | sflag = 1; |
rlinnmoran | 0:77857a36b4ff | 71 | compass.calibrate(); |
rlinnmoran | 0:77857a36b4ff | 72 | l = 0; |
rlinnmoran | 0:77857a36b4ff | 73 | //led = !led; |
rlinnmoran | 0:77857a36b4ff | 74 | } |
rlinnmoran | 0:77857a36b4ff | 75 | tcount++; |
rlinnmoran | 0:77857a36b4ff | 76 | return(0); |
rlinnmoran | 0:77857a36b4ff | 77 | } |
rlinnmoran | 0:77857a36b4ff | 78 | |
rlinnmoran | 0:77857a36b4ff | 79 | /* |
rlinnmoran | 0:77857a36b4ff | 80 | void calibrate_thread(void const *argument) { |
rlinnmoran | 0:77857a36b4ff | 81 | while (true) { |
rlinnmoran | 0:77857a36b4ff | 82 | // Signal flags that are reported as event are automatically cleared. |
rlinnmoran | 0:77857a36b4ff | 83 | Thread::signal_wait(0x1); |
rlinnmoran | 0:77857a36b4ff | 84 | compass.calibrate(); // re-calibrate the eCompass every second |
rlinnmoran | 0:77857a36b4ff | 85 | } |
rlinnmoran | 0:77857a36b4ff | 86 | } |
rlinnmoran | 0:77857a36b4ff | 87 | |
rlinnmoran | 0:77857a36b4ff | 88 | |
rlinnmoran | 0:77857a36b4ff | 89 | |
rlinnmoran | 0:77857a36b4ff | 90 | void print_thread(void const *argument) { |
rlinnmoran | 0:77857a36b4ff | 91 | while (true) { |
rlinnmoran | 0:77857a36b4ff | 92 | // Signal flags that are reported as event are automatically cleared. |
rlinnmoran | 0:77857a36b4ff | 93 | Thread::signal_wait(0x1); |
rlinnmoran | 0:77857a36b4ff | 94 | debug_print(); // re-calibrate the eCompass every second |
rlinnmoran | 0:77857a36b4ff | 95 | } |
rlinnmoran | 0:77857a36b4ff | 96 | } |
rlinnmoran | 0:77857a36b4ff | 97 | */ |
rlinnmoran | 0:77857a36b4ff | 98 | |
rlinnmoran | 0:77857a36b4ff | 99 | int eCompass_init() { |
rlinnmoran | 0:77857a36b4ff | 100 | |
rlinnmoran | 0:77857a36b4ff | 101 | acc.enable(); |
rlinnmoran | 0:77857a36b4ff | 102 | |
rlinnmoran | 0:77857a36b4ff | 103 | return 0; |
rlinnmoran | 0:77857a36b4ff | 104 | } |