- Wymagane składniki:
- Schemat obwodu i wyjaśnienie: -
- Pobieranie danych lokalizacji z GPS:
- Kroki do połączenia GPS z mikrokontrolerem PIC: -
- Objaśnienie kodu:
GPS to skrót od Global Positioning System. Jest to system, który dostarcza dokładnych informacji o wysokości, szerokości i długości geograficznej, czasie UTC i wielu innych, które są pobierane z 2, 3, 4 lub więcej satelitów. Aby odczytać dane z GPS, potrzebujemy mikrokontrolera i już połączyliśmy GPS z Arduino i Raspberry Pi.
Wybraliśmy moduł GPS G7020 firmy U-blox. Otrzymamy długość i szerokość geograficzną określonej pozycji z satelity i wyświetlimy ją na wyświetlaczu LCD 16x2 znaków. Więc tutaj połączymy GPS z mikrokontrolerem PIC16F877A przez mikroczip.
Wymagane składniki:
- Pic16F877A - pakiet PDIP40
- Deska do chleba
- Pickit-3
- Adapter 5V
- LCD JHD162A
- Moduł GPS uBLOX-G7020
- Przewody do podłączenia urządzeń peryferyjnych.
- Rezystory 4,7 tys
- Pula 10k
- Kryształ 20 MHz
- 2 sztuki kondensatorów ceramicznych 33pF
Schemat obwodu i wyjaśnienie: -
16x2 znakowy wyświetlacz LCD jest podłączony przez mikrokontroler PIC16F877A, w którym RB0, RB1, RB2 są podłączone odpowiednio do pinów LCD, które są RS, R / W i E.RB4, RB5, RB6 i RB7 są podłączone do 4 pinów D4, D5 LCD, D6, D7. Wyświetlacz LCD jest podłączony w trybie 4-bitowym lub w trybie półbajtowym. Dowiedz się więcej o połączeniu LCD z mikrokontrolerem PIC.
Oscylator kwarcowy 20 MHz z dwoma ceramicznymi kondensatorami 33 pF połączonymi między pinami OSC1 i OSC2. Zapewni stałą częstotliwość zegara 20 MHz do mikrokontrolera.
Moduł GPS uBlox-G7020, odbiór i transmisja danych za pomocą UART. PIC16F877A składa się z jednego sterownika USART wewnątrz chipa, będziemy odbierać dane z modułu GPS przez USART, więc połączenie krzyżowe zostanie wykonane z pinu Rx mikrokontrolera do pinu Tx GPS i pinu odbiorczego USART połączonego przez pin nadawczy GPS.
UBlox-G7020 ma kod koloru dla pinów. Styk dodatni lub 5 V jest w kolorze czerwonym, styk ujemny lub GND jest w kolorze czarnym, a styk nadawczy jest w kolorze niebieskim.
Podłączyłem to wszystko w płytce stykowej.
Pobieranie danych lokalizacji z GPS:
Zobaczmy, jak połączyć GPS za pomocą USART i zobaczmy wynik na wyświetlaczu LCD 16x2.
Moduł przesyła dane w wielu ciągach z szybkością 9600 bodów. Jeśli korzystamy z terminala UART z prędkością 9600 bodów, zobaczymy dane odebrane przez GPS.
Moduł GPS wysyła dane o 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.
Kroki do połączenia GPS z mikrokontrolerem PIC: -
- Ustaw konfiguracje mikrokontrolera, które obejmują konfigurację oscylatora.
- Ustaw żądany port dla LCD, w tym rejestru TRIS.
- Podłącz moduł GPS do mikrokontrolera za pomocą USART.
- Zainicjuj system USART w trybie ciągłego odbioru, z prędkością 9600 bodów i wyświetlaczem LCD z trybem 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 $ Receive to łańcuch, musimy sprawdzić GPGGA, te 5 liter i przecinek.
- Jeśli jest to GPGGA, to pominiemy czas i poszukamy szerokości i długości geograficznej. Będziemy przechowywać szerokość i długość geograficzną w dwuznakowej tablicy, dopóki N (północ) i E (wschód) nie zostaną odebrane.
- Tablicę wydrukujemy na wyświetlaczu LCD.
- Wyczyść tablicę.
Objaśnienie kodu:
Spójrzmy na kod linia po linii. Pierwsze kilka wierszy służy do ustawiania bitów konfiguracyjnych, które zostały wyjaśnione w poprzednim samouczku, więc na razie je pomijam. Pełny kod znajduje się na końcu tego samouczka.
Te pięć wierszy jest używanych do dołączania plików nagłówkowych bibliotek, lcd.h i eusart.h są odpowiednio dla LCD i USART. A xc.h jest dla pliku nagłówkowego mikrokontrolera.
#zawierać
W pustych przestrzeni głównej () funkcji, system_init () ; Funkcja służy do inicjalizacji LCD i USART.
Void main (void) { TRISB = 0x00; // Ustawienie jako wyjście system_init ();
Lcd_init (); i EUSART_Intialize (); jest wywoływana z dwóch bibliotek lcd.h i eusart.h
void system_init (void) { lcd_init (); // Spowoduje to zainicjowanie lcd EUSART1_Initialize (); // Spowoduje to zainicjowanie Eusart }
W podczas pętli łamiemy ciąg GPGGA aby pobrać długości i szerokości geograficznej współrzędnych. Odbieramy jeden bit na raz i porównujemy go z pojedynczymi znakami obecnymi w ciągu GPGGA.
Łamiemy kody, które otrzymamy: -
incomer_data = EUSART1_Read (); // Sprawdź ciąg „$ GPGGA,” / * ------------------------------ Znajdź wiersz GPGGA krok po kroku- --------------------------- * / if (incomer_data == '$') {// Pierwsza instrukcja danych GPS zaczyna się od $ sign incomer_data = EUSART1_Read (); // Jeśli pierwsza jeśli stanie się prawdą, to następna faza 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 == ',') {// pierwsza, odebrana incomer_data = EUSART1_Read (); // Na tym etapie Końcowe sprawdzenie zakończone, znaleziono GPGGA.
Używając tego kodu pomijamy czas UTC.
while (incomer_data! = ',') {// pomijanie czasu GMT incomer_data = EUSART1_Read (); }
Ten kod służy do przechowywania danych szerokości i długości geograficznej w tablicy znaków.
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; // Przechowuj dane Latitude } incomer_data = EUSART1_Read (); if (incomer_data == ',') { for (array_count = 0; incomer_data! = 'E'; array_count ++) { incomer_data = EUSART1_Read (); longitude = incomer_data; // Przechowuj dane długości geograficznej } }
I wreszcie wydrukowaliśmy długość i szerokość geograficzną na wyświetlaczu LCD.
array_count = 0; lcd_com (0x80); // Wybór pierwszej linii LCD while (array_count <12) {// Tablica danych szerokości geograficznej składa się z 11 cyfr lcd_data (latitude); // Wydrukuj dane Latitude array_count ++; } array_count = 0; lcd_com (0xC0); // Wybór drugiego wiersza Lcd while (array_count <13) {// Tablica danych długości geograficznej składa się z 12 cyfr lcd_data (długość); // Wydrukuj dane długości geograficznej array_count ++; }
W ten sposób możemy połączyć moduł GPS z mikrokontrolerem PIC, aby uzyskać szerokość i długość geograficzną aktualnej lokalizacji.
Pełny kod i pliki nagłówkowe są podane poniżej.