A project similar to http://mbed.org/users/lhiggs/code/UM6_IMU_AHRS_2012/, where I'm trying to log data from a UM6 (CH Robotics orientation sensor) and a GPS transceiver to an sd card. I've adapted LHiggs code to include ModGPS. For sum reason a soon as I pick up a gps signal the UM6 data freezes i.e. the time and gps signals continue to print out but the UM6 signals fixes on a single value.
Dependencies: MODGPS MODSERIAL SDFileSystem mbed
main.cpp@7:af9f373ac87b, 2013-05-25 (annotated)
- Committer:
- njewin
- Date:
- Sat May 25 14:29:36 2013 +0000
- Revision:
- 7:af9f373ac87b
- Parent:
- 6:fae3d66a4e21
- Child:
- 8:0ce247da6370
prints GPS speed to SD card
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
njewin | 0:52295643d083 | 1 | #include "mbed.h" |
njewin | 4:8dcf0bdc25c8 | 2 | #include "SDFileSystem.h" // SD file system header from handbook/cookbook offical mbed library |
njewin | 4:8dcf0bdc25c8 | 3 | #include "MODSERIAL.h" |
njewin | 5:ac633cdbb75c | 4 | #include "UM6_usart.h" // UM6 USART HEADER |
njewin | 5:ac633cdbb75c | 5 | #include "UM6_config.h" // UM6 CONFIG HEADER |
njewin | 4:8dcf0bdc25c8 | 6 | |
njewin | 0:52295643d083 | 7 | |
njewin | 1:9fe40d9ac0f5 | 8 | //------------ system and interface setup ----------------------------// |
njewin | 5:ac633cdbb75c | 9 | //////////////////////////////////////LocalFileSystem local("local"); // sets up local file on mbed |
njewin | 4:8dcf0bdc25c8 | 10 | MODSERIAL pc(USBTX, USBRX); // sets up serial connection to pc terminal |
njewin | 0:52295643d083 | 11 | |
njewin | 1:9fe40d9ac0f5 | 12 | //------------ Hardware setup ----------------------------------------// |
njewin | 5:ac633cdbb75c | 13 | DigitalOut pc_led(LED1); // LED1 = PC SERIAL |
njewin | 5:ac633cdbb75c | 14 | DigitalOut uart_led(LED2); // LED2 = UM6 SERIAL |
njewin | 5:ac633cdbb75c | 15 | DigitalOut log_led(LED3); // debug LED |
njewin | 0:52295643d083 | 16 | DigitalIn enable(p10); // enable signal for logging data to file |
njewin | 3:b3358ec2f57c | 17 | SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board |
njewin | 3:b3358ec2f57c | 18 | |
njewin | 0:52295643d083 | 19 | |
njewin | 1:9fe40d9ac0f5 | 20 | //------------ interrupt and variable setup --------------------------// |
njewin | 1:9fe40d9ac0f5 | 21 | Ticker tick; |
njewin | 3:b3358ec2f57c | 22 | Timer t; |
njewin | 1:9fe40d9ac0f5 | 23 | int counter=0; |
njewin | 1:9fe40d9ac0f5 | 24 | int flag=0; |
njewin | 1:9fe40d9ac0f5 | 25 | |
njewin | 5:ac633cdbb75c | 26 | // interupt function for processing uart messages --------------------// |
njewin | 5:ac633cdbb75c | 27 | void rxCallback(MODSERIAL_IRQ_INFO *q) { |
njewin | 5:ac633cdbb75c | 28 | if (um6_uart.rxBufferGetCount() >= MAX_PACKET_DATA) { |
njewin | 5:ac633cdbb75c | 29 | uart_led = !uart_led; // Lights LED when uart RxBuff has > 40 bytes |
njewin | 5:ac633cdbb75c | 30 | Process_um6_packet(); |
njewin | 5:ac633cdbb75c | 31 | } |
njewin | 5:ac633cdbb75c | 32 | } |
njewin | 5:ac633cdbb75c | 33 | |
njewin | 1:9fe40d9ac0f5 | 34 | //------------ LogData interrupt function ----------------------------// |
njewin | 1:9fe40d9ac0f5 | 35 | void LogData() { |
njewin | 1:9fe40d9ac0f5 | 36 | counter++; |
njewin | 1:9fe40d9ac0f5 | 37 | flag=1; |
njewin | 1:9fe40d9ac0f5 | 38 | } |
njewin | 1:9fe40d9ac0f5 | 39 | |
njewin | 1:9fe40d9ac0f5 | 40 | //============= Main Program =========================================// |
njewin | 0:52295643d083 | 41 | int main() { |
njewin | 1:9fe40d9ac0f5 | 42 | pc.baud(115200); // baud rate to pc interface |
njewin | 5:ac633cdbb75c | 43 | um6_uart.baud(115200); // baud rate to um6 interface |
njewin | 5:ac633cdbb75c | 44 | |
njewin | 5:ac633cdbb75c | 45 | t.start(); // start log time |
njewin | 5:ac633cdbb75c | 46 | |
njewin | 5:ac633cdbb75c | 47 | //---- call interrupt functions -------------------------// |
njewin | 5:ac633cdbb75c | 48 | um6_uart.attach(&rxCallback, MODSERIAL::RxIrq); // attach interupt function to uart |
njewin | 7:af9f373ac87b | 49 | tick.attach(&LogData, 0.5); // attaches LogData function to 'tick' ticker interrupt every 0.5s |
njewin | 3:b3358ec2f57c | 50 | |
njewin | 3:b3358ec2f57c | 51 | //---------- setup sd card -----------------------------// |
njewin | 7:af9f373ac87b | 52 | mkdir("/sd/mydir", 0777); |
njewin | 7:af9f373ac87b | 53 | FILE *fp = fopen("/sd/mydir/sdtest.csv", "w"); |
njewin | 7:af9f373ac87b | 54 | if(fp == NULL) { |
njewin | 7:af9f373ac87b | 55 | error("Could not open file for write\n"); |
njewin | 7:af9f373ac87b | 56 | } |
njewin | 5:ac633cdbb75c | 57 | //////////// FILE *fp = fopen("/local/log1.csv", "w"); |
njewin | 7:af9f373ac87b | 58 | fprintf(fp,"time(s),count,Yaw(deg),Accel(m/s2),GPS Speed(m/s) \r"); |
njewin | 1:9fe40d9ac0f5 | 59 | |
njewin | 5:ac633cdbb75c | 60 | //---- main while loop ----------------------------------// |
njewin | 5:ac633cdbb75c | 61 | //--(interrupt sets flag that causes variables to be logged) |
njewin | 1:9fe40d9ac0f5 | 62 | while(1) { |
njewin | 1:9fe40d9ac0f5 | 63 | if(flag==1) { // prints counter value every interrupt raises flag |
njewin | 5:ac633cdbb75c | 64 | log_led=1; // turns on LED3 to indicate logging |
njewin | 5:ac633cdbb75c | 65 | float Yaw=data.Yaw; |
njewin | 7:af9f373ac87b | 66 | float AccelX=data.Accel_Proc_X; |
njewin | 7:af9f373ac87b | 67 | float GPSspeed=data.GPS_speed; |
njewin | 7:af9f373ac87b | 68 | fprintf(fp,"%.3f,%d,%f,%f,%f \r",t.read(),counter,Yaw,AccelX,GPSspeed); |
njewin | 7:af9f373ac87b | 69 | pc.printf("time %.3f, count %d,Yaw %f,Accel %f, Speed %f \n",t.read(),counter,Yaw,AccelX,GPSspeed); |
njewin | 1:9fe40d9ac0f5 | 70 | flag=0; |
njewin | 5:ac633cdbb75c | 71 | pc_led = !pc_led; // Lights LED1 when uart RxBuff has > 40 bytes |
njewin | 1:9fe40d9ac0f5 | 72 | } // end if(flag=1) loop |
njewin | 3:b3358ec2f57c | 73 | |
njewin | 5:ac633cdbb75c | 74 | if(enable==0) { |
njewin | 3:b3358ec2f57c | 75 | break; // breaks while loop in enable switched off |
njewin | 3:b3358ec2f57c | 76 | } |
njewin | 3:b3358ec2f57c | 77 | } // end while(1) loop |
njewin | 5:ac633cdbb75c | 78 | pc.printf(" done. "); // prints 'done when logging is finished/enable switched off |
njewin | 5:ac633cdbb75c | 79 | log_led=0; // turns off LED logging is finished/enable switched off |
njewin | 5:ac633cdbb75c | 80 | wait(0.5); // debug wait for pc.printf |
njewin | 7:af9f373ac87b | 81 | fclose(fp); // closes log file |
njewin | 5:ac633cdbb75c | 82 | } // end main() program |
njewin | 5:ac633cdbb75c | 83 | |
njewin | 5:ac633cdbb75c | 84 | |
njewin | 7:af9f373ac87b | 85 | /* opening a file BEFORE calling interrupts OK |
njewin | 5:ac633cdbb75c | 86 | opening a file and print to it BEFORE calling interrupts NOT OK (stops rest of program) |
njewin | 5:ac633cdbb75c | 87 | open a (local) file and print to it AFTER calling interrupts NOT OK (stops rest of program) |
njewin | 5:ac633cdbb75c | 88 | open a (sd) file and print to it AFTER calling interrupts OK |
njewin | 5:ac633cdbb75c | 89 | */ |