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.
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 Connector (G) interne Verbindung
GPS Mode setzen
Mithilfe des Tools socat können sie den GPS Mode abfragen, aktiv setzen bzw. einschalten und verifizieren:
hier sollte jede Aktion seitens des Modems mit einem OK quittiert bekommen.
GPS Aktivierung auf EM-05E Quectel Card
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 passive GPS Antenne verwendet werden.
echo 'AT+QGPSLOC=0' | socat - /dev/ttyUSB3,crnl
GPS Location NMEA Ausgabe
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.
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 Codes 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 unterschiedlicher Architekturen zuständig.
LPIC 3 zertifiziert, beschäftigt sich u.a. mit Aufbau / Programmierung Embedded (x64/ARM) Systemen.