- Nødvendige komponenter:
- Kretsdiagram og forklaring: -
- Få posisjonsdata fra GPS:
- Trinn for å grensesnitt GPS med PIC Microcontroller: -
- Kode Forklaring:
GPS er kortformen til Global Positioning System. Det er et system som gir nøyaktig høyde, bredde, lengdegrad, UTC-tid og mye mer informasjon, som er hentet fra 2, 3, 4 eller mer satellitt. For å lese data fra GPS trenger vi litt mikrokontroller, og vi har allerede grensesnitt GPS med Arduino og med Raspberry Pi.
Vi har valgt G7020 GPS-modul som er laget av U-blox. Vi vil motta lengdegrad og breddegrad for en bestemt posisjon fra satellitt og vil vise det samme på en 16x2 tegn-LCD. Så her vil vi grensesnitt GPS med PIC16F877A mikrokontroller med mikrochip.
Nødvendige komponenter:
- Pic16F877A - PDIP40-pakke
- Brødtavle
- Pickit-3
- 5V adapter
- LCD JHD162A
- uBLOX-G7020 GPS-modul
- Ledninger for å koble til eksterne enheter.
- 4.7k motstander
- 10k pott
- 20mHz krystall
- 2 stk 33pF keramiske kondensatorer
Kretsdiagram og forklaring: -
16x2 tegn LCD er koblet over PIC16F877A mikrokontroller, der RB0, RB1, RB2 er koblet til henholdsvis LCD-pinnen som er RS, R / W, og E. RB4, RB5, RB6 og RB7 er koblet over LCD-ens 4-pinners D4, D5, D6, D7. LCD-skjermen er koblet til i 4bit-modus eller nibble-modus. Lær mer om grensesnitt LCD med PIC Microcontroller.
En krystalloscillator på 20MHz med to keramiske kondensatorer på 33pF koblet over OSC1 og OSC2 pin. Det vil gi konstant 20 MHz klokkefrekvens til mikrokontrolleren.
uBlox-G7020 GPS-modul, motta og overføre data ved hjelp av UART. PIC16F877A består av en USART-driver inne i brikken, vi vil motta data fra GPS-modulen av USART, så det blir laget en kryssforbindelse fra mikrocontroller Rx-pin til GPSs Tx-pin og USART-mottaksstift som er koblet over GPSs sendepinne.
UBlox-G7020 har fargekode for pinnene. Den positive eller 5V-pinnen er i rød farge, den negative eller GND-pinnen er i svart og sendepinnen er i blå farge.
Jeg har koblet alt dette til brødplaten.
Få posisjonsdata fra GPS:
La oss se hvordan du kan grensesnitt GPS ved hjelp av USART og se resultatet i en 16x2 tegn LCD.
Modulen vil overføre data i flere strenger ved 9600 Baud Rate. Hvis vi bruker en UART-terminal med 9600 Baud-hastighet, vil vi se dataene som mottas av GPS.
GPS-modulen sender posisjonsdata i sanntid 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.
Trinn for å grensesnitt GPS med PIC Microcontroller: -
- Still inn konfigurasjonene til mikrokontrolleren som inkluderer oscillatorkonfigurasjon.
- Still inn ønsket port for LCD inkludert TRIS-register.
- Koble GPS-modulen til mikrokontrolleren ved hjelp av USART.
- Initialiser systemet USART i kontinuerlig mottaksmodus, med 9600 baudrate og LCD med 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 $ mottar, er det en streng, vi må sjekke GPGGA, disse 5 bokstavene og kommaet.
- Hvis det er GPGGA, vil vi hoppe over tiden og se etter breddegrad og lengdegrad. Vi vil lagre breddegrad og lengdegrad i to tegns array til N (Nord) og E (Øst) ikke mottas.
- Vi skriver ut matrisen i LCD.
- Fjern matrisen.
Kode Forklaring:
La oss se på koden linje for linje. De første linjene er for å sette opp konfigurasjonsbiter som ble forklart i forrige opplæring, så jeg hopper over dem for nå. Den komplette koden er gitt på slutten av denne opplæringen.
Disse fem linjene brukes til å inkludere bibliotekets headerfiler, lcd.h og eusart.h er for henholdsvis LCD og USART. Og xc.h er for mikrokontroller header-fil.
#inkludere
I ugyldig hoved () -funksjon, system_init () ; funksjonen brukes til å initialisere LCD og USART.
Ugyldig hoved (ugyldig) { TRISB = 0x00; // Innstilling som utgang system_init ();
The lcd_init (); og EUSART_Intialize (); kalles fra de to bibliotekene lcd.h og eusart.h
ugyldig system_init (ugyldig) { lcd_init (); // Dette vil initialisere lcd EUSART1_Initialize (); // Dette vil initialisere Eusart }
I løpet av en løkke bryter vi GPGGA-strengen for å få lengdegrad og bredde-koordinat. Vi mottar en bit av gangen og sammenligner den med individuelle tegn som er til stede i GPGGA-streng.
Vi bryter kodene vi får: -
incomer_data = EUSART1_Read (); // Sjekk strengen '$ GPGGA,' / * ------------------------------ trinnvis for å finne GPGGA-linjen- --------------------------- * / if (incomer_data == '$') {// Første setning av GPS-dataene starter med en $ sign incomer_data = EUSART1_Read (); // Hvis den første hvis blir sann, er neste fase hvis (incomer_data == 'G') { incomer_data = EUSART1_Read (); hvis (incomer_data == 'P'); { incomer_data = EUSART1_Read (); hvis (incomer_data == 'G'); { incomer_data = EUSART1_Read (); hvis (incomer_data == 'G') { incomer_data = EUSART1_Read (); hvis (incomer_data == 'A') { incomer_data = EUSART1_Read (); hvis (incomer_data == ',') {// først, mottatt incomer_data = EUSART1_Read (); // På dette stadiet er den endelige innsjekkingen funnet, GPGGA er funnet.
Ved å bruke denne koden hopper vi over UTC-tiden.
mens (incomer_data! = ',') {// hopper over GMT Tid incomer_data = EUSART1_Read (); }
Denne koden er for lagring av dataene for bredde og lengdegrad i tegnmatrisen.
incomer_data = EUSART1_Read (); breddegrad = incomer_data; mens (incomer_data! = ',') { for (array_count = 1; incomer_data! = 'N'; array_count ++) { incomer_data = EUSART1_Read (); breddegrad = incomer_data; // Lagre Latitude-data } incomer_data = EUSART1_Read (); hvis (incomer_data == ',') { for (array_count = 0; incomer_data! = 'E'; array_count ++) { incomer_data = EUSART1_Read (); lengdegrad = incomer_data; // Lagre lengdegradsdata } }
Og til slutt har vi skrevet ut lengde- og breddegrad på LCD.
array_count = 0; lcd_com (0x80); // LCD linje ett valg mens (array_count <12) {// Array of Latitude data er 11 sifret lcd_data (latitude); // Skriv ut Latitude data array_count ++; } array_count = 0; lcd_com (0xC0); // Lcd linje to valg mens (array_count <13) {// Array of Longitude data er 12-sifret lcd_data (longitude); // Skriv ut Longitude data array_count ++; }
Dette er hvordan vi kan grensesnitt GPS-modul med PIC Microcontroller for å få Latitude og lengdegrad av gjeldende plassering.
Fullstendig kode og topptekstfiler er gitt nedenfor.