Barkeeper Posted June 20, 2012 at 03:12 PM Share 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 Link to comment Share on other sites More sharing options...
photron Posted June 20, 2012 at 04:27 PM Share 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 Link to comment Share on other sites More sharing options...
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.