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

Committer:
njewin
Date:
Sat May 25 12:47:06 2013 +0000
Revision:
5:ac633cdbb75c
Parent:
4:8dcf0bdc25c8
Child:
6:fae3d66a4e21
Prints time,yaw,accel to sd card at 10ms rate

Who changed what in which revision?

UserRevisionLine numberNew 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 5:ac633cdbb75c 49 tick.attach(&LogData, 0.01); // attaches LogData function to 'tick' ticker interrupt every 0.5s
njewin 3:b3358ec2f57c 50
njewin 3:b3358ec2f57c 51 //---------- setup sd card -----------------------------//
njewin 3:b3358ec2f57c 52 mkdir("/sd/mydir", 0777);
njewin 3:b3358ec2f57c 53 FILE *fp = fopen("/sd/mydir/sdtest.csv", "w");
njewin 3:b3358ec2f57c 54 if(fp == NULL) {
njewin 3:b3358ec2f57c 55 error("Could not open file for write\n");
njewin 3:b3358ec2f57c 56 }
njewin 5:ac633cdbb75c 57 //////////// FILE *fp = fopen("/local/log1.csv", "w");
njewin 5:ac633cdbb75c 58 fprintf(fp,"time(s),count,Yaw(deg),Accel(m/s2) \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 5:ac633cdbb75c 66 float AccelX=data.Accel_Proc_X;
njewin 5:ac633cdbb75c 67 fprintf(fp,"%.3f,%d,%f,%f \r",t.read(),counter,Yaw,AccelX);
njewin 5:ac633cdbb75c 68 pc.printf("time %.3f, count %d,Yaw %f,Accel %f \n",t.read(),counter,Yaw,AccelX);
njewin 1:9fe40d9ac0f5 69 flag=0;
njewin 5:ac633cdbb75c 70 pc_led = !pc_led; // Lights LED1 when uart RxBuff has > 40 bytes
njewin 1:9fe40d9ac0f5 71 } // end if(flag=1) loop
njewin 3:b3358ec2f57c 72
njewin 5:ac633cdbb75c 73 if(enable==0) {
njewin 3:b3358ec2f57c 74 break; // breaks while loop in enable switched off
njewin 3:b3358ec2f57c 75 }
njewin 3:b3358ec2f57c 76 } // end while(1) loop
njewin 5:ac633cdbb75c 77 pc.printf(" done. "); // prints 'done when logging is finished/enable switched off
njewin 5:ac633cdbb75c 78 log_led=0; // turns off LED logging is finished/enable switched off
njewin 5:ac633cdbb75c 79 wait(0.5); // debug wait for pc.printf
njewin 5:ac633cdbb75c 80 fclose(fp); // closes log file
njewin 5:ac633cdbb75c 81 } // end main() program
njewin 5:ac633cdbb75c 82
njewin 5:ac633cdbb75c 83
njewin 5:ac633cdbb75c 84 /* opening a file BEFORE calling interrupts OK
njewin 5:ac633cdbb75c 85 opening a file and print to it BEFORE calling interrupts NOT OK (stops rest of program)
njewin 5:ac633cdbb75c 86 open a (local) file and print to it AFTER calling interrupts NOT OK (stops rest of program)
njewin 5:ac633cdbb75c 87 open a (sd) file and print to it AFTER calling interrupts OK
njewin 5:ac633cdbb75c 88 */