9.2 KiB
GPS-Daten lesen - Raspberry Pi
In diesem Teil der Lektion fügen Sie Ihrem Raspberry Pi einen GPS-Sensor hinzu und lesen Werte von diesem aus.
Hardware
Der Raspberry Pi benötigt einen GPS-Sensor.
Der Sensor, den Sie verwenden werden, ist ein Grove GPS Air530 Sensor. Dieser Sensor kann sich mit mehreren GPS-Systemen verbinden, um eine schnelle und präzise Standortbestimmung zu ermöglichen. Der Sensor besteht aus zwei Teilen: der Kern-Elektronik des Sensors und einer externen Antenne, die über ein dünnes Kabel angeschlossen ist, um die Funkwellen der Satelliten zu empfangen.
Dies ist ein UART-Sensor, der GPS-Daten über UART sendet.
GPS-Sensor anschließen
Der Grove GPS-Sensor kann mit dem Raspberry Pi verbunden werden.
Aufgabe - GPS-Sensor anschließen
Schließen Sie den GPS-Sensor an.
-
Stecken Sie ein Ende eines Grove-Kabels in die Buchse des GPS-Sensors. Es passt nur in einer Richtung hinein.
-
Schalten Sie den Raspberry Pi aus und verbinden Sie das andere Ende des Grove-Kabels mit der UART-Buchse, die mit UART auf dem Grove Base Hat am Pi markiert ist. Diese Buchse befindet sich in der mittleren Reihe, auf der Seite in der Nähe des SD-Karten-Slots, gegenüber den USB-Ports und dem Ethernet-Anschluss.
-
Positionieren Sie den GPS-Sensor so, dass die angeschlossene Antenne Sicht zum Himmel hat – idealerweise neben einem offenen Fenster oder draußen. Es ist einfacher, ein klares Signal zu empfangen, wenn nichts die Antenne blockiert.
GPS-Sensor programmieren
Der Raspberry Pi kann nun programmiert werden, um den angeschlossenen GPS-Sensor zu verwenden.
Aufgabe - GPS-Sensor programmieren
Programmieren Sie das Gerät.
-
Schalten Sie den Pi ein und warten Sie, bis er hochgefahren ist.
-
Der GPS-Sensor hat zwei LEDs – eine blaue LED, die blinkt, wenn Daten übertragen werden, und eine grüne LED, die jede Sekunde blinkt, wenn Daten von Satelliten empfangen werden. Stellen Sie sicher, dass die blaue LED blinkt, wenn Sie den Pi einschalten. Nach einigen Minuten sollte die grüne LED blinken – falls nicht, müssen Sie möglicherweise die Antenne neu positionieren.
-
Starten Sie VS Code, entweder direkt auf dem Pi oder verbinden Sie sich über die Remote SSH-Erweiterung.
⚠️ Sie können die Anweisungen zum Einrichten und Starten von VS Code in Lektion 1 bei Bedarf nachlesen.
-
Bei neueren Versionen des Raspberry Pi, die Bluetooth unterstützen, gibt es einen Konflikt zwischen dem seriellen Port, der für Bluetooth verwendet wird, und dem, der vom Grove UART-Port genutzt wird. Um dies zu beheben, führen Sie die folgenden Schritte aus:
-
Bearbeiten Sie die Datei
/boot/config.txt
im VS Code-Terminal mitnano
, einem integrierten Terminal-Texteditor, mit folgendem Befehl:sudo nano /boot/config.txt
Diese Datei kann nicht direkt in VS Code bearbeitet werden, da Sie
sudo
-Berechtigungen benötigen, also erhöhte Berechtigungen. VS Code läuft nicht mit diesen Berechtigungen. -
Navigieren Sie mit den Pfeiltasten zum Ende der Datei und kopieren Sie den untenstehenden Code, um ihn am Ende der Datei einzufügen:
dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1
Sie können den Code mit den üblichen Tastenkombinationen für Ihr Gerät einfügen (
Ctrl+v
auf Windows, Linux oder Raspberry Pi OS,Cmd+v
auf macOS). -
Speichern Sie die Datei und verlassen Sie nano, indem Sie
Ctrl+x
drücken. Drücken Siey
, wenn Sie gefragt werden, ob Sie den geänderten Puffer speichern möchten, und drücken SieEnter
, um zu bestätigen, dass Sie/boot/config.txt
überschreiben möchten.Wenn Sie einen Fehler machen, können Sie ohne Speichern beenden und die Schritte wiederholen.
-
Bearbeiten Sie die Datei
/boot/cmdline.txt
in nano mit folgendem Befehl:sudo nano /boot/cmdline.txt
-
Diese Datei enthält eine Reihe von Schlüssel-Wert-Paaren, die durch Leerzeichen getrennt sind. Entfernen Sie alle Schlüssel-Wert-Paare für den Schlüssel
console
. Sie sehen wahrscheinlich so aus:console=serial0,115200 console=tty1
Sie können zu diesen Einträgen mit den Pfeiltasten navigieren und sie dann mit den Tasten
del
oderbackspace
löschen.Wenn Ihre Originaldatei beispielsweise so aussieht:
console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
Wird die neue Version so aussehen:
root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
-
Folgen Sie den oben genannten Schritten, um diese Datei zu speichern und nano zu verlassen.
-
Starten Sie Ihren Pi neu und verbinden Sie sich erneut in VS Code, sobald der Pi neu gestartet ist.
-
-
Erstellen Sie im Terminal einen neuen Ordner im Home-Verzeichnis des Benutzers
pi
mit dem Namengps-sensor
. Erstellen Sie in diesem Ordner eine Datei mit dem Namenapp.py
. -
Öffnen Sie diesen Ordner in VS Code.
-
Das GPS-Modul sendet UART-Daten über einen seriellen Port. Installieren Sie das
pyserial
Pip-Paket, um über Python-Code mit dem seriellen Port zu kommunizieren:pip3 install pyserial
-
Fügen Sie den folgenden Code in Ihre Datei
app.py
ein: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)
Dieser Code importiert das
serial
-Modul aus dempyserial
Pip-Paket. Anschließend wird eine Verbindung zum seriellen Port/dev/ttyAMA0
hergestellt – dies ist die Adresse des seriellen Ports, den der Grove Pi Base Hat für seinen UART-Port verwendet. Danach werden alle vorhandenen Daten aus dieser seriellen Verbindung gelöscht.Als Nächstes wird eine Funktion namens
print_gps_data
definiert, die die übergebene Zeile in der Konsole ausgibt.Anschließend wird der Code in einer Endlosschleife ausgeführt, die in jeder Schleife so viele Textzeilen wie möglich vom seriellen Port liest. Für jede Zeile wird die Funktion
print_gps_data
aufgerufen.Nachdem alle Daten gelesen wurden, schläft die Schleife für 1 Sekunde und versucht es erneut.
-
Führen Sie diesen Code aus. Sie sehen die Rohdaten des GPS-Sensors, etwa so:
$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*68
Wenn Sie einen der folgenden Fehler beim Stoppen und Neustarten Ihres Codes erhalten, fügen Sie einen
try - except
Block in Ihre While-Schleife ein.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 byte
while 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)
💁 Sie finden diesen Code im Ordner code-gps/pi.
😀 Ihr GPS-Sensor-Programm war erfolgreich!
Haftungsausschluss:
Dieses Dokument wurde mit dem KI-Übersetzungsdienst Co-op Translator übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die sich aus der Nutzung dieser Übersetzung ergeben.