Norme NMEA 0183
(National Marine Electronics Association)
Elle définit le mode de communication entre les différents instruments de navigation
(cette liaison n'est pas un bus, il peut y avoir plusieurs récepteurs mais un seul émetteur) :
4 800 bauds, données en ASCII sur 7 bits (0 à 127) et le format des messages
(disponible librement sur le site de la NMEA depuis peu).
Existe aussi la NMEA 0183-HS où la vitesse est passée à 38 400 bauds pour l'AIS.
Elle devait être remplacée par la NMEA 2000 utilisant un bus CAN bien plus
performant, mais il semble que les deux standards coexisteront puisqu'une version 4 est apparue
récemment (2008 ?) complétée par de nouveaux paramètres. Le format des messages de la 2000 est
complètement différent de ceux de la 0183.
Branchement sur le PC
Les GPS récents, dont ceux appelés "antenne GPS active", se branchent en USB. Un convertisseur (par ex. le PL 2303 de Prolific™ et son driver) émule un port série COMx (Windows) ou ttyUSBx (Linux) qui facilite la programmation.
Les anciens GPS avec une sortie RS232 sont branchés soit directement sur des PCs ayant encore ce port (disparu depuis des PC récents), soit via un convertisseur RS232 / USB.
Il faut utiliser un adaptateur avec couplage opto-électronique si la sortie est en RS422 (ce qui est la norme NMEA depuis la v2) ; le branchement direct sur un port RS232 du PC, bien que possible, risque d'endommager les deux appareils.
Paramètres du port : 4 800 bauds, sans parité, 8 bits de données (mais le huitième n'est pas utilisé)
et un de stop.
Sous DOS le port sera initialisé par la commande : "MODE COMx: 4800,N,8,1" ;
la lecture des données par : "COPY COMx: fichier.txt" (la copie doit être interrompue par un
Ctrl-Break, attention le système attend indéfiniment en cas d'absence de données),
ou en utilisant l'HyperTerminal de Windows (disparu de la v 10). Si les données reçues sont illisibles
c'est que les paramètres d'initialisation sont incorrects.
Sous Linux consulter le
Serial-Programming-HOWTO. Certaines distributions incluent le driver du PL2303 (par ex. Ubantu).
Exploitation
Le GPS transmet toutes les secondes (fréquence paramétrable) un groupe de messages dont la composition dépend de la version de la NMEA 0183. On peut soit les exploiter tous, soit ne prendre que le plus intéressant, par exemple le "$GPRMC" (depuis la version 2) :
$GPRMC,152600.03,A,4840.5236,N,00223.2043,E,0.0,9.6,300907,0.0,W*47
Chaque message commence par '$', 'GP' identifie un GPS ('LC' un Loran, ...), 'RMC' le message. Suivent les données séparées par des virgules : ici l'heure sous la forme hhmnss.ss, le statut (A : données valides, V : invalides), la latitude : les deux premiers chiffres sont les degrés puis les minutes et décimales, Nord ou Sud, idem pour la longitude (trois chiffres pour les degrés) Est ou Ouest (W), la vitesse fond en noeuds, l'angle de route fond, la date, la déclinaison magnétique Est ou Ouest, enfin le checksum en hexadécimal après l'astérisque. Il est clos par une fin de ligne 'CRLF'.
Le "$GPGGA" donne la position, l'altitude par rapport au géoïde (dit niveau de la mer)
et la hauteur du géoïde sur l'ellipsoïde de référence ( Navigation, § 2.4.2),
le "$GPGSA" les PDOP, VDOP et HDOP, le "$GPGSV" les hauteur, azimut et niveau de signal
de chaque satellite...
Sinon les informations minimales (versions NMEA inférieures) sont "$GPGLL" : position et
"$GPGTV" : vitesse et route fond.
Inversement il est possible d'envoyer des instructions au GPS : sélection des messages à transmettre, fréquence... Voir par exemple le site de SiRF™ (fabricant de circuits). Par prudence s'assurer auparavant que l'on peut restaurer le firmware de l'appareil.
Le programme GPS2.c est un exemple d'application : affichage de la position en temps réel. La période d'une seconde entre groupes de messages laisse le temps d'exploitations plus complexes, ou simplement l'enregistrement périodique dans un fichier, les données seront ensuite importées et traitées dans un tableur. En particulier le traitement statistique d'un grand nombre de coordonnées d'un point fixe permet de réduire l'incertitude sur sa position.
Généralisation
Ceci est applicable à tous les instruments fournissant des messages NMEA 0183. Le branchement de plusieurs appareils se fera soit par l'intermédiaire d'un multiplexeur NMEA (plusieurs entrées, une sortie RS232 ou USB, relativement cher), soit sur des ports série ou USB différents. Dans le cas d'un raccordement via un multiplexeur il faut juste reconnaître chaque message et le traiter en conséquence. Si les entrées sont sur des ports séparés l'exploration de ceux-ci se fera en séquence.
Les messages AIS ajoutés à la norme (v 3) sont transmis de la même façon, excepté un point d'exclamation à la place du dollar du début et une vitesse de transmission à 38 400 bauds :
!AIVDM,1,1,,A,15MgK45P3@G?fl0E`JbR0OwT0@MS,0*4E
'AI' identifie un poste AIS, 'VDM' le type de sentence, 1 le nombre de trames transmises, le second 1 le numéro de trame (donc ici une seule), le champ suivant est un numéro de séquence (vide ici), le canal radio (A ou B), le message à décoder, le nombre de bits de complément (ici 0) et enfin l'astérisque suivi du checksum.
Les messages transmis par radio sont codés sur 6 bits et transformés sur 8 dans la trame. Il faut donc retrouver les données d'origine. Le premier caractère est le type de message, ici '1' (ASCII 49), en retranchant 48 on obtient le chiffre 1, etc. Si le résultat est supérieur à 40 on retranche encore 8. Les données dépendent du type de message (de 1 à 27) et sont codées sur un nombre variable de bits.
Alors que "!AIVDM" donne les informations des bateaux environnants, la sentence "!AIVDO" donne celles de son propre bateau, suivant le même format.