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
- Committer:
- njewin
- Date:
- 2013-05-25
- Revision:
- 6:fae3d66a4e21
- Parent:
- 5:ac633cdbb75c
- Child:
- 7:af9f373ac87b
File content as of revision 6:fae3d66a4e21:
#include "mbed.h" #include "SDFileSystem.h" // SD file system header from handbook/cookbook offical mbed library #include "MODSERIAL.h" #include "UM6_usart.h" // UM6 USART HEADER #include "UM6_config.h" // UM6 CONFIG HEADER //------------ system and interface setup ----------------------------// //////////////////////////////////////LocalFileSystem local("local"); // sets up local file on mbed MODSERIAL pc(USBTX, USBRX); // sets up serial connection to pc terminal //------------ Hardware setup ----------------------------------------// DigitalOut pc_led(LED1); // LED1 = PC SERIAL DigitalOut uart_led(LED2); // LED2 = UM6 SERIAL DigitalOut log_led(LED3); // debug LED DigitalIn enable(p10); // enable signal for logging data to file SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board //------------ interrupt and variable setup --------------------------// Ticker tick; Timer t; int counter=0; int flag=0; // interupt function for processing uart messages --------------------// void rxCallback(MODSERIAL_IRQ_INFO *q) { if (um6_uart.rxBufferGetCount() >= MAX_PACKET_DATA) { uart_led = !uart_led; // Lights LED when uart RxBuff has > 40 bytes Process_um6_packet(); } } //------------ LogData interrupt function ----------------------------// void LogData() { counter++; flag=1; } //============= Main Program =========================================// int main() { pc.baud(115200); // baud rate to pc interface um6_uart.baud(115200); // baud rate to um6 interface t.start(); // start log time //---- call interrupt functions -------------------------// um6_uart.attach(&rxCallback, MODSERIAL::RxIrq); // attach interupt function to uart tick.attach(&LogData, 0.01); // attaches LogData function to 'tick' ticker interrupt every 0.5s //---------- setup sd card -----------------------------// // mkdir("/sd/mydir", 0777); // FILE *fp = fopen("/sd/mydir/sdtest.csv", "w"); // if(fp == NULL) { // error("Could not open file for write\n"); // } //////////// FILE *fp = fopen("/local/log1.csv", "w"); // fprintf(fp,"time(s),count,Yaw(deg),Accel(m/s2) \r"); // fprintf(fp, "time (s),Yaw (deg),Roll (deg),Pitch (deg),GyroX(deg/s),GyroY(deg/s),GyroZ(deg/s),AccelX(g),AccelY(g),AccelZ(g),GPScourse(deg),GPSspeed(m/s),Latitude,Longitude \r"); // sends header to file //---- main while loop ----------------------------------// //--(interrupt sets flag that causes variables to be logged) while(1) { if(flag==1) { // prints counter value every interrupt raises flag log_led=1; // turns on LED3 to indicate logging float time=t.read(); float Yaw=data.Yaw; /* float Roll=data.Roll; float Pitch=data.Pitch; float GyroX=data.Gyro_Proc_X; float GyroY=data.Gyro_Proc_Y; float GyroZ=data.Gyro_Proc_Z; float AccelX=data.Accel_Proc_X; float AccelY=data.Accel_Proc_Y; float AccelZ=data.Accel_Proc_Z; float GPSlong=data.GPS_long; // currently I can get GPS longitude to out data float GPSlat=data.GPS_lat; // currently I can get GPS latitude to out data */ float GPScourse=data.GPS_course; float GPSspeed=data.GPS_speed // fprintf(fp,"%.3f,%d,%f,%f \r",t.read(),counter,Yaw,AccelX); // fprintf(fp, ".3%f,.1%f,.1%f,.1%f,.3%f,.3%f,.3%f, .4%f,.4%f,.4%f, .1%f,.2%f,%f,%f \r",time,Yaw,Roll,Pitch,GyroX,GyroY,GyroZ,AccelX,AccelY,AccelZ,GPScourse,GPSspeed,GPSlat,GPSlong); pc.printf("time %.3f, count %d,Yaw %f,speed %f, course %f, lat %f, long %f, \n",time,counter,Yaw,GPSspeed,GPScourse,GPSlat,GPSlong); flag=0; pc_led = !pc_led; // Lights LED1 when uart RxBuff has > 40 bytes } // end if(flag=1) loop if(enable==0) { break; // breaks while loop in enable switched off } } // end while(1) loop pc.printf(" done. "); // prints 'done when logging is finished/enable switched off log_led=0; // turns off LED logging is finished/enable switched off wait(0.5); // debug wait for pc.printf // fclose(fp); // closes log file } // end main() program /* DEBUG RECORD opening a file BEFORE calling interrupts OK opening a file and print to it BEFORE calling interrupts NOT OK (stops rest of program) open a (local) file and print to it AFTER calling interrupts NOT OK (stops rest of program) open a (sd) file and print to it AFTER calling interrupts OK */