(gepeto,sarah)
l'arduino gérant des interfaces pas trop rapides, sera exploité en 115000 bauds sur l'USB, une trame de sortie ASCII composée pour le moment de 4 lignes : entête et données sur un total de 115k/4 soit grosso modo 100/4 soit 25 car par lignes
donc une trame de 100 chars venant de l'arduino sera de la forme
GP,xxxx,yyyy,tttt,\n RF,xxxxxxxxx,\n NS,-xxx,\n IO,xxxx,xxxx,xxx,\n
// A simple sketch to read GPS data and parse the $GPRMC string // see http://www.ladyada.net/make/gpsshield for more info // If using Arduino IDE prior to version 1.0, // make sure to install newsoftserial from Mikal Hart // http://arduiniana.org/libraries/NewSoftSerial/ #include "Arduino.h" #include "SoftwareSerial.h" const uint8_t sirf_to_nmea[] = { 0xa0, 0xa2, // preamble 0x00, 0x18, // message length 0x81, 0x02, // switch to NMEA 0x01, 0x01, // GGA on with checksum 0x00, 0x01, // GLL off 0x00, 0x01, // GSA off 0x00, 0x01, // GSV off 0x01, 0x01, // RMC on with checksum 0x01, 0x01, // VTG on with checksum 0x00, 0x01, // MSS off 0x00, 0x01, // EPE off 0x00, 0x01, // ZPA off 0x00, 0x00, // pad 0x96, 0x00, // 38400 0x01, 0x25, // checksum TBD 0xb0, 0xb3 }; // postamble // Use pins 2 and 3 to talk to the GPS. 2 is the TX pin, 3 is the RX pin SoftwareSerial GPSSerial = SoftwareSerial(10, 11); // Set the GPSRATE to the baud rate of the GPS module. Most are 4800 // but some are 38400 or other. Check the datasheet! //#define GPSRATE 4800 #define GPSRATE 38400 // The buffer size that will hold a GPS sentence. They tend to be 80 characters long // so 90 is plenty. #define BUFFSIZ 90 // plenty big // global variables char buffer[BUFFSIZ]; // string buffer for the sentence char *parseptr; // a character pointer for parsing char buffidx; // an indexer into the buffer // The time, date, location data, etc. uint8_t hour, minute, second, year, month, date; uint32_t latitude, longitude; uint8_t groundspeed, trackangle; char latdir, longdir; char status; void setup() { // Use the pin 13 LED as an indicator pinMode(13, OUTPUT); // connect to the serial terminal at 38400 baud Serial.begin(38400); // connect to the GPS at the desired rate GPSSerial.begin(GPSRATE); //for (uint8_t i = 0; i < sizeof(sirf_to_nmea); i++) // GPSSerial.write(sirf_to_nmea[i]); // GPSSerial.write("$PMTK220,1000*1F\r\n"); delay(100); //GPSSerial.write("$PMTK251,9600*17\r\n"); //delay(100); //GPSSerial.close(); //delay(100); //GPSSerial.begin(9600); //delay(100); GPSSerial.write("$PGCMD,16,1,0,0,0,0*6B\r\n") ; delay(100); // prints title with ending line break Serial.println("GPS parser"); } uint32_t parsedecimal(char *str) { uint32_t d = 0; while (str[0] != 0) { if ((str[0] > '9') || (str[0] < '0')) return d; d *= 10; d += str[0] - '0'; str++; } return d; } void readline(void) { char c; buffidx = 0; // start at begninning while (1) { c=GPSSerial.read(); if (c == -1) continue; Serial.print(c); if (c == '\n') continue; if ((buffidx == BUFFSIZ-1) || (c == '\r')) { buffer[buffidx] = 0; return; } buffer[buffidx++]= c; } } void loop() { uint32_t tmp; Serial.print("\n\rRead: "); readline(); // check if $GPRMC (global positioning fixed data) if (strncmp(buffer, "$GPRMC",6) == 0) { //if (strncmp(buffer, "GPGGA",6) == 0) { // hhmmss time data parseptr = buffer+7; tmp = parsedecimal(parseptr); hour = tmp / 10000; minute = (tmp / 100) % 100; second = tmp % 100; parseptr = strchr(parseptr, ',') + 1; status = parseptr[0]; parseptr += 2; // grab latitude & long data // latitude latitude = parsedecimal(parseptr); if (latitude != 0) { latitude *= 10000; parseptr = strchr(parseptr, '.')+1; latitude += parsedecimal(parseptr); } parseptr = strchr(parseptr, ',') + 1; // read latitude N/S data if (parseptr[0] != ',') { latdir = parseptr[0]; } //Serial.println(latdir); // longitude parseptr = strchr(parseptr, ',')+1; longitude = parsedecimal(parseptr); if (longitude != 0) { longitude *= 10000; parseptr = strchr(parseptr, '.')+1; longitude += parsedecimal(parseptr); } parseptr = strchr(parseptr, ',')+1; // read longitude E/W data if (parseptr[0] != ',') { longdir = parseptr[0]; } // groundspeed parseptr = strchr(parseptr, ',')+1; groundspeed = parsedecimal(parseptr); // track angle parseptr = strchr(parseptr, ',')+1; trackangle = parsedecimal(parseptr); // date parseptr = strchr(parseptr, ',')+1; tmp = parsedecimal(parseptr); date = tmp / 10000; month = (tmp / 100) % 100; year = tmp % 100; Serial.print("\n\tTime: "); Serial.print(hour, DEC); Serial.print(':'); Serial.print(minute, DEC); Serial.print(':'); Serial.println(second, DEC); Serial.print("\tDate: "); Serial.print(month, DEC); Serial.print('/'); Serial.print(date, DEC); Serial.print('/'); Serial.println(year, DEC); Serial.print("\tLat: "); if (latdir == 'N') Serial.print('+'); else if (latdir == 'S') Serial.print('-'); Serial.print(latitude/1000000, DEC); Serial.print("* "); Serial.print((latitude/10000)%100, DEC); Serial.print('\''); Serial.print(' '); Serial.print((latitude%10000)*6/1000, DEC); Serial.print('.'); Serial.print(((latitude%10000)*6/10)%100, DEC); Serial.println('"'); Serial.print("\tLong: "); if (longdir == 'E') Serial.print('+'); else if (longdir == 'W') Serial.print('-'); Serial.print(longitude/1000000, DEC); Serial.print("* "); Serial.print((longitude/10000)%100, DEC); Serial.print('\''); Serial.print(' '); Serial.print((longitude%10000)*6/1000, DEC); Serial.print('.'); Serial.print(((longitude%10000)*6/10)%100, DEC); Serial.println('"'); } // Serial.println(buffer); }
ce qui nous donne : $GPRMC,180535.000,A,4716.6260,N,00212.6208,W,0.00,185.27,180712,,,A*79
Time: 18:5:35 Date: 7/18/12 Lat: +47* 16' 37.56" Long: -2* 12' 37.24"
ce qui donne bien 61 rue d'anjou : Lat:+47* 16' 37.56“ Long: -2* 12' 37.24”.
Ce serait pas mal qu'il soit sur l'USB pour optimiser les transferts de donnee
http://www.ladyada.net/products/tfttouchshield/
il nous faudrait developper des parties pour l'affichage de texte
Bon nous allons regarder aussi du coté de la KOBO !
l'affichage de texte est deja das les librairies a voir …