Jump to content

python variablen problem


Recommended Posts

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

@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 :'(.

??????

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

@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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...