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

  1. GPS : GP,xxx,yyy,ttt …. latitude,longitude,temps, tout en relatif ?,
  2. RFID : RF,xxxxxxxxx le tag rfid (10 chars?)
  3. Boussole : NS,[+,-],[1-360]
  4. 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

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 …

boutons