- Nødvendige komponenter:
- Kredsløbsdiagram og forklaring: -
- Hent placeringsdata fra GPS:
- Trin til interface GPS med PIC Microcontroller: -
- Kode Forklaring:
GPS er den korte form for Global Positioning System. Det er et system, der giver nøjagtig højde, bredde, længdegrad, UTC-tid og mange flere oplysninger, der er taget fra 2, 3, 4 eller mere satellit. For at læse data fra GPS har vi brug for noget Microcontroller, og vi har allerede interfacet GPS med Arduino og med Raspberry Pi.
Vi har valgt G7020 GPS-modul, der er lavet af U-blox. Vi modtager længde- og breddegrad for en bestemt position fra satellit og viser det samme på et 16x2 tegn LCD. Så her vil vi interface GPS med PIC16F877A mikrokontroller med mikrochip.
Nødvendige komponenter:
- Pic16F877A - PDIP40-pakke
- Brødbræt
- Pickit-3
- 5V adapter
- LCD JHD162A
- uBLOX-G7020 GPS-modul
- Ledninger til tilslutning af perifert udstyr.
- 4.7k modstande
- 10 k gryde
- 20 mHz krystal
- 2 stk. 33pF keramiske kondensatorer
Kredsløbsdiagram og forklaring: -
16x2 tegn LCD er forbundet på tværs af PIC16F877A mikrocontroller, hvor RB0, RB1, RB2 er forbundet henholdsvis til LCD-stiften, som er RS, R / W, og E. RB4, RB5, RB6 og RB7 er forbundet over LCD's 4-pin D4, D5, D6, D7. LCD'et er tilsluttet i 4bit-tilstand eller nibble-tilstand. Lær mere om grænseflade mellem LCD og PIC Microcontroller.
En krystaloscillator på 20 MHz med to keramiske kondensatorer på 33 pF forbundet over OSC1 og OSC2-ben. Det giver konstant 20 MHz urfrekvens til mikrocontrolleren.
uBlox-G7020 GPS-modul, modtage og transmittere data ved hjælp af UART. PIC16F877A består af en USART-driver inde i chippen, vi modtager data fra GPS-modulet af USART, så der oprettes en krydsforbindelse fra mikrocontrolleren Rx-pin til GPS's Tx-pin og USART-modtagestift tilsluttet på tværs af GPS's sendestift.
UBlox-G7020 har farvekode til stifterne. Den positive eller 5V pin er i rød farve, den negative eller GND pin er i sort farve og sendestiften er i blå farve.
Jeg har forbundet alt dette i brødbrættet.
Hent placeringsdata fra GPS:
Lad os se, hvordan man interfacer GPS ved hjælp af USART, og se resultatet i et 16x2 tegn LCD.
Modulet sender data i flere strenge ved 9600 Baudrate. Hvis vi bruger en UART-terminal med 9600 Baud-hastighed, ser vi 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.
Trin til interface GPS med PIC Microcontroller: -
- Indstil konfigurationerne af mikrokontrolleren, der inkluderer Oscillator-konfiguration.
- Indstil den ønskede port til LCD inklusive TRIS-register.
- Tilslut GPS-modulet til mikrokontrolleren ved hjælp af USART.
- Initialiser systemet USART i kontinuerlig modtagefunktion med 9600 baudhastighed og LCD med 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 $ Modtag, er det en streng, skal vi kontrollere GPGGA, disse 5 bogstaver og kommaet.
- Hvis det er GPGGA, springer vi tiden over og kigger efter bredde og længdegrad. Vi gemmer bredde- og længdegrad i to tegn, indtil N (Nord) og E (Øst) ikke modtages.
- Vi udskriver arrayet i LCD.
- Ryd arrayet.
Kode Forklaring:
Lad os se på koden linje for linje. De første par linjer er til opsætning af konfigurationsbits, der blev forklaret i den foregående vejledning, så jeg springer dem over indtil videre. Den komplette kode gives i slutningen af denne vejledning.
Disse fem linjer bruges til at inkludere bibliotekets headerfiler, lcd.h og eusart.h er til henholdsvis LCD og USART. Og xc.h er til mikrocontroller header-fil.
#omfatte
I ugyldig main () -funktion, system_init () ; funktion bruges til at initialisere LCD og USART.
Annulleret hoved (ugyldigt) { TRISB = 0x00; // Indstilling som output system_init ();
Den lcd_init (); og EUSART_Intialize (); kaldes fra de to biblioteker lcd.h og eusart.h
ugyldigt system_init (ugyldigt) { lcd_init (); // Dette initialiserer lcd EUSART1_Initialize (); // Dette initialiserer Eusart }
I mens løkke bryder vi GPGGA-strengen for at få længdegrad og bredde koordinat. Vi modtager en bit ad gangen og sammenligner det med individuelle tegn til stede i GPGGA-streng.
Vi bryder de koder, vi får: -
incomer_data = EUSART1_Read (); // Kontroller strengen '$ GPGGA,' / * -------------------------------- Trin for trin for at finde GPGGA-linjen- --------------------------- * / if (incomer_data == '$') {// Første sætning af GPS-dataene starter med en $ sign incomer_data = EUSART1_Read (); // Hvis den første hvis bliver sand, så er den næste 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 modtaget incomer_data = EUSART1_Read (); // På dette tidspunkt er den endelige check-in udført, GPGGA fundet.
Ved at bruge denne kode springer vi over UTC-tiden.
mens (incomer_data! = ',') {// springer over GMT tid incomer_data = EUSART1_Read (); }
Denne kode er til lagring af data om bredde og længdegrad i tegnarrayet.
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; // Gem Latitude-data } incomer_data = EUSART1_Read (); hvis (incomer_data == ',') { for (array_count = 0; incomer_data! = 'E'; array_count ++) { incomer_data = EUSART1_Read (); længdegrad = incomer_data; // Gem data for længdegrad } }
Og endelig har vi udskrevet længde- og breddegrad på LCD.
array_count = 0; lcd_com (0x80); // LCD-linje et valg, mens (array_count <12) {// Array of Latitude data er 11 cifret lcd_data (latitude); // Udskriv Latitude data array_count ++; } array_count = 0; lcd_com (0xC0); // Valg af LCD-linje to, mens (array_count <13) {// Array of Longitude data er 12-cifret lcd_data (longitude); // Print Longitude data array_count ++; }
Sådan kan vi interface GPS-modul med PIC Microcontroller for at få bredden og længden af den aktuelle placering.
Komplet kode og header filer er angivet nedenfor.