Vous êtes sur la page 1sur 5

• Trames NMEA


➢ Présentation du GPS
Le système de positionnement global (GPS) est un système de navigation par satellite qui se compose de 24
satellites en orbite, dont chacun effectue deux rotations autour de la Terre toutes les 24 heures. Des signaux
sont captés par le récepteur GPS, qui utilise ces informations pour calculer la distance entre lui et les
satellites GPS. Avec les signaux de trois satellites ou plus, un récepteur GPS peut trianguler sa position au sol
(c'est-à-dire la longitude et la latitude) à partir de la position connue des satellites. Avec quatre satellites ou
plus, un récepteur GPS peut déterminer une position 3D (c'est-à-dire la latitude, la longitude et l'élévation).
De plus, un récepteur GPS peut fournir des données sur votre vitesse et votre sens de déplacement. Toute
personne disposant d'un récepteur GPS peut accéder à la constellation des satallites. Étant donné que le GPS
fournit un positionnement, une navigation et une synchronisation tridimensionnels en temps réel 24 heures
sur 24, 7 jours sur 7, partout dans le monde, il est utilisé dans de nombreuses applications, notamment la
collecte de données SIG, l'arpentage et la cartographie.

Présentation du module NEO-6M


Ce module intègre un récepteur GPS GY - GPS6MV2 doté d'une
excellente sensibilité (jusqu'à -166 dBm) dont vous pourrez récupérer
les coordonnées en temps réel disposant d'une interface série (UART).
Caractéristiques :

• Alimentation : 3,3 Vcc / 5 Vcc


• Récepteur GY - GPS6MV2
• Consommation : 60mA max.
• Interface UART
• Avec Leds d'état
• Supporte : GPS

Sciences Numériques et Technologie – Page : 1


• Trames NMEA

➢ Les trames NMEA


Sous ce standard, toutes les données sont transmises sous la forme des caractères ASCII, à la vitesse de
transmission de 4800 bauds. Les données sont transmises sous forme de trames (sentences, phrases).
Chaque trame commence par le caractère $ suivi par un groupe de 2 lettres pour l'identifiant du récepteur.
(Non limitatif):

• GP pour Global Positioning System.


• LC Loran-C receiver.
• OM Omega Navigation receiver.
• II Integrated Instrumentation (eg. AutoHelm Seatalk system).

Puis un groupe de 3 lettres pour l'identifiant de la trame.

• GGA : pour GPS Fix et Date.


• GLL : pour Positionnement Géographique Longitude - Latitude.
• GSA : pour DOP et satellites actifs. • GSV : pour Satellites visibles.
• VTG : pour Direction (cap) et vitesse de déplacement (en noeuds et Km/h).
• RMC: pour données minimales exploitables spécifiques.

Suivent ensuite un certain nombre de champs séparés par une "virgule". Le rôle de la virgule est d'être le
séparateur de champs, qui permet la dé-concaténation des données dans le programme. La norme NMEA
détermine dans quel ordre sont placées les informations issues des satellites et sous quelle forme elles sont
enregistrées. Pour lire les informations comprises dans la trame, il est nécessaire de connaître ces règles
d’écriture. Les données, comme l’heure, la latitude ou la longitude, sont placés dans des champs séparés par
des virgules :

La trame GPGGA
C’est la trame qui va contenir l’ensemble des informations qui nous interesse. C’est la trame la plus
commune. Décomposons maintenant cette trame selon les premiers éléments qui la composent :

Champ Valeur Traduction


Type de trame $GPGGA Ceci est une trame pour les GPS
Heure d’envoi 073028.314 7h30min28.314s
Latitude 2514.3215 25 Degrés et 14,3215 minutes
Orientation latitude N Nord
Longitude 00819.1214 8 Degrés et 19.1214 minutes
Orientation longitude E Est
Sciences Numériques et Technologie – Page : 2
• Trames NMEA


Positionnement 1 1 pour GPS
Nombre de satellites 04 4 satellites
Précision 2.1 Fiabilité de mesure de 1 à 9 (1
= bon, 9 = mauvais)
Altitude 238.5 238,5m au-dessus de la mer
Unité altitude M Mètres
,,,,0000*43 Autres informations
Au total, la trame GPGGA renvois un tuple de 15 valeurs

➢ Partie 1 : Lire la trame NMEA avec un module GPS


Le module GPS se connecte grâce a une liaison UART ou liaison série. L’UART est le protocole série qui
permet d’échanger facilement des données entre deux appareils.
Sur l’ESP32 3 bus UART sont disponibles : UART0, UART1 et UART2.

L’UART0 est par défaut sur les pins GPIO1(TX0) et GPIO3(RX0) de l’ESP32, il est utilisé pour communiquer
avec l’ordinateur via le moniteur série. C’est également celui qui est utilisé pour flasher la carte ESP32. En
général, on l’utilise pour afficher des messages dans la console la fonction print(). Nous n’utiliserons jamais
la liaison UART0, car elle est réservée à la liaison avec l’ordinateur.

Mais la carte dispose d’un deuxième port de transmission en liaison série, le port Tx2 et Rx2 (respectivement
GPIO16 et GPIO17). Nous allons utiliser ces GPIO pour le branchement du module GPS
Attention la broche Tx (signifie « transmission ») du module doit être branché sur la broche RX2 («
réception ») de la carte (GPIO16). Et inversement.

Code de lecture de UART 2


Le code entre dans une boucle infinie qui vérifie s'il y a des données disponibles sur l'UART en utilisant la
méthode uart.any(). Si des données sont disponibles, elles sont lues en utilisant la méthode uart.read()
et stockées dans la variable data. Enfin, les données sont affichées à l'aide de la fonction print(), et le
code attend 0,1 seconde avant de vérifier à nouveau la disponibilité des données.
from machine import Pin, UART
from time import sleep

uart = UART(2, tx = X, rx = X, baudrate=9600)

while True:
if uart.any():
data = uart.readline()
print(data)
sleep(0.1)

Question 1: Remplacer X par le numéro des GPIO de tx et rx (sur la liaison UART2).

Question 2: Branchez le capteur et exécuter le code. Qu’observez-vous ? Comment sont


organisées les données ?

Sciences Numériques et Technologie – Page : 3


• Trames NMEA

➢ Partie 2 : Récupération des données


Ouvrir le code fourni « GPS.py » dans MU editor
from machine import Pin, UART
import utime, time

gpsModule = UART(2, tx=16, rx=17, baudrate=9600)


buff = bytearray(255)
latitude = ""
longitude = ""
satellites = ""
GPStime = ""

while True:
gpsModule.readline()
buff = str(gpsModule.readline())
dataTrame = buff.split(',')

if len(dataTrame) == 15 and dataTrame[4] and dataTrame[2]:


latitude = dataTrame[2]
longitude = dataTrame[4]
satellites = dataTrame[7]
GPStime = dataTrame[1]

latitude_dms = dataTrame[3]+ " " + dataTrame[2][0:2] + "°" + dataTrame[2][2:4] + "'" + dataTrame[2][5:7] + "." + dataTrame[2][7:11] + "''"
longitude_dms = dataTrame[5]+ " " + dataTrame[4][1:3] + "°" + dataTrame[4][3:5] + "'" + str((int(dataTrame[4][6:8])-10)) + "." + dataTrame[4][8:12] + "''"
Heure = dataTrame[1][0:2] + ":" + dataTrame[1][2:4] + ":" + dataTrame[1][4:6]

print(latitude_dms)
print(longitude_dms)
print("Heure :", Heure)
print("__________________________________________")

time.sleep(0.5)

Question 3: Expliquer la ligne 16 « if len(dataTrame) == 15 and dataTrame[4]


and dataTrame[2]: »

Question 4: Copier les coordonnées rendues par la console et vérifier votre position ? Est-
elle correcte ?

Sciences Numériques et Technologie – Page : 4


• Trames NMEA

➢ Partie 3 : Conversion des données


Les coordonnées géographiques sont exprimées selon une notation sexagésimale :

• angle en degrés (°)


• minutes (‘)
• secondes (‘’)

Différentes notations des unités Exemple pour l’Hôtel de ville de Nom


pour les latitudes et longitudes Paris

En degrés, minutes, secondes 48°51’ 24’’ Nord, 2°21’07’’ Est Système DMS (degrés,
sexagésimaux (° ‘ ‘’) minutes, secondes)
En degrés décimaux 48,856448° Nord, 2,352197° E Système DD (degrés
décimaux)

Exemple : La conversion des degrés sexagésimaux vers les degrés décimaux se fait ainsi :
48° 47' 54" N = 48. (47 / 60) + (54 / 3600) soit 48.798333°
La conversion des degrés décimaux vers les degrés sexagésimaux se fait ainsi :
48.798333 = 48°
>> 0.798333x60 = 47,89998 soit 47'
>> 0.89998x60 = 53,9988 soit 54"
>> le résultat est donc 48° 47' 54"

Question 5: Exécuter le code. Quel est le format des coordonnées GPS (DD ou DMS) ?

A la ligne 30 du code, rajouter ce bloc de variables (dans la boucle if, attention aux indentations):
Degre_latitude = int(dataTrame[2][0:2])
Minute_latitude = int(dataTrame[2][2:4])
Seconde_latitude = float(dataTrame[2][5:11])/1000

Degre_longitude = int(dataTrame[4][1:3])
Minute_longitude = int(dataTrame[4][3:5])
Seconde_longitude = (float(dataTrame[4][6:12])/1000)-10

Question 6: (A rendre) Modifier le programme pour ajouter une fonction permettant de


convertir automatiquement une coordonnée DMS (degrés, minutes, secondes) en système
DD (degrés décimaux).

Question 7: Afficher les nouvelles coordonnées en DD. Vérifier la position.

Sciences Numériques et Technologie – Page : 5

Vous aimerez peut-être aussi