- Komponenter, der kræves
- Hent lokalitetsdata fra GPS
- Kredsløbsdiagram
- Trin til interface GPS med AVR-mikrocontroller
- Kode Forklaring
GPS- moduler bruges i vid udstrækning i elektronikapplikationer til at spore placeringen baseret på længde- og breddegradskoordinater. Køretøjssporingssystem, GPS-ur, alarmsystem til ulykkesdetektering, trafiknavigation, overvågningssystem osv. Er få af eksemplerne, hvor GPS-funktionalitet er afgørende. GPS giver højde, bredde, længdegrad, UTC-tid og mange andre oplysninger om den bestemte placering, der er taget fra mere end en satellit. For at læse data fra GPS er der brug for en mikrocontroller, så her grænseflader vi GPS-modulet med AVR-mikrocontrolleren Atmega16 og udskriver længdegrad og bredde på 16x2 LCD-display.
Komponenter, der kræves
- Atmega16 / 32
- GPS-modul (uBlox Neo 6M GPS)
- Lang ledningsantenne
- 16x2 LCD
- 2,2 k modstand
- 1000uf kondensator
- 10uF kondensator
- Forbindelsesledning
- LM7805
- DC-stik
- 12v jævnstrømsadapter
- Burgstips
- PCB eller PCB til almindeligt brug
Ublox Neo 6M er et serielt GPS-modul, der giver placeringsoplysninger gennem seriel kommunikation. Den har fire ben.
Pin |
Beskrivelse |
Vcc |
2,7 - 5V strømforsyning |
Gnd |
Jord |
TXD |
Overfør data |
RXD |
Modtag data |
Ublox neo 6M GPS-modul er TTL-kompatibelt og dets specifikationer er angivet nedenfor.
Optag tid |
Cool start: 27s, Hot start: 1s |
Kommunikationsprotokol |
NMEA |
Seriel kommunikation |
9600bps, 8 databits, 1 stopbit, ingen paritet og ingen flowkontrol |
Driftsstrøm |
45mA |
Hent lokalitetsdata fra GPS
GPS-modulet transmitterer data i flere strenge ved 9600 Baudrate. Hvis vi bruger en UART-terminal med 9600 Baud-hastighed, kan vi se de data, der modtages af GPS.
GPS-modul sender realtidssporingspositionsdata i NMEA-format (se skærmbilledet ovenfor). NMEA-format består af flere sætninger, hvor fire vigtige sætninger er angivet nedenfor. Flere detaljer om NMEA-sætningen og dens dataformat kan findes her.
- $ GPGGA: Data om Global Positioning System Fix
- $ GPGSV: GPS-satellitter i syne
- $ GPGSA: GPS DOP og aktive satellitter
- $ GPRMC: Anbefalet minimumsspecifikke GPS / Transit-data
Lær mere om GPS-data og NMEA-strenge her.
Dette er de data, der modtages af GPS, når de er tilsluttet med 9600 baudhastighed.
$ 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 bruger GPS-modul til at spore en hvilken som helst placering, har vi kun brug for koordinater, og vi kan finde dette i $ GPGGA-streng. Kun $ GPGGA (Global Positioning System Fix Data) streng bruges mest i programmer, og andre strenge ignoreres.
$ GPGGA, 141848.00,2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54,2, M,, * 74
Hvad er meningen med denne linje?
Betydningen af denne linje er: -
1. Streng starter altid med et "$" -tegn
2. GPGGA står for Global Positioning System Fix Data
3. “,” Komma angiver adskillelsen mellem to værdier
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: Længdegrad 088 (grad) 20 (minutter) 86316 (sek) Øst
7. 1: Fix antal 0 = ugyldige data, 1 = gyldige data, 2 = DGPS-rettelse
8. 03: Antal satellitter, der aktuelt er set.
9. 1.0: HDOP
10. 2.56, M: Højde (højde over havets overflade i meter)
11. 1.9, M: Geoids højde
12. * 74: kontrolsum
Så vi har brug for nr. 5 og nr. 6 for at indsamle oplysninger om modulets placering eller, hvor det er placeret. I dette projekt har vi brugt et GPS-bibliotek, der indeholder nogle funktioner til at udtrække breddegrad og længdegrad, så vi ikke behøver at bekymre os om det.
Vi har tidligere interface GPS med andre mikrocontrollere:
- Sådan bruges GPS med Arduino
- Raspberry Pi GPS-modul Interfacing-vejledning
- Interfacing GPS-modul med PIC-mikrocontroller
- Spor et køretøj på Google Maps ved hjælp af Arduino, ESP8266 & GPS
Tjek alle GPS-relaterede projekter her.
Kredsløbsdiagram
Kredsløbsdiagram for GPS-interface med AVR Atemga16 mikrokontroller er nedenfor:
Hele systemet drives af en 12V DC-adapter, men kredsløbene fungerer på 5V, så strømforsyningen reguleres til 5V af LM7805 spændingsregulator. En 16x2 LCD er konfigureret i 4-bit tilstand, og dens pin-forbindelser vises i kredsløbsdiagrammet. GPS drives også af 5v, og dens tx-pin er direkte forbundet til Rx fra Atmega16 mikrokontroller. En 8MHz krystaloscillator bruges til at ur mikrokontrolleren.
Trin til interface GPS med AVR-mikrocontroller
- Indstil konfigurationerne af mikrokontrolleren, der inkluderer Oscillator-konfiguration.
- Indstil den ønskede port til LCD inklusive DDR-register.
- Tilslut GPS-modulet til mikrokontrolleren ved hjælp af USART.
- Initialiser systemet UART i ISR-tilstand med 9600 baudrate og LCD i 4bit-tilstand.
- Tag to tegnarrays afhængigt af længde på bredde og længdegrad.
- Modtag en tegnbit ad gangen, og kontroller, om den startes fra $ eller ej.
- Hvis $ modtages, er det en streng, vi skal kontrollere $ GPGGA, disse 6 bogstaver inklusive $.
- Hvis det er GPGGA, skal du modtage den komplette streng og indstille flag.
- Udpak derefter bredde- og længdegrad med retninger i to arrays.
- Til sidst skal du udskrive bredde- og længdegradsarrayerne i LCD.
Kode Forklaring
Komplet kode med en demonstrationsvideo gives i slutningen, her forklares nogle vigtige dele af koden.
Først og fremmest skal du inkludere et påkrævet overskrift i koden og derefter skrive MACROS af bitmask til LCD- og UART-konfiguration.
#define F_CPU 8000000ul #include #include
Erklær og initialiser nu nogle variabler og arrays til lagring af GPS-streng, længdegrad og flag.
char buf; flygtige char ind, flag, streng Modtaget; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; char bredde; char logitude;
Efter det har vi nogle LCD Driver-funktioner til at køre LCD.
ugyldigt lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; hvis (r == 1) RSHøj; ellers RSLow; ENHøj; _forsink_ms (1); ENLav; _forsink_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; hvis (r == 1) RSHøj; ellers RSLow; ENHøj; _forsink_ms (1); ENLav; _forsink_ms (1); } ugyldigt lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ forsinkelse_ms (20); } } ugyldigt lcdbegin () { char lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; for (int i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Derefter initialiserede vi den serielle kommunikation med GPS og sammenlignede den modtagne streng med "GPGGA":
ugyldigt serialbegin () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
Nu, hvis den modtagne snor matches med succes med GPGGA derefter i vigtigste funktion ekstrakt og vise breddegrad og længdegrad koordinater for placering:
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 ("Log:"); 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-modulet kan interfaces med ATmega16 for at finde placeringskoordinaterne.
Find den komplette kode og arbejdsvideo nedenfor.