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 zu diesem Kommentar
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 zu diesem Kommentar
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 zu diesem Kommentar
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 zu diesem Kommentar
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.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...