Barkeeper Posted June 20, 2012 at 03:12 PM Posted June 20, 2012 at 03:12 PM Hallo, ich habe mich durch die Python-Beispiele gearbeitet und bin meinem Ziel schon recht nahe. Nun benötige ich aber eure Hilfe… Ziel: Servo 6: Position wird durch RotaryPoti eingestellt (OK) Servo 5: wechselt Position von -90 auf +90 bei Tasterdruck an IO4-Bricklet (OK) Servo 4: wechselt beim loslassen des Taster für Servo 5 von -90 zu +90 und zurück zu -90 (mein Problem) Hintergrund: Fernsteuerung eines mechanischen Verschlusses (Copal 0) einer Fotokamera. Servo 6 verstellt die Blende Servo 5 löst den Verschluss aus Servo 4 spannt den Verschluss erneut (Anleitung des Verschlusses: Copal No. 0 nur für den Hintergrund: http://www.schneiderkreuznach.com/pdf/zubehoer/copal_0.pdf) Mein bisheriges Skript: #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID_SERVO = "***" # Changed to the UID of my Servo Brick UID_POTI = "***" # Changed to the UID of my Rotary Poti Bricklet UID_IO4 = "***" # Changed to the UID of my IO4 Bricklet from tinkerforge.ip_connection import IPConnection from tinkerforge.brick_servo import Servo from tinkerforge.bricklet_rotary_poti import RotaryPoti from tinkerforge.bricklet_io4 import IO4 # Callback function for position callback (parameter has range -150 to 150) def cb_position(poti_position): servo_position = 9000*poti_position/150 # Poti-Position: -9000/9000 print('Set Position/Velocity: ' + str(poti_position) + '/' + str(servo_position)) servo.set_position(6, servo_position) # Callback function for interrupts def cb_interrupt(interrupt_mask, value_mask): print('Interrupt by: ' + str(bin(interrupt_mask))) print('Value: ' + str(bin(value_mask))) if value_mask & (1 << 0): servo.set_position(5, 9000) else: servo.set_position(5, -9000) if __name__ == "__main__": ipcon = IPConnection(HOST, PORT) # Create IP connection to brickd servo = Servo(UID_SERVO) # Create device object poti = RotaryPoti(UID_POTI) # Create rotary poti device object io = IO4(UID_IO4) # Create input output 4 object ipcon.add_device(servo) # Add device to IP connection ipcon.add_device(poti) # Add device to IP connection ipcon.add_device(io) # Add device to IP connection # Enable interrupt on pin 0 io.set_interrupt(1 << 0) # Register callback for interrupts io.register_callback(io.CALLBACK_INTERRUPT, cb_interrupt) poti.set_position_callback_period(50) # set callback period to 50ms poti.register_callback(poti.CALLBACK_POSITION, cb_position) servo.set_pulse_width(6, 1000, 2000) servo.set_period(6, 19500) servo.set_acceleration(6, 0xFFFF) # Full acceleration servo.set_velocity(6, 0xFFFF) # Full speed servo.enable(6) # enable Servo No. 6 servo.set_pulse_width(5, 1000, 2000) servo.set_period(5, 19500) servo.set_acceleration(6, 0xFFFF) # Full acceleration servo.set_velocity(5, 0xFFFF) # Full speed servo.enable(5) # enable Servo No. 5 raw_input('Press Enter to exit\n') # Use input() in Python 3 ipcon.destroy() Wie bekomme ich es hin, dass der Servo 4 diese "hin- und her"-Bewegung beim loslassen des Tasters macht? Vielen Dank im Voraus, Barkeeper Quote
photron Posted June 20, 2012 at 04:27 PM Posted June 20, 2012 at 04:27 PM Wenn ich mir deinen Code ansehe, dann stimme ich zu, dass du Servo 6 mit dem Poti stellst. Servo 5 fährt auf +90 wenn der Taster gedrückt wird und fährt auf -90 zurück wenn du den Taster wieder loslässt. Soweit so gut, nun zu Servo 4: [...] # Callback function for interrupts def cb_interrupt(interrupt_mask, value_mask): print('Interrupt by: ' + str(bin(interrupt_mask))) print('Value: ' + str(bin(value_mask))) if value_mask & (1 << 0): servo.set_position(5, 9000) else: servo.set_position(5, -9000) servo.set_position(4, 9000) def cb_reached(servo_num, position): if servo_num == 4 and position == 9000: servo.set_position(4, -9000) if __name__ == "__main__": [...] servo.register_callback(servo.CALLBACK_POSITION_REACHED, cb_reached) servo.set_pulse_width(4, 1000, 2000) servo.set_period(4, 19500) servo.set_acceleration(4, 0xFFFF) # Full acceleration servo.set_velocity(4, 0xFFFF) # Full speed servo.enable(4) # enable Servo No. 4 [...] Loslassen des Taster bekommst du in cb_interrupt mit. Dort also Servo 4 nach +90 schicken. Dass Servo 4 +90 erreicht hat kannst du im Position Reached Callback mitbekommen: cb_reached. Wenn Servo 4 +90 erreicht hat ihn nach -90 schicken. 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.