- Komponenter krävs
- Hämta platsdata från GPS
- Kretsschema
- Steg för att gränssnitt GPS med AVR Microcontroller
- Kodförklaring
GPS- moduler används ofta i elektronikapplikationer för att spåra platsen baserat på koordinater för longitud och latitud. Fordonsspårningssystem, GPS-klocka, olycksdetekteringsvarningssystem, trafiknavigering, övervakningssystem etc. är några exempel där GPS-funktionalitet är nödvändig. GPS ger höjd, latitud, longitud, UTC-tid och många andra uppgifter om den specifika platsen, som hämtas från mer än en satellit. För att läsa data från GPS behövs en mikrokontroller så här gränssnitt vi GPS-modulen med AVR mikrokontroller Atmega16 och skriver ut longitud och latitud på 16x2 LCD-skärm.
Komponenter krävs
- Atmega16 / 32
- GPS-modul (uBlox Neo 6M GPS)
- Lång trådantenn
- 16x2 LCD
- 2,2 k motstånd
- 1000uf kondensator
- 10uF kondensator
- Anslutningskabel
- LM7805
- DC-uttag
- 12V DC-adapter
- Burgstips
- PCB eller PCB för allmänt ändamål
Ublox Neo 6M är en seriell GPS-modul som ger platsinformation genom seriell kommunikation. Den har fyra stift.
Stift |
Beskrivning |
Vcc |
2,7 - 5V strömförsörjning |
Gnd |
Jord |
TXD |
Överför data |
RXD |
Ta emot data |
Ublox neo 6M GPS-modul är TTL-kompatibel och dess specifikationer ges nedan.
Fångstid |
Cool start: 27s, Hot start: 1s |
Kommunikationsprotokoll |
NMEA |
Seriekommunikation |
9600bps, 8 databitar, 1 stoppbit, ingen paritet och ingen flödeskontroll |
Driftström |
45mA |
Hämta platsdata från GPS
GPS-modulen överför data i flera strängar till 9600 Baud Rate. Om vi använder en UART-terminal med 9600 Baud-hastighet kan vi se data som mottas av GPS.
GPS-modulen skickar spårningspositionsdata i realtid i NMEA-format (se skärmdumpen ovan). NMEA-formatet består av flera meningar, där fyra viktiga meningar ges nedan. Mer information om NMEA-meningen och dess dataformat finns här.
- $ GPGGA: Fixeringsdata för globalt positioneringssystem
- $ GPGSV: GPS-satelliter i sikte
- $ GPGSA: GPS DOP och aktiva satelliter
- $ GPRMC: Rekommenderad minimispecifik GPS / transitdata
Läs mer om GPS-data och NMEA-strängar här.
Detta är den data som mottas av GPS när den är ansluten till 9600 baudhastighet.
$ 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
När vi använder GPS-modulen för att spåra vilken plats som helst behöver vi bara koordinater och vi kan hitta detta i $ GPGGA-sträng. Endast $ GPGGA (Global Positioning System Fix Data) -sträng används mest i program och andra strängar ignoreras.
$ GPGGA, 141848.00,2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54,2, M,, * 74
Vad är meningen med den linjen?
Betydelsen av den linjen är: -
1. Sträng börjar alltid med ett "$" -tecken
2. GPGGA står för Global Positioning System Fix Data
3. “,” Komma indikerar separationen mellan två värden
4. 141848.00: GMT tid som 14 (hr): 18 (min): 48 (sek): 00 (ms)
5. 2237.63306, N: Latitud 22 (grad) 37 (minuter) 63306 (sek) Nord
6. 08820.86316, E: Longitud 088 (grad) 20 (minuter) 86316 (sek) Öst
7. 1: Fix kvantitet 0 = ogiltiga data, 1 = giltiga data, 2 = DGPS fix
8. 03: Antal satelliter som för närvarande ses.
9. 1.0: HDOP
10. 2.56, M: Höjd (höjd över havet i meter)
11. 1.9, M: Geoids höjd
12. * 74: kontrollsumma
Så vi behöver nr 5 och nr 6 för att samla information om modulens plats eller var den ligger. I det här projektet har vi använt ett GPS-bibliotek som tillhandahåller vissa funktioner för att extrahera latitud och longitud så att vi inte behöver oroa oss för det.
Vi har tidigare gränssnitt GPS med andra mikrokontroller:
- Hur man använder GPS med Arduino
- Raspberry Pi GPS-modul gränssnittshandledning
- Gränssnitts GPS-modul med PIC-mikrokontroller
- Spåra ett fordon på Google Maps med Arduino, ESP8266 & GPS
Kontrollera alla GPS-relaterade projekt här.
Kretsschema
Kretsschema för GPS-gränssnitt med AVR Atemga16 mikrokontroller ges nedan:
Hela systemet drivs av en 12V likströmsadapter, men kretsarna fungerar på 5v så att strömförsörjningen regleras till 5v av LM7805 spänningsregulator. En 16x2 LCD är konfigurerad i 4-bitars läge och dess stiftanslutningar visas i kretsschemat. GPS drivs också av 5v och dess tx-stift är direkt ansluten till Rx hos Atmega16 mikrokontroller. En 8MHz kristalloscillator används för att klocka mikrokontrollern.
Steg för att gränssnitt GPS med AVR Microcontroller
- Ställ in mikrokontrollerns konfigurationer som inkluderar Oscillatorkonfiguration.
- Ställ in önskad port för LCD inklusive DDR-register.
- Anslut GPS-modulen till mikrokontrollern med USART.
- Initiera systemet UART i ISR-läge, med 9600 baudhastighet och LCD i 4bit-läge.
- Ta två teckenarrayer beroende på längd på latitud och longitud.
- Ta emot en teckenbit åt gången och kontrollera om den startas från $ eller inte.
- Om $ mottas är det en sträng, vi måste kontrollera $ GPGGA, dessa 6 bokstäver inklusive $.
- Om det är GPGGA får du hela strängen och anger flaggor.
- Extrahera sedan latitud och longitud med riktningar i två matriser.
- Skriv slutligen ut latitud- och longitudarrangemang i LCD.
Kodförklaring
Komplett kod med en demonstrationsvideo ges i slutet, här förklaras några viktiga delar av koden.
Först och främst inkludera några obligatoriska rubriker i koden och skriv sedan MACROS för bitmask för LCD- och UART-konfiguration.
#define F_CPU 8000000ul #include #include
Deklarera och initialisera nu några variabler och matriser för lagring av GPS-sträng, latitud och flaggor.
röding buf; flyktig char ind, flagga, stringReceived; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; rödhet latitud; char logitude;
Efter det har vi lite LCD Driver-funktion för att köra LCD.
ogiltig lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; om (r == 1) RSHigh; annars RSLow; ENHög; _fördröja_ms (1); ENLåga; _fördröja_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; om (r == 1) RSHigh; annars RSLow; ENHög; _fördröja_ms (1); ENLåga; _fördröja_ms (1); } ogiltigt lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ fördröjning_ms (20); } } ogiltigt lcdbegin () { char lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; för (int i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Efter det initialiserade vi seriekommunikationen med GPS och jämförde den mottagna strängen med "GPGGA":
ogiltigt serialbegin () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
Nu om den mottagna strängen matchas framgångsrikt med GPGGA sedan i huvudfunktion extrakt och visa latitud och longitud koordinat läget:
lcdwrite (0x80,0); lcdprint ("Lat:"); serienummer ("Latitude:"); för (int i = 15; i <27; i ++) { latitud = buf; lcdwrite (latitud, 1); seriell skrivning (latitud); om (i == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("Log:"); serienummer ("Logitude:"); för (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (logitude, 1); serialwrite (logitude); om (i == 38) { lcdwrite ('', 1); i ++; } }
Så detta är hur GPS-modulen kan anslutas till ATmega16 för att hitta platskoordinaterna.
Hitta den fullständiga koden och arbetsvideo nedan.