Apprenez à interfacer le module GPS NEO-6M avec l’ESP32 pour obtenir des données GPS. Vous apprendrez à obtenir des données GPS brutes et à interpréter les phrases NMEA. Enfin, nous vous montrerons comment obtenir facilement la latitude, la longitude, l’altitude, la vitesse et l’heure UTC à l’aide de la bibliothèque TinyGPSPlus. L’ESP32 sera programmé à l’aide de l’IDE Arduino.

En résumé, dans ce tutoriel, vous apprendrez à :
- Câblez le module GPS NEO-6M à l’ESP32 via série
- Obtenez des données GPS brutes
- Analyser les données brutes pour obtenir des informations GPS sélectionnées et lisibles
- Obtenez votre position actuelle
Nous avons un guide similaire pour la carte ESP8266 avec module GPS NEO-6M (Arduino IDE)
Table des matières
Tout au long de ce tutoriel, nous aborderons les sujets suivants :
Présentation du module GPS NEO-6M
Le module GPS NEO-6M est un récepteur GPS compatible avec la plupart des cartes microcontrôleurs. Il peut obtenir des données sur l’emplacement, la vitesse, l’altitude et l’heure.

Il est livré avec une petite batterie de secours, une EEPROM externe et un indicateur de signal LED. Cette LED commencera à clignoter lorsqu’elle aura obtenu une position fixe.
Habituellement, ces modules sont livrés avec une antenne GPS en céramique.

Mais vous pouvez la remplacer par n’importe quelle autre antenne compatible qui pourrait mieux convenir à votre projet. Par exemple, j’aime utiliser celle de droite sur l’image ci-dessous car elle est étanche et l’antenne est livrée avec un long câble qui permet plus de flexibilité.

Le module GPS NEO-6M communique avec un microcontrôleur via un protocole de communication série.
Ce module fonctionne avec les phrases NMEA standards. NMEA signifie National Marine Electronics Association et, dans le monde du GPS, il s’agit d’un format de données standard pris en charge par les fabricants de GPS.
Caractéristiques du module GPS NEO-6M

En résumé:
- Ce module dispose d’une antenne externe et d’une EEPROM intégrée.
- Interface : RS232 TTL
- Alimentation : 3V à 5V
- Débit en bauds par défaut : 9 600 bps
- Fonctionne avec les phrases NMEA standard
Où acheter ?
Vous pouvez obtenir le module GPS NEO-6M pour un prix compris entre 5 $ et 20 $. Nous vous recommandons de consulter la page du module GPS NEO-6M sur Maker Advisor pour comparer les prix dans différents magasins et trouver le meilleur.
Vous pouvez utiliser les liens précédents ou vous rendre directement sur MakerAdvisor.com/tools pour trouver toutes les pièces pour vos projets au meilleur prix !

Câblage du module GPS NEO-6M à l’ESP32
Nous connecterons le module GPS NEO-6M à l’aide des broches UART2 par défaut de l’ESP32. Vous pouvez utiliser l’image et le tableau suivants comme référence.

| Module GPS NÉO-6M | ESP32 |
| VCC | 3V3 |
| RX | TX2 (GPIO17) |
| Émission | RX2 (GPIO16) |
| GND | GND |
Obtention de données GPS brutes – Test du module GPS NEO-6M avec l’ESP32
Pour obtenir des données GPS brutes, il vous suffit de démarrer une communication série avec le module GPS et de lire les données disponibles.

Le code suivant établit une communication série avec le module GPS et lit les données disponibles.
/*********
Rui Santos & Sara Santos - Raspberryme.com
Complete instructions at https://Raspberryme.com/esp32-neo-6m-gps-module-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/
// Define the RX and TX pins for Serial 2
#define RXD2 16
#define TXD2 17
#define GPS_BAUD 9600
// Create an instance of the HardwareSerial class for Serial 2
HardwareSerial gpsSerial(2);
void setup(){
// Serial Monitor
Serial.begin(115200);
// Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
Serial.println("Serial 2 started at 9600 baud rate");
}
void loop(){
while (gpsSerial.available() > 0){
// get the byte data from the GPS
char gpsData = gpsSerial.read();
Serial.print(gpsData);
}
delay(1000);
Serial.println("-------------------------------");
}
Afficher le code brut
Comment fonctionne le code ?
Ce croquis suppose que vous utilisez GPIO 16 et GPIO 17 comme broches série RX et TX pour établir une communication série avec le module GPS. Si vous utilisez d’autres épingles, vous devez les modifier sur les lignes suivantes :
// Define the RX and TX pins for Serial 2
#define RXD2 16
#define TXD2 17
De plus, si votre module utilise un débit en bauds par défaut différent de 9600 bps, vous devez modifier le code sur la ligne suivante :
#define GPS_BAUD 9600
Ensuite, nous créons une instance de HardwareSerial pour utiliser UART 2 appelée gpsSerial.
// Create an instance of the HardwareSerial class for Serial 2
HardwareSerial gpsSerial(2);
Dans le setup(), nous lançons le Serial Monitor.
// Serial Monitor
Serial.begin(115200);
Ensuite, nous initialisons une communication série avec le module GPS.
// Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
Serial.println("Serial 2 started at 9600 baud rate");
Dans la boucle(), le code écoute le port série GPS et lorsque les données sont reçues du module, elles sont imprimées sur le moniteur série.
void loop(){
while (gpsSerial.available() > 0){
// get the byte data from the GPS
char gpsData = gpsSerial.read();
Serial.print(gpsData);
}
delay(1000);
Serial.println("-------------------------------");
}
Tester le code
Téléchargez le code sur votre tableau.

Assurez-vous que l’antenne est connectée et que le module ou l’antenne est placé à l’extérieur ou à côté d’une fenêtre afin qu’il puisse recevoir les données des satellites.

La LED bleue du module commencera à clignoter lorsqu’il trouvera une position fixe.

Le moniteur série affichera des phrases NMEA avec des données GPS. Lorsque vous exécutez cette esquisse pour la première fois, cela peut prendre quelques minutes avant de pouvoir déterminer sa position. Vous commencerez à obtenir des données réelles lorsque la LED bleue commencera à clignoter.

Vous devriez obtenir de nombreuses informations dans le langage standard du GPS, NMEA. Chaque ligne que vous obtenez dans le moniteur série est une phrase NMEA.
NMEA signifie National Marine Electronics Association et, dans le monde du GPS, il s’agit d’un format de données standard pris en charge par les fabricants de GPS.
Phrases NMEA
Les phrases NMEA commencent par le caractère $ et chaque champ de données est séparé par une virgule.
$GPRMC,110827.00,A,4107.32485,N,00831.79799,W,0.888,30.44,180724,,,A*4B
$GPVTG,30.44,T,,M,0.888,N,1.644,K,A*01
$GPGGA,110827.00,41XX.32485,N,00831.79799,W,1,07,0.99,123.1,M,50.1,M,,*48
$GPGSA,A,3,03,32,22,08,04,14,17,,,,,,2.25,0.99,2.02*0A
$GPGSV,3,1,11,3,11,22,26,296,29,27,01,142,,32,17,042,23*48
$GPGLL,4107.32485,N,00831.79799,W,110827.00,A,A*7F
Il existe différents types de phrases NMEA. Le type de message est indiqué par les caractères précédant la première virgule.
Le GP après le $ indique qu’il s’agit d’une position GPS. Le $GPGGA est le message GPS NMEA de base, qui fournit des données de localisation et de précision en 3D.
Dans la phrase suivante :
$GPGGA,110827.00,41XX.32485,N,008XX.XXXXX,W,1,07,0.99,123.1,M,50.1,M,,*48
- 110827 – représente l’heure à laquelle l’emplacement fixe a été pris, 11:08:27 UTC
- 41XX.32845,N – latitude 41 degrés XX.32845,N
- 00831.79799,W – Longitude 008 degrés XX.XXXXX′ W
- 1 – qualité du correctif (0 = invalide ; 1 = correctif GPS ; 2 = correctif DGPS ; 3 = correctif PPS ; 4 = cinématique en temps réel ; 5 = RTK flottant ; 6 = estimé (à l’estime) ; 7 = mode de saisie manuel ; 8 = Mode simulation)
- 07 – nombre de satellites suivis
- 0,99 – Dilution horizontale de la position (moins de un est idéal)
- 123.1, M – Altitude, en mètres au-dessus du niveau de la mer
- 50.1, M – Hauteur du géoïde (niveau moyen de la mer) au-dessus de l’ellipsoïde WGS84
- champ vide – temps en secondes depuis la dernière mise à jour du DGPS
- champ vide – numéro d’identification de la station DGPS
- *48 – les données de la somme de contrôle commencent toujours par *
Les autres phrases NMEA fournissent des informations supplémentaires :
- $GPGSA – GPS DOP et satellites actifs
- $GPGSV – Informations détaillées sur les satellites GPS
- $GPGLL – Latitude et longitude géographiques
- $ GPRMC – Données GPS pvt essentielles (position, vitesse, temps)
- $ GPVTG – Vitesse améliorée
Vous pouvez utiliser cet analyseur NME en ligne et y coller vos phrases pour interpréter les données GPS.
Cependant, le moyen le plus simple d’obtenir et d’interpréter les données GPS souhaitées est d’analyser vos phrases NMEA directement dans le code. Pour cela, nous pouvons utiliser la bibliothèque TinyGPSPlus qui fournit des méthodes pour extraire facilement les données des phrases NMEA.
Analyse des phrases NMEA avec la bibliothèque TinyGPSPlus
La bibliothèque TinyGPSPlus facilite l’obtention de données GPS dans un format facile à comprendre. Vous pouvez cliquer ici pour plus d’informations sur la bibliothèque TinyGPSPlus.
Installation de la bibliothèque TinyGPSPlus
Dans l’IDE Arduino, accédez à Sketch > Inclure la bibliothèque > Gérer les bibliothèques ou cliquez sur l’icône Libary Manager dans la barre latérale gauche.
Recherchez TinyGPSPlus et installez la bibliothèque de Mikal Hart.

Obtenir des données GPS à l’aide du module GPS NEO-6M et de la bibliothèque TinyGPSPlus
Le code suivant montre comment obtenir des données GPS à l’aide de la bibliothèque TinyGPSPlus. Nous obtiendrons la date, l’heure, la vitesse, l’altitude, le nombre de satellites visibles et le HDOP (une mesure de la précision du signal).
/*********
Rui Santos & Sara Santos - Raspberryme.com
Complete instructions at https://Raspberryme.com/esp32-neo-6m-gps-module-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/
#include
// Define the RX and TX pins for Serial 2
#define RXD2 16
#define TXD2 17
#define GPS_BAUD 9600
// The TinyGPS++ object
TinyGPSPlus gps;
// Create an instance of the HardwareSerial class for Serial 2
HardwareSerial gpsSerial(2);
void setup() {
// Serial Monitor
Serial.begin(115200);
// Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
Serial.println("Serial 2 started at 9600 baud rate");
}
void loop() {
// This sketch displays information every time a new sentence is correctly encoded.
unsigned long start = millis();
while (millis() - start < 1000) {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
if (gps.location.isUpdated()) {
Serial.print("LAT: ");
Serial.println(gps.location.lat(), 6);
Serial.print("LONG: ");
Serial.println(gps.location.lng(), 6);
Serial.print("SPEED (km/h) = ");
Serial.println(gps.speed.kmph());
Serial.print("ALT (min)= ");
Serial.println(gps.altitude.meters());
Serial.print("HDOP = ");
Serial.println(gps.hdop.value() / 100.0);
Serial.print("Satellites = ");
Serial.println(gps.satellites.value());
Serial.print("Time in UTC: ");
Serial.println(String(gps.date.year()) + "/" + String(gps.date.month()) + "/" + String(gps.date.day()) + "," + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
Serial.println("");
}
}
}
Afficher le code brut
Comment fonctionne le code ?
Vous commencez par importer la bibliothèque TinyGPSPlus.
#include
#include
Ensuite, vous définissez les broches UART 2 RX et TX ainsi que le débit en bauds GPS. Si votre carte utilise des broches UART 2 différentes, ou si le module GPS utilise un débit en bauds différent, vous pouvez les modifier sur les lignes suivantes.
// Define the RX and TX pins for Serial 2
#define RXD2 16
#define TXD2 17
#define GPS_BAUD 9600
Ensuite, vous créez un objet TinyGPS++ :
TinyGPSPlus gps;
Créez une instance de la classe HardwareSerial pour Serial 2 appelée gpsSerial.
HardwareSerial gpsSerial(2);
Dans setup(), initialisez le moniteur série et la communication série avec le module GPS.
void setup() {
// Serial Monitor
Serial.begin(115200);
// Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
Serial.println("Serial 2 started at 9600 baud rate");
}
Dans la boucle(), c’est là que vous demandez les informations. Analysez les données du module GPS dans l’objet TinyGPS++ à l’aide de la méthode encode() comme suit.
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
Ensuite, vous pouvez interroger l’objet GPS pour voir si des champs de données ont été mis à jour :
if (gps.location.isUpdated()) {
S’il y a de nouvelles données, nous pouvons les obtenir comme suit :
| Latitude | gps.location.lat() |
| Longitude | gps.location.lng() |
| Vitesse (km/h) | gps.speed.kmph() |
| Altitude (mètres) | gps.altitude.meters() |
| HDOP | gps.hdop.value() |
| Le nombre de satellites visibles | gps.satellites.value() |
| Année | gps.date.année() |
| Mois | gps.date.mois() |
| Jour | gps.date.day() |
| Heure | gps.time.hour() |
| Minutes | gps.time.minute() |
| Secondes | gps.time.second() |
Dans le code, nous récupérons les données et imprimons toutes les informations dans le Serial Monitor.
Serial.print("LAT: ");
Serial.println(gps.location.lat(), 6);
Serial.print("LONG: ");
Serial.println(gps.location.lng(), 6);
Serial.print("SPEED (km/h) = ");
Serial.println(gps.speed.kmph());
Serial.print("ALT (min)= ");
Serial.println(gps.altitude.meters());
Serial.print("HDOP = ");
Serial.println(gps.hdop.value() / 100.0);
Serial.print("Satellites = ");
Serial.println(gps.satellites.value());
Serial.print("Time in UTC: ");
Serial.println(String(gps.date.year()) + "/" + String(gps.date.month()) + "/" + String(gps.date.day()) + "," + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
Serial.println("");
Tester le code
Téléchargez le code sur votre carte ESP32. Ouvrez le moniteur série à un débit en bauds de 115 200. Assurez-vous que votre module GPS est placé à l’extérieur ou à côté d’une fenêtre pour obtenir les données des satellites.
Vous obtiendrez des données GPS sur le moniteur série concernant votre position actuelle, votre vitesse, votre altitude, le nombre de satellites visibles HDOP et l’heure.

HDOP signifie Dilution horizontale de précision. Il s’agit d’une mesure de la précision de la localisation. Plus la valeur HDOP est élevée, moins la détermination de la position sera précise. Idéalement, vous devriez obtenir une valeur inférieure à 2. Une valeur inférieure signifie une meilleure précision.
Vous pouvez désormais pousser ce projet plus loin et afficher les données sur un écran OLED ou un écran TFT.
Conclusion
Dans ce didacticiel, vous avez appris à utiliser le module GPS NEO-6M avec l’ESP32 pour obtenir des données GPS : latitude, longitude, altitude, vitesse, date, heure, nombre de satellites, etc.
L’interfaçage du module GPS NEO-6M avec l’ESP32 est assez simple : il vous suffit d’établir une communication série avec le capteur et de lire les données disponibles.
La précision des données dépendra de l’endroit où le module est placé et de l’antenne utilisée. Pour de meilleures performances, le capteur doit être placé à l’extérieur ou à côté d’une fenêtre et loin des rues étroites avec des immeubles de grande hauteur. Plus le nombre de satellites visibles est élevé, plus la position sera précise.
Nous espérons que vous avez trouvé ce tutoriel utile. Nous avons des guides pour plus de 25 modules et capteurs avec l’ESP32, vous pouvez les consulter ci-dessous :
Si vous souhaitez en savoir plus sur l’ESP32, consultez nos ressources :
Merci d’avoir lu.
Cette vidéo vous emmène dans l’histoire de Raspberry Pi :

-
GY-NEO6MV2 NEO-6M Lot de 2 modules de commande de vol GPS 3 V-5 V avec antenne en céramique super puissante pour Arduino EEPROM APM 2.5
-
ICQUANZX GY-NEO6MV2 NEO-6M Module de commande de vol GPS 3 V-5 V avec antenne en céramique super puissante pour Arduino EEPROM APM 2.5
