Communication avec un GPS : Protocole NMEA 0183

Communication avec un GPS : Protocole NMEA 0183
Les trames émises par le recepteur gps.

Il existe plusieurs protocoles de communication pour les récepteurs GPS. Certains sont standardisés comme NMEA (National Marine Electronics Association) ou Sirf, d’autres sont propriétaires comme Garmin ou delorme.
Mon propos ici ne vise pas l’utilisation de récepteur GPS grand public que l’on peut trouver dans la grande distribution ou les magasins d’électronique grand public. Je parle ici de composants électroniques GPS, que l’on appelle également GPS engine. Je souhaite donc m’affranchir le plus possible des marques. J’utilise donc le protocole NMEA qui est utilisé par tous les récepteurs (à ma connaissance). Le protocole Sirf bien que standardisé n’est géré que par les circuits intégrant un chipset sirf.
Pour lever toute ambiguïté, je précise que ces trames n’ont rien à voir avec les informations envoyées par les satellites. Elle sont générées par le GPS Engine à partir des informations reçues depuis les satellites.
Le protocole NMEA est basé sur une communication serie rs232.
Les paramètres de communication sont les suivants :
4800 bauds,
8 bits de données,
Pas de parité,
1 bit d’arrêt,
Aucun contrôle de flux.

La liaison se résume à 3 signaux. RX, TX et GND. Dans la plupart des cas le RX (réception) ne nécessite pas d’être câblé. Sauf si vous souhaitez commuter le composant sur un autre protocole, ou changer des paramètres internes.

NMEA 01183 utilise les caractères ASCII. Les trames sont définies par un format normalisé.
Chaque trame commence par le caractère ‘$’ (ascii hexa 0x24) et finit par les caractères retour chariot et saut de ligne (ascii hexa 0x0D 0x0A).
La trame est ensuite constituée d’un identifiant de trame suivi des champs de valeurs séparées par des virgules.
Après le dernier champ et avant les caractères de fin de ligne., on trouve le caractère * suivi d’un checksum.
Le checksum est un ou exclusif des caractères compris entre le $ et le *
L’identifiant est constitué des 2 lettres « GP » suivi d’un code de 3 lettres.

Les trames GPS NMEA

  • Trame GGA

Cette trame fournit l’heure du système GPS, les coordonnées Longitude, Latitude, et toutes les informations relatives à la précision de mesure et au repère.

Exemple de trame reçu :
$GPGGA,134435.205,4539.5165,N,00433.4235,E,1,07,1.9,711.3,M,48.6,M,,0000*56
$GPGGA :identifiant de message.
134435.205 : heure du système UTC au format HHMMSS .SSS en millièmes de seconde.
4539.5165 : Lattitude au format DDMM.MMMM en dix millième de degré.
N : Indicateur Nord /Sud N=Nord, S=Sud
00433.4235 :Longitude au format DDDMM.MMMM en dix millième de degré.
E : Indicateur Est /ouest E=Est, W=Ouest
1 : Repere 0= invalid, 1=valid,2=gps differentiel (jamais testé) ,3=Mode PPS (connais pas)
07 : Nombre de satellites
1.9 : Dilution de précision horizontale
711.3 : Altitude en Metres
M : precise l’unité M=metres
48.6 :Ecart par rapport au géoide
M : precise l’unité M=metres
Champ vide : utilisé uniquement en DGPS
0000
*56 : Checksum

Voilà à quoi ressemble la trame si vous ne captez pas suffisamment de satellites :
$GPGGA,235953.056,,,,,0,00,,,M,0.0,M,,0000*5E
Si vous avez précédemment capté un satellite, l’heure peut être bonne, sinon elle est aléatoire.

  • Trame GLL

Fournit la latitude, la longitude et l’heure
Exemple de trame :
$GPGLL, 4539.5165,N, 00433.4235,E,014522124,A*2C

$GPGLL : identifiant de message.
4539.5165 : Lattitude au format DDMM.MMMM en dix millième de degré.
N : Indicateur Nord /Sud N=Nord, S=Sud (je n’ai pas vérifié)
00433.4235 :Longitude au format DDDMM.MMMM en dix millième de degré.
E : Indicateur Est /ouest E=Est, W=Ouest (je n’ai pas vérifié)
014522124 : heure du système UTC au format HHMMSS .SSS en millièmes de seconde.
A : Données valides, (V pour donnée non valides)
*2C : Checksum

  • Trame GSA

Précision et satellites actifs.
Exemple de trame :
$GPGSA,A,3,21,30,31,06,24,29,,,,,,,2.8,1.5,2.4*33
$GPGSA :identifiant de message
A : Mode 1, switch automatique entre mode 2D et 3D. (M pour manuel)
3 : Mode 2, Mode de fix (1 : incorrecte, 2 :2D, 3 :3D)
21 : Numéro de satellite utilisé sur canal 1
30 : Numéro de satellite utilisé sur canal 2
31 : Numéro de satellite utilisé sur canal 3
06 : Numéro de satellite utilisé sur canal 4
24 : Numéro de satellite utilisé sur canal 5
29 : Numéro de satellite utilisé sur canal 6
les virgules sans numéro associé sont réservés pour d’autres satellite .(jusqu’au canal 12)
2.8 : Dilution de précision sur la position globale
1.5 : Dilution de précision sur la position horizontale
2.4 : Dilution de précision sur la position verticale
*33 :Checksum

  • Trame RMC

Minimum recommandé.
Il s’agit du message le plus couramment utilisé.
Exemple de trame :
$GPRMC,145413.000,A,4539.5109,N,00433.4255,E,1.25,78.05,011008,,*35
$GPRMC : Identifiant de message.
145413.000 : heure du système UTC au format HHMMSS .SSS en millièmes de seconde.
A :fixe correcte (V pour incorrecte)
4539.5109 : Lattitude au format DDMM.MMMM en dix millième de degré.
N : Indicateur Nord /Sud N=Nord, S=Sud
00433.4255 : Longitude au format DDDMM.MMMM en dix millième de degré.
E : Indicateur Est /ouest E=Est, W=Ouest
1.25 : Vitesse de déplacement en nœuds (pour mémoire 1 noeud = 1 mille marin / heure = 1852 mètres / heure)
78.05 : Azimut de déplacement en degrés décimaux
011008 : date UTC au format JJMMAA.
35 : checksum

  • Trame GSV

Satellite en vue
Cette trame peut être envoyée de 1 à 3 fois par séquence.
Elle fournit les informations de 4 satellites maximum, la dernière trame pouvant être plus courte si le nombre de satellite n’est pas multiple de 4.
Exemple de trame :
$GPGSV,2,1,07,07,79,048,42,02,51,062,43,26,36,256,42,27,27,138,42*71
$GPGSV : identifiant de message
2 : nombre de trames
1 : numéro de trame
07 : nombre de satellites visibles
07 : numéro du premier satellite
79 : élévation en degré du premier satellite
048 : Azimut en degré du premier satellite
42 : qualité du signal
02 : numéro du deuxième satellite
51 : élévation du deuxième satellite en degré
062 : azimut du deuxième satellite en degré
43 : qualité de signal deuxième satellite
26 : numéro du troisième satellite
36 : élévation du troisième satellite en degré
256 : azimut du troisième satellite en degré
42 : qualité du signal satellite en degré
27 : numéro du quatrième satellite
27 : élévation du quatrième satellite en degré
138 : azimut du quatrième satellite en degré
42 : qualité du signal du quatrième satellite.
*71 : Checksum

  • Trame VTG

Direction et vitesse.
Exemple de trame :
$GPVTG,309.62,T,,M,0.13,N,0.2,K*6E

$GPVTG: identifiant de message
309.62 : direction par rapport au nord géographique (réel) en degré
T : indicateur réel (True)
Valeur manquante : direction par rapport au nord magnétique en degré
M: indicateur magnetique
0.13: vitesse en noeuds
N: Indicateurs noeuds
0.2: vitesse en km/h
K : indicateur km/h
*6E: Checksum