Dans ce chapitre, nous allons raccorder ce petit module GPS a l'Arduino, récupérer les données qui nous intéresse et les formater pour nos besoins...
Le module dispose de 4 broches:
- VCC (3 à 5 Volts)
- GND
- TX ( a raccorder sur pin 10 soit virtual Rx de l'Arduino pour notre exemple)
- RX ( a raccorder sur pin 11 soit virtual Tx de l'Arduino pour notre exemple)
La vitesse de transmission de base est de 9600 bauds.
Par défaut, il envoie un flot de trames toutes les secondes.
Il est opérationnel ( environ 10 secondes aprés mise en route) quand la Led rouge clignote.
Les trames GPS sont au formes standard de la norme NMEA 0183
Consultez l’excellent site:
http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=17661
pour plus de détails!
Le module envoie une trentaine de trames toutes les secondes, mais celle qui nous intéresse particulièrement est la trame GPGGA:
$GPGGA,064036.289,4836.5375,N,00740.9373,E,1,04,3.2,200.2,M,,,,0000*0E
La trame GPGGA contient notamment:
-La date HHMMSS. MILLIS.
-La Latitude (format spécifique horaire) + direction ( Nord ou Sud)
-La Longitude (format spécifique horaire) + direction (Est ou West)
-La validité des données (1) ou non valide (0)
-L'altitude (en mètres)
Configuration de base de l'Arduino pour l'acquisition des données:
Le premier port série est utilisé pour la classique communication entre l'Arduino et l'ordinateur afin d'effectuer les téléversement et voir si tout se passe bien...(port USB)
Nous allons mettre en route le "serial software". Il sera chargé de la communication entre le module et l'Arduino. Nous utiliseront les pins 10 & 11.
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX void setup() { Serial.begin(9600); // ouvre le port serie, transfert data a 9600 bps while (!Serial) { ; // attend que le port serie soit connecte. } Serial.println("Prêt pour transmission!"); // transfert data a 9600 bps pour le port SoftwareSerial mySerial.begin(9600); }
Pour vérifier que le module fonctionne correctement, on peut ajouter ces lignes.
Le programme va alors recopier sur le port série "classique" tout ce que le module envoie...
void loop() { // put your main code here, to run repeatedly: if (mySerial.available()) { Serial.write(mySerial.read()); } }
1- Comme seule la trame GPGGA nous intéresse, il va falloir "récupérer des paquets de données" puis rechercher dans ces paquets cette fameuse trame...
Nous allons créer un tableau de 1000 caractères ( qui ne sera jamais rempli car un paquet de trames complet n’excède jamais 800 caractères...)
2- Nous allons ensuite rechercher, dans ce tableau, la suite des caractères "G"," P", "G", "G", "A" avec un pointeur de tableau.
void recuperationTrame(){ for (i=0; i<compteurChar;i++) { if (tableau[i] == '$' && tableau[i+1] == 'G' && tableau[i+2] == 'P' && tableau[i+3] == 'G' && tableau[i+4] == 'G' && tableau[i+5] == 'A') { Serial.println("Trame GPGGA trouvee!"); pointeurTrame = i; drapeauDetectionTrame = 1; } } }
Si la trame GPGGA n'est pas trouvée, un nouvelle capture de tableau est lancée.
(La trame peut ne pas être trouvée car la capture a pu être effectuée en cours de transmission...)
Si la trame est trouvée, le pointeur de tableau est associé a un compteur de virgules pour récupérer les différents champs : heure, latitude, longitude, altitude...
( On ne peut se fier a un simple pointeur de caractères dans la chaine car certaines données varient en longueur!)
for (i = pointeurTrame; i<compteurChar;i++) { if ( tableau [i] == ',') { compteurVirgule++; pointeurCaractereChaine =0; } i++; donnee = tableau [i]; if (compteurVirgule == 1) { date[pointeurCaractereChaine]= donnee; pointeurCaractereChaine++; pointeurChaineDate = pointeurCaractereChaine; } if (compteurVirgule == 3) { longitude[pointeurCaractereChaine]= donnee; pointeurCaractereChaine++; pointeurChaineLongitude = pointeurCaractereChaine; } if (compteurVirgule == 5) { latitude[pointeurCaractereChaine]= donnee; pointeurCaractereChaine++; pointeurChaineLatitude = pointeurCaractereChaine; } if (compteurVirgule == 11) { altitude[pointeurCaractereChaine]= donnee; pointeurCaractereChaine++; pointeurChaineAltitude = pointeurCaractereChaine; } } }
Notre petit module NEO6 MV2 nous envoie les latitudes et longitudes sous forme:
4836.5375,N et 00740.9373,E
Nous allons nous en servir pour calculer le cap.
Aucun commentaire:
Enregistrer un commentaire