Kazalo:
- 1. korak: BoM - materialni material
- 2. korak: Kako deluje PWM
- 3. korak: Namestitev Hw
- 4. korak: Umerjanje servomotorjev
- 5. korak: Ustvarite skript Python
- Korak 6: Mehanizem nagiba
- Korak 7: Mehanizem z nagibom - mehanska konstrukcija
- Korak 8: Sklop električnega pomika/nagiba
- 9. korak: Skript Python
- 10. korak: Loop test strežnikov
- 11. korak: Zaključek
Video: Pan-Tilt Multi Servo Control: 11 korakov (s slikami)
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:07
V tej vadnici bomo raziskali, kako upravljati več servomotorjev z uporabo Pythona na Raspberry Pi. Naš cilj bo mehanizem PAN/TILT za postavitev kamere (PiCam).
Tukaj si lahko ogledate, kako bo deloval naš končni projekt:
Preizkus krmilne zanke krmilnega servomotorja:
1. korak: BoM - materialni material
Glavni deli:
- Raspberry Pi V3 - 32,00 USD
- 5 -megapikselni senzor 1080p senzor OV5647 videokamera z mini kamero - 13,00 USD
- Tower Servo SG90 9G 180 stopinj mikro servo (2 X)- 4,00 USD
- Nosilec za kamero za premikanje in nagibanje kamere proti vibracijam z 2 servomotorjema (*) - 8,00 US $
- Upor 1K ohm (2X) - neobvezno
- Razno: kovinski deli, trakovi itd. (V primeru, da boste izdelali mehanizem Pan/Tilt)
(*) lahko kupite celotno platformo Pan/Tilt s servomotorji ali pa jo zgradite sami.
2. korak: Kako deluje PWM
Raspberry Pi nima analognega izhoda, vendar ga lahko simuliramo s pristopom PWM (Pulse Width Modulation). Kar bomo naredili, je ustvariti digitalni signal s fiksno frekvenco, kjer bomo spremenili širino impulznega niza, kar bo "prevedeno" kot "povprečna" raven izhodne napetosti, kot je prikazano spodaj:
To "povprečno" napetostno raven lahko uporabimo za nadzor svetlosti LED, na primer:
Upoštevajte, da tukaj ni pomembna sama frekvenca, ampak "delovni cikel", to je razmerje med časom, ko je pulz "visok", deljeno z valovnim obdobjem. Recimo, da bomo na enem od naših Raspberry Pi GPIO ustvarili frekvenco 50 Hz. Obdobje (p) bo obratno od frekvence ali 20 ms (1/f). Če želimo, da je naša LED dioda "polovično svetla", moramo imeti 50 -odstotni delovni cikel, kar pomeni "impulz", ki bo za 10 ms "visok".
To načelo bo za nas zelo pomembno za nadzor položaja servomotorja, ko bo "Delovni cikel" določil položaj servo, kot je prikazano spodaj:
Servo
3. korak: Namestitev Hw
Servomotorji bodo povezani z zunanjim 5V napajanjem, njihov podatkovni zatič (v mojem primeru rumeno ožičenje) priključen na Raspberry Pi GPIO, kot je prikazano spodaj:
- GPIO 17 ==> Nagibni servo
- GPIO 27 ==> Pan servo
Ne pozabite povezati GND skupaj ==> Raspberry Pi - Servomotorji - Zunanji napajalnik)
Kot možnost imate lahko 1K ohm upor med Raspberry Pi GPIO in vhodnim podatkovnim zatičem strežnika. To bi zaščitilo vaš RPi v primeru težav s servo.
4. korak: Umerjanje servomotorjev
Najprej morate potrditi glavne značilnosti servomotorjev. V mojem primeru uporabljam Power Pro SG90.
Iz njegovega podatkovnega lista lahko upoštevamo:
- Domet: 180o
- Napajanje: 4,8 V (zunanji 5 V DC kot napajalnik USB deluje dobro)
- Delovna frekvenca: 50Hz (obdobje: 20 ms)
- Širina impulza: od 1 ms do 2 ms
Teoretično bo servo vklopljen
- Začetni položaj (0 stopinj), ko je na podatkovni terminal priključen impulz 1 ms
- Nevtralni položaj (90 stopinj), ko je na podatkovni terminal priključen impulz 1,5 ms
- Končni položaj (180 stopinj), ko je na njegov podatkovni terminal priključen impulz 2 ms
Za programiranje položaja servo z uporabo Pythona bo zelo pomembno, da poznate dopisnika "Delovni cikel" za zgornje položaje, naredimo nekaj izračunov:
- Začetni položaj ==> (0 stopinj) Širina impulza ==> 1 ms ==> Delovni cikel = 1 ms/20 ms ==> 2,0%
- Nevtralni položaj (90 stopinj) Širina impulza 1,5 ms ==> Delovni cikel = 1,5ms/20ms ==> 7,5%
- Končni položaj (180 stopinj) Širina impulza 2 ms ==> Delovni cikel = 2ms/20ms ==> 10%
Delovni cikel se mora torej razlikovati od 2 do 10 %.
Poskusimo servomotorje posamično. V ta namen odprite svoj terminal Raspberry in zaženite urejevalnik lupine Python 3 kot "sudo" (ker bi morali biti "super uporabnik" za upravljanje z GPIO):
sudo python3
V lupini Python
>>
Uvozite modul RPI. GPIO in ga pokličite GPIO:
uvozite RPi. GPIO kot GPIO
Določite, katere sheme oštevilčevanja pin želite uporabiti (BCM ali BOARD). Ta test sem naredil z BOARD -om, zato so bili nožice, ki sem jih uporabil, fizični (GPIO 17 = Pin 11 in GPIO 27 Pin 13). Z lahkoto sem jih odkril in med testom ne delal napak (v končnem programu bom uporabil BCM). Izberite eno od vaših želja:
Način nastavitve GPIO (GPIO. BOARD)
Določite servo pin, ki ga uporabljate:
tiltPin = 11
Če ste namesto tega uporabili shemo BCM, je treba zadnja 2 ukaza umakniti z:
Način GPIO.set (GPIO. BCM)
tiltPin = 17
Zdaj moramo določiti, da bo ta pin "izhod"
GPIO.setup (tiltPin, GPIO. OUT)
In kakšna bo frekvenca, ustvarjena na tem pinu, da bo za naš servo 50Hz:
nagib = GPIO. PWM (tiltPin, 50)
Zdaj pa začnimo ustvarjati signal PWM na zatiču z začetnim delovnim ciklom (ohranili ga bomo "0"):
nagib = zagon (0)
Zdaj lahko vnesete različne vrednosti obratovalnega cikla in opazujete gibanje vašega servo. Začnimo z 2% in poglejmo, kaj se zgodi (predvidevamo, da gre servo v "ničelni položaj"):
tilt. ChangeDutyCycle (2)
V mojem primeru je šel servo v ničelni položaj, ko pa sem spremenil obratovalni cikel na 3%, sem opazil, da je servo ostal v istem položaju in se začel premikati z obratovalnimi cikli večjimi od 3%. Torej, 3% je moj začetni položaj (o stopinj). Enako se je zgodilo z 10%, moj servo je presegel to vrednost in dosegel 13%. Za ta poseben servo je bil rezultat:
- 0 stopinj ==> obratovalni cikel 3%
- 90 stopinj ==> 8% obratovalni cikel
- 180 stopinj ==> obratovalni cikel 13%
Ko končate teste, morate ustaviti PWM in očistiti GPIO:
nagib = stop ()
GPIO.cleanup ()
Zgornji zaslon za tiskanje terminala prikazuje rezultat za oba moja servomotorja (ki ima podobne rezultate). Vaš razpon je lahko drugačen.
5. korak: Ustvarite skript Python
Ukazi PWM, ki jih je treba poslati na naš servo, so v "delovnih ciklih", kot smo videli na zadnjem koraku. Običajno pa moramo kot parameter za krmiljenje servomotorja uporabiti "kot" v stopinjah. Zato moramo pretvoriti "kot", ki je za nas v delovnem ciklu bolj naravna meritev, kot ga razume naš Pi.
Kako narediti? Zelo preprosto! Vemo, da se obseg delovnega cikla giblje od 3% do 13% in da je to enako kotom, ki se gibljejo od 0 do 180 stopinj. Vemo tudi, da so te variacije linearne, zato lahko sestavimo sorazmerno shemo, kot je prikazano zgoraj. tako lahko glede na kot imamo ustrezen delovni cikel:
delovni cikel = kot/18 + 3
Ohranite to formulo. Uporabili ga bomo v naslednji kodi.
Ustvarimo skript Python za izvajanje testov. V bistvu bomo ponovili, kar smo prej počeli v Python Shell:
od časa uvoza spanja
uvoz RPi. GPIO kot GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, kot): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = kot / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) sleep (0.3) pwm.stop () if _name_ == '_main_': import sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (servo, int (sys.argv [2])) GPIO.cleanup ()
Jedro zgornje kode je funkcija setServoAngle (servo, kot). Ta funkcija prejme kot argumente številko servo GPIO in vrednost kota do mesta, kjer mora biti servo usmerjen. Ko je vnos te funkcije "kot", ga moramo pretvoriti v obratovalni cikel v odstotkih s pomočjo prej razvite formule.
Ko se skript izvede, morate vnesti parametre, servo GPIO in kot.
Na primer:
sudo python3 angleServoCtrl.py 17 45
Zgornji ukaz bo servo, priključen na GPIO 17, postavil za 45 stopinj v "višino". Podoben ukaz bi lahko uporabili za krmiljenje Pan Servo (položaj do 45 stopinj v "azimutu"):
sudo python angleServoCtrl.py 27 45
Datoteko angleServoCtrl.py lahko prenesete z mojega GitHub -a
Korak 6: Mehanizem nagiba
Servo "Pan" bo premikal "vodoravno" našo kamero ("azimutni kot"), naš servo "Tilt" pa jo bo premikal "navpično" (kot višine).
Spodnja slika prikazuje, kako deluje mehanizem Pan/Tilt:
Med razvojem ne bomo šli v "skrajnosti" in uporabljali bomo samo mehanizem Pan/Tilt od 30 do 150 stopinj. Ta obseg bo dovolj za uporabo s fotoaparatom.
Korak 7: Mehanizem z nagibom - mehanska konstrukcija
Zdaj sestavimo 2 servomotorja kot mehanizem Pan/Tilt. Tu lahko naredite 2 stvari. Kupite mehanizem platforme Pan-Tilt, kot je prikazan na zadnjem koraku, ali pa ga sestavite po svojih potrebah.
En primer je lahko tisti, ki sem ga zgradil, le pritrdil servomotorje drug na drugega in uporabil majhne kovinske koščke iz starih igrač, kot je prikazano na zgornjih fotografijah.
Korak 8: Sklop električnega pomika/nagiba
Ko sestavite mehanizem Pan/Tilt, sledite fotografijam za popolno električno povezavo.
- Izklopite Pi.
- Izvedite vse električne povezave.
- Dvakrat preveri.
- Najprej vklopite svoj Pi.
- Če je vse v redu, vklopite servomotorje.
V tej vadnici ne bomo raziskovali, kako nastaviti kamero, to bo razloženo v naslednji vadnici.
9. korak: Skript Python
Ustvarimo skript Python za istočasno krmiljenje obeh servomotorjev:
od časa uvoza spanja
uvoz RPi. GPIO kot GPIO.način nastavitve GPIO. (GPIO. BCM) Opozorila o nastavitvah GPIO. (napačno) pan = 27 nagiba = 17 GPIO.setup (nagib, GPIO. OUT) # bela => NAVILA GPIO.setup (pan, GPIO. OUT) # grey ==> PAN def setServoAngle (servo, kot): uveljavi kot> = 30 in kot 90 (srednja točka) ==> 150 setServoAngle (nagib, int (sys.argv [2])) # 30 ==> 90 (srednja točka) ==> 150 GPIO.cleanup ()
Ko se skript izvede, morate kot parametre vnesti kot Pana in kot nagiba. Na primer:
sudo python3 servoCtrl.py 45 120
Zgornji ukaz bo mehanizem Pan/Tilt postavil za 45 stopinj v "azimutu" (kot Pan) in 120 stopinj "višine" (kot nagiba). Upoštevajte, da če niso vneseni parametri, bodo privzeti kot, kot in nagib nagiba nastavljeni do 90 stopinj.
Spodaj si lahko ogledate nekaj testov:
Datoteko servoCtrl.py lahko prenesete z mojega GitHub -a.
10. korak: Loop test strežnikov
Ustvarimo skript Python za samodejno testiranje celotnega obsega servomotorjev:
od časa uvoza spanja
uvoz RPi. GPIO kot GPIO.način nastavitve GPIO. (GPIO. BCM) Opozorila o nastavitvah GPIO. (napačno) pan = 27 nagiba = 17 GPIO.setup (nagib, GPIO. OUT) # bela => NAVILA GPIO.setup (pan, GPIO. OUT) # grey ==> PAN def setServoAngle (servo, kot): uveljavite kot> = 30 in kot <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = kot / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) spanje (0,3) pwm.stop () če je _name_ == '_main_': za i v območju (30, 160, 15): setServoAngle (pan, i) setServoAngle (nagib, i) za i in range (150, 30, -15): setServoAngle (pan, i) setServoAngle (tilt, i) setServoAngle (pan, 100) setServoAngle (tilt, 90) GPIO.cleanup ()
Program bo samodejno izvedel zanko od 30 do 150 stopinj v obeh kotih.
Pod rezultatom:
Priključil sem osciloskop samo za ponazoritev teorije PWM, kot je bilo že razloženo.
Zgornjo kodo, servoTest.py lahko prenesete z mojega GitHub -a.
11. korak: Zaključek
Kot vedno upam, da lahko ta projekt pomaga drugim najti pot v razburljiv svet elektronike!
Za podrobnosti in končno kodo obiščite moj skladišče GitHub: RPi-Pan-Tilt-Servo-Control
Za več projektov obiščite moj blog: MJRoBot.org
Spodaj je pogled na mojo naslednjo vadnico:
Saludos z juga sveta!
Se vidimo v mojem naslednjem navodilu!
Hvala vam, Marcelo
Priporočena:
Cat Control Access Control (ESP8266 + servo motor + 3D tiskanje): 5 korakov (s slikami)
Nadzor dostopa do hrane za mačke (ESP8266 + servo motor + 3D tiskanje): Ta projekt gre skozi postopek, ki sem ga uporabil za ustvarjanje avtomatizirane posode za mačjo hrano za mojo starejšo diabetično mačko Chaz. Glej, preden mora dobiti insulin, mora zajtrkovati, a pogosto pozabim vzeti njegovo jed pred spanjem, kar
Arduino Multi Light Controller: 7 korakov (s slikami)
Arduino Multi Light Controller: Kolega in umetnik Jim Hobbs je nameraval zgraditi samostojno instalacijo za razstavo, ki jo je pripravljal. Ta namestitev bi bila sestavljena iz 8 polic, ki tvorijo parabolično obliko. Vsaka od 8 polic naj bi imela 10 žarnic na
SERVO MOTOR CONTROL UP WIFI AND BLYNK: 5 korakov
SERVO MOTOR CONTROL UP WIFI AND BLYNK: Pozdravljeni fantje, v tem navodilu se naučimo, kako nadzorovati gibanje servo motorja prek WiFi z uporabo Node MCU in Blynk App
Pretvarjanje katerega koli R/C avtomobila v Bluetooth Control Control R/C Car: 9 korakov
Pretvarjanje katerega koli R/C avtomobila v Bluetooth App Control R/C Car: Ta projekt prikazuje korake za spremembo običajnega avtomobila z daljinskim upravljalnikom v avtomobil Bluetooth (BLE) z robotsko ploščo Wombatics SAM01, aplikacijo Blynk in MIT App Inventor. je veliko poceni RC avtomobilov z veliko funkcijami, kot so LED žarometi in
Naučite se SERVO Control (na kratko): 6 korakov
Naučite se krmiljenja SERVO (na kratko): V tem modulu se boste naučili upravljati mikro ali mini servo, ki je združljiv z arduinom. Servo motor se običajno uporablja v vseh projektih avtomatizacije z gibljivimi deli. Igra zelo pomembno vloga v robotiki, natančni premiki