Mausschieber Posted February 21, 2021 at 05:33 PM Posted February 21, 2021 at 05:33 PM 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 Quote
borg Posted February 22, 2021 at 09:06 AM Posted February 22, 2021 at 09:06 AM 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. Quote
Mausschieber Posted February 22, 2021 at 09:06 PM Author Posted February 22, 2021 at 09:06 PM 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 Quote
borg Posted February 23, 2021 at 09:58 AM Posted February 23, 2021 at 09:58 AM 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! Quote
Mausschieber Posted February 24, 2021 at 09:56 PM Author Posted February 24, 2021 at 09:56 PM 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() Quote
borg Posted February 25, 2021 at 08:36 AM Posted February 25, 2021 at 08:36 AM Du müsstest bevor du die neue Position setzt einmal die entsprechende Zeit warten bis der Servo an der ersten Position angekommen ist. also zum Beispiel oben "import time" und dann "time.sleep(5)" vor dem zweiten set_position. Quote
Mausschieber Posted February 25, 2021 at 07:34 PM Author Posted February 25, 2021 at 07:34 PM Okay, so funktioniert es, meist. Ich glaube langsam, dass die Servos nicht in Ordnung sind, denn mal klappt es, mal nicht. Ich bestelle jetzt mal von Euch einen Servo, mal schauen, wie das dann funktioniert. Danke schon mal. Quote
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.