saschaho Geschrieben May 28, 2012 at 10:16 Geschrieben May 28, 2012 at 10:16 Hallo Tinkerforge Gemeinde, nachdem ich diese tollen Klötzchen entdeckt hatte, bin ich nun auch Fan geworden und bastle an den ersten Versuchen. Bin jetzt nicht die große Leuchte im Programmieren, aber es geht voran. Jetzt habe ich alledings ein seltsames (für mich) Problem. Ich bastle ein ferngesteuertes Auto mit einigen Features. Hier mal der Phyton-Code in Auszügen: ... from tinkerforge.ip_connection import IPConnection from tinkerforge.brick_master import Master from tinkerforge.bricklet_joystick import Joystick from tinkerforge.brick_dc import DC from tinkerforge.brick_servo import Servo sp = 0 st = 0 br = 0 def posi(x,y): global sp, st sp = int((-32767+y*16)/2) st = int(4095-x*2) def cb_pressed(): global br br = 1 if __name__ == "__main__": ipcon = IPConnection(HOST, PORT) # Create IP connection to brickd dc = DC(UID_DC) # Create device object ipcon.add_device(dc) # Add device to IP connection master = Master(UID) # Create device object ipcon.add_device(master) # Add device to IP connection js = Joystick(UID_JS) # Create device object ipcon.add_device(js) # Add device to IP connection servo = Servo(UID_SERVO) # Create device object ipcon.add_device(servo) # Add device to IP connection js.set_debounce_period(200) js.set_analog_value_callback_period(50) dc.set_pwm_frequency(2000) # Use PWM frequency of 10khz dc.set_drive_mode(1) # use 1 = Drive/Coast instead of 0 = Drive/Brake dc.enable() dc.set_acceleration(65000) # Slow acceleration servo.set_output_voltage(5500) servo.enable(0) print "ready" while br == 0: js.register_callback(js.CALLBACK_ANALOG_VALUE, posi) js.register_callback(js.CALLBACK_PRESSED, cb_pressed) dc.set_velocity(sp) servo.set_position(0, st) print str(sp), str(st) ipcon.destroy() Wobei der Servo und der DC-Brick nicht reagieren. Der print-Befehl zeigt mir beide Variablen an und sie reagieren auch auf den Joystick. Trage ich feste Werte statt z.b. sp ein geht´s ebenfalls. Auch wenn ich die beiden Zeilen dc.set_velocity(sp) servo.set_position(0, st) in die Funktion posi(x,y) schreibe funktioniert es. Will ich aber nicht. Für Hilfe wäre ich dankbar, da ich schon länger an dem Problem tüftle. Sascha Zitieren
Imbafestor Geschrieben May 28, 2012 at 10:35 Geschrieben May 28, 2012 at 10:35 Hey, bin jetzt kein Python Experte, allerdings musst du die Callbacks nur einmal (vor der while Schleife) hinzufügen. Dann würde ich als nächstes überprüfen, ob die von dir definierten Callbacks (posi und cb_pressed) die korrekte Signatur (dh. die Argumente bzw deren Typen in Ordnung sind), siehe dazu die Doku (http://www.tinkerforge.com/doc/Software/Bricks/DC_Brick_Python.html#callbacks). Als nächstes mit dem Debugger überprüfen, ob er überhaupt in die Callbacks reinläuft. Sollte es noch fragen geben, einfach her damit, gibt aber bestimmt noch jemanden hier, der sich mehr mit Python auskennt. Zitieren
saschaho Geschrieben May 28, 2012 at 11:10 Autor Geschrieben May 28, 2012 at 11:10 Die callbacks werden ausgeführt. Mit "print str(sp), str(st)" werden die sich ändernden Werte ja angezeigt. Zitieren
batti Geschrieben May 28, 2012 at 20:12 Geschrieben May 28, 2012 at 20:12 Hast du die Callbacks denn aus der Schleife rausgenommen? Die solltest du wirklich nur einmal registrieren. Zitieren
saschaho Geschrieben May 29, 2012 at 08:01 Autor Geschrieben May 29, 2012 at 08:01 @batti Habe die Aufrufe aus der Schleife rausgenommen. .... js.register_callback(js.CALLBACK_ANALOG_VALUE, posi) js.register_callback(js.CALLBACK_PRESSED, cb_pressed) print "ready" while br == 0: dc.set_velocity(sp) # speed servo.set_position(0, st) # Set position print str(sp), str(st) .... Ist aber wie gehabt, der print-Befehl zeigt mir die umgerechneten Joystickwerte aber Motor und Servo reagieren nicht :'(. ??? Zitieren
borg Geschrieben May 29, 2012 at 08:35 Geschrieben May 29, 2012 at 08:35 Ich vermute das ist irgendwie eine Art Scheduler Problem oder so, du spammst brickd ja regelrecht zu mit den settern. mach mal: from threading import Event cb_event = Event() # Im callback unten: cb_event.set() # In der while Schleife: cb_event.clear() cb_event.wait() Alternativ einfach erstmal ein time.sleep(0.1) oder so in die while Schleife, damit du nicht ununterbrochen Nachrichten sendest (bei dieser Möglichkeit hast du dann natürlich eine Latenz von maximal 100ms). Zitieren
saschaho Geschrieben May 29, 2012 at 09:03 Autor Geschrieben May 29, 2012 at 09:03 @borg Mit event läuft´s nicht, die Schleife bleibt stehen, aber mit time.sleep(0.1) geht´s jetzt. Das war es also.... Danke für die Hilfe Sascha Zitieren
borg Geschrieben May 29, 2012 at 09:12 Geschrieben May 29, 2012 at 09:12 naja, die Schleife bleibt solange stehen bis du oben bei callbacks das set() aufrufst, das ist ja Sinn der Sache . Zitieren
saschaho Geschrieben May 29, 2012 at 17:20 Autor Geschrieben May 29, 2012 at 17:20 @borg Den Sinn hatte ich verstanden. Wenn ich das set jedoch in die def posi(x,y) reinschreibe ändert sich nichts. Schreibe ich es hinter js.register_callback(js.CALLBACK_PRESSED, cb_pressed) bleibt das Proggi im wait stehen. Mit time() geht´s ganz gut. Danke nochmals Sascha Zitieren
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.