- Componenten vereist
- Locatiegegevens ophalen van GPS
- Schakelschema
- Stappen om GPS te koppelen aan AVR Microcontroller
- Code Uitleg
GPS- modules worden veel gebruikt in elektronicatoepassingen om de locatie te volgen op basis van lengte- en breedtegraadcoördinaten. Voertuigvolgsysteem, GPS-klok, waarschuwingssysteem voor ongevalsdetectie, verkeersnavigatie, bewakingssysteem enz. Zijn enkele van de voorbeelden waarbij GPS-functionaliteit essentieel is. GPS biedt hoogte, breedtegraad, lengtegraad, UTC-tijd en vele andere informatie over de specifieke locatie, die afkomstig is van meer dan één satelliet. Om gegevens van GPS te lezen, is een microcontroller nodig, dus hier koppelen we de GPS-module aan de AVR-microcontroller Atmega16 en printen we de lengte- en breedtegraad op een 16x2 LCD-scherm.
Componenten vereist
- Atmega16 / 32
- GPS-module (uBlox Neo 6M GPS)
- Lange draadantenne
- 16x2 LCD
- 2.2k weerstand
- 1000uf condensator
- 10uF condensator
- Verbindingsdraad
- LM7805
- DC Jack
- 12v gelijkstroomadapter
- Burgstips
- PCB of PCB voor algemeen gebruik
Ublox Neo 6M is een seriële GPS-module die locatiegegevens verstrekt via seriële communicatie. Het heeft vier pinnen.
Pin |
Omschrijving |
Vcc |
2.7 - 5V voeding |
GND |
Grond |
TXD |
Verzend gegevens |
RXD |
Ontvang data |
Ublox neo 6M GPS-module is TTL-compatibel en de specificaties worden hieronder weergegeven.
Leg de tijd vast |
Koele start: 27s, hete start: 1s |
Communicatie protocol |
NMEA |
Seriële communicatie |
9600bps, 8 databits, 1 stopbit, geen pariteit en geen flow control |
Bedrijfsstroom |
45mA |
Locatiegegevens ophalen van GPS
De GPS-module verzendt gegevens in meerdere strings met een baudsnelheid van 9600. Als we een UART-terminal met 9600 baudrate gebruiken, kunnen we de gegevens zien die door GPS zijn ontvangen.
De GPS-module verzendt de realtime trackingpositiegegevens in NMEA-formaat (zie de bovenstaande schermafbeelding). Het NMEA-formaat bestaat uit meerdere zinnen, waarin hieronder vier belangrijke zinnen worden gegeven. Meer informatie over de NMEA-zin en het gegevensformaat vindt u hier.
- $ GPGGA: herstelgegevens voor Global Positioning System
- $ GPGSV: GPS-satellieten in zicht
- $ GPGSA: GPS DOP en actieve satellieten
- $ GPRMC: aanbevolen minimale specifieke GPS / Transit-gegevens
Lees hier meer over GPS-gegevens en NMEA-strings.
Dit zijn de gegevens die worden ontvangen door GPS bij aansluiting op 9600 baudrate.
$ 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
Wanneer we een GPS-module gebruiken om een locatie te volgen, hebben we alleen coördinaten nodig en kunnen we deze vinden in de $ GPGGA-string. Alleen $ GPGGA (Global Positioning System Fix Data) String wordt meestal in programma's gebruikt en andere strings worden genegeerd.
$ GPGGA, 141848.00,2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54.2, M`` * 74
Wat is de betekenis van die regel?
Betekenis van die regel is: -
1. String begint altijd met een "$" -teken
2. GPGGA staat voor Global Positioning System Fix Data
3. "," Komma geeft de scheiding tussen twee waarden aan
4. 141848.00: GMT-tijd als 14 (uur): 18 (min): 48 (sec): 00 (ms)
5. 2237.63306, N: Breedtegraad 22 (graden) 37 (minuten) 63306 (sec) Noord
6. 08820.86316, E: Lengtegraad 088 (graden) 20 (minuten) 86316 (sec) Oost
7. 1: Aantal reparaties 0 = ongeldige gegevens, 1 = geldige gegevens, 2 = DGPS-fix
8. 03: Aantal satellieten dat momenteel wordt bekeken.
9. 1.0: HDOP
10. 2,56, M: Hoogte (hoogte boven zeeniveau in meter)
11. 1.9, M: hoogte Geoids
12. * 74: checksum
We hebben dus nr. 5 en nr. 6 nodig om informatie te verzamelen over de locatie van de module of, waar deze zich bevindt. In dit project hebben we een GPS-bibliotheek gebruikt die enkele functies biedt om de lengte- en breedtegraad te extraheren, zodat we ons daar geen zorgen over hoeven te maken.
We hebben GPS eerder gekoppeld aan andere microcontrollers:
- GPS gebruiken met Arduino
- Raspberry Pi GPS-module Interfacing-zelfstudie
- GPS-module koppelen met PIC-microcontroller
- Volg een voertuig op Google Maps met Arduino, ESP8266 en GPS
Bekijk hier alle GPS-gerelateerde projecten.
Schakelschema
Het schakelschema voor GPS-interface met de AVR Atemga16-microcontroller wordt hieronder weergegeven:
Het hele systeem wordt gevoed door een 12v DC-adapter, maar de circuits werken op 5v, dus de voeding wordt geregeld naar 5v door de LM7805-spanningsregelaar. Een 16x2 LCD-scherm is geconfigureerd in 4-bit-modus en de pinverbindingen worden weergegeven in het schakelschema. GPS wordt ook aangedreven door 5v en de tx-pin is rechtstreeks verbonden met Rx van de Atmega16-microcontroller. Een 8 MHz kristaloscillator wordt gebruikt om de microcontroller te klokken.
Stappen om GPS te koppelen aan AVR Microcontroller
- Stel de configuraties van de microcontroller in, waaronder de oscillatorconfiguratie.
- Stel de gewenste poort in voor LCD inclusief DDR-register.
- Verbind de GPS-module met de microcontroller met behulp van USART.
- Initialiseer de UART van het systeem in ISR-modus, met 9600 baudrate en LCD in 4bit-modus.
- Neem twee tekenarrays, afhankelijk van de lengte van de lengte- en breedtegraad.
- Ontvang één tekenbit per keer en controleer of het vanaf $ wordt gestart of niet.
- Als $ wordt ontvangen dan is het een string, we moeten $ GPGGA controleren, deze 6 letters inclusief $.
- Als het GPGGA is, ontvang dan de volledige string en stel vlaggen in.
- Extraheer vervolgens de lengte- en breedtegraad met richtingen in twee reeksen.
- Druk tenslotte de latitude en longitude arrays af op het LCD-scherm.
Code Uitleg
De volledige code met een demonstratievideo wordt aan het einde gegeven, hier worden enkele belangrijke delen van de code uitgelegd.
Neem allereerst een vereiste header op in de code en schrijf vervolgens MACROS of bitmask voor LCD- en UART-configuratie.
#define F_CPU 8000000ul #include #include
Declareer en initialiseer nu enkele variabelen en arrays voor het opslaan van GPS-string, breedtegraad, lengtegraad en vlaggen.
char buf; vluchtige char ind, flag, stringReceived; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; char breedtegraad; char logitude;
Daarna hebben we een aantal LCD-stuurprogrammafuncties om LCD aan te sturen.
void lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; if (r == 1) RSHigh; anders RSLow; NLHoog; _delay_ms (1); ENLow; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; if (r == 1) RSHigh; anders RSLow; NLHoog; _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}; voor (int i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Daarna hebben we de seriële communicatie met GPS geïnitialiseerd en de ontvangen string vergeleken met "GPGGA":
leegte serialbegin () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
Als de ontvangen string met succes is gematcht met GPGGA, extract dan in de hoofdfunctie en geef de lengte- en breedtecoördinaat van de locatie weer:
lcdwrite (0x80,0); lcdprint ("Lat:"); serialprint ("Latitude:"); voor (int i = 15; i <27; i ++) { latitude = buf; lcdwrite (breedtegraad, 1); serialwrite (breedtegraad); if (i == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("Log:"); serialprint ("Logitude:"); voor (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (logitude, 1); serialwrite (logitude); if (i == 38) { lcdwrite ('', 1); i ++; } }
Dit is dus hoe de GPS-module kan worden gekoppeld aan ATmega16 om de locatiecoördinaten te vinden.
Vind de volledige code en werkvideo hieronder.