GPS Device

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hi.
    ich habe mir ewig viele tutorials und anleitungen und erklährungen im internet angesehen und nichts aber auch garnichts will klappen.
    also:

    ich würde gerne meinen Pi3 an ein GY-GPY6Mv2 Anschließen und die Daten:
    Sateliten Anzahl, Länge, Breite,Höhe über 0 0; Geschwindigkeit und Richtung/Kurs
    als variablen ausgeben lassen.
    alle ist angeschlossen, über GPIO und Mein Code sieht so aus.

    import serial
    import time
    s=serial.Serial('/dev/ttyS0',9600)
    s.close
    s.open
    time.sleep(1)
    while True:
    response = s.readline().split(",")
    print response


    dieser code gibt mit die NMEA Sätze aus, jedoch scheinbar zufällig dazwischen auch riesige Code... -fragmente -Zeilen -Dinge irgentwie sowas.
    Die einzelnen Zeilen kann ich selber aufsplitten, aber ich kann eben nicht anztändig daten auslesen, da diese riesigen datensätze die zwischendurch auftauchen auch schon m mal 10 sekunden lang hinte´reinander kommen können.

    Mein ziel war es mit

    if(response[0][0]=='$'):
    print response

    eine Art filter zu machen, der alle anderen Zeilen nicht anzeigt. Klappt gut, nur jetzt kommen die angezeigten Zeilen Sehr sehr unregelmäßig und manchmal garnicht.

    Ich hoffe jemand von euch kann mir helfen, oder mir schritt für schritt sagen, wie ich anders ans Ziel komme. Im Grunde möchte ich die oben genannten werte einfach als variablen in pyton haben, um damit weiterzuarbeiten.

    vielen dank im voraus euer
    morila

  • Hallo Morila,

    dann lasse Dir doch ersteinmal die Ausgabe des GPS-Sticks direkt ausgeben, um zu erkennen, was da so alles an Daten kommt.

    Code
    cat /dev/ttyS0


    Ich hoffe, dass Dein Stick auch hierüber zu erreichen ist.

    Dann erkennst Du zunächst, dass die ersten Bytes mit einer Kennung beginnen, die zu einem bestimmten Format mit eigenen Inhalten gehören. Dieses Format kannst Du u.a. über die Seite nachlesen.

    Jede Kennung enthält andere Daten, so dass Du möglicherweise mehrere dieser Kennungen verwenden musst, bis Du alle Dich interessierenden Informationen ausgelesen hast.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Und warum schreibst Du das, noch dazu mit dem Präfix "Tutorial", in den Bereich für Anleitungen?
    Kann doch nicht so schwer sein, da eine passende Rubrik zu finden ...
    Wenn Du die gefundenen Anleitungen auch so aufmerksam befolgt hast wie Du beim Posten bist, wundert es mich nicht, dass Du nicht zum Ziel kommst :fies:
    cu,
    -ds-

  • s.close
    s.open

    Das sind Funktionen und müssen so auch aufgerufen werden:
    s.close()
    s.open()

    Macht in der Reihenfolge aber kein Sinn und wichtig wäre auch zu prüfen ob das "öffnen" erfolgreich war... Wichtig wären auch die Einstellungen der Schnittstelle, die man vor solchen Befehlen wie Andreas nannte, auch erst vornehmen müsste, vor allem die Baudrate.

    Probier es mal damit:
    [code=php]
    #!/usr/bin/python2
    # -*- coding: utf-8 -*-

    from __future__ import print_function
    import serial
    import time
    import sys

    SerialPort = "/dev/ttyS0"
    SerialBaudrate = 9600

    #-------------------------------------------------------------------
    # serial docu: http://pyserial.sourceforge.net/pyserial.html
    #
    #initialization and open the port.
    #possible timeout values:
    # 1. None: wait forever, block call
    # 2. 0: non-blocking mode, return immediately
    # 3. x, x is bigger than 0, float allowed, timeout block call
    ser = serial.Serial()
    ser.port = SerialPort
    ser.baudrate = SerialBaudrate
    ser.bytesize = serial.EIGHTBITS #number of bits per bytes
    ser.parity = serial.PARITY_NONE #set parity check: no parity
    ser.stopbits = serial.STOPBITS_ONE #number of stop bits
    #ser.timeout = None #block read
    ser.timeout = 1 #non-block read
    #ser.timeout = 2 #timeout block read
    ser.xonxoff = False #disable software flow control
    ser.rtscts = False #disable hardware (RTS/CTS) flow control
    ser.dsrdtr = False #disable hardware (DSR/DTR) flow control
    ser.writeTimeout = 2 #timeout for write
    #-------------------------------------------------------------------

    #read from Arduino
    def Serial_read():
    while True:
    try:
    # Remove newline character '\n'
    response = ser.readline().strip()
    #response = ser.readline()
    if response:
    print("got: "+response),
    except serial.SerialException, e4:
    print("Could not open serial port '{}': {}".format(SerialPort, e4))
    except (KeyboardInterrupt, SystemExit):
    sys.exit()
    ser.close()

    if __name__ == '__main__':
    try:
    ser.open()
    except Exception, e:
    print("Error open serial port: " + str(e))
    exit()
    if ser.isOpen():
    try:
    ser.flushInput() #flush input buffer, discarding all its contents
    ser.flushOutput() #flush output buffer, aborting current output and discard all that is in buffer
    Serial_read()
    except Exception, e1:
    print("Error...: " + str(e1))
    except (KeyboardInterrupt, SystemExit):
    print("Schliesse Programm..")
    sys.exit()
    else:
    print("Cannot open serial port ")
    [/php]


  • Und warum schreibst Du das, noch dazu mit dem Präfix "Tutorial", in den Bereich für Anleitungen?
    Kann doch nicht so schwer sein, da eine passende Rubrik zu finden ...
    Wenn Du die gefundenen Anleitungen auch so aufmerksam befolgt hast wie Du bei posten bist, wundert es mich nicht, dass Du nicht zum Ziel kommst :fies:
    cu,
    -ds-


    Ich habe es in tutorial geschrieben, weil wie chon erwähnt ich auch eine Schritt für schritt Anleitung brauchen könnte. Es ist eben nur nicht nötig, wenn jemand stattdessen meinen Fehler findet
    Automatisch zusammengefügt:
    Wow. Vielen Dank r die schnellen Antworten. Ich versuche es morgen nochmal und melde mich bei weiteren problemen.

    echt klasse

    Einmal editiert, zuletzt von morila (11. April 2016 um 21:40)

  • Ob man eine Anleitung benötigt, hat dahingehend eine Anfrage aber nichts im Bereich Für Anleitungen verloren :fies: Dieser Forumsbereich ist Für Anleitungen, hier werden also Anleitungen gepostet, keine Hilfegesuche.
    Das steht aber auch ganz oben:

    Code
    Information
    In diesem Forum bitte nur Tutorials und Anleitungen posten. Bei Fragen bitte in einem passenden Subforum posten und ggfs auf das Tutorial verlinken.

    Du Suchst eine Anleitung, stellst aber keine zur Verfügung = falscher Bereich


  • ...
    Du Suchst eine Anleitung, stellst aber keine zur Verfügung = falscher Bereich


    ein gewisses Grundverständnis der deutschen Sprache sollte man bei jemandem, der meint kompetent genug zu sein um sich im Internet zu bewegen und aktiv an Foren teilzunehmen, ohne weitere Erklärung voraussetzen können ... :fies:
    cu,
    -ds-

  • Ich weiß dass ich was falsch gemacht hab. Das Thema wurde verschoben.
    Vielen Dank an der stelle an meingrafd für die schnelle antwort.
    der Output ist immernoch voller Schrott Output. Liegt das am inputbuffer? Wenn ja wie kann ich das ändern?

  • Was bedeutet denn Schrott? :) Wenn komische Zeichen angezeigt werden liegt das meist an einer falschen Baudrate.

    Leider finde ich nichts zum "GY-GPY6M" und kann dir daher nicht sagen welche Einstellungen du für die Serielle Schnittstelle vornehmen musst - hast du einen Link wo du das Module gekauft hast?

  • Na da haste dich bei der Typenbezeichnung vertan, nicht GY-GPY6Mv2 sondern GY-NEO6MV2 :fies:
    Laut => dieser Seite <= wird ein spezielles Protokoll verwendet: https://de.wikipedia.org/wiki/NMEA_0183
    Allerdings nennt die Seite folgende Einstellungen für UART:
    9600 Baud
    8 Bit
    keine Parität
    1 Stoppbit

    Googled man nach "python GY-NEO6MV2" findet man auch einige Projekte zu diesem GPS-Module, wie zum beispiel auf => diesem Blog <= ein ziemlich aktueller Beitrag.

    Desweiteren ist aber auch wichtig das du vorher die UART pins des Pi's frei gibst, die werden nämlich standardmäßig für die Serielle-Konsole vom Linux verwendet. Wie das geht habe ich => hier <= beschrieben wobei du eben die Beschreibung für Jessie beachten müsstest.

    Wie dem Blog zu entnehmen bedarf es spezieller Python-Module und einem gpsd Dienst:

    Code
    sudo apt-get install gpsd gpsd-clients python-gps

    Anschließend sollte das Script funktionieren:
    [code=php]
    #! /usr/bin/python
    # Written by Dan Mandle http://dan.mandle.me September 2012
    # License: GPL 2.0

    import os
    from gps import *
    from time import *
    import time
    import threading

    gpsd = None #seting the global variable

    os.system('clear') #clear the terminal (optional)

    class GpsPoller(threading.Thread):
    def __init__(self):
    threading.Thread.__init__(self)
    global gpsd #bring it in scope
    gpsd = gps(mode=WATCH_ENABLE) #starting the stream of info
    self.current_value = None
    self.running = True #setting the thread running to true

    def run(self):
    global gpsd
    while gpsp.running:
    gpsd.next() #this will continue to loop and grab EACH set of gpsd info to clear the buffer

    if __name__ == '__main__':
    gpsp = GpsPoller() # create the thread
    try:
    gpsp.start() # start it up
    while True:
    #It may take a second or two to get good data
    #print gpsd.fix.latitude,', ',gpsd.fix.longitude,' Time: ',gpsd.utc

    os.system('clear')

    print
    print ' GPS reading'
    print '----------------------------------------'
    print 'latitude ' , gpsd.fix.latitude
    print 'longitude ' , gpsd.fix.longitude
    print 'time utc ' , gpsd.utc,' + ', gpsd.fix.time
    print 'altitude (m)' , gpsd.fix.altitude
    print 'eps ' , gpsd.fix.eps
    print 'epx ' , gpsd.fix.epx
    print 'epv ' , gpsd.fix.epv
    print 'ept ' , gpsd.fix.ept
    print 'speed (m/s) ' , gpsd.fix.speed
    print 'climb ' , gpsd.fix.climb
    print 'track ' , gpsd.fix.track
    print 'mode ' , gpsd.fix.mode
    print
    print 'sats ' , gpsd.satellites

    time.sleep(5) #set to whatever

    except (KeyboardInterrupt, SystemExit): #when you press ctrl+c
    print "\nKilling Thread..."
    gpsp.running = False
    gpsp.join() # wait for the thread to finish what it's doing
    print "Done.\nExiting."
    [/php]

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!