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 
*/