walterberger Posted March 28, 2016 at 03:08 PM Share Posted March 28, 2016 at 03:08 PM Hallo Ich bin neu in der Welt von Tinkerforge und mache gerade die ersten Versuche mit dem GPS-Bricklet. Dazu habe ich das Callback beispiel genommen (python) und für callback_motion angepasst. Das funktioniert soweit das ich mir fortlaufend die Geschwindigkeit anzeigen lassen kann. Die Richtung (course) benötige ich nicht. Wie muss ich aber nun speed definieren, damit ich mit dem Wert berechnungen anstellen kann? Quote Link to comment Share on other sites More sharing options...
photron Posted March 29, 2016 at 09:02 AM Share Posted March 29, 2016 at 09:02 AM Die Geschwindigkeit ist in 1/100 km/h: http://www.tinkerforge.com/de/doc/Software/Bricklets/GPS_Bricklet_Python.html#BrickletGPS.get_motion Du kannst also den speed Wert nehmen, ihn durch 100 teilen und hast dann die Geschwindigkeit in km/h. Quote Link to comment Share on other sites More sharing options...
walterberger Posted March 29, 2016 at 11:08 AM Author Share Posted March 29, 2016 at 11:08 AM Vielen Dank, aber leider hilft mir das nicht weiter. Die Frage war vielleicht etwas schlecht verständlich. Unten mal mein Programm, dort wo fast am Ende zahl = 1 steht sollte anstelle von 1 die Geschwindigkeit (speed) stehen. Wenn ich dort einfach speed eingebe erhalte ich folgende Fehlermeldung: Traceback (most recent call last): File "C:\Users\wb\AppData\Local\Programs\Python\Python35-32\Servo-Test-1\GPS-7Meter-1.py", line 40, in <module> zahl = speed NameError: name 'speed' is not defined Wie muss ich speed dort definieren? #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID = "qG8" # Change to your UID from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_gps import BrickletGPS import time ende = 6.5 # Callback function for coordinates callback def cb_motion(course, speed): #print("Speed: " + str(speed/360)) #print("Longitude: " + str(longitude/1000000.0) + "° " + ew) #print("") if __name__ == "__main__": ipcon = IPConnection() # Create IP connection gps = BrickletGPS(UID, ipcon) # Create device object ipcon.connect(HOST, PORT) # Connect to brickd # Don't use device before ipcon is connected # Register coordinates callback to function cb_coordinates gps.register_callback(gps.CALLBACK_MOTION, cb_motion) # Set period for coordinates callback to 1s (1000ms) # Note: The coordinates callback is only called every second # if the coordinates has changed since the last call! # gps.set_coordinates_callback_period(1000) gps.set_motion_callback_period(100) zahl = 1 while 1: start = 0 while start <= ende: start = start + zahl print ("Summe", start) time.sleep(1) # input("Press key to exit\n") # Use input() in Python 3 ipcon.disconnect() Quote Link to comment Share on other sites More sharing options...
photron Posted March 29, 2016 at 11:33 AM Share Posted March 29, 2016 at 11:33 AM Das was du das tun willst funktioniert auch mit Callbacks. Aber fang am besten erst mal einfach mit Gettern an: #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID = "qG8" # Change to your UID from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_gps import BrickletGPS import time ende = 6.5 if __name__ == "__main__": ipcon = IPConnection() # Create IP connection gps = BrickletGPS(UID, ipcon) # Create device object ipcon.connect(HOST, PORT) # Connect to brickd # Don't use device before ipcon is connected while True: start = 0 while start <= ende: course, speed = gps.get_motion() # speed in 1/100 km/h start = start + speed time.sleep(0.1) print("Summe", start) time.sleep(1) ipcon.disconnect() Mit ist nur nicht klar, warum du den speed aufsummieren möchtest bis die Summe 0,065 km/h erreicht hat. Quote Link to comment Share on other sites More sharing options...
Nic Posted March 29, 2016 at 11:56 AM Share Posted March 29, 2016 at 11:56 AM Nur eine kleine Ergänzung: File "C:\Users\wb\AppData\Local\Programs\Python\Python35-32\Servo-Test-1\GPS-7Meter-1.py", line 40, in <module> zahl = speed NameError: name 'speed' is not defined Die Variable "speed" war im Haupt(main)code nicht definiert und daher unbekannt. Diese war nur innerhalb des Callback-Aufrufs bekannt und auch nur dort nutzbar. Mit z.B. start = 0 wird die Variable "start" erst definiert und erhält eine Wertzuweisung. Es kommt aber darauf an wo (=scope: https://de.wikipedia.org/wiki/Variable_%28Programmierung%29#G.C3.BCltigkeitsbereich_von_Variablen_.28Scope.29) man diese festlegt. Quote Link to comment Share on other sites More sharing options...
walterberger Posted March 29, 2016 at 01:04 PM Author Share Posted March 29, 2016 at 01:04 PM Vielen Dank, das funktioniert. Ja das Ganze so wie es jetzt da steht macht natürlich keinen Sinn. Letztendlich soll nicht die Geschwindligkeit sondern der Weg (v*t) aufsummiert werden um alle X Meter eine Aktion auszulösen. Dazu habe ich mir gedacht ein Industrial Quad Relay Bricklet zu verwenden und einen Ausganz kurz ein und wieder auszuschalten. Und irgendwie muss ich die Endlosschlaufe auch noch ferngesteuert aktivieren und deaktivieren können. Da habe ich mir gedacht das geht am besten mit einem IO-4 Bricklet. Könnte das so grundsätzlich funktionieren? Der Ursprung des Ganzen ist übrigens das hier: http://www.tinkerunity.org/forum/index.php/topic,3398.0.html Das was du das tun willst funktioniert auch mit Callbacks. Aber fang am besten erst mal einfach mit Gettern an: Mit ist nur nicht klar, warum du den speed aufsummieren möchtest bis die Summe 0,065 km/h erreicht hat. Quote Link to comment Share on other sites More sharing options...
walterberger Posted April 6, 2016 at 07:01 PM Author Share Posted April 6, 2016 at 07:01 PM Mittlerweilen habe ich das Programm soweit zum laufen gebracht das es mit dem PC funktioniert. Die Genauigkeit muss ich noch austesten. Hier mal der Code: #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID = "qG8" # Change to your UID from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_gps import BrickletGPS import time ende = 7 if __name__ == "__main__": ipcon = IPConnection() # Create IP connection gps = BrickletGPS(UID, ipcon) # Create device object ipcon.connect(HOST, PORT) # Connect to brickd # Don't use device before ipcon is connected while True: start = 0 while start <= ende: course, speed = gps.get_motion() # speed in 1/100 km/h start = start + (speed/3600) time.sleep(0.1) print("Summe", start) HOST = "localhost" PORT = 4223 UID = "roq" # Change to your UID from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_industrial_quad_relay import BrickletIndustrialQuadRelay import time if __name__ == "__main__": ipcon = IPConnection() # Create IP connection iqr = BrickletIndustrialQuadRelay(UID, ipcon) # Create device object ipcon.connect(HOST, PORT) # Connect to brickd iqr.set_value(1111) time.sleep(0.3) iqr.set_value(0000) ipcon.disconnect() ipcon.disconnect() Dazu habe ich noch ein paar Fragen: - Ist das so richtig wie ich die verschiedenen Bicklets aufrufe oder macht man das anders? - Wenn die Berechnung den gewünschten Wert erreicht hat erflgt das auslösen. Dort ist eine Pause von 0.3 Sec drinn, muss so sein. Sehe ich das richtig das in der Zeit die Neuberechnung noch nicht läuft? Wenn ja wie muss das seine damit die Neuberechnung unabhänig von der Auslösung weiterläuft? - Nun möchte ich den gesammten Ablauf mit einem externen Schalter via IO-4 Bricklet steuern. Wenn der Schalter offen ist sollte eine art Warteschlaufe laufen und wenn der Schalter geschlossen ist sollte die Berechnung und Auslösung durchlaufen. Wie muss ich das machen, da habe ich leider keine Idee? - Und noch was anderes, schlussendlich soll das alles auf einem RedBrick laufen. Denn habe ich auch schon hier und nach Anleitung die SD-Karte vorbereitet. Nur tut sich leider nicht, der Brick wird nicht erkannt. Gemäss Anleitung sollte die grüne LED blinken, aber bei meinem leuchter diese dauernd. Was könnte das sein? Danke und einen schönen Abend. Quote Link to comment Share on other sites More sharing options...
photron Posted April 7, 2016 at 07:22 AM Share Posted April 7, 2016 at 07:22 AM - Ist das so richtig wie ich die verschiedenen Bicklets aufrufe oder macht man das anders? Das würde man eher so machen. Die Beispiele haben verschiedene Abschnitte und man würde die Beispiele in ihre Abschnitte zerlegen und diese dann zusammenfügen: #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID_GPS = "qG8" # Change to your UID UID_IQR = "roq" # Change to your UID from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_gps import BrickletGPS from tinkerforge.bricklet_industrial_quad_relay import BrickletIndustrialQuadRelay import time ende = 7 if __name__ == "__main__": ipcon = IPConnection() # Create IP connection gps = BrickletGPS(UID_GPS, ipcon) # Create device object iqr = BrickletIndustrialQuadRelay(UID_IQR, ipcon) # Create device object ipcon.connect(HOST, PORT) # Connect to brickd # Don't use device before ipcon is connected while True: start = 0 while start <= ende: course, speed = gps.get_motion() # speed in 1/100 km/h start = start + (speed/3600) time.sleep(0.1) print("Summe", start) iqr.set_value(0b1111) time.sleep(0.3) iqr.set_value(0b0000) ipcon.disconnect() - Wenn die Berechnung den gewünschten Wert erreicht hat erflgt das auslösen. Dort ist eine Pause von 0.3 Sec drinn, muss so sein. Sehe ich das richtig das in der Zeit die Neuberechnung noch nicht läuft? Wenn ja wie muss das seine damit die Neuberechnung unabhänig von der Auslösung weiterläuft? Der sleep Aufruf hält das Programm (genauer gesagt den einzigen Thread des Programms) da an. Die Neuberechnung wird also auch angehalten. Damit das gleichzeitig laufen kann, kannst du entweder einen weiteren Thread benutzten, oder den Motion Callback des GPS Bricklets, der im Hintergrund auch in einem weiteren Thread ausgeführt wird. Du solltest dich wahrscheinlich erstmal zumindest kurz mit Threads und Nebenläufigkeit beschäftigen. Mit Threads kann man in einem Programm mehrere Dinge parallel ausführen. - Nun möchte ich den gesammten Ablauf mit einem externen Schalter via IO-4 Bricklet steuern. Wenn der Schalter offen ist sollte eine art Warteschlaufe laufen und wenn der Schalter geschlossen ist sollte die Berechnung und Auslösung durchlaufen. Wie muss ich das machen, da habe ich leider keine Idee? Du musst dazu in deinem Programm also den Zustand des IO-4 Bricklet Abfragen und dann entweder die Berechnung durchführen, oder weiter das IO-4 Bricklet abfragen. - Und noch was anderes, schlussendlich soll das alles auf einem RedBrick laufen. Denn habe ich auch schon hier und nach Anleitung die SD-Karte vorbereitet. Nur tut sich leider nicht, der Brick wird nicht erkannt. Gemäss Anleitung sollte die grüne LED blinken, aber bei meinem leuchter diese dauernd. Was könnte das sein? Dann ist der Brick im Booten stecken geblieben? Ist das eine SD Karte von uns? Wenn nicht, wie schnell ist beim lesen. Es kann Probleme mit sehr langsamen SD Karten geben. Wenn es dass nicht ist, dann versuch mal das Image neu auf die SD Karte zu schreiben. Quote Link to comment Share on other sites More sharing options...
walterberger Posted April 7, 2016 at 02:34 PM Author Share Posted April 7, 2016 at 02:34 PM Vielen Dank für die Antwort. Wie muss die Abfrage des IO-4 genau aussehen? Hast du da vielleicht ein Beispiel. Die Speicherkarte habe ich zusammen mit dem RedBrick bei eienm Reseller gekauft. Eigentlich bin ich davon ausgegeangen das das Image schon auf der Karte ist, war es aber nicht. Ich habe das Image mit Windows gemäss Anleitung auf die Karte geschrieben. Aber vielleicht ist die Karte nicht gut, ich werde mir mal eine andere besorgen. Auf diese hier habe ich das Image schon 2x versucht zu schreiben. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.