- Componenti richiesti
- Recupero dei dati sulla posizione dal GPS
- Schema elettrico
- Passaggi per interfacciare il GPS con il microcontrollore AVR
- Spiegazione del codice
I moduli GPS sono ampiamente utilizzati nelle applicazioni elettroniche per tracciare la posizione in base alle coordinate di longitudine e latitudine. Sistema di localizzazione del veicolo, orologio GPS, sistema di allarme rilevamento incidenti, navigazione del traffico, sistema di sorveglianza ecc. Sono alcuni degli esempi in cui la funzionalità GPS è essenziale. Il GPS fornisce altitudine, latitudine, longitudine, ora UTC e molte altre informazioni sulla posizione particolare, che sono prese da più di un satellite. Per leggere i dati dal GPS, è necessario un microcontrollore, quindi qui stiamo interfacciando il modulo GPS con il microcontrollore AVR Atmega16 e stampando la longitudine e la latitudine sul display LCD 16x2.
Componenti richiesti
- Atmega16 / 32
- Modulo GPS (uBlox Neo 6M GPS)
- Antenna a filo lungo
- LCD 16x2
- Resistenza 2.2k
- Condensatore 1000uf
- Condensatore 10uF
- Cavo di collegamento
- LM7805
- DC Jack
- Adattatore CC 12v
- Burgstips
- PCB o PCB per uso generico
Ublox Neo 6M è un modulo GPS seriale che fornisce dettagli sulla posizione tramite comunicazione seriale. Ha quattro perni.
Pin |
Descrizione |
Vcc |
Alimentazione 2,7 - 5V |
Gnd |
Terra |
TXD |
Trasmetti dati |
RXD |
Ricevi dati |
Il modulo GPS Ublox neo 6M è compatibile TTL e le sue specifiche sono fornite di seguito.
Cattura il tempo |
Inizio freddo: 27 secondi, Inizio caldo: 1 secondo |
Protocollo di comunicazione |
NMEA |
Comunicazione seriale |
9600 bps, 8 bit di dati, 1 bit di stop, nessuna parità e nessun controllo di flusso |
Corrente di esercizio |
45mA |
Recupero dei dati sulla posizione dal GPS
Il modulo GPS trasmetterà i dati in più stringhe a 9600 baud rate. Se utilizziamo un terminale UART con 9600 Baud rate, possiamo vedere i dati ricevuti dal GPS.
Il modulo GPS invia i dati di posizione del 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. In questo progetto abbiamo utilizzato una libreria GPS che fornisce alcune funzioni per estrarre la latitudine e la longitudine, quindi non dobbiamo preoccuparci di questo.
Abbiamo precedentemente interfacciato il GPS con altri microcontrollori:
- Come usare il GPS con Arduino
- Tutorial sull'interfacciamento del modulo GPS Raspberry Pi
- Interfacciamento del modulo GPS con il microcontrollore PIC
- Traccia un veicolo su Google Maps utilizzando Arduino, ESP8266 e GPS
Controlla qui tutti i progetti relativi al GPS.
Schema elettrico
Di seguito è riportato lo schema del circuito per l' interfacciamento GPS con il microcontrollore AVR Atemga16:
L'intero sistema è alimentato da un adattatore CC da 12 V, ma i circuiti funzionano a 5 V, quindi l'alimentazione è regolata a 5 V dal regolatore di tensione LM7805. Un LCD 16x2 è configurato in modalità 4 bit e le sue connessioni pin sono mostrate nello schema del circuito. Anche il GPS è alimentato da 5v e il suo pin tx è direttamente collegato al microcontrollore Rx di Atmega16. Un oscillatore a cristallo da 8 MHz viene utilizzato per sincronizzare il microcontrollore.
Passaggi per interfacciare il GPS con il microcontrollore AVR
- Imposta le configurazioni del microcontrollore che includono la configurazione dell'oscillatore.
- Impostare la porta desiderata per LCD incluso il registro DDR.
- Collega il modulo GPS al microcontrollore usando USART.
- Inizializza l'UART del sistema in modalità ISR, con velocità di trasmissione 9600 e LCD in modalità 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 $ viene ricevuto, allora è una stringa, dobbiamo controllare $ GPGGA, queste 6 lettere includono $.
- Se è GPGGA, ricevi la stringa completa e imposta i flag.
- Quindi estrai la latitudine e la longitudine con le direzioni in due array.
- Infine stampare gli array di latitudine e longitudine sul display LCD.
Spiegazione del codice
Alla fine viene fornito il codice completo con un video dimostrativo, qui vengono spiegate alcune parti importanti del codice.
Prima di tutto includi alcune intestazioni richieste nel codice e poi scrivi MACRO di maschera di bit per la configurazione LCD e UART.
#define F_CPU 8000000ul #include #include
Ora dichiara e inizializza alcune variabili e array per memorizzare stringhe GPS, latitudine, longitudine e flag.
char buf; volatile char ind, flag, stringReceived; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; latitudine del carattere; char logitude;
Dopo di che abbiamo alcune funzioni LCD Driver per guidare LCD.
void lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; if (r == 1) RSHigh; altro RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; if (r == 1) RSHigh; altro RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); } void lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ delay_ms (20); } } void lcdbegin () { char lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; for (int i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Successivamente abbiamo inizializzato la comunicazione seriale con il GPS e confrontato la stringa ricevuta con "GPGGA":
void serialbegin () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
Ora, se la stringa ricevuta viene abbinata correttamente a GPGGA, nella funzione principale estrai e visualizza le coordinate di latitudine e longitudine della posizione:
lcdwrite (0x80,0); lcdprint ("Lat:"); serialprint ("Latitude:"); for (int i = 15; i <27; i ++) { latitude = buf; lcdwrite (latitudine, 1); serialwrite (latitudine); if (i == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("Log:"); serialprint ("Logitude:"); for (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (logitude, 1); serialwrite (logitude); if (i == 38) { lcdwrite ('', 1); i ++; } }
Quindi è così che il modulo GPS può essere interfacciato con ATmega16 per trovare le coordinate della posizione.
Trova il codice completo e il video funzionante di seguito.