- Komponenter kreves
- Få posisjonsdata fra GPS
- Kretsdiagram
- Trinn for å grensesnitt GPS med AVR Microcontroller
- Kode Forklaring
GPS- moduler brukes mye i elektronikkapplikasjoner for å spore posisjonen basert på lengde- og breddekoordinater. Bilsporingssystem, GPS-klokke, system for varslingsvarsling, trafikknavigasjon, overvåkingssystem etc. er noen få eksempler der GPS-funksjonalitet er viktig. GPS gir høyde, bredde, lengdegrad, UTC-tid og mange andre opplysninger om den aktuelle plasseringen, som er hentet fra mer enn en satellitt. For å lese data fra GPS er det nødvendig med en mikrokontroller, så her grensesnitt vi GPS-modulen med AVR-mikrokontrolleren Atmega16 og skriver ut lengdegrad og breddegrad på 16x2 LCD-skjerm.
Komponenter kreves
- Atmega16 / 32
- GPS-modul (uBlox Neo 6M GPS)
- Lang ledningsantenne
- 16x2 LCD
- 2,2 k motstand
- 1000uf kondensator
- 10uF kondensator
- Koblingsledning
- LM7805
- DC-kontakt
- 12v DC adapter
- Burgstips
- PCB eller PCB for generell bruk
Ublox Neo 6M er en seriell GPS-modul som gir posisjonsdetaljer gjennom seriell kommunikasjon. Den har fire pinner.
Pin |
Beskrivelse |
Vcc |
2,7 - 5V strømforsyning |
Gnd |
Bakke |
TXD |
Overfør data |
RXD |
Motta data |
Ublox neo 6M GPS-modul er TTL-kompatibel og spesifikasjonene er gitt nedenfor.
Fange tid |
Kul start: 27s, Hot start: 1s |
Kommunikasjonsprotokoll |
NMEA |
Seriell kommunikasjon |
9600bps, 8 databiter, 1 stoppbit, ingen paritet og ingen strømningskontroll |
Driftsstrøm |
45mA |
Få posisjonsdata fra GPS
GPS-modulen vil overføre data i flere strenger med 9600 Baud Rate. Hvis vi bruker en UART-terminal med 9600 Baud-hastighet, kan vi se dataene som mottas av GPS.
GPS-modulen sender sanntidssporingsposisjonsdata i NMEA-format (se skjermbildet ovenfor). NMEA-format består av flere setninger, der fire viktige setninger er gitt nedenfor. Flere detaljer om NMEA-setningen og dens dataformat finner du her.
- $ GPGGA: Data om globale posisjoneringssystemer
- $ GPGSV: GPS-satellitter i sikte
- $ GPGSA: GPS DOP og aktive satellitter
- $ GPRMC: Anbefalt minimum spesifikk GPS / transittdata
Lær mer om GPS-data og NMEA-strenger her.
Dette er dataene som mottas av GPS når de er koblet til 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
Når vi bruker GPS-modul for å spore hvilket som helst sted, trenger vi bare koordinater, og vi kan finne dette i $ GPGGA-streng. Bare $ GPGGA (Global Positioning System Fix Data) streng brukes mest i programmer, og andre strenger ignoreres.
$ GPGGA, 141848.00,2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54,2, M,, * 74
Hva er meningen med den linjen?
Betydningen av den linjen er: -
1. Streng starter alltid med et "$" -tegn
2. GPGGA står for Global Positioning System Fix Data
3. “,” Komma indikerer skillet mellom to verdier
4. 141848.00: GMT tid som 14 (hr): 18 (min): 48 (sek): 00 (ms)
5. 2237.63306, N: Breddegrad 22 (grad) 37 (minutter) 63306 (sek) Nord
6. 08820.86316, E: Lengdegrad 088 (grad) 20 (minutter) 86316 (sek) Øst
7. 1: Fix Quantity 0 = ugyldige data, 1 = valid data, 2 = DGPS fix
8. 03: Antall satellitter som vises.
9. 1.0: HDOP
10. 2.56, M: Høyde (høyde over havet i meter)
11. 1.9, M: Geoids høyde
12. * 74: sjekksum
Så vi trenger nr. 5 og nr. 6 for å samle informasjon om modulplasseringen eller hvor den ligger. I dette prosjektet har vi brukt et GPS-bibliotek som inneholder noen funksjoner for å trekke ut breddegrad og lengdegrad, slik at vi ikke trenger å bekymre deg for det.
Vi har tidligere grensesnitt GPS med andre mikrokontrollere:
- Hvordan bruke GPS med Arduino
- Raspberry Pi GPS Module Interfacing Tutorial
- Grensesnitt GPS-modul med PIC-mikrokontroller
- Spor et kjøretøy på Google Maps ved hjelp av Arduino, ESP8266 og GPS
Sjekk alle GPS-relaterte prosjekter her.
Kretsdiagram
Kretsskjema for GPS-grensesnitt med AVR Atemga16 mikrokontroller er gitt nedenfor:
Hele systemet drives av en 12v DC adapter, men kretsene fungerer på 5v, så strømforsyningen er regulert til 5v av LM7805 spenningsregulator. En 16x2 LCD er konfigurert i 4-bits modus, og pin-tilkoblingene er vist i kretsskjemaet. GPS drives også av 5v, og dens tx-pin er direkte koblet til Rx fra Atmega16 mikrokontroller. En 8MHz krystalloscillator brukes til å klokke mikrokontrolleren.
Trinn for å grensesnitt GPS med AVR Microcontroller
- Still inn konfigurasjonene til mikrokontrolleren som inkluderer oscillatorkonfigurasjon.
- Still inn ønsket port for LCD inkludert DDR-register.
- Koble GPS-modulen til mikrokontrolleren ved hjelp av USART.
- Initialiser systemet UART i ISR-modus, med 9600 baudrate og LCD i 4bit-modus.
- Ta to tegneserier avhengig av lengde på bredde og lengdegrad.
- Motta en karakterbit om gangen og sjekk om den er startet fra $ eller ikke.
- Hvis $ mottas, er det en streng, vi må sjekke $ GPGGA, disse 6 bokstavene inkludert $.
- Hvis det er GPGGA, motta den komplette strengen og sett flagg.
- Trekk deretter ut breddegrad og lengdegrad med retninger i to matriser.
- Til slutt skriver du ut breddegrad og lengdegrad i LCD.
Kode Forklaring
Komplett kode med en demonstrasjonsvideo er gitt til slutt, her er noen viktige deler av koden forklart.
Først og fremst inkluderer du noen nødvendige overskrifter i koden, og skriv deretter MACROS av bitmaske for LCD- og UART-konfigurasjon.
#define F_CPU 8000000ul #include #include
Nå erklær og initialiser noen variabler og matriser for lagring av GPS-streng, breddegrad og flagg.
røye buf; flyktig røyeind, flagg, strengMottatt; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; røye breddegrad; røye logitude;
Etter det har vi litt LCD Driver-funksjon for å kjøre LCD.
ugyldig lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; hvis (r == 1) RSHøy; annet RSLow; ENHøy; _forsink_ms (1); ENLav; _forsink_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; hvis (r == 1) RSHøy; annet RSLow; ENHøy; _forsink_ms (1); ENLav; _forsink_ms (1); } ugyldig lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ delay_ms (20); } } ugyldig lcdbegin () { char lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; for (int i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Etter det initialiserte vi seriekommunikasjonen med GPS og sammenlignet den mottatte strengen med "GPGGA":
ugyldig seriellbegynnelse () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
Nå hvis den mottatte strengen er matchet med hell med GPGGA deretter i hovedfunksjon ekstrakt og vise breddegrad og lengdegrad koordinatene for plasseringen:
lcdwrite (0x80,0); lcdprint ("Lat:"); serienummer ("Latitude:"); for (int i = 15; i <27; i ++) { latitude = buf; lcdwrite (breddegrad, 1); serialwrite (breddegrad); hvis (i == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("Logg:"); serienummer ("Logitude:"); for (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (logitude, 1); serialwrite (logitude); hvis (i == 38) { lcdwrite ('', 1); i ++; } }
Så dette er hvordan GPS-modulen kan kobles til ATmega16 for å finne stedskoordinatene.
Finn den fullstendige koden og arbeidsvideoen nedenfor.