Raspberry Pi – Aansturen Servo (SG-90) met game stuur (USB)
Hardware
Met dit voorbeeld laat ik zien hoe je met apparatuur via de USB poort (bijvoorbeeld een game stuur) de GPIO pinnen aanstuurt (bijvoorbeeld een mini servo SG-90) op de Raspberry Pi in een python script.
We combineren hier eigenlijk 2 scripts:
1) Raspberry Pi – Joystick of controller gebruiken via USB (python)
2) Raspberry Pi – Mini Servo SG-90 aansturen via GPIO (python)
Hoe werkt het?
We lezen de AS (x) van het stuur (of joystick, controller) uit met de python bibliotheek PyGame, dit is een (float) getal van -1 tot 1 (verschil is 2), de servo is aan te sturen via de GPIO pinnen met PWM op 50 Hz en een duty-cycle tussen de 2.5 en 11 met de python bibliotheek Rpi.GPIO.
Met een handige functie
Wat heb je nodig?
1) Python RPi.GPIO bibliotheek (standaard geïnstalleerd op de wheezy image)
1) Python PyGame bibliotheek (standaard geïnstalleerd op de wheezy image)
Aansluiten op de Raspberry Pi
Sluit de SG-90 servo aan zoals aangegeven op onderstaand schema:
Raspberry Pi pin: | Draadkleur SG-90: |
---|---|
Pin 1 (+ 3.3V) | Rood |
Pin 6 (GND) | Bruin |
Pin 7 | Oranje |
Script
Onderstaand script laat de servo tussen 90 en -90 graden draaien aan de hand van het stuur op de USB poort, er zijn commentaarregels toegevoegd om e.e.a. toe te lichten.
Maak een bestand aan, bijvoorbeeld /usr/src/servostuur.py (evt onder root, en vergeet niet chmod te gebruiken om het bestand uit te kunnen voeren), voeg deze inhoud daar in toe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#!/usr/bin/env python # Importeer PyGame bibliotheek. import pygame # importeer de GPIO bibliotheek. import RPi.GPIO as GPIO # Importeer de time biblotheek voor tijdfuncties. from time import sleep # Initialiseer de Joystick(s). pygame.init() pygame.joystick.init() # Kijk of er een joystick of controller aangesloten is. if pygame.joystick.get_count() == 0: # Er is geen joystick of controller gevonden. print "Er is geen joystick gevonden!" exit() # Zet de pinmode op Broadcom SOC. GPIO.setmode(GPIO.BCM) # Zet waarschuwingen uit. GPIO.setwarnings(False) GPIO.setup(4, GPIO.OUT) # Zet de GPIO pin als uitgang. servopin = GPIO.PWM(4, 50) # Configureer de pin voor PWM met een frequentie van 50Hz. servopin.start(6) # Start PWM op de GPIO pin met een duty-cycle van 6% joystick = pygame.joystick.Joystick(0) joystick.init() # Informatie over de Joystick of controller print "Joysticks gevonden:", pygame.joystick.get_count(), "(", joystick.get_name(), ")" print "Specs: assen:", joystick.get_numaxes(), ", knoppen:", joystick.get_numbuttons() print "Druk op de knoppen of draai aan de assen!, druk op CTRL+C om het script te eindigen." # Haal het aantal knoppen en assen op. knoppen = joystick.get_numbuttons() assen = joystick.get_numaxes() # Definieer waarden. asrichting = 0 pwmdcwaarde = 6 pwmdctemp = 6 # Een MAP functie om eenvoudig verhoudingen tussen getallen te creeren. def arduino_map(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min try: # Oneindige loop, druk op CTRL+C om het script te eindigen. while True: # Interrupt trigger voor PyGame. for event in pygame.event.get(): # Er wordt een knop ingedrukt. if event.type == pygame.JOYBUTTONDOWN: # Loop alle beschikbare knoppen langs. for i in range(knoppen): # Haal de waarde van de knop op. knop = joystick.get_button(i) # Kijk of deze knop is ingedrukt. if knop == 1: # Deze knop is ingedrukt. print "Knop:", i, "ingedrukt!" # Er wordt een knop losgelaten. elif event.type == pygame.JOYBUTTONUP: print "Knop: losgelaten!" # Een as wordt bewogen. elif event.type == pygame.JOYAXISMOTION: # Haal de waarde van de as op. eenas = joystick.get_axis(0) # Gebruik de MAP functie om eenvoudig verhoudingen tussen getallen te creeren. # De waarden met 10 vermenigvuldigen voor betere precisie. pwmdcwaarde = arduino_map(eenas, 1, -1, (2.5 * 10), (11.5 * 10)) # Print de gegevens naar de console. print "AS 0 - Stuur, waarde:", asrichting, eenas, "| PWM DC waarde:", pwmdcwaarde / 10 # Om de servo niet te zenuwachtig te maken, veranderen we alleen de PWM instelling als deze gewijzigd moet worden. if pwmdcwaarde <> pwmdctemp: # De aswaarde is veranderd, pas de PWM DC aan. servopin.ChangeDutyCycle(pwmdcwaarde / 10) # Zet de tijdelijke PWM DC als de huidige waarde om weer een vergelijking te kunnen maken. pwmdctemp = pwmdcwaarde except KeyboardInterrupt: # Stop PWM op GPIO. servopin.stop() # PyGame netjes afsluiten wanneer er op CTRL+C is gedrukt. pygame.quit() |
Start het script met: sudo python /usr/src/servo.py , druk op CTRL+C om het script te stoppen!
De servo zal nu draaien als je aan het stuur draait!
Dit is de output van de console:
Dit zijn de knoppen en assen van uit PyGame: