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
Diff: main.cpp
- Revision:
- 9:7dcfa24d5e7a
- Parent:
- 8:0ce247da6370
- Child:
- 10:d96e068f3595
--- a/main.cpp Mon May 27 17:22:36 2013 +0000 +++ b/main.cpp Thu May 30 13:32:54 2013 +0000 @@ -6,22 +6,17 @@ //------------ 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 +DigitalOut pc_led(LED1); // LED1 = PC SERIAL +DigitalOut uart_led(LED2); // LED2 = UM6 SERIAL +DigitalOut log_led(LED3); // debug LED +DigitalOut debug_led(LED4); // debug LED +DigitalIn enable(p10); // enable logging pin +DigitalOut sync(p11); // sychronization (with CAN logger) pin SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board - -//------------ variables setup ---------------------------------------// -Ticker tick; -Timer t; -int flag=0; - // interupt function for processing uart messages --------------------// void rxCallback(MODSERIAL_IRQ_INFO *q) { if (um6_uart.rxBufferGetCount() >= MAX_PACKET_DATA) { @@ -31,77 +26,100 @@ } //------------ LogData interrupt function ----------------------------// +int flag=0; void LogData() { - flag=1; + flag=1; //interrupt sets flag that causes variables to be logged } //============= Main Program =========================================// int main() { - pc.baud(115200); // baud rate to pc interface + 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 -------------------------// + Ticker tick; + Timer t; + + //---- call interrupt functions --------------------------// um6_uart.attach(&rxCallback, MODSERIAL::RxIrq); // attach interupt function to uart tick.attach(&LogData, 0.5); // attaches LogData function to 'tick' ticker interrupt every 0.5s - - //---------- setup sd card -----------------------------// - mkdir("/sd/mydir", 0777); - FILE *fp = fopen("/sd/mydir/log1.csv", "w"); - if(fp == NULL) { - error("Could not open file for write\n"); - } -//////////////////////////// FILE *fp = fopen("/local/log1.csv", "w"); - // print TEST signals to file, header -// fprintf(fp,"time(s),Yaw(deg),Accel(m/s2),GPS Speed(m/s) \r"); - // print ALL signals to file, header - 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(deg),Longitude(deg) \r"); // sends header to file - + t.start(); // start logging time + + //---------- setup sd card directory------------------------------// + int FileNo = 0; + mkdir("/sd/log_data", 0777); - //---- main while loop ----------------------------------// - //--(interrupt sets flag that causes variables to be logged) - while(1) { - if(flag==1) { - 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; - double GPSlong=data.GPS_long; // currently I can get GPS longitude to out data - double GPSlat=data.GPS_lat; // currently I can get GPS latitude to out data - float GPScourse=data.GPS_course; - float GPSspeed=data.GPS_speed; - - //----- print TEST signals to file -------------------// - // fprintf(fp,"%.3f,%.2f,%.4f,%.2f \r",time,Yaw,AccelX,GPSspeed); - pc.printf("time %.3f,Yaw %f, Speed %f, Lat %f, Long %f \n",time,Yaw,GPSspeed,GPSlat,GPSlong); - // pc.printf("0x%08X, %f\n", *(int *)&GPSlong, GPSlong); - - //----- print ALL signals to file --------------------// - fprintf(fp, "%3.3f, %3.1f,%3.1f,%3.1f, %3.2f,%3.2f,%3.2f, %3.4f,%3.4f,%3.4f, %3.1f,%3.2f,%f,%f\r",time,Yaw,Roll,Pitch,GyroX,GyroY,GyroZ,AccelX,AccelY,AccelZ,GPScourse,GPSspeed,GPSlat,GPSlong); - flag=0; // recents LogData interrupt flag - pc_led = !pc_led; // Lights LED1 when transmitting to PC screen - } // end if(flag=1) loop - - if(enable==0) { - break; // breaks while loop if enable switched off + //---- main while loop -------------------------------------------// + while(1) { + //---- Setup file on SD card ----------------------------// + printf("Opening sd card\n"); + char buffer[50]; + sprintf(buffer, "/sd/log_data/%i.csv", FileNo); + //**************************************************** + // This is necessary for card to work when reconnected + // Initialise disk + sd.disk_initialize(); + //**************************************************** + // Open a file for write + FILE *fp = fopen(buffer, "w"); + if(fp == NULL) { + error("Could not open file for write\n"); } + //--- print TEST signals to file, header + //fprintf(fp,"time(s),Yaw(deg),Accel(m/s2),GPS Speed(m/s) \r"); + //--- print ALL signals to file, header + 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(deg),Longitude(deg) \r"); // sends header to file + + while (!pc.readable()) { + if(flag==1) { + 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 not reading GPS longitude correctly + float GPSlat=data.GPS_lat; // currently not reading GPS latitude correctly + float GPScourse=data.GPS_course; + float GPSspeed=data.GPS_speed; + int32_t GPSlatR=data.GPS_lat_raw; + + //----- print TEST signals----------------------------// + // fprintf(fp,"%.3f,%.2f,%.4f,%.2f \r",time,Yaw,AccelX,GPSspeed); + pc.printf("time %.3f,Yaw %f,Accel %f, Speed %f, Lat %f, Long %f, LatR %d \n",time,Yaw,AccelX,GPSspeed,GPSlat,GPSlong,GPSlatR); + //pc.printf("time %.3f,Yaw %f,Accel %f, Speed %f \n",time,Yaw,AccelX,GPSspeed); + // pc.printf("time %f,LongIn 0x%08X, LongOut %f\n",time,GPSlong,*(int *)&GPSlong); + + //----- print ALL signals to file --------------------// + fprintf(fp, "%3.3f, %3.1f,%3.1f,%3.1f, %3.2f,%3.2f,%3.2f, %3.4f,%3.4f,%3.4f, %3.1f,%3.2f,%d,%f\r",time,Yaw,Roll,Pitch,GyroX,GyroY,GyroZ,AccelX,AccelY,AccelZ,GPScourse,GPSspeed,GPSlat,GPSlong); + flag=0; // reset LogData interrupt flag + pc_led = !pc_led; // Lights LED1 when transmitting to PC screen + } // end if(flag=1) loop + + if(enable==0) { + break; // breaks while loop if enable switched off + } + } // end while(!pc.readable()) loop + pc.printf(" Done. \n"); // 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 + pc.getc(); // Clear character from buffer + + while (!pc.readable()) { // Wait for a key press to restart logging + }; + pc.getc(); // Clear character from buffer + FileNo++; // Increment file number } // end while(1) loop - pc.printf(" done. \n"); // 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 -/* opening a file BEFORE calling interrupts OK +/* DEUBBING NOTES + 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