- Componente necesare
- Obținerea datelor de localizare de pe GPS
- Diagrama circuitului
- Pași pentru interfața GPS cu microcontrolerul AVR
- Explicarea codului
Modulele GPS sunt utilizate pe scară largă în aplicațiile electronice pentru a urmări locația pe baza coordonatelor de longitudine și latitudine. Sistemul de urmărire a vehiculului, ceasul GPS, sistemul de alertă pentru detectarea accidentelor, navigarea în trafic, sistemul de supraveghere etc. sunt câteva dintre exemplele în care funcționalitatea GPS este esențială. GPS oferă Altitudine, Latitudine, Longitudine, ora UTC și multe alte informații despre locația respectivă, care sunt preluate de la mai multe satelite. Pentru a citi datele de pe GPS, este nevoie de un microcontroler, așa că aici interfațăm modulul GPS cu microcontrolerul AVR Atmega16 și imprimăm longitudinea și latitudinea pe afișajul LCD de 16x2.
Componente necesare
- Atmega16 / 32
- Modul GPS (GPS uBlox Neo 6M)
- Antenă cu fir lung
- 16x2 LCD
- 2.2k Rezistor
- Condensator 1000uf
- Condensator 10uF
- Sârmă de conectare
- LM7805
- DC Jack
- Adaptor DC 12v
- Burstips
- PCB sau PCB de uz general
Ublox Neo 6M este un modul GPS serial care oferă detalii despre locație prin comunicare serială. Are patru pini.
Pin |
Descriere |
Vcc |
Sursă de alimentare de 2,7 - 5V |
Gnd |
Sol |
TXD |
Transmite date |
RXD |
Primiți date |
Modulul GPS Ublox neo 6M este compatibil TTL și specificațiile sale sunt prezentate mai jos.
Captează timpul |
Start rece: 27s, Start fierbinte: 1s |
Protocol de comunicare |
NMEA |
Comunicare în serie |
9600bps, 8 biți de date, 1 bit de oprire, fără paritate și fără control al fluxului |
Curent de funcționare |
45mA |
Obținerea datelor de localizare de pe GPS
Modulul GPS va transmite date în mai multe șiruri la 9600 Baud Rate. Dacă folosim un terminal UART cu o rată de 9600 Baud, putem vedea datele primite de GPS.
Modulul GPS trimite datele poziției de urmărire în timp real în format NMEA (vezi captura de ecran de mai sus). Formatul NMEA constă în mai multe propoziții, în care sunt prezentate mai jos patru propoziții importante. Mai multe detalii despre propoziția NMEA și formatul său de date pot fi găsite aici.
- $ GPGGA: Date corecte ale sistemului de poziționare globală
- $ GPGSV: Sateliți GPS în vizualizare
- $ GPGSA: GPS DOP și sateliți activi
- $ GPRMC: date GPS / tranzit specifice minime recomandate
Aflați mai multe despre datele GPS și șirurile NMEA aici.
Acestea sunt datele primite de GPS când sunteți conectat la 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
Când folosim modulul GPS pentru urmărirea oricărei locații, avem nevoie doar de coordonate și putem găsi acest lucru în șirul $ GPGGA. Doar șirul $ GPGGA (Global Positioning System Fix Data) este utilizat în principal în programe, iar alte șiruri sunt ignorate.
$ GPGGA, 141848.00,2237.63306, N, 08820.86316, E, 1,03,2,56,1,9, M, -54,2, M,, * 74
Care este sensul acestei linii?
Înțelesul acelei linii este: -
1. Șirul începe întotdeauna cu semnul „$”
2. GPGGA înseamnă Global Fixing System Fix Data
3. „,” virgulă indică separarea între două valori
4. 141848.00: ora GMT ca 14 (h): 18 (min): 48 (sec): 00 (ms)
5. 2237.63306, N: Latitudine 22 (grad) 37 (minute) 63306 (sec) Nord
6. 08820.86316, E: Longitudine 088 (grad) 20 (minute) 86316 (sec) Est
7. 1: Cantitate corecție 0 = date nevalide, 1 = date valide, 2 = corecție DGPS
8. 03: Numărul de sateliți vizualizați în prezent.
9. 1.0: HDOP
10. 2,56, M: Altitudine (Înălțimea deasupra nivelului mării în metri)
11. 1.9, M: Înălțimea geoidelor
12. * 74: suma de control
Deci, avem nevoie de nr. 5 și nr. 6 pentru a colecta informații despre locația modulului sau, unde se află acesta. În acest proiect am folosit o bibliotecă GPS care oferă câteva funcții pentru a extrage latitudinea și longitudinea, astfel încât nu trebuie să ne facem griji pentru asta.
Anterior am interfațat GPS-ul cu alte microcontrolere:
- Cum se folosește GPS cu Arduino
- Tutorial de interfațare a modulului GPS Raspberry Pi
- Interfață modul GPS cu microcontroler PIC
- Urmăriți un vehicul pe Google Maps folosind Arduino, ESP8266 și GPS
Verificați aici toate proiectele legate de GPS.
Diagrama circuitului
Diagrama circuitului pentru interfața GPS cu microcontrolerul AVR Atemga16 este prezentată mai jos:
Întregul sistem este alimentat de un adaptor de 12V DC, dar circuitele funcționează pe 5v, astfel încât sursa de alimentare este reglementată la 5v de regulatorul de tensiune LM7805. Un ecran LCD de 16x2 este configurat în modul 4 biți, iar conexiunile pin sunt afișate în diagrama circuitului. GPS-ul este, de asemenea, alimentat de 5V, iar pinul său tx este conectat direct la microcontrolerul Rx al Atmega16. Un oscilator de cristal de 8 MHz este utilizat pentru a ceasul microcontrolerului.
Pași pentru interfața GPS cu microcontrolerul AVR
- Setați configurațiile microcontrolerului care includ configurația oscilatorului.
- Setați portul dorit pentru LCD, inclusiv registrul DDR.
- Conectați modulul GPS la microcontroler folosind USART.
- Inițializați sistemul UART în modul ISR, cu 9600 baud rate și LCD în modul 4 biți.
- Luați două matrice de caractere în funcție de lungimea latitudinii și longitudinii.
- Primiți câte un bit de caractere odată și verificați dacă este pornit de la $ sau nu.
- Dacă se primește $ atunci este un șir, trebuie să verificăm $ GPGGA, aceste 6 litere incluzând $.
- Dacă este GPGGA, atunci primiți șirul complet și setați semnalizatoarele.
- Apoi extrageți latitudinea și longitudinea cu direcții în două tablouri.
- În cele din urmă, imprimați matricile de latitudine și longitudine pe LCD.
Explicarea codului
Codul complet cu un videoclip demonstrativ este dat la sfârșit, aici sunt explicate câteva părți importante ale codului.
În primul rând, includeți un antet necesar în cod și apoi scrieți MACROS de bitmask pentru configurația LCD și UART.
#define F_CPU 8000000ul #include #include
Acum declarați și inițializați câteva variabile și tablouri pentru stocarea șirului GPS, longitudine latitudine și steaguri.
char buf; volatile char ind, flag, stringRecived; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; latitudine char; char logitude;
După aceasta avem unele funcții de driver LCD pentru a conduce LCD.
void lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; if (r == 1) RSHigh; altfel RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; if (r == 1) RSHigh; altfel 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); }
După aceea am inițializat comunicația serială cu GPS și am comparat șirul primit cu „GPGGA”:
void serialbegin () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
Acum, dacă șirul primit este asortat cu succes cu GPGGA, atunci în funcția principală extrageți și afișați coordonatele de latitudine și longitudine ale locației:
lcdwrite (0x80,0); lcdprint ("Lat:"); tipărire de serie („Latitude:”); for (int i = 15; i <27; i ++) { latitudine = buf; lcdwrite (latitudine, 1); serialwrite (latitudine); if (i == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("Jurnal:"); serialprint ("Logitudine:"); for (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (logitudine, 1); serialwrite (logitudine); if (i == 38) { lcdwrite ('', 1); i ++; } }
Deci, astfel modulul GPS poate fi interfațat cu ATmega16 pentru a găsi coordonatele de locație.
Găsiți codul complet și videoclipul de lucru de mai jos.