Table des matières
Développement sur Arduino des interfaces
(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
- GPS : GP,xxx,yyy,ttt …. latitude,longitude,temps, tout en relatif ?,
- RFID : RF,xxxxxxxxx le tag rfid (10 chars?)
- Boussole : NS,[+,-],[1-360]
- Boutons et autres: IO,xxxxx,xxxxx,xxxx, : a voir plus tard
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
GPS
- ressource protocole NMEA http://www.gpsinformation.org/dale/nmea.htm
Bidouille de test :
// 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”.
Zigbee
Ce serait pas mal qu'il soit sur l'USB pour optimiser les transferts de donnee
mini écran
tests autour du module tactile
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 !
tests autour du module à bouton
l'affichage de texte est deja das les librairies a voir …
