GPS Data Logger with SD File system. Logger can save RMC & GGA data from GPS and five channels of analog data. Based on http://mbed.org/users/prf/ "GPS_Logger_01" by Peter Forden

Dependencies:   mbed

Committer:
kenjiArai
Date:
Sat Apr 17 13:27:34 2010 +0000
Revision:
0:dc3be3264d2d

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:dc3be3264d2d 1 //-------------------------------------------------------------------------------------------------
kenjiArai 0:dc3be3264d2d 2 // GPS DATA LOGGER Ver.1
kenjiArai 0:dc3be3264d2d 3 // (c)2010 Kenji Arai / JH1PJL
kenjiArai 0:dc3be3264d2d 4 // http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:dc3be3264d2d 5 // http://mbed.org/users/kenjiArai/
kenjiArai 0:dc3be3264d2d 6 // April 17th,2010 Started
kenjiArai 0:dc3be3264d2d 7 // April 17th,2010
kenjiArai 0:dc3be3264d2d 8 //-------------------------------------------------------------------------------------------------
kenjiArai 0:dc3be3264d2d 9 // Reference ----- GPS_logger_01 by Peter Foden ------
kenjiArai 0:dc3be3264d2d 10 // http://mbed.org/users/prf/
kenjiArai 0:dc3be3264d2d 11 // http://mbed.org/users/prf/programs/GPS_Logger_01/f5c2b003ae38423640de0fc5e0727190/
kenjiArai 0:dc3be3264d2d 12 //-------------------------------------------------------------------------------------------------
kenjiArai 0:dc3be3264d2d 13 // Function
kenjiArai 0:dc3be3264d2d 14 // GPS data and five channeles ADC data records into a file which is located in SD-Card
kenjiArai 0:dc3be3264d2d 15 // Connection
kenjiArai 0:dc3be3264d2d 16 // GPS receiver PIN 8,9
kenjiArai 0:dc3be3264d2d 17 // Analog input PIN 15,16,17,19,20
kenjiArai 0:dc3be3264d2d 18 // SD Card I/F PIN 11,12,13,14
kenjiArai 0:dc3be3264d2d 19 // LCD PIN 5,6,7,21,22,23
kenjiArai 0:dc3be3264d2d 20 // -> CAUTION!! pin assignment is different
kenjiArai 0:dc3be3264d2d 21 // with " http://mbed.org/projects/cookbook/wiki/TextLCD "
kenjiArai 0:dc3be3264d2d 22 // RTC PIN 3 needs to connect 3V Battery
kenjiArai 0:dc3be3264d2d 23 // -> Please refer my program " RTC_w_COM" for time adjustment
kenjiArai 0:dc3be3264d2d 24 // at " http://mbed.org/users/kenjiArai/programs/RTC_w_COM/5yi9a/ "
kenjiArai 0:dc3be3264d2d 25 //-------------------------------------------------------------------------------------------------
kenjiArai 0:dc3be3264d2d 26 #include "mbed.h"
kenjiArai 0:dc3be3264d2d 27 #include "TextLCD.h"
kenjiArai 0:dc3be3264d2d 28 #include "SDFileSystem.h"
kenjiArai 0:dc3be3264d2d 29
kenjiArai 0:dc3be3264d2d 30 // Data logging configration
kenjiArai 0:dc3be3264d2d 31 // Save RMC any condition
kenjiArai 0:dc3be3264d2d 32 #define CONFG_ANA 1 // 1= Save Analog data
kenjiArai 0:dc3be3264d2d 33 #define DEBUG 1 // 1= Shows progress on PC via USB ( virtual COM line)
kenjiArai 0:dc3be3264d2d 34 #define USE_LCD 1 // 1= Display the data on LCD
kenjiArai 0:dc3be3264d2d 35
kenjiArai 0:dc3be3264d2d 36 // Commands for GPS to turn on or off data strings
kenjiArai 0:dc3be3264d2d 37 #define RMC_ON "$PSRF103,4,0,1,1*21\r\n"
kenjiArai 0:dc3be3264d2d 38 #define RMC_OFF "$PSRF103,4,0,0,1*20\r\n"
kenjiArai 0:dc3be3264d2d 39 #define GGA_ON "$PSRF103,0,0,1,1*25\r\n"
kenjiArai 0:dc3be3264d2d 40 #define GGA_OFF "$PSRF103,0,0,0,1*24\r\n"
kenjiArai 0:dc3be3264d2d 41 #define GSA_ON "$PSRF103,2,0,1,1*27\r\n"
kenjiArai 0:dc3be3264d2d 42 #define GSA_OFF "$PSRF103,2,0,0,1*26\r\n"
kenjiArai 0:dc3be3264d2d 43 #define GSV_ON "$PSRF103,3,0,1,1*26\r\n"
kenjiArai 0:dc3be3264d2d 44 #define GSV_OFF "$PSRF103,3,0,0,1*27\r\n"
kenjiArai 0:dc3be3264d2d 45 #define WAAS_ON "$PSRF151,1*3F\r\n"
kenjiArai 0:dc3be3264d2d 46 #define WAAS_OFF "$PSRF151,0*3E\r\n"
kenjiArai 0:dc3be3264d2d 47
kenjiArai 0:dc3be3264d2d 48 // kind of GPS data
kenjiArai 0:dc3be3264d2d 49 #define NONE 0
kenjiArai 0:dc3be3264d2d 50 #define RMC 1
kenjiArai 0:dc3be3264d2d 51 #define GGA 2
kenjiArai 0:dc3be3264d2d 52 #define GSA 3
kenjiArai 0:dc3be3264d2d 53 #define GSV 4
kenjiArai 0:dc3be3264d2d 54
kenjiArai 0:dc3be3264d2d 55 // SD Recording status
kenjiArai 0:dc3be3264d2d 56 #define IDLE 0
kenjiArai 0:dc3be3264d2d 57 #define RECD 1
kenjiArai 0:dc3be3264d2d 58 #define SD_FAIL 0xff
kenjiArai 0:dc3be3264d2d 59
kenjiArai 0:dc3be3264d2d 60 // Buffer size
kenjiArai 0:dc3be3264d2d 61 #define BSIZ 256
kenjiArai 0:dc3be3264d2d 62
kenjiArai 0:dc3be3264d2d 63 //-------------------------------------------------------------------------------------------------
kenjiArai 0:dc3be3264d2d 64 // Set up hardware
kenjiArai 0:dc3be3264d2d 65 // MBED USB port used for console debug messages
kenjiArai 0:dc3be3264d2d 66 // SZP950T GPS unit connects to UART
kenjiArai 0:dc3be3264d2d 67 // LED & Switch
kenjiArai 0:dc3be3264d2d 68 // 40chr x 2 line Text LCD
kenjiArai 0:dc3be3264d2d 69 // SD card interface
kenjiArai 0:dc3be3264d2d 70 // Analog input
kenjiArai 0:dc3be3264d2d 71 // G-sensor data, Baterry volt, Temperature sensor data
kenjiArai 0:dc3be3264d2d 72 #if DEBUG
kenjiArai 0:dc3be3264d2d 73 Serial pc(USBTX, USBRX); // tx, rx - Default 9600 baud
kenjiArai 0:dc3be3264d2d 74 #endif
kenjiArai 0:dc3be3264d2d 75 Serial gps(p9, p10); // tx, rx - 4800 baud required
kenjiArai 0:dc3be3264d2d 76 DigitalOut RCV_GPS(LED1); // Receive GPS data
kenjiArai 0:dc3be3264d2d 77 DigitalOut GPS_LOCK(LED2); // GPS got valid data
kenjiArai 0:dc3be3264d2d 78 DigitalOut ON_REC(LED4); // Data sent LED
kenjiArai 0:dc3be3264d2d 79 DigitalIn SW_REC(p26); // Data recode switch
kenjiArai 0:dc3be3264d2d 80 #if USE_LCD
kenjiArai 0:dc3be3264d2d 81 TextLCD lcd(p22, p23, p21, p8, p7, p6, p5, 40, 2); // rs,rw,e,d0,d1,d2,d3,40char's x 2 lines
kenjiArai 0:dc3be3264d2d 82 #endif
kenjiArai 0:dc3be3264d2d 83 SDFileSystem sd(p11, p12, p13, p14, "sd"); // do,di,clk,cs
kenjiArai 0:dc3be3264d2d 84 #if CONFG_ANA
kenjiArai 0:dc3be3264d2d 85 AnalogIn ain_G_X(p15); // G Sensor
kenjiArai 0:dc3be3264d2d 86 AnalogIn ain_G_Y(p16); // G Sensor
kenjiArai 0:dc3be3264d2d 87 AnalogIn ain_G_Z(p17); // G Sensor
kenjiArai 0:dc3be3264d2d 88 AnalogIn ain_BAT(p19); // Battery Volt
kenjiArai 0:dc3be3264d2d 89 AnalogIn ain_TEMP(p20); // Temperature Sensor
kenjiArai 0:dc3be3264d2d 90 #endif
kenjiArai 0:dc3be3264d2d 91
kenjiArai 0:dc3be3264d2d 92 //-------------------------------------------------------------------------------------------------
kenjiArai 0:dc3be3264d2d 93 // Data rea
kenjiArai 0:dc3be3264d2d 94 char msg[BSIZ]; //GPS data buffer
kenjiArai 0:dc3be3264d2d 95 char MsgBuf_RMC[BSIZ]; // GPS/GGA data
kenjiArai 0:dc3be3264d2d 96 char MsgBuf_GGA[BSIZ]; // GPS/RMC data
kenjiArai 0:dc3be3264d2d 97 #if CONFG_ANA
kenjiArai 0:dc3be3264d2d 98 char MsgBuf_ANA[128]; // Analog data buffer
kenjiArai 0:dc3be3264d2d 99 float x,y,z,b,t; // Analog data
kenjiArai 0:dc3be3264d2d 100 #endif
kenjiArai 0:dc3be3264d2d 101 char gps_dat; // Kind of GPS data
kenjiArai 0:dc3be3264d2d 102 char recode_status;
kenjiArai 0:dc3be3264d2d 103 FILE *fp; // File pointer
kenjiArai 0:dc3be3264d2d 104 char buf[40]; // data buffer for text
kenjiArai 0:dc3be3264d2d 105 time_t seconds; // RTC data based on seconds
kenjiArai 0:dc3be3264d2d 106
kenjiArai 0:dc3be3264d2d 107 //-------------------------------------------------------------------------------------------------
kenjiArai 0:dc3be3264d2d 108 // --------------- CONTROL PROGRAM --------------------
kenjiArai 0:dc3be3264d2d 109
kenjiArai 0:dc3be3264d2d 110 // Select GPS data
kenjiArai 0:dc3be3264d2d 111 void setgps() {
kenjiArai 0:dc3be3264d2d 112 gps.printf(RMC_ON); // use RMC
kenjiArai 0:dc3be3264d2d 113 gps.printf(GGA_ON); // use GGA
kenjiArai 0:dc3be3264d2d 114 gps.printf(GSA_OFF);
kenjiArai 0:dc3be3264d2d 115 gps.printf(GSV_OFF);
kenjiArai 0:dc3be3264d2d 116 gps.printf(WAAS_OFF);
kenjiArai 0:dc3be3264d2d 117 return;
kenjiArai 0:dc3be3264d2d 118 }
kenjiArai 0:dc3be3264d2d 119
kenjiArai 0:dc3be3264d2d 120 // Get line of data from GPS
kenjiArai 0:dc3be3264d2d 121 void getline() {
kenjiArai 0:dc3be3264d2d 122 while (gps.getc() != '$'); // Wait for start of line
kenjiArai 0:dc3be3264d2d 123 msg[0] = '$';
kenjiArai 0:dc3be3264d2d 124 #if DEBUG
kenjiArai 0:dc3be3264d2d 125 pc.putc('$');
kenjiArai 0:dc3be3264d2d 126 #endif
kenjiArai 0:dc3be3264d2d 127 for (int i=1; i<512; i++) {
kenjiArai 0:dc3be3264d2d 128 msg[i] = gps.getc();
kenjiArai 0:dc3be3264d2d 129 #if DEBUG
kenjiArai 0:dc3be3264d2d 130 pc.putc(msg[i]);
kenjiArai 0:dc3be3264d2d 131 #endif
kenjiArai 0:dc3be3264d2d 132 if (msg[i] == '\r' || msg[i] == '\n') {
kenjiArai 0:dc3be3264d2d 133 msg[i] = '\r';
kenjiArai 0:dc3be3264d2d 134 msg[i+1] = '\n';
kenjiArai 0:dc3be3264d2d 135 msg[i+2] = 0;
kenjiArai 0:dc3be3264d2d 136 #if DEBUG
kenjiArai 0:dc3be3264d2d 137 pc.printf("\r\n");
kenjiArai 0:dc3be3264d2d 138 #endif
kenjiArai 0:dc3be3264d2d 139 return;
kenjiArai 0:dc3be3264d2d 140 }
kenjiArai 0:dc3be3264d2d 141 }
kenjiArai 0:dc3be3264d2d 142 }
kenjiArai 0:dc3be3264d2d 143
kenjiArai 0:dc3be3264d2d 144 int main(void) {
kenjiArai 0:dc3be3264d2d 145 gps.baud(4800); // baud rate 4800
kenjiArai 0:dc3be3264d2d 146 #if DEBUG
kenjiArai 0:dc3be3264d2d 147 pc.printf("\r\n\r\nGPS logger on mbed by K.Arai/JH1PJL (c)2010\r\n");
kenjiArai 0:dc3be3264d2d 148 #endif
kenjiArai 0:dc3be3264d2d 149 #if USE_LCD
kenjiArai 0:dc3be3264d2d 150 lcd.cls();
kenjiArai 0:dc3be3264d2d 151 lcd.locate(0, 0);
kenjiArai 0:dc3be3264d2d 152 // 1234567890123456789012345678901234567890
kenjiArai 0:dc3be3264d2d 153 lcd.printf("GPS Logger Running! .... ");
kenjiArai 0:dc3be3264d2d 154 #endif
kenjiArai 0:dc3be3264d2d 155 setgps();
kenjiArai 0:dc3be3264d2d 156 while (1) {
kenjiArai 0:dc3be3264d2d 157 RCV_GPS = 1;
kenjiArai 0:dc3be3264d2d 158 getline(); // Get GPS data from UART
kenjiArai 0:dc3be3264d2d 159 if (strncmp(msg, "$GPRMC",6) == 0) {
kenjiArai 0:dc3be3264d2d 160 for (int i=0; i<BSIZ ; MsgBuf_RMC[i++]=0); // Clear buffer
kenjiArai 0:dc3be3264d2d 161 for (int i=0; msg[i] != 0; i++) { // Copy msg to RMC buffer
kenjiArai 0:dc3be3264d2d 162 MsgBuf_RMC[i] = msg[i];
kenjiArai 0:dc3be3264d2d 163 }
kenjiArai 0:dc3be3264d2d 164 gps_dat = RMC;
kenjiArai 0:dc3be3264d2d 165 // Get analog data from each port
kenjiArai 0:dc3be3264d2d 166 #if CONFG_ANA
kenjiArai 0:dc3be3264d2d 167 x=ain_G_X.read();
kenjiArai 0:dc3be3264d2d 168 y=ain_G_Y.read();
kenjiArai 0:dc3be3264d2d 169 z=ain_G_Z.read();
kenjiArai 0:dc3be3264d2d 170 b=ain_BAT.read();
kenjiArai 0:dc3be3264d2d 171 t=ain_TEMP.read();
kenjiArai 0:dc3be3264d2d 172 sprintf(MsgBuf_ANA, "$ANA,%f,%f,%f,%f,%f,,*00\r\n", x, y, z, b, t);
kenjiArai 0:dc3be3264d2d 173 #if DEBUG
kenjiArai 0:dc3be3264d2d 174 pc.printf(MsgBuf_ANA);
kenjiArai 0:dc3be3264d2d 175 #endif
kenjiArai 0:dc3be3264d2d 176 #endif
kenjiArai 0:dc3be3264d2d 177 } else if (strncmp(msg, "$GPGGA",6) == 0) {
kenjiArai 0:dc3be3264d2d 178 for (int i=0; i<BSIZ ; MsgBuf_GGA[i++]=0); // Clear buffer
kenjiArai 0:dc3be3264d2d 179 for (int i=0; msg[i] != 0; i++) { // Copy msg to GGA buffer
kenjiArai 0:dc3be3264d2d 180 MsgBuf_GGA[i] = msg[i];
kenjiArai 0:dc3be3264d2d 181 }
kenjiArai 0:dc3be3264d2d 182 gps_dat = GGA;
kenjiArai 0:dc3be3264d2d 183 } else {
kenjiArai 0:dc3be3264d2d 184 gps_dat = NONE;
kenjiArai 0:dc3be3264d2d 185 }
kenjiArai 0:dc3be3264d2d 186 RCV_GPS = 0;
kenjiArai 0:dc3be3264d2d 187 if (SW_REC){
kenjiArai 0:dc3be3264d2d 188 if (recode_status == RECD){
kenjiArai 0:dc3be3264d2d 189 // Recording -> on going
kenjiArai 0:dc3be3264d2d 190 ON_REC = 1; // LED ON for recording indication
kenjiArai 0:dc3be3264d2d 191 switch(gps_dat){
kenjiArai 0:dc3be3264d2d 192 case RMC: {
kenjiArai 0:dc3be3264d2d 193 fprintf(fp,MsgBuf_RMC); // save data
kenjiArai 0:dc3be3264d2d 194 #if CONFG_ANA
kenjiArai 0:dc3be3264d2d 195 fprintf(fp,MsgBuf_ANA); // save data
kenjiArai 0:dc3be3264d2d 196 #endif
kenjiArai 0:dc3be3264d2d 197 break;
kenjiArai 0:dc3be3264d2d 198 }
kenjiArai 0:dc3be3264d2d 199 case GGA: {
kenjiArai 0:dc3be3264d2d 200 fprintf(fp,MsgBuf_GGA); // save data
kenjiArai 0:dc3be3264d2d 201 break;
kenjiArai 0:dc3be3264d2d 202 }
kenjiArai 0:dc3be3264d2d 203 default: {;}
kenjiArai 0:dc3be3264d2d 204 }
kenjiArai 0:dc3be3264d2d 205 } else if (recode_status == IDLE){
kenjiArai 0:dc3be3264d2d 206 // Start recoding -> File open
kenjiArai 0:dc3be3264d2d 207 seconds = time(NULL);
kenjiArai 0:dc3be3264d2d 208 seconds %= 100000000; // Adjust 8 charcters file name
kenjiArai 0:dc3be3264d2d 209 sprintf(buf,"/sd/%d.txt",seconds); // File name based on time from 1970/1/1
kenjiArai 0:dc3be3264d2d 210 fp = fopen(buf, "w"); // File open
kenjiArai 0:dc3be3264d2d 211 #if DEBUG
kenjiArai 0:dc3be3264d2d 212 pc.printf("\r\n %s \r\n", buf); // File name on the screen
kenjiArai 0:dc3be3264d2d 213 #endif
kenjiArai 0:dc3be3264d2d 214 if(fp == NULL) {
kenjiArai 0:dc3be3264d2d 215 // Try again
kenjiArai 0:dc3be3264d2d 216 fp = fopen(buf, "w");
kenjiArai 0:dc3be3264d2d 217 if(fp == NULL) {
kenjiArai 0:dc3be3264d2d 218 // File not open then give up
kenjiArai 0:dc3be3264d2d 219 #if USE_LCD
kenjiArai 0:dc3be3264d2d 220 lcd.locate(0, 0);
kenjiArai 0:dc3be3264d2d 221 // 1234567890123456789012345678901234567890
kenjiArai 0:dc3be3264d2d 222 lcd.printf(" Could not open file for write ");
kenjiArai 0:dc3be3264d2d 223 #endif
kenjiArai 0:dc3be3264d2d 224 #if DEBUG
kenjiArai 0:dc3be3264d2d 225 pc.printf( "\r\n Could not open file for write\r\n");
kenjiArai 0:dc3be3264d2d 226 #endif
kenjiArai 0:dc3be3264d2d 227 recode_status = SD_FAIL;
kenjiArai 0:dc3be3264d2d 228 }
kenjiArai 0:dc3be3264d2d 229 }
kenjiArai 0:dc3be3264d2d 230 if (fp){
kenjiArai 0:dc3be3264d2d 231 // File open successful
kenjiArai 0:dc3be3264d2d 232 fprintf(fp, "GPS logger on mbed by K.Arai/JH1PJL (c)2010\r\n");
kenjiArai 0:dc3be3264d2d 233 #if USE_LCD
kenjiArai 0:dc3be3264d2d 234 lcd.locate(0, 0);
kenjiArai 0:dc3be3264d2d 235 // 1234567890123456789012345678901234567890
kenjiArai 0:dc3be3264d2d 236 lcd.printf(" Start recording ");
kenjiArai 0:dc3be3264d2d 237 #endif
kenjiArai 0:dc3be3264d2d 238 #if DEBUG
kenjiArai 0:dc3be3264d2d 239 pc.printf( "GPS logger on mbed by K.Arai/JH1PJL (c)2010");
kenjiArai 0:dc3be3264d2d 240 pc.printf("\r\nStart recording\r\n");
kenjiArai 0:dc3be3264d2d 241 #endif
kenjiArai 0:dc3be3264d2d 242 recode_status = RECD;
kenjiArai 0:dc3be3264d2d 243 }
kenjiArai 0:dc3be3264d2d 244 }
kenjiArai 0:dc3be3264d2d 245 } else {
kenjiArai 0:dc3be3264d2d 246 if (recode_status == RECD){
kenjiArai 0:dc3be3264d2d 247 // File close
kenjiArai 0:dc3be3264d2d 248 fclose(fp);
kenjiArai 0:dc3be3264d2d 249 recode_status = IDLE; // back to idle state
kenjiArai 0:dc3be3264d2d 250 #if USE_LCD
kenjiArai 0:dc3be3264d2d 251 lcd.locate(0, 0);
kenjiArai 0:dc3be3264d2d 252 // 1234567890123456789012345678901234567890
kenjiArai 0:dc3be3264d2d 253 lcd.printf("Finish data save ");
kenjiArai 0:dc3be3264d2d 254 #endif
kenjiArai 0:dc3be3264d2d 255 #if DEBUG
kenjiArai 0:dc3be3264d2d 256 pc.printf( "\r\n Finish data save\r\n");
kenjiArai 0:dc3be3264d2d 257 #endif
kenjiArai 0:dc3be3264d2d 258 } else if (recode_status == SD_FAIL){
kenjiArai 0:dc3be3264d2d 259 // When file access failed
kenjiArai 0:dc3be3264d2d 260 recode_status = IDLE; // back to idle state
kenjiArai 0:dc3be3264d2d 261 #if USE_LCD
kenjiArai 0:dc3be3264d2d 262 lcd.locate(0, 0);
kenjiArai 0:dc3be3264d2d 263 // 1234567890123456789012345678901234567890
kenjiArai 0:dc3be3264d2d 264 lcd.printf("Could not save the data ");
kenjiArai 0:dc3be3264d2d 265 #endif
kenjiArai 0:dc3be3264d2d 266 #if DEBUG
kenjiArai 0:dc3be3264d2d 267 pc.printf( "\r\n Could not save the data\r\n");
kenjiArai 0:dc3be3264d2d 268 #endif
kenjiArai 0:dc3be3264d2d 269 }
kenjiArai 0:dc3be3264d2d 270 ON_REC = 0; // LED off for IDLE
kenjiArai 0:dc3be3264d2d 271 }
kenjiArai 0:dc3be3264d2d 272 }
kenjiArai 0:dc3be3264d2d 273 }
kenjiArai 0:dc3be3264d2d 274