Jump to content
View in the app

A better way to browse. Learn more.

Tinkerunity

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Geschrieben

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

Geschrieben

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.

Geschrieben
  • Autor

Die callbacks werden ausgeführt.

Mit "print str(sp), str(st)" werden die sich ändernden Werte ja angezeigt.

 

 

Geschrieben
  • Autor

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

??????

 

Geschrieben

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

Geschrieben
  • Autor

@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

Geschrieben
  • Autor

@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

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.