- Wymagane składniki
- Pobieranie danych lokalizacji z GPS
- Schemat obwodu
- Kroki do połączenia GPS z mikrokontrolerem AVR
- Objaśnienie kodu
Moduły GPS są szeroko stosowane w aplikacjach elektronicznych do śledzenia lokalizacji na podstawie współrzędnych długości i szerokości geograficznej. System śledzenia pojazdów, zegar GPS, system ostrzegania o wypadkach, nawigacja drogowa, system nadzoru itp. To tylko kilka przykładów, w których funkcjonalność GPS jest niezbędna. GPS zapewnia wysokość, szerokość i długość geograficzną, czas UTC i wiele innych informacji o konkretnej lokalizacji, które są pobierane z więcej niż jednego satelity. Do odczytania danych z GPS potrzebny jest mikrokontroler, więc tutaj łączymy moduł GPS z mikrokontrolerem AVR Atmega16 i drukujemy długość i szerokość geograficzną na wyświetlaczu LCD 16x2.
Wymagane składniki
- Atmega16 / 32
- Moduł GPS (uBlox Neo 6M GPS)
- Antena z długim przewodem
- Wyświetlacz LCD 16x2
- Rezystor 2,2 k
- Kondensator 1000uf
- Kondensator 10uF
- Przewód łączący
- LM7805
- Gniazdo DC
- Zasilacz 12V DC
- Burgstips
- PCB lub PCB ogólnego przeznaczenia
Ublox Neo 6M to szeregowy moduł GPS, który zapewnia szczegółowe informacje o lokalizacji poprzez komunikację szeregową. Posiada cztery piny.
Kołek |
Opis |
Vcc |
Zasilanie 2,7 - 5V |
Gnd |
Ziemia |
TXD |
Transmisja danych |
RXD |
Otrzymywać dane |
Moduł GPS Ublox neo 6M jest kompatybilny z TTL, a jego specyfikacje podano poniżej.
Czas przechwytywania |
Fajny start: 27 s, Gorący start: 1 s |
Protokół komunikacyjny |
NMEA |
Komunikacja szeregowa |
9600bps, 8 bitów danych, 1 bit stopu, bez parzystości i bez kontroli przepływu |
Prąd roboczy |
45mA |
Pobieranie danych lokalizacji z GPS
Moduł GPS przesyła dane w wielu ciągach z prędkością 9600 bodów. Jeśli korzystamy z terminala UART z prędkością 9600 bodów, możemy zobaczyć dane odebrane przez GPS.
Moduł GPS wysyła dane pozycji śledzenia w czasie rzeczywistym w formacie NMEA (patrz powyższy zrzut ekranu). Format NMEA składa się z kilku zdań, w których poniżej podano cztery ważne zdania. Więcej szczegółów na temat zdania NMEA i formatu danych można znaleźć tutaj.
- $ GPGGA: Dane poprawki globalnego systemu pozycjonowania
- $ GPGSV: satelity GPS w zasięgu wzroku
- $ GPGSA: GPS DOP i aktywne satelity
- $ GPRMC: Zalecane minimalne konkretne dane GPS / Tranzyt
Dowiedz się więcej o danych GPS i ciągach NMEA tutaj.
Są to dane odebrane przez GPS po podłączeniu z szybkością 9600 bodów.
$ 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
Kiedy używamy modułu GPS do śledzenia dowolnej lokalizacji, potrzebujemy tylko współrzędnych i możemy to znaleźć w ciągu $ GPGGA. Tylko ciąg $ GPGGA (Global Positioning System Fix Data) jest używany głównie w programach, a inne ciągi są ignorowane.
$ GPGGA, 141848,00,2237,63306, N, 08820.86316, E, 1,03,2,56,1,9, M, -54,2, M,, * 74
Jakie jest znaczenie tego wiersza?
Znaczenie tej linii to: -
1. Łańcuch zawsze zaczyna się od znaku „$”
2. GPGGA to skrót od Global Positioning System Fix Data
3. „,” Przecinek wskazuje separację między dwiema wartościami
4. 141848.00: czas GMT jako 14 (godz.): 18 (min): 48 (sek.): 00 (ms)
5. 2237.63306, N: Szerokość geograficzna 22 (stopnie) 37 (minuty) 63306 (s) Północ
6. 08820.86316, E: Długość geograficzna 088 (stopnie) 20 (minuty) 86316 (s) Wschód
7. 1: Ilość pozycji 0 = nieprawidłowe dane, 1 = prawidłowe dane, 2 = poprawka DGPS
8. 03: Liczba obecnie oglądanych satelitów.
9. 1.0: HDOP
10. 2,56, M: Wysokość (wysokość nad poziomem morza w metrach)
11. 1,9, M: Wysokość geoid
12. * 74: suma kontrolna
Potrzebujemy więc nr 5 i nr 6, aby zebrać informacje o lokalizacji modułu lub o tym, gdzie się znajduje. W tym projekcie wykorzystaliśmy bibliotekę GPS, która zapewnia pewne funkcje do wyodrębniania szerokości i długości geograficznej, więc nie musimy się tym martwić.
Wcześniej łączyliśmy GPS z innymi mikrokontrolerami:
- Jak używać GPS z Arduino
- Samouczek dotyczący interfejsu modułu GPS Raspberry Pi
- Łączenie modułu GPS z mikrokontrolerem PIC
- Śledź pojazd w Mapach Google za pomocą Arduino, ESP8266 i GPS
Sprawdź wszystkie projekty związane z GPS tutaj.
Schemat obwodu
Schemat podłączenia GPS z mikrokontrolerem AVR Atemga16:
Cały system jest zasilany przez adapter 12 V DC, ale obwody działają na 5 V, więc zasilanie jest regulowane do 5 V przez regulator napięcia LM7805. Wyświetlacz LCD 16x2 jest skonfigurowany w trybie 4-bitowym, a jego połączenia pinowe są pokazane na schemacie obwodu. GPS jest również zasilany napięciem 5v, a jego pin tx jest bezpośrednio podłączony do Rx mikrokontrolera Atmega16. Oscylator kwarcowy 8 MHz służy do taktowania mikrokontrolera.
Kroki do połączenia GPS z mikrokontrolerem AVR
- Ustaw konfiguracje mikrokontrolera, które obejmują konfigurację oscylatora.
- Ustaw żądany port dla wyświetlacza LCD, w tym rejestru DDR.
- Podłącz moduł GPS do mikrokontrolera za pomocą USART.
- Zainicjuj system UART w trybie ISR, z szybkością transmisji 9600 bodów i wyświetlaczem LCD w trybie 4-bitowym.
- Weź dwie tablice znaków w zależności od długości i szerokości geograficznej.
- Odbieraj po jednym bitu znaku na raz i sprawdź, czy zaczyna się od $, czy nie.
- Jeśli otrzymano $, to jest to ciąg znaków, musimy sprawdzić $ GPGGA, to 6 liter, w tym $.
- Jeśli jest to GPGGA, odbierz cały ciąg i ustaw flagi.
- Następnie wyodrębnij szerokość i długość geograficzną z kierunkami w dwóch tablicach.
- Na koniec wydrukuj tablice szerokości i długości geograficznej na wyświetlaczu LCD.
Objaśnienie kodu
Kompletny kod z filmem demonstracyjnym znajduje się na końcu, tutaj wyjaśniono kilka ważnych części kodu.
Najpierw umieść w kodzie wymagany nagłówek, a następnie napisz MAKRA maski bitowej dla konfiguracji LCD i UART.
# zdefiniować F_CPU 8000000ul #include #include
Teraz zadeklaruj i zainicjalizuj niektóre zmienne i tablice do przechowywania łańcucha GPS, szerokości geograficznej i flag.
char buf; volatile char ind, flag, stringReceived; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; szerokość geograficzna znaku; logitude znaków;
Po nim mamy funkcję sterownika LCD do sterowania wyświetlaczem LCD.
void lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; if (r == 1) RSHigh; else RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; if (r == 1) RSHigh; else RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); } void lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ opóźnienie_ms (20); } } void lcdbegin () { char lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; dla (int i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Następnie zainicjowaliśmy komunikację szeregową z GPS i porównaliśmy otrzymany ciąg z „GPGGA”:
void serialbegin () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
Teraz, jeśli otrzymany ciąg jest pomyślnie dopasowany do GPGGA, to w funkcji głównej wyodrębnij i wyświetl współrzędną szerokości i długości geograficznej lokalizacji:
lcdwrite (0x80,0); lcdprint („Szer.:”); serialprint („Szerokość:”); for (int i = 15; i <27; i ++) { latitude = buf; lcdwrite (latitude, 1); serialwrite (latitude); 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 ++; } }
W ten sposób można połączyć moduł GPS z ATmega16, aby znaleźć współrzędne lokalizacji.
Znajdź pełny kod i działający film poniżej.