Stap 8: De sprong motion Controller te koppelen aan een servomotor
Nu hopelijk hebt u uw apparaat sprong beweging omhoog en lopen die we gaan maken onze eerste program stream gegevens van het apparaat en dan we gonna koppelen tot onze servomotor met de pyduino-bibliotheek. Elke keer wanneer we uitvoert een script moeten we de leapd-service wordt uitgevoerd. Om te weten dat deze service draait dat u moet zitten kundig voor zien de 3 verlichte LEDs op uw apparaat sprong. (Zie ON afbeelding in de vorige stap)
Onze eerste sprong script zal worden samengesteld uit verschillende belangrijke onderdelen. Er is een controller die verbindt naar het apparaat sprong en een luisteraar klasse die de gegevens van de opsporingssoftware van zal krijgen. Voor een grondige tutorial over hoe u een eenvoudige sprong script check out: https://developer.leapmotion.com/documentation/pyt...
Ik geef een beknopt overzicht van wat het stukje code hieronder doet en hoe het werkt. In het grootste deel van de code initialiseren we een exemplaar van onze luisteraar en controller klassen daarna voegen we de aangepaste luisteraar aan onze controller. Het belangrijkste deel van het script is wat er gebeurt binnen de luisteraar. De luisteraar is een klasse die zal verkrijgen van gegevens van het apparaat van de sprong en beoordelen wat te doen met de informatie gestreamd. De luisteraar heeft de mogelijkheid om het verkrijgen van 60 frames per seconde van het apparaat, maar dat is een beetje teveel informatie voor wat we willen. Je bent zeker welkom om te proberen en gebruik de 60 frames per seconde te controleren uw Arduino maar houd in gedachten het duurt een kleine hoeveelheid tijd te reageren en stuur een bericht naar de Arduino-apparaat. Om op te lossen dit probleem gaan we alleen werken met 10 frames een tweede in plaats van 60. De luisteraar heeft een paar basisfuncties: op initialiseren, op verbinding maken op verbinding verbreken, op afsluiten, op Frame. Ze zijn allemaal vrij duidelijk uit de namen maar laat ze één voor één doorlopen en uitleggen hoe we gaan om ze te gebruiken om te controleren onze servo.
Op Initialize - willen hier we verklaren onze Arduino en seriële verbinding maken met het
Op Connect - kunnen We enkele gebaren voor de controller, hoeft te doen met de Arduino hier
Op verbinding verbreken - niets echt hier.
Op Exit - willen We de servo positie herstellen en sluit de verbinding met onze apparaat Arduino
Op Frame - is het eerste ding om te doen de tijd krijgen, want wij willen alleen krijgen een frame elke 10ms of zo. Zodra we het frame van de controller verkrijgen zal het ons vertellen welke kant is in het frame en wat haar standpunt is. Hieruit kunnen we vinger en gezamenlijke standpunten zo goed uitpakken. We gaan het gebruik van de genormaliseerde positie van onze hand in het vak van de interactie en vermenigvuldig dat met het bereik van onze motor. Bijvoorbeeld als onze hand helemaal links was, de genormaliseerde positie 0 zal zijn en dus de hoek op onze servo 0 zo goed zal zijn. Voor meer inzicht u kunt lezen over het vak van de interactie in de sprong API documentatie: https://developer.leapmotion.com/documentation/pyt... Een andere nuttige link om naar te kijken is enerzijds voor het frame omdat het frame al onze informatie over de hand en de standpunten van alles slaat. Om te zien welke informatie is toegankelijk in onze frame Bekijk deze link: https://developer.leapmotion.com/documentation/pyt...
We zijn gaan gebruiken hetzelfde Arduino circuit dat we eerder hebt gemaakt. Als u is er gebeurd met de servo-pin wijzigen in iets anders dan 2 moet u de code hieronder (lijn 17) te wijzigen. Bent u niet in staat om het deel van de Arduino werken ervoor hebt u de seriële aansluiting op de juiste poort (regel 23). Lijnen 78,82 zijn wat de servomotor control. Tijdens het uitvoeren van de code Neem de tijd om uw hand bewegen en zien wat de uitvoer krijgt. De positie van uw hand zal worden output in termen van de genormaliseerde positie in het vak van de interactie. Zorg ervoor dat uw leapd-service wordt uitgevoerd en dat je Arduino is aangesloten op uw computer voordat u deze code uitvoert.
my_first_leap.py
# Simple Leap motion program to track the position of your hand and move one servo# import the libraries where the LeapMotionSDK is import sys sys.path.insert(0, "LeapLib/")import Leap, thread, time from Leap import CircleGesture, KeyTapGesture, ScreenTapGesture, SwipeGesture from pyduino import *class SampleListener(Leap.Listener): oldtime = time.time() newtime = time.time() # FIXME if servo is not attached to pin 2 SERVO_PIN = 2 # Azimuthal Servo motor pin AZIMUTHAL_LIMIT = 180 # we want our motor to go between 0 and 180 def on_init(self, controller): # if your arduino was running on a serial port other than '/dev/ttyACM0/' # declare: a = Arduino(serial_port='/dev/ttyXXXX') self.a = Arduino() # sleep to ensure ample time for computer to make serial connection time.sleep(3) print "Initialized" def on_connect(self, controller): print "Connected" # Enable gestures controller.enable_gesture(Leap.Gesture.TYPE_CIRCLE); controller.enable_gesture(Leap.Gesture.TYPE_KEY_TAP); controller.enable_gesture(Leap.Gesture.TYPE_SCREEN_TAP); controller.enable_gesture(Leap.Gesture.TYPE_SWIPE); def on_disconnect(self, controller): # Note: not dispatched when running in a debugger. print "Disconnected" def on_exit(self, controller): # Reset servo position when you stop program self.a.servo_write(self.SERVO_PIN,90) self.a.close() print "Exited" def on_frame(self, controller): # we only want to get the position of the hand every so often self.newtime = time.time() if self.newtime-self.oldtime > 0.1: # if difference between times is 10ms # Get the most recent frame and report some basic information frame = controller.frame() interaction_box = frame.interaction_box # print some statistics print "Frame id: %d, timestamp: %d, hands: %d, fingers: %d, tools: %d, gestures: %d" % ( frame.id, frame.timestamp, len(frame.hands), len(frame.fingers), len(frame.tools), len(frame.gestures())) # Get hands for hand in frame.hands: handType = "Left hand" if hand.is_left else "Right hand" normalized_point = interaction_box.normalize_point(hand.palm_position,True) print " %s, id %d, x-position: %s" % (handType, hand.id, normalized_point.x ) print " %s, id %d, y-position: %s" % (handType, hand.id, normalized_point.y ) print " %s, id %d, z-position: %s" % (handType, hand.id, normalized_point.z ) # FIXME depending on orientation of servo motor # if motor is upright, Leap Device will register a 0 degree angle if hand is all the way to the left XPOS_servo = abs(AZIMUTHAL_LIMIT-normalized_point.x*AZIMUTHAL_LIMIT) print " Servo Angle = %d " %(int(XPOS_servo)) # write the value to servo on arduino self.a.servo_write(self.SERVO_PIN,int(XPOS_servo)) # turn LED on # update the old time self.oldtime = self.newtime else: pass # keep advancing in time until 10 millisecond is reacheddef main(): # Create a sample listener and controller listener = SampleListener() controller = Leap.Controller() # Have the sample listener receive events from the controller controller.add_listener(listener) # Keep this process running until Enter is pressed print "Press Enter to quit..." try: sys.stdin.readline() except KeyboardInterrupt: pass finally: # Remove the sample listener when done controller.remove_listener(listener)if __name__ == "__main__": main()