8.4 KiB
Odczyt danych GPS - Raspberry Pi
W tej części lekcji dodasz czujnik GPS do swojego Raspberry Pi i odczytasz z niego dane.
Sprzęt
Raspberry Pi potrzebuje czujnika GPS.
Czujnik, którego użyjesz, to Grove GPS Air530 sensor. Ten czujnik może łączyć się z wieloma systemami GPS, aby szybko i dokładnie określić pozycję. Składa się z dwóch części - głównej elektroniki czujnika oraz zewnętrznej anteny podłączonej cienkim przewodem, która odbiera fale radiowe z satelitów.
Jest to czujnik UART, więc przesyła dane GPS przez UART.
Podłącz czujnik GPS
Czujnik Grove GPS można podłączyć do Raspberry Pi.
Zadanie - podłącz czujnik GPS
Podłącz czujnik GPS.
-
Włóż jeden koniec kabla Grove do gniazda w czujniku GPS. Kabel pasuje tylko w jedną stronę.
-
Gdy Raspberry Pi jest wyłączone, podłącz drugi koniec kabla Grove do gniazda UART oznaczonego jako UART na nakładce Grove Base przymocowanej do Raspberry Pi. Gniazdo to znajduje się w środkowym rzędzie, po stronie najbliższej gniazda karty SD, na przeciwległym końcu od portów USB i gniazda Ethernet.
-
Ustaw czujnik GPS tak, aby podłączona antena miała widoczność na niebo - najlepiej w pobliżu otwartego okna lub na zewnątrz. Łatwiej uzyskać wyraźny sygnał, gdy nic nie zasłania anteny.
Programowanie czujnika GPS
Teraz Raspberry Pi można zaprogramować do obsługi podłączonego czujnika GPS.
Zadanie - zaprogramuj czujnik GPS
Zaprogramuj urządzenie.
-
Włącz Raspberry Pi i poczekaj, aż się uruchomi.
-
Czujnik GPS ma dwie diody LED - niebieską, która miga podczas przesyłania danych, oraz zieloną, która miga co sekundę, gdy odbiera dane z satelitów. Upewnij się, że niebieska dioda LED miga po włączeniu Raspberry Pi. Po kilku minutach powinna zacząć migać zielona dioda LED - jeśli nie, może być konieczne przestawienie anteny.
-
Uruchom VS Code, bezpośrednio na Raspberry Pi lub za pomocą rozszerzenia Remote SSH.
⚠️ Możesz odwołać się do instrukcji konfiguracji i uruchamiania VS Code w lekcji 1, jeśli to konieczne.
-
W nowszych wersjach Raspberry Pi obsługujących Bluetooth występuje konflikt między portem szeregowym używanym przez Bluetooth a tym używanym przez port UART Grove. Aby to naprawić, wykonaj następujące kroki:
-
W terminalu VS Code edytuj plik
/boot/config.txtza pomocąnano, wbudowanego edytora tekstu w terminalu, używając następującego polecenia:sudo nano /boot/config.txtTego pliku nie można edytować w VS Code, ponieważ wymaga on uprawnień
sudo, czyli podwyższonych uprawnień. VS Code nie działa z tymi uprawnieniami. -
Użyj klawiszy kursora, aby przejść na koniec pliku, a następnie skopiuj poniższy kod i wklej go na końcu pliku:
dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1Możesz wkleić, używając standardowych skrótów klawiaturowych dla swojego urządzenia (
Ctrl+vna Windows, Linux lub Raspberry Pi OS,Cmd+vna macOS). -
Zapisz plik i wyjdź z
nano, naciskającCtrl+x. Naciśnijy, gdy zostaniesz zapytany, czy chcesz zapisać zmodyfikowany bufor, a następnie naciśnijenter, aby potwierdzić nadpisanie/boot/config.txt.Jeśli popełnisz błąd, możesz wyjść bez zapisywania, a następnie powtórzyć te kroki.
-
Edytuj plik
/boot/cmdline.txtwnano, używając następującego polecenia:sudo nano /boot/cmdline.txt -
Ten plik zawiera kilka par klucz/wartość oddzielonych spacjami. Usuń wszystkie pary klucz/wartość dla klucza
console. Prawdopodobnie będą wyglądać tak:console=serial0,115200 console=tty1Możesz przejść do tych wpisów za pomocą klawiszy kursora, a następnie usunąć je za pomocą klawiszy
dellubbackspace.Na przykład, jeśli Twój oryginalny plik wygląda tak:
console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwaitNowa wersja będzie wyglądać tak:
root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait -
Wykonaj powyższe kroki, aby zapisać ten plik i wyjść z
nano. -
Uruchom ponownie Raspberry Pi, a następnie połącz się ponownie w VS Code po ponownym uruchomieniu Pi.
-
-
W terminalu utwórz nowy folder w katalogu domowym użytkownika
pio nazwiegps-sensor. Utwórz plik w tym folderze o nazwieapp.py. -
Otwórz ten folder w VS Code.
-
Moduł GPS przesyła dane UART przez port szeregowy. Zainstaluj pakiet Pip
pyserial, aby komunikować się z portem szeregowym w kodzie Pythona:pip3 install pyserial -
Dodaj poniższy kod do swojego pliku
app.py:import time import serial serial = serial.Serial('/dev/ttyAMA0', 9600, timeout=1) serial.reset_input_buffer() serial.flush() def print_gps_data(line): print(line.rstrip()) while True: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data(line) line = serial.readline().decode('utf-8') time.sleep(1)Ten kod importuje moduł
serialz pakietu Pippyserial. Następnie łączy się z portem szeregowym/dev/ttyAMA0- to adres portu szeregowego, którego używa nakładka Grove Pi Base Hat dla swojego portu UART. Następnie czyści wszelkie istniejące dane z tego połączenia szeregowego.Następnie definiowana jest funkcja
print_gps_data, która wypisuje na konsolę linię przekazaną do niej jako argument.Kolejny fragment kodu działa w nieskończonej pętli, odczytując tyle linii tekstu, ile może z portu szeregowego w każdej iteracji. Wywołuje funkcję
print_gps_datadla każdej linii.Po odczytaniu wszystkich danych pętla usypia na 1 sekundę, a następnie próbuje ponownie.
-
Uruchom ten kod. Zobaczysz surowe dane wyjściowe z czujnika GPS, coś w rodzaju:
$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $BDGSA,A,1,,,,,,,,,,,,,,,*0F $GPGSV,1,1,00*79 $BDGSV,1,1,00*68Jeśli napotkasz jeden z poniższych błędów podczas zatrzymywania i ponownego uruchamiania kodu, dodaj blok
try - exceptdo swojej pętliwhile.UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation bytewhile True: try: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data() line = serial.readline().decode('utf-8') # There's a random chance the first byte being read is part way through a character. # Read another full line and continue. except UnicodeDecodeError: line = serial.readline().decode('utf-8') time.sleep(1)
💁 Ten kod znajdziesz w folderze code-gps/pi.
😀 Twój program obsługujący czujnik GPS działa poprawnie!
Zastrzeżenie:
Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI Co-op Translator. Chociaż dokładamy wszelkich starań, aby zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia.

