GPS Verbindung unter Linux aufbauen

Aus Thomas-Krenn-Wiki
Zur Navigation springen Zur Suche springen

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:

  • UNO127 DockExpansion.png
    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
  • 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

Usb-devices QuectelEM05E.png

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.
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 aktive 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.

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:

ReadOutScript active.png


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


Foto Wilfried Seifert.jpg

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.


Das könnte Sie auch interessieren

SIM-Karte im LES v3 installieren
Ubuntu LTE Verbindung
Ubuntu LTE Verbindung via Kommandozeile