[PYTHON] Holen Sie sich Ihren aktuellen Standort mit einem USB-GPS-Empfänger

Ich habe einen USB-Empfänger zur Hand, also werde ich ihn an eine Raspeltorte anschließen und meinen aktuellen Standort ermitteln. [BU-353S4](https://www.amazon.co.jp/GlobalSat-BU-353S4-GLOBALSAT-BU-353S4-SiRFstarIV%E6%90%AD%E8%BC%89-GPS%E3%83% AC% E3% 82% B7% E3% 83% BC% E3% 83% 90USB-% E6% 9D% B1% E4% BA% AC% E9% 80% 9A% E5% 95% 86% E6% AD% A3 % E8% A6% 8F% E8% B2% A9% E5% A3% B2 / dp / B00HZCQYLU) wurde verwendet.

Obwohl es sich um eine analoge Methode handelt, führen Sie den folgenden Befehl vor und nach dem Einsetzen und Entfernen des GPS-Empfängers aus, um das Zielgerät zu identifizieren.

$ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3  /dev/ttyUSB4

Dieses Mal gehen wir davon aus, dass es als "/ dev / ttyUSB4" erkannt wird.

Skript zum Abrufen des GPS-Werts

gps.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import serial

#Gerätespezifikation
DEV = '/dev/ttyUSB4'

#Bruchnotation von Breiten- und Längengrad ⇒ Umrechnungsfunktion in Frequenznotation
def convert(x):
    result = (float(x[0:-7])+(float(x[-7:])/60))
    return result

#Eine Funktion, die den erforderlichen Wert als Zeichenfolge zurückgibt
def get_str(x):
    result =""
    if (x[2] == "A") and (x[2] != ""):
        result += "state:"+"ok "
    elif (x[2] == "V") and (x[2] != ""):
        result += "state:"+"alert "
    else:
        result += "state:"+"no data "
    if x[7] != "":
        result += 'speed:'+ '%.1f' % (float(x[7])*1.852) + "km/h "
    else:
        result += "speed:"+"no data "
    if (x[4] == "N")  and ( x[4] != "" ):
        result += "north latitude:" + '%.4f' % convert(x[3]) +' '
    elif (x[4] == "S")  and ( x[4] != "" ):
        result += "south latitude:" + '%.4f' % convert(x[3]) +' '
    else:
        result += "latitude:"+"no data "
    if (x[6] == "E") and ( x[6] != ""):
        result += "east longitude:" + '%.4f' % convert(x[5]) +' '
    elif (x[6] == "W") and ( x[6] != ""):
        result += "west longitude" + '%.4f' % convert(x[5]) +' '
    else:
        result += "logitude:"+"no data "
    return result

#Prüfsummenüberprüfung
def checksum_verify(c_sum,data):
    c_data = '0x00'
    for i in range(1,len(data)-3):
        c_data = hex(int(c_data,16) ^ int(hex(ord(data[i])),16))
    if int(c_sum,16) == int(c_data,16):
        return True
    else:
        return False


#Hauptschleife
#Verarbeiten Sie nur den GPRMC-Wert. Verarbeiten Sie nicht, wenn die Anzahl der Elemente dieses Werts weniger als 13 beträgt und er nicht gut erfasst wird
try:
    #Holen Sie sich seriell
    sr = serial.Serial(DEV, 4800)
    while 1:
        #Zeilenvorschubcode ausgeschlossen
        tmp = sr.readline().rstrip()
        #Prüfsumme prüfen
        if checksum_verify(tmp[-2:],tmp):
            tmp2 = tmp.split(",")
            #Nur GPRMC verarbeiten
            if (tmp2[0] == '$GPRMC'):
                line = get_str(tmp2)
                print 'OK:'+tmp
                print line
                time.sleep(0.5)
        else:
            print 'NG:'+tmp
finally:
    print 'serial_close'
    sr.close()

Ergänzende Erklärung

Jeder Wert von GPRMC ist wie folgt

tmp2[1]UTC-Zeit Japanische Standardzeit-9 Stunden
tmp2[2]Status A ist normal V ist Warnung
tmp2[3]Breite(Bruchnotation)
tmp2[4](N)Nördlicher Breitengrad(S)Südlicher Breitengrad
tmp2[5]Längengrad(Bruchnotation)
tmp2[6](E)Osten(W)Ist es Nishikei?
tmp2[7]Bewegungsgeschwindigkeitsknoten
tmp2[8]Wahre Orientierung
tmp2[9]Vereinbarung Weltzeit(UTC)TTMJJ-Format
tmp2[12]Prüfsumme

※ Bewegungsgeschwindigkeit Knoten ist 1,852 mal und km / h

※ Prüfsumme XOR die Zeichen zwischen "" und "*", um festzustellen, ob sie denselben Wert haben  `GPRMC,034357.279,V,,,,,,,020117,,,N*42 Wenn oben,  GPRMC,034357.279,V,,,,,,,020117,,,N` Ist das Berechnungsziel

So beheben Sie das Problem, wenn Sie auf das Gerät verweisen

Es ist unpraktisch, dass es je nach angeschlossenem Gerät und Umgebung jedes Mal in "/ dev / ttyUSB0" oder "/ dev / ttyUSB4" wechselt. Es kann nicht im Autostart-Skript verwendet werden. In einem solchen Fall ist dies eine Gegenmaßnahme.

Verwendung der Geräte-ID

Wenn Sie sich für einen USB-Anschluss entschieden haben, überprüfen Sie die folgenden Informationen und verwenden Sie ihn.

$ ls -al /dev/serial/by-path
total 0
drwxr-xr-x 2 root root 140 Jan  2 01:30 .
drwxr-xr-x 4 root root  80 Jan  1 20:03 ..
lrwxrwxrwx 1 root root  13 Jan  2 01:30 platform-3f980000.usb-usb-0:1.3:1.0-port0 -> ../../ttyUSB4
lrwxrwxrwx 1 root root  13 Jan  1 20:03 platform-3f980000.usb-usb-0:1.4:1.0-port0 -> ../../ttyUSB0
lrwxrwxrwx 1 root root  13 Jan  1 20:03 platform-3f980000.usb-usb-0:1.4:1.1-port0 -> ../../ttyUSB1
lrwxrwxrwx 1 root root  13 Jan  1 20:03 platform-3f980000.usb-usb-0:1.4:1.2-port0 -> ../../ttyUSB2
lrwxrwxrwx 1 root root  13 Jan  1 20:03 platform-3f980000.usb-usb-0:1.4:1.3-port0 -> ../../ttyUSB3

Wenn das Zielgerät "/ dev / ttyUSB4" ist, beheben Sie es wie folgt

#Gerätespezifikation
DEV = '/dev/ttyUSB4'
↓
DEV = '/dev/serial/by-path/platform-3f980000.usb-usb-0:1.3:1.0-port0'

Beschreibung in der udev-Regel (USB-Anschluss kann geändert werden)

Informationen zur udev-Regel finden Sie unter Oracle Über die udev-Regel.

Führen Sie den folgenden Befehl aus, um die Informationen zu überprüfen (wenn / dev / ttyUSB4 das Zielgerät ist). udevadm info -a -p $(sudo udevadm info -q path -n /dev/ttyUSB4) Überprüfen Sie Folgendes aus dem angezeigten

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3':
    KERNELS=="1-1.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="1.3"
    ATTRS{idVendor}=="067b"
    ATTRS{speed}=="12"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="21"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="100mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0400"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 1.10"
    ATTRS{urbnum}=="65169"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Prolific Technology Inc. "
    ATTRS{removable}=="removable"
    ATTRS{idProduct}=="2303"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="USB-Serial Controller D"

Extrahieren Sie die folgenden drei Punkte

ATTRS{idProduct}=="2303"
ATTRS{idVendor}=="067b"
ATTRS{product}=="USB-Serial Controller D"

Erstellen Sie eine Datei wie "70-bu353s4.rules" unter "/ etc / udev / rules.d" und geben Sie die folgenden Informationen ein.

70-bu353s4.rules


ATTRS{idProduct}=="2303",ATTRS{idVendor}=="067b",ATTRS{product}=="USB-Serial Controller D",SYMLINK+="bu353s4"

Legen Sie nach dem Erstellen der Datei den GPS-Empfänger ein und entfernen Sie ihn Jetzt können Sie mit / dev / bu353s4 eine Verbindung zum GPS-Empfänger herstellen. Korrigieren Sie dies wie folgt

#Gerätespezifikation
DEV = '/dev/ttyUSB4'
↓
DEV = '/dev/bu353s4'

Recommended Posts

Holen Sie sich Ihren aktuellen Standort mit einem USB-GPS-Empfänger
Rufen Sie mit Python eine Liste der in der aktuellen Umgebung installierten Pakete ab
Rufen Sie die aktuellen Standortinformationen und den Benutzeragenten in Python ab
Holen Sie sich mit Docker eine lokale Umgebung für DynamoDB
Holen Sie sich viele Ihrer Tweets mit Tweepy
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Holen Sie sich ein Ticket für einen Themenpark mit Python
Ich erhalte einen UnicodeDecodeError, wenn ich mit mod_wsgi laufe
Holen Sie sich eine Liste der IAM-Benutzer mit Boto3
Zubu Amateur will Python starten
Holen Sie sich mit Poetry eine schnelle Python-Entwicklungsumgebung