- Composants requis
- Obtenir des données de localisation à partir du GPS
- Schéma
- Étapes pour interfacer le GPS avec le microcontrôleur AVR
- Explication du code
Les modules GPS sont largement utilisés dans les applications électroniques pour suivre l'emplacement en fonction des coordonnées de longitude et de latitude. Le système de suivi des véhicules, l'horloge GPS, le système d'alerte de détection d'accident, la navigation routière, le système de surveillance, etc. ne sont que quelques exemples où la fonctionnalité GPS est essentielle. Le GPS fournit l'altitude, la latitude, la longitude, l'heure UTC et de nombreuses autres informations sur l'emplacement particulier, qui sont prises à partir de plusieurs satellites. Pour lire les données du GPS, un microcontrôleur est nécessaire, nous interagissons donc ici le module GPS avec le microcontrôleur AVR Atmega16 et imprimons la longitude et la latitude sur un écran LCD 16x2.
Composants requis
- Atmega16 / 32
- Module GPS (GPS uBlox Neo 6M)
- Antenne à fil long
- Écran LCD 16x2
- Résistance 2,2k
- Condensateur 1000 uf
- Condensateur 10uF
- Fil de connexion
- LM7805
- Prise DC
- Adaptateur 12v DC
- Burgstips
- PCB ou PCB à usage général
Ublox Neo 6M est un module GPS série qui fournit des détails de localisation via une communication série. Il a quatre broches.
Épingle |
La description |
Vcc |
Alimentation 2.7 - 5V |
Gnd |
Sol |
TXD |
Transmettre des données |
RXD |
Recevoir des données |
Le module GPS Ublox neo 6M est compatible TTL et ses spécifications sont données ci-dessous.
Temps de capture |
Démarrage à froid: 27 s, démarrage à chaud: 1 s |
Protocole de communication |
NMEA |
Communication série |
9600bps, 8 bits de données, 1 bit d'arrêt, pas de parité et pas de contrôle de flux |
Courant de fonctionnement |
45 mA |
Obtenir des données de localisation à partir du GPS
Le module GPS transmettra les données en plusieurs chaînes à un débit de 9600 bauds. Si nous utilisons un terminal UART avec un débit de 9600 bauds, nous pouvons voir les données reçues par GPS.
Le module GPS envoie les données de position de suivi en temps réel au format NMEA (voir la capture d'écran ci-dessus). Le format NMEA se compose de plusieurs phrases, dans lesquelles quatre phrases importantes sont données ci-dessous. Plus de détails sur la phrase NMEA et son format de données peuvent être trouvés ici.
- $ GPGGA: Données de correction du système de positionnement global
- $ GPGSV: satellites GPS en vue
- $ GPGSA: GPS DOP et satellites actifs
- $ GPRMC: Données GPS / Transit spécifiques minimales recommandées
En savoir plus sur les données GPS et les chaînes NMEA ici.
Il s'agit des données reçues par le GPS lorsqu'il est connecté à un débit de 9600 bauds.
$ GPRMC, 141848.00, A, 2237.63306, N, 08820.86316, E, 0.553`` 100418``, A * 73 $ GPVTG`` T`` M, 0.553, N, 1.024, K, A * 27 $ GPGGA, 141848.00, 2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54.2, M,, * 74 $ GPGSA, A, 2,06,02,05,,,,,,,,,,, 2,75, 2.56,1.00 * 02 $ GPGSV, 1,1,04,02,59,316,30,05,43,188,25,06,44,022,23,25,03,324, * 76 $ GPGLL, 2237.63306, N, 08820.86316, E, 141848.00, A, A * 65
Lorsque nous utilisons le module GPS pour suivre n'importe quel emplacement, nous n'avons besoin que de coordonnées et nous pouvons le trouver dans la chaîne $ GPGGA. Seule la chaîne $ GPGGA (Global Positioning System Fix Data) est principalement utilisée dans les programmes et les autres chaînes sont ignorées.
$ GPGGA, 141848.00,2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54.2, M`` * 74
Quelle est la signification de cette ligne?
La signification de cette ligne est: -
1. La chaîne commence toujours par un signe «$»
2. GPGGA signifie Global Positioning System Fix Data.
3. «,» La virgule indique la séparation entre deux valeurs
4. 141848.00: Heure GMT 14 (h): 18 (min): 48 (sec): 00 (ms)
5. 2237.63306, N: Latitude 22 (degrés) 37 (minutes) 63306 (sec) Nord
6. 08820.86316, E: Longitude 088 (degré) 20 (minutes) 86316 (sec) Est
7. 1: Fix Quantity 0 = données non valides, 1 = données valides, 2 = correction DGPS
8. 03: Nombre de satellites actuellement visionnés.
9. 1.0: HDOP
10. 2.56, M: Altitude (hauteur au-dessus du niveau de la mer en mètre)
11. 1.9, M: hauteur des géoïdes
12. * 74: somme de contrôle
Nous avons donc besoin des numéros 5 et 6 pour collecter des informations sur l'emplacement du module ou sur son emplacement. Dans ce projet, nous avons utilisé une bibliothèque GPS qui fournit des fonctions pour extraire la latitude et la longitude afin que nous n'ayons pas à nous en soucier.
Nous avons précédemment interfacé le GPS avec d'autres microcontrôleurs:
- Comment utiliser le GPS avec Arduino
- Tutoriel d'interfaçage du module GPS Raspberry Pi
- Interfaçage du module GPS avec le microcontrôleur PIC
- Suivre un véhicule sur Google Maps en utilisant Arduino, ESP8266 et GPS
Consultez ici tous les projets liés au GPS.
Schéma
Le schéma de circuit pour l' interfaçage GPS avec le microcontrôleur AVR Atemga16 est donné ci-dessous:
L'ensemble du système est alimenté par un adaptateur CC 12 V, mais les circuits fonctionnent sur 5 V, de sorte que l'alimentation est régulée à 5 V par le régulateur de tension LM7805. Un écran LCD 16x2 est configuré en mode 4 bits et ses connexions par broches sont indiquées dans le schéma de circuit. Le GPS est également alimenté par 5v et sa broche tx est directement connectée au Rx du microcontrôleur Atmega16. Un oscillateur à cristal de 8 MHz est utilisé pour synchroniser le microcontrôleur.
Étapes pour interfacer le GPS avec le microcontrôleur AVR
- Définissez les configurations du microcontrôleur qui incluent la configuration de l'oscillateur.
- Définissez le port souhaité pour l'écran LCD, y compris le registre DDR.
- Connectez le module GPS au microcontrôleur en utilisant USART.
- Initialisez l'UART du système en mode ISR, avec un débit de 9600 bauds et un écran LCD en mode 4 bits.
- Prenez deux tableaux de caractères en fonction de la longueur de la latitude et de la longitude.
- Recevez un caractère bit à la fois et vérifiez s'il est démarré à partir de $ ou non.
- Si $ est reçu alors c'est une chaîne, nous devons vérifier $ GPGGA, ces 6 lettres incluant $.
- S'il s'agit de GPGGA, recevez la chaîne complète et définissez des indicateurs.
- Puis extrayez la latitude et la longitude avec les directions dans deux tableaux.
- Enfin, imprimez les tableaux de latitude et de longitude sur l'écran LCD.
Explication du code
Le code complet avec une vidéo de démonstration est donné à la fin, ici quelques parties importantes du code sont expliquées.
Tout d'abord, incluez un en-tête requis dans le code, puis écrivez les MACROS du masque de bits pour la configuration LCD et UART.
#define F_CPU 8000000ul #include #include
Maintenant, déclarez et initialisez certaines variables et tableaux pour stocker la chaîne GPS, la latitude, la longitude et les drapeaux.
char buf; volatile char ind, flag, stringReceived; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; latitude char; char logitude;
Après cela, nous avons une fonction de pilote LCD pour piloter LCD.
void lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; si (r == 1) RSHigh; else RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; si (r == 1) RSHigh; else RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); } void lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ delay_ms (20); } } void lcdbegin () { char lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; pour (int i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Après cela, nous avons initialisé la communication série avec le GPS et comparé la chaîne reçue avec "GPGGA":
void serialbegin () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
Maintenant, si la chaîne reçue correspond avec succès à GPGGA, dans la fonction principale , extrayez et affichez les coordonnées de latitude et de longitude de l'emplacement:
lcdwrite (0x80,0); lcdprint ("Lat:"); numéro de série ("Latitude:"); pour (int i = 15; i <27; i ++) { latitude = buf; lcdwrite (latitude, 1); écriture en série (latitude); si (i == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("Journal:"); serialprint ("Logitude:"); pour (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (logitude, 1); écriture en série (logitude); si (i == 38) { lcdwrite ('', 1); i ++; } }
C'est ainsi que le module GPS peut être interfacé avec ATmega16 pour trouver les coordonnées de localisation.
Trouvez le code complet et la vidéo de travail ci-dessous.