Raspberry Pi – Stappenmotor (28BYJ-48) via 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 stappenmotor (28BYJ-48) op de Raspberry Pi in een python script.
We combineren hier eigenlijk 2 scripts:
1) Raspberry Pi – Joystick of controller uitlezen USB (python)
2) Raspberry Pi – Stappenmotor (28BYJ-48) via GPIO (python)
Hoe werkt het?
We lezen de AS (y) van het gaspedaal (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 doormiddel van 4 GPIO pinnen op een bepaalde volgorde aan te sturen met de python bibliotheek Rpi.GPIO.
Met een handige functie
Stappen volgorde van stappenmotor 28BYJ-48:
Pinout
Draadkleur: | |
---|---|
Blauw | Spoel 01A |
Roze | Spoel 02A |
Geel | Spoel 01B |
Oranje | Spoel 02B |
Rood | Spoelen GND |
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 28BYJ-48 via de ULN2003A driver board aan op de Raspberry Pi zoals aangegeven op onderstaand schema (de kruising in de kabel is al met de standaard connector toegepast):
Raspberry Pi pin: | Draadkleur SG-90: |
---|---|
Pin 1 (+ 3.3V) | Rood |
Pin 6 (GND) | Bruin |
Pin 7 | Oranje |
Script
Onderstaand script laat de stappenmotor draaien aan de hand van hoever het gaspedaal is ingedrukt, er zijn commentaarregels toegevoegd om e.e.a. toe te lichten.
Maak een bestand aan, bijvoorbeeld /usr/src/gaspedaal.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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#!/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) # Stel de GPIO pinnen in voor de stappenmotor: StepPins = [4,17,27,22] # Set alle pinnen als uitgang. for pin in StepPins: GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) 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 variabelen. StepCounter = 0 tijdwaarde = 1000 # Definieer simpele volgorde StepCount1 = 4 Seq1 = [] Seq1 = range(0, StepCount1) Seq1[0] = [1,0,0,0] Seq1[1] = [0,1,0,0] Seq1[2] = [0,0,1,0] Seq1[3] = [0,0,0,1] # Definieer geadvanceerde volgorde (volgens de datasheet) StepCount2 = 8 Seq2 = [] Seq2 = range(0, StepCount2) Seq2[0] = [1,0,0,0] Seq2[1] = [1,1,0,0] Seq2[2] = [0,1,0,0] Seq2[3] = [0,1,1,0] Seq2[4] = [0,0,1,0] Seq2[5] = [0,0,1,1] Seq2[6] = [0,0,0,1] Seq2[7] = [1,0,0,1] # Welke stappenvolgorde gaan we hanteren? Seq = Seq2 StepCount = StepCount2 # 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 tijdwaarde = 4 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 as bewogen. if event.type == pygame.JOYAXISMOTION: # Haal de waarde van de as op. eenas = joystick.get_axis(1) # Gebruik de MAP functie om eenvoudig verhoudingen tussen getallen te creeren. tijdwaarde = arduino_map(eenas, 1, -1, 4, 1900) # Print de gegevens naar de console. print "AS 1 - Gaspedaal, waarde:", eenas, "| TIJD waarde:", 1 / tijdwaarde for pin in range(0, 4): xpin = StepPins[pin] if Seq[StepCounter][pin]!=0: GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += 1 # Als we aan het einde van de stappenvolgorde zijn beland start dan opnieuw if (StepCounter==StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount # Wacht voor de volgende stap (lager = snellere draaisnelheid) sleep(1 / tijdwaarde) except KeyboardInterrupt: # GPIO netjes afsluiten. GPIO.cleanup() # PyGame netjes afsluiten wanneer er op CTRL+C is gedrukt. pygame.quit() |
Start het script met: sudo python /usr/src/gaspedaal.py , druk op CTRL+C om het script te stoppen!
LET OP: Zodra je het script start staan de GPIO poorten allemaal aan, voor lange tijd is dit niet goed voor de motor, het pedaal zal zsm ingetrapt moeten worden om de timer te starten.
De stappenmotor zal nu sneller draaien wanneer je het gaspedaal verder intrapt, dit is de output van de console:
Meten is weten
de GPIO poorten worden aangestuurd in een tijd van 1/ tijdwaarde, de tijdwaarde is variabel van 4 t/m 1900, het is even spelen met de juiste maximale waarde om de meeste rotaties per minuut te krijgen, met een stopwatch zijn deze waarden gemeten:
– Tijdwaarde max. 1300 = 1 rotatie in ca. 4,80 seconden.
– Tijdwaarde max. 1400 = 1 rotatie in ca. 4,70 seconden.
– Tijdwaarde max. 1500 = 1 rotatie in ca. 4,40 seconden.
– Tijdwaarde max. 1700 = 1 rotatie in ca. 4,20 seconden.
– Tijdwaarde max. 1900 = 1 rotatie in ca. 4,00 seconden.
Theoretische snelheid van een wiel met een doorsnede van 26 CM =
– Dimeter = 26 cm x 3.14 (pi) = ca. 82 cm per rotatie.
– Met een tijdwaarde van 1900 wordt een snelheid gehaald van ca. 4 seconden per rotatie,
Per uur zijn dat 3600 / 4 = 900 rotaties per uur.
– In een uur wordt dan een afstand afgelegd van 900 rotaties x 82 cm = 73800 cm per uur = ca. 740 m/h = 0,74 km/h.
LET OP: Bij maximale rotatie van de motor is het koppel (kracht) ook minder!
Dit zijn de knoppen en assen vanuit PyGame:
Bron: raspberrypi-spy.co.uk