Présentation
Nous allons utiliser le même capteur
GPS que l'année dernière : le
GPS MTK3339 à 66 Canaux Adafruit
Nous l'avons déjà utilisé pour le projet Ballon Sonde M2C3T1 2014, il est capable de prendre des mesures jusqu'à une altitude supérieure à 32 km.
Nous avions déjà présenté sa programmation sur le site stl.janetti.perso.sfr.fr
Nous allons encore utiliser la bibliothèque Tiny GPS pour extraire automatiquement les coordonnées GPS à partir des trames NMEA reçues :
$GPGGA,064036.289,4836.5375,N,00740.9373,E,1,04,3.2,200.2,M,,,,0000*0E
$GPGGA : Type de trame064036.289 : Trame envoyée à 06h40m36,289s (heure UTC) 4836.5375,N : Latitude 48,608958° Nord = 48°36'32.25" Nord 00740.9373,E : Longitude 7,682288° Est = 7°40'56.238" Est 1 : Type de positionnement (le 1 est un positionnement GPS) 04 : Nombre de satellites utilisés pour calculer les coordonnées 3.2 : Précision horizontale ou HDOP (Horizontal dilution of precision) 200.2,M : Altitude 200,2, en mètres ,,,,,0000 : D'autres informations peuvent être inscrites dans ces champs *0E : Somme de contrôle de parité, un simple XOR sur les caractères précédents
Analyse du signal sortant de TX
Rappel sur la liaison UART : consulter la page TP Arduino/UART.
Un capteur GPS UART utilise principalement 4 pattes :
- VIN : alimentation + 5 V ;
- GND : la masse ;
- Rx : pour la réception de donnée, facultatif si on utilise les paramètres par défaut du GPS ;
- Tx : transmission des données GPS, par défaut 9600 bit/s, rafraichissement des coordonnées 1 Hz (1 fois par seconde).
Nous avons alimenté un capteur GPS entre GND et VIN=5V. Puis nous avons relié sa patte TX à notre analyseur logique pour obtenir ce signal :
Notre GPS transmet sans arrêt des trames GPS sur sa sortie UART Tx à 9600 bauds. une nouvelle trame est émise toutes les secondes. Voici un zoom sur un début de transmission :
Dans une liaison UART pour transmettre
un carctère Ascii (codé sur 1 octet) il faut : 1 bit de start
puis le code ASCII sur 8 bits (1 octet) et un bit de stop soit
10 bits.
Une liaison 9600 bit/s (baudrate) transmet donc 960 caractères par seconde.
Une trame dure entre :
-
0,4278 s * 960 caractères/s = 411 caractères
-
0,2472 s * 960 caractères/s = 237 caractères
Le buffer standard de la liaison série d'un Arduino est de 64 caractères : c'est insuffisant. Par conséquent pour être sûr de lire une trame complète il faudra scruter le port série durant 1s.
Le sous programme acquisition GPS
Il faut d'abord importer la bibliothèque Tiny GPS que vous pouvez télécharger en cliquant sur le lien.
Pour importer : Croquis/Importer bibliothèque/Ajpouter bibliothèque puis Téléchargements/TinyGPS.zip
La première partie du programme est à placer dans l'entête, puis le sous programme à la fin...
Pensez à initialiser la liaison série dans le setup : Sgps.begin(9600);
/* 1) Zone 1 : les déclarations */
// 1.a) Les bibliothèques et création d'objets
#include <TinyGPS.h>
TinyGPS gps; // création de l'objet gps
// 1.b) Les Constantes et #define
#define Sgps Serial3
// 1.c) Les variables globales
word N1,E1,Alti;
float N,E,Vitesse
/* 4) Zone 4 : les sous programmes (ou fonctions) */
void acquisitionGPS() // durée d'exécution environ 1100 ms
{ // Variables locales
unsigned long t1, fix_age;
int annee;
byte c,mois, jour, heure,minutes, seconde, iemes;
t1=millis();
while (millis()-t1<1100) // On scrute durant 1,1 s la liaison UART du GPS
{
if (Sgps.available()){
c = Sgps.read();
// Sdebug.write(c); // permet de voir les trames GPS brutes
gps.encode(c); // On envoie chaque caratère reçu à la bibliothèque Tiny GPS
}
// Retour des coordonnées par la bibliothèque Tiny GPS
gps.f_get_position(&N, &E); // Les pointeurs &N et &E sont les coordonnées GPS
Alti = gps.f_altitude(); // +/- altitude en mètres
Vitesse = gps.f_speed_mps();
gps.crack_datetime(&annee, &mois, &jour, &heure, &minutes, &seconde, &iemes, &fix_age);
Date =String(jour) + "/" + String(mois) + "/" + String(annee) + " "+ String (heure+2) + ":" + String (minutes) + ":" + String (seconde);
N1=(N-40.0)*10000.0;
/* word permet de coder un nombre entier jusqu'à 65535
Pour cela nous allons enlever 40° à N et le multiplier par 10000 pour garder 4 chiffres après la vigule
Ainsi nous pouvons coder N de 40° (N1=0) à 46,5535 (N1=65535)
Ce qui couvre la zone probable de vol */
E1=E*10000;
/* De même pour E de 0° (E1=0) à 6,5535° */
};