- Componenti richiesti:
- Schema del circuito e spiegazione: -
- Recupero dei dati sulla posizione dal GPS:
- Passaggi per interfacciare il GPS con il microcontrollore PIC: -
- Spiegazione del codice:
GPS è l'abbreviazione di Global Positioning System. È un sistema che fornisce altitudine, latitudine, longitudine, ora UTC e molte altre informazioni, che sono prese da 2, 3, 4 o più satelliti. Per leggere i dati dal GPS, abbiamo bisogno di un microcontrollore e abbiamo già interfacciato il GPS con Arduino e con Raspberry Pi.
Abbiamo selezionato il modulo GPS G7020 realizzato da U-blox. Riceveremo la longitudine e la latitudine di una particolare posizione dal satellite e le visualizzeremo su un LCD 16x2 caratteri. Quindi qui interfacciamo il GPS con il microcontrollore PIC16F877A tramite microchip.
Componenti richiesti:
- Pic16F877A - Pacchetto PDIP40
- Tagliere per il pane
- Pickit-3
- Adattatore 5V
- LCD JHD162A
- Modulo GPS uBLOX-G7020
- Fili per collegare le periferiche.
- 4.7k Resistori
- Pentola da 10k
- Cristallo da 20 mHz
- Condensatori ceramici da 2 pezzi 33pF
Schema del circuito e spiegazione: -
L'LCD 16x2 caratteri è collegato al microcontrollore PIC16F877A, in cui RB0, RB1, RB2 è collegato rispettivamente al pin LCD che è RS, R / W ed E. RB4, RB5, RB6 e RB7 sono collegati ai 4 pin D4, D5 dell'LCD, D6, D7. Il display LCD è connesso in modalità 4 bit o in modalità nibble. Ulteriori informazioni sull'interfacciamento dell'LCD con il microcontrollore PIC.
Un oscillatore a cristallo da 20 MHz con due condensatori ceramici da 33pF collegati tra i pin OSC1 e OSC2. Fornirà una frequenza di clock costante di 20 MHz al microcontrollore.
Modulo GPS uBlox-G7020, riceve e trasmette dati utilizzando UART. PIC16F877A è costituito da un driver USART all'interno del chip, riceveremo dati dal modulo GPS da USART, quindi verrà effettuata una connessione incrociata dal pin Rx del microcontrollore al pin Tx del GPS e al pin di ricezione USART collegato al pin di trasmissione del GPS.
UBlox-G7020 ha un codice colore per i pin. Il pin positivo o 5V è di colore rosso, il pin negativo o GND è di colore nero e il pin di trasmissione è di colore blu.
Ho collegato tutto questo nella breadboard.
Recupero dei dati sulla posizione dal GPS:
Vediamo come interfacciare il GPS utilizzando USART e vedere il risultato in un LCD 16x2 caratteri.
Il modulo trasmetterà i dati in più stringhe a 9600 Baud Rate. Se utilizziamo un terminale UART con 9600 Baud rate, vedremo i dati ricevuti dal GPS.
Il modulo GPS invia i dati di posizione di rilevamento in tempo reale in formato NMEA (vedere lo screenshot sopra). Il formato NMEA è composto da diverse frasi, in cui di seguito vengono fornite quattro frasi importanti. Maggiori dettagli sulla frase NMEA e sul suo formato dati possono essere trovati qui.
- $ GPGGA: dati di correzione del sistema di posizionamento globale
- $ GPGSV: satelliti GPS in vista
- $ GPGSA: GPS DOP e satelliti attivi
- $ GPRMC: dati GPS / di transito specifici minimi consigliati
Ulteriori informazioni sui dati GPS e sulle stringhe NMEA qui.
Questi sono i dati ricevuti dal GPS quando connesso a 9600 baud rate.
$ 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
Quando usiamo il modulo GPS per tracciare qualsiasi posizione, abbiamo solo bisogno delle coordinate e possiamo trovarle nella stringa $ GPGGA. Solo la stringa $ GPGGA (Global Positioning System Fix Data) viene utilizzata principalmente nei programmi e le altre stringhe vengono ignorate.
$ GPGGA, 141848.00,2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54,2, M`` * 74
Qual è il significato di quella linea?
Il significato di quella linea è: -
1. La stringa inizia sempre con un segno "$"
2. GPGGA è l'acronimo di Global Positioning System Fix Data
3. "," La virgola indica la separazione tra due valori
4. 141848.00: ora GMT come 14 (h): 18 (min): 48 (sec): 00 (ms)
5. 2237.63306, N: Latitudine 22 (gradi) 37 (minuti) 63306 (sec) Nord
6. 08820.86316, E: Longitudine 088 (gradi) 20 (minuti) 86316 (sec) Est
7. 1: Quantità correzione 0 = dati non validi, 1 = dati validi, 2 = correzione DGPS
8. 03: Numero di satelliti attualmente visualizzati.
9. 1.0: HDOP
10. 2.56, M: Altitudine (altezza sul livello del mare in metri)
11. 1.9, M: Altezza dei geoidi
12. * 74: checksum
Quindi abbiamo bisogno del n. 5 e del n. 6 per raccogliere informazioni sulla posizione del modulo o su dove si trova.
Passaggi per interfacciare il GPS con il microcontrollore PIC: -
- Imposta le configurazioni del microcontrollore che includono la configurazione dell'oscillatore.
- Impostare la porta desiderata per LCD compreso il registro TRIS.
- Collega il modulo GPS al microcontrollore usando USART.
- Inizializza il sistema USART in modalità di ricezione continua, con velocità di 9600 baud e LCD con modalità a 4 bit.
- Prendi due matrici di caratteri a seconda della lunghezza di latitudine e longitudine.
- Ricevi un bit di carattere alla volta e controlla se è stato avviato da $ o meno.
- Se $ Ricevi allora è una stringa, dobbiamo controllare GPGGA, queste 5 lettere e la virgola.
- Se è GPGGA, salteremo il tempo e cercheremo la latitudine e la longitudine, memorizzeremo la latitudine e la longitudine in due array di caratteri fino a quando N (Nord) ed E (Est) non verranno ricevuti.
- Stamperemo l'array sul display LCD.
- Cancella l'array.
Spiegazione del codice:
Diamo un'occhiata al codice riga per riga. Le prime righe sono per impostare i bit di configurazione che sono stati spiegati nel tutorial precedente, quindi per ora li sto saltando. Il codice completo è fornito alla fine di questo tutorial.
Queste cinque linee sono utilizzate per includere i file di intestazione di libreria, lcd.h e eusart.h è per LCD e USART, rispettivamente. E xc.h è per il file di intestazione del microcontrollore.
#includere
Nella funzione void main () , system_init () ; viene utilizzata per inizializzare LCD e USART.
Void main (void) { TRISB = 0x00; // Impostazione come output system_init ();
Il lcd_init (); e EUSART_Intialize (); viene chiamato dal due biblioteche lcd.h e eusart.h
void system_init (void) { lcd_init (); // Questo inizializzerà lcd EUSART1_Initialize (); // Questo inizializzerà l'Eusart }
Nel ciclo while interrompiamo la stringa GPGGA per ottenere le coordinate di longitudine e latitudine. Riceviamo un bit alla volta e lo confrontiamo con i singoli caratteri presenti nella stringa GPGGA.
Rompiamo i codici che otterremo: -
incomer_data = EUSART1_Read (); // Controlla la stringa '$ GPGGA,' / * ------------------------------ Passo dopo passo trovando la linea GPGGA- --------------------------- * / if (incomer_data == '$') {// La prima affermazione dei dati GPS inizia con un $ sign incomer_data = EUSART1_Read (); // Se il primo se diventa vero, la fase successiva if (incomer_data == 'G') { incomer_data = EUSART1_Read (); if (incomer_data == 'P'); { incomer_data = EUSART1_Read (); if (incomer_data == 'G'); { incomer_data = EUSART1_Read (); if (incomer_data == 'G') { incomer_data = EUSART1_Read (); if (incomer_data == 'A') { incomer_data = EUSART1_Read (); if (incomer_data == ',') {// first, ricevuto incomer_data = EUSART1_Read (); // In questa fase, il controllo finale è stato eseguito, GPGGA viene trovato.
Usando questo codice saltiamo l'ora UTC.
while (incomer_data! = ',') {// salta l'ora GMT incomer_data = EUSART1_Read (); }
Questo codice serve per memorizzare i dati di latitudine e longitudine nella matrice di caratteri.
incomer_data = EUSART1_Read (); latitude = incomer_data; while (incomer_data! = ',') { for (array_count = 1; incomer_data! = 'N'; array_count ++) { incomer_data = EUSART1_Read (); latitude = incomer_data; // Memorizza i dati Latitude } incomer_data = EUSART1_Read (); if (incomer_data == ',') { for (array_count = 0; incomer_data! = 'E'; array_count ++) { incomer_data = EUSART1_Read (); longitude = incomer_data; // Memorizza i dati di longitudine } }
E infine abbiamo stampato longitudine e latitudine sul display LCD.
array_count = 0; lcd_com (0x80); // Selezione della riga uno dell'LCD while (array_count <12) {// Array of Latitude data is 11 digit lcd_data (latitude); // Stampa i dati di Latitude array_count ++; } array_count = 0; lcd_com (0xC0); // Selezione riga due dell'LCD while (array_count <13) {// L'array di dati di longitudine è di 12 cifre lcd_data (longitudine); // Stampa i dati di longitudine array_count ++; }
In questo modo possiamo interfacciare il modulo GPS con il microcontrollore PIC per ottenere la latitudine e la longitudine della posizione corrente.
Di seguito vengono forniti il codice completo e i file di intestazione.