====== 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]]
* [[http://www.hhhh.org/wiml/proj/nmeaxor.html|calcul de checksum]]
* [[https://docs.google.com/fileview?id=0B_dHj7E2weiiNmUzNDA3OTktNTNhNy00Y2Y5LTg0YTQtMzIyNzJhZmFiNjcy&hl=en|datasheet]]
==== 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/]]
* https://github.com/adafruit/TFTLCD-Library
* https://github.com/adafruit/Adafruit-GFX-Library
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 ...
===== boutons =====