GPS Verbindung unter Linux aufbauen
In diesem Beispiel zeigen wir, wie Sie eine GPS Verbindung unter Ubuntu 22.04.4 Server auf der Kommandozeile direkt konfigurieren. Im Test verwenden wir das Mini Industriesserversystem UNO127 mit installiertem Quectel EM05-E M.2 Modem.
Im weiteren Verlauf stellen wir einen Code zur Verfügung der die GPS Informationen gezielt ausliest und in einfacher Form verarbeitet.
Testumgebung
Zum Test der GPS Verbindung kamen folgende Komponenten zum Einsatz:
- Industrielösung UNO 127
- BIOS Build Version: U1270000060x007/08-01-23/9:28:16
- Quectel EM05-E Modem
- GPS Connector (G) konnektiert
- GPS Antenne passiv / 1575.42 Mhz
- Firmwarestand: EM05EFAR06A05M4G
- Ubuntu 22.04.4 LTS
- Linux Kernel 5.15.0-112-generic
- Der Test wurde aussen in einem fliegenden Aufbau mit direkter Sicht zum Himmel durchgeführt. Für das Foto wurden die LTE Antennenzuführungen entfernt. (bessere Sichtbarkeit des angeschlossenen GPS Connectors)
Wichtig: Betreiben Sie Funkmodule niemals ohne Antennen! Ein Betrieb ohne Antennen kann Ihre Hardware beschädigen. |
---|
Erkennung Karte unter Linux
Mit folgendem Code können sie mittels usb-devices den Status der Quectel Modem Karte abfragen:
GPS Mode setzen
Mithilfe des Tools socat können sie den GPS Mode abfragen, aktiv setzen bzw. einschalten und verifizieren:
echo 'AT+QGPS?' | socat - /dev/ttyUSB3,crnl echo 'AT+QGPS=1' | socat - /dev/ttyUSB3,crnl echo 'AT+QGPS?' | socat - /dev/ttyUSB3,crnl
- hier sollte jede Aktion seitens des Modems mit einem OK quittiert bekommen.
Als Value muss der Wert: +QGPS: 1 gesetzt sein, dann ist GPS aktiv und einsatzfähig.
Überprüfung NMEA Sentences
Um zu überprüfen, ob die NMEA Sentences (d.h. die GPS Daten) eintreffen, verwenden Sie den folgenden Code. Hierzu muss eine aktive GPS Antenne verwendet werden.
echo 'AT+QGPSLOC=0' | socat - /dev/ttyUSB3,crnl
Jetzt können Sie die Daten im gewünschten Format (hier die Recommended minimum specific GNSS Data, kurz: RMC) exportieren.
An dieser Stelle werden dann u.a. Zeitstempel, Koordinaten ausgegeben.
echo 'AT+QGPSGNMEA="RMC"' | socat - /dev/ttyUSB1,crnl
Überprüfung der GPS Konfiguration und Codeseitige Verarbeitung
Um die Daten weiterverarbeiten zu können, müssen sie erst noch passend übersetzt werden.
Hier ein Datensatz:
$GPGGA,061015.00,4849.7360,N,01332.9844,E,1,03,1.0,332.0,M,0.0,M,,*6B
Der Datensatz setzt sich aus folgenden Teilen zusammen:
- $GPGGA: Dies ist der Nachrichtentyp, der angibt, dass es sich um eine GPS Fix Data-Nachricht handelt.
- Zeit: 061015.00: Die Zeit des Fix in UTC (Coordinated Universal Time).
- 4849.7360,N: Die Breitengrad-Koordinate. In diesem Fall 48°49.7360' Nord.
- 01332.9844,E: Die Längengrad-Koordinate. In diesem Fall 13°32.9844' Ost.
- 1: GPS-Qualitätsindikator: 0: kein GPS-Fix GPS-Fix (SPS - Standard Positioning Service)
- 03: Anzahl der verwendeten Satelliten für die Berechnung der Position
- 1.0: Horizontale Dilution of Precision (HDOP). Ein Maß für die Genauigkeit der horizontalen Position.
- 332.0,M: Höhe über dem Meeresspiegel in Metern.
- 0.0,M: Höhe der Geoid-Referenz über dem WGS84-Ellipsoid in Metern.
- (leer): Alter der DGPS-Daten (Differential GPS), in diesem Fall nicht angegeben.
- *6B: Prüfsumme, die zur Integritätsprüfung der Nachricht verwendet wird.
Scriptcode/bash
Die vorherigen Schritte sind im Folgenden in einem kurzen Code-Snippet zusammengestellt.
Wichtig: Um den Code auszuführen, muss socat als Paket installiert vorhanden sein
Die Ausführung des odes bewirkt:
- Es wird eine LogDatei gpslog.txt mit den umgewandelten Daten erstellt
- Es wird ein Link erstellt, mit dem unter Google Maps die Orte angezeigt werden
#!/bin/bash ### Dieser Code liest im Intervall alle 5 Sekunden GPS Daten ### direkt über das Modem / EM05E via USB aus, wandelt diese in ein ### passendes Format (Dezimalgrad) um. ### Erzeugt weiter verarbeitbare Daten / GoogleLink / LogDatei zur Validierung der GPS Daten ### by TK 2024 / wseifert # Funktion zum Extrahieren und Verarbeiten der GPS-LOC-Daten process_gpsloc_data() { while read -r line; do if [[ $line == +QGPSLOC:* ]]; then # Datensatz +QGPSLOC für Verarbeitung extrahieren GPSLOC_LINE=$(echo "$line" | cut -d ' ' -f 2-) # Datenfelder extrahieren IFS=',' read -r -a ADDR <<< "$GPSLOC_LINE" TIME="${ADDR[0]}" LAT="${ADDR[1]}" LON="${ADDR[2]}" HDOP="${ADDR[3]}" ALT="${ADDR[4]}" SATS="${ADDR[5]}" SPEED="${ADDR[6]}" COURSE="${ADDR[7]}" DATE="${ADDR[9]}" # Latitude und Longitude in Dezimalgrad umwandeln LAT_DEG=$(echo "${LAT:0:2}") LAT_MIN=$(echo "${LAT:2}") LAT_DEC=$(echo "$LAT_DEG + ($LAT_MIN / 60)" | bc -l) if [[ "${LAT: -1}" == "S" ]]; then LAT_DEC=$(echo "-$LAT_DEC" | bc); fi LON_DEG=$(echo "${LON:0:3}") LON_MIN=$(echo "${LON:3}") LON_DEC=$(echo "$LON_DEG + ($LON_MIN / 60)" | bc -l) if [[ "${LON: -1}" == "W" ]]; then LON_DEC=$(echo "-$LON_DEC" | bc); fi # Originalantwort der Schnittstelle ausgeben echo "Originalantwort der Schnittstelle: $line" # Aufschlüsselung der Felder anzeigen echo "Aufschlüsselung der Felder:" echo " - Time: $TIME" echo " - Latitude: $LAT_DEG° $LAT_MIN'" echo " - Longitude: $LON_DEG° $LON_MIN'" echo " - HDOP: $HDOP" echo " - Altitude: $ALT m" echo " - Satellites: $SATS" echo " - Speed: $SPEED km/h" echo " - Course: $COURSE°" echo " - Date: $DATE" # Google Maps Link erstellen GOOGLE_MAPS_LINK="https://www.google.com/maps?q=$LAT_DEC,$LON_DEC" # Google Maps Link ausgeben echo "Google Maps Link: $GOOGLE_MAPS_LINK" # Datenfeld für die weitere Verarbeitung erstellen DATA_FIELD="$TIME,$LAT_DEG,$LAT_MIN,$LON_DEG,$LON_MIN,$HDOP,$ALT,$SATS,$SPEED,$COURSE,$DATE" # Logdatei erstellen oder anhängen und Datenfeld schreiben echo "$DATA_FIELD" >> gpslog.txt # Datenfeld ausgeben echo "Datenfeld: $DATA_FIELD" fi done } # Hauptprogramm: AT-Befehl senden und Antwort verarbeiten echo 'AT+QGPSLOC=0' | socat - /dev/ttyUSB3,crnl | process_gpsloc_data
Hier der Code in Aktion:
Troubleshooting / FAQ
Folgende Fehler sind bislang bekannt:
CME Error
Beschreibung
Die Karte meldet einen CME Error.
Ursache
- Ein GPS Modul ist nicht vorhanden
- Ein GPS Modul ist nicht aktiv
- Es kann kein Fix mit einem Satelliten hergestellt werden
Lösung
- Das Quectel Modem neu starten:
echo 'AT+cfun=1,1 | socat - /dev/ttyUSB3,crnl
- Für eine Verbindung in 2D (Länge und Breite) werden 3 Satelliten mit Sichtverbindung für einen Fix benötigt. Dies kann mehrere Minuten dauern.
- Bei 3D (Länge, Breite und Höhe) werden 4 Satelliten mit Sichtverbindung benötigt und dauert dementsprechend länger.
- Firmwarestand der Modemkarte in Erfahrung bringen:
echo 'AT+CGMR' | socat - /dev/ttyUSB3,crnl
Autor: Wilfried Seifert Wilfried Seifert, tätig in der Abteilung Systems Engineering bei Thomas-Krenn, ist in seinem Arbeitsbereich für die System-/Prototypenentwicklung sowie Softwaredeployment / Rollout zuständig. LPIC 3 zertifiziert, beschäftigt sich u.a. mit Aufbau / Programmierung Embedded Systemen.
|