Jump to content

Servobricket und Modellbauservo


Recommended Posts

Hallo zusammen,

ich habe ein Problem mit dem Servobricklet.

Egal ob ich das Callback- oder das Configurationsbeispiel nehme, es ist bei 3 verschiedenen Servos immer gleich.

Der Servo dreht sehr schnell zu einer Position und danach langsam wieder zurück. Müsste das nicht immer die gleiche Geschwindigkeit sein?

Dann ist es auch so, dass sich die Servos nur um ca. 45 Grad drehen, obwohl doch Modellbauservos 180 Grad haben.

Wenn ich, nachdem der Servo gedreht hat, wieder neu starten will, passiert nichts oder es gibt eine Fehlermeldung, aber eben nicht immer.

Ich muss erst den USB-Stecker abziehen, dann kann ich wieder neu starten. Ich speise die Servos natürlich mit einem Netzteil. 

 

Fehlermeldung:


  File "D:\Daten\Thonny\Servo eigen.py", line 17, in <module>
    s.set_degree(0, -10000, 10000)

  File "D:\Daten\Thonny\tinkerforge\bricklet_servo_v2.py", line 339, in set_degree
    self.check_validity()

  File "D:\Daten\Thonny\tinkerforge\ip_connection.py", line 506, in check_validity
    device_identifier = self.ipcon.send_request(self, 255, (), '', 33, '8s 8s c 3B 3B H')[5] # <device>.get_identity

  File "D:\Daten\Thonny\tinkerforge\ip_connection.py", line 1314, in send_request
    raise Error(Error.TIMEOUT, msg, suppress_context=True)

Error: Did not receive response for function 255 in time (-1)

 

------------

Jetzt will der Servo gar nicht mehr drehen, auch wenn ich den USB-Stecker abziehe. Als ich den Brick Viewer gestartet habe, um mal zu sehen, ob ich da den Servo noch bewegen kann, kam als erstes eine Fehlermeldung:

Brick Viewer 2.4.17 on Windows 10 (10.0) Windows 10.0.19041 (winnt 10.0.19041) (PyQt 5.12, Qt 5.12.1)
Exception raised at 2021-02-21T18:23:11.707215+01:00

Traceback (most recent call last):
  File "brickv\async_call.py", line 110, in async_event_handler
  File "brickv\plugin_system\plugins\servo_v2\servo_v2.py", line 265, in get_degree_async
  File "brickv\knob_widget.py", line 292, in set_range
  File "brickv\knob_widget.py", line 330, in set_value
ZeroDivisionError: float division by zero

Active Threads:

Thread 1504 (Name: Thread-4):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "brickv\main.py", line 120, in run_with_except_hook
  File "threading.py", line 865, in run
  File "brickv\callback_emulator.py", line 120, in loop
  File "queue.py", line 179, in get
  File "threading.py", line 300, in wait


Thread 11892 (Name: Thread-3):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "brickv\main.py", line 120, in run_with_except_hook
  File "threading.py", line 865, in run
  File "brickv\callback_emulator.py", line 120, in loop
  File "queue.py", line 179, in get
  File "threading.py", line 300, in wait


Thread 13488 (Name: Brickd-Receiver):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "brickv\main.py", line 120, in run_with_except_hook
  File "threading.py", line 865, in run
  File "brickv\bindings\ip_connection.py", line 1019, in receive_loop


Thread 8344 (Name: Disconnect-Prober):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "brickv\main.py", line 120, in run_with_except_hook
  File "threading.py", line 865, in run
  File "brickv\bindings\ip_connection.py", line 1249, in disconnect_probe_loop
  File "queue.py", line 179, in get
  File "threading.py", line 300, in wait


Thread 12480 (Name: Callback-Processor):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "brickv\main.py", line 120, in run_with_except_hook
  File "threading.py", line 865, in run
  File "brickv\bindings\ip_connection.py", line 1226, in callback_loop
  File "queue.py", line 170, in get
  File "threading.py", line 296, in wait


Thread 2956 (Name: unknown):
  File "brickv\firmware_fetch.py", line 299, in run
  File "threading.py", line 552, in wait
  File "threading.py", line 300, in wait


Thread 3976 (Name: Dummy-2):
  File "brickv\async_call.py", line 128, in run
  File "queue.py", line 170, in get
  File "threading.py", line 296, in wait


Thread 9832 (Name: Thread-1):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "threading.py", line 865, in run
  File "brickv\main.py", line 195, in error_spawner
  File "brickv\main.py", line 139, in get_python_thread_stack_traces


Thread 8524 (Name: MainThread):
  File "brickv\main.py", line 372, in <module>
  File "brickv\main.py", line 369, in main
  File "brickv\main.py", line 235, in notify
  File "brickv\main.py", line 235, in notify

 

 

 

Link to post
Share on other sites

Bezüglich der Exception und der Geschwindigkeit: Kannst du einmal deine "Servo eigen.py" hier anhängen?

Bezüglich der 180°: Du musst im Datenblatt des Herstellers deines Servos schauen wie viel Grad das Servo drehen kann und bei welcher Pulsweite welcher Winkel erreicht ist.

Das Servo Bricklet geht per Default von einem Pulsweiten-Minimum von 1000µs und Maximum von 2000µs aus. Wenn du kein Datenblatt hast kannst du die Werte solange verändern bis der gewünschte Winkel erreicht ist. In deinem Fall also das Minimum verkleinern und das Maximum vergrößern. Die Pulsweite kann per set_pulse_width pro Servo gesetzt werden.

Link to post
Share on other sites

Hallo borg,

Datei hängt an.

Ich habe leider keine Daten zu den Servos, außer das sie 180Grad haben. Ich kenne das auch nur, dass die Pulsweite immer zwischen 1000 und 2000 liegt.

Aber ich werde mit anderen Werten probieren.

Ich habe aber auch ein Problem mit dem BrickViewer. Sobald ich auf den Servo gehe, kommt die Fehlermeldung. Andere Bricklets funktionieren weiterhin.

Es kommt folgende Fehlermeldung:

Brick Viewer 2.4.17 on Windows 10 (10.0) Windows 10.0.19041 (winnt 10.0.19041) (PyQt 5.12, Qt 5.12.1)
Exception raised at 2021-02-22T21:52:50.708918+01:00

Traceback (most recent call last):
  File "brickv\async_call.py", line 110, in async_event_handler
  File "brickv\plugin_system\plugins\servo_v2\servo_v2.py", line 265, in get_degree_async
  File "brickv\knob_widget.py", line 292, in set_range
  File "brickv\knob_widget.py", line 330, in set_value
ZeroDivisionError: float division by zero

Active Threads:

Thread 15368 (Name: Thread-7):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "brickv\main.py", line 120, in run_with_except_hook
  File "threading.py", line 865, in run
  File "brickv\callback_emulator.py", line 120, in loop
  File "queue.py", line 179, in get
  File "threading.py", line 300, in wait


Thread 15392 (Name: Thread-6):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "brickv\main.py", line 120, in run_with_except_hook
  File "threading.py", line 865, in run
  File "brickv\callback_emulator.py", line 120, in loop
  File "queue.py", line 179, in get
  File "threading.py", line 300, in wait


Thread 8364 (Name: Brickd-Receiver):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "brickv\main.py", line 120, in run_with_except_hook
  File "threading.py", line 865, in run
  File "brickv\bindings\ip_connection.py", line 1019, in receive_loop


Thread 8424 (Name: Disconnect-Prober):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "brickv\main.py", line 120, in run_with_except_hook
  File "threading.py", line 865, in run
  File "brickv\bindings\ip_connection.py", line 1249, in disconnect_probe_loop
  File "queue.py", line 179, in get
  File "threading.py", line 300, in wait


Thread 15500 (Name: Callback-Processor):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "brickv\main.py", line 120, in run_with_except_hook
  File "threading.py", line 865, in run
  File "brickv\bindings\ip_connection.py", line 1226, in callback_loop
  File "queue.py", line 170, in get
  File "threading.py", line 296, in wait


Thread 15588 (Name: unknown):
  File "brickv\firmware_fetch.py", line 299, in run
  File "threading.py", line 552, in wait
  File "threading.py", line 300, in wait


Thread 15488 (Name: Dummy-2):
  File "brickv\async_call.py", line 128, in run
  File "queue.py", line 170, in get
  File "threading.py", line 296, in wait


Thread 15448 (Name: Thread-1):
  File "threading.py", line 885, in _bootstrap
  File "threading.py", line 917, in _bootstrap_inner
  File "threading.py", line 865, in run
  File "brickv\main.py", line 195, in error_spawner
  File "brickv\main.py", line 139, in get_python_thread_stack_traces


Thread 16336 (Name: MainThread):
  File "brickv\main.py", line 372, in <module>
  File "brickv\main.py", line 369, in main
  File "brickv\main.py", line 235, in notify

 

Was soll, kann ich machen?

 

Servo eigen.py

Link to post
Share on other sites

Der division by zero bug im Brick Viewer ist im git schon gefixt.

Das kommt zustande weil in der "Servo eigen.py" per set_degree die Winkel von 100° bis 100° gesetzt sind. Da müsste stattdessen

s.set_degree(0, -10000, 10000)

stehen um das auf -100° bis 100° zu setzen. Diese Angabe ist aber nur eine Skalierung zwischen der Pulsweite. Ich würde sowas wie

s.set_degree(0, -9000, 9000)
s.set_pulse_width(0, 850, 2150)

ausprobieren!

Link to post
Share on other sites

Hallo borg,

danke für den degree-Tipp, beim probieren ist wohl das Minuszeichen abhanden gekommen.😪

Habe ein wenig rumprobiert und mit den Werten s.set_pulse_width(0, 500, 2420) funktioniert der Servo perfekt.

jetzt habe ich nur noch ein Problem:

Mit dem Programm fährt der Servo normalerweise auf die Position 9000, wenn der Servo beim Programmstart auf z.B. um Position 0 steht.

Sobald ich die zweite Positionsangabe im Programm lasse, fährt er gleich auf die Position -9000. Warum?

Laut meinem Verständnis muss er erst die Position 9000 anfahren und danach die andere Position -9000.

Oder wie muss ich das sonst programmieren?

Er soll also erst nach 9000 und danach nach -9000 fahren.

 

HOST = "localhost"
PORT = 4223
UID = "SyN"                   # Change XYZ to the UID of your Servo Bricklet 2.0

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_servo_v2 import BrickletServoV2

if __name__ == "__main__":
    ipcon = IPConnection() # Create IP connection
    s = BrickletServoV2(UID, ipcon) # Create device object

    ipcon.connect(HOST, PORT) # Connect to brickd
    # Don't use device before ipcon is connected

    # Servo 1: Connected to port 0, period of 19.5ms, pulse width of 1 to 2ms
    #          and operating angle -100 to 100°
    s.set_degree(0, -9000, 9000)
    s.set_pulse_width(0, 500, 2420)
    s.set_period(0, 19500)
    s.set_motion_configuration(0, 400000, 25000, 25000) # Full velocity with slow ac-/deceleration

    s.set_position(0, 9000)        # Set to most right position
    s.set_enable(0, True)
    s.set_position(0, -9000)       
    input("Press key to exit\n") 

    s.set_enable(0, False)

    ipcon.disconnect()

 

Link to post
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.

×
×
  • Create New...