Kazalo:

Pan-Tilt Multi Servo Control: 11 korakov (s slikami)
Pan-Tilt Multi Servo Control: 11 korakov (s slikami)

Video: Pan-Tilt Multi Servo Control: 11 korakov (s slikami)

Video: Pan-Tilt Multi Servo Control: 11 korakov (s slikami)
Video: CS50 2013 - Week 8, continued 2024, December
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

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:

Slika
Slika

1. korak: BoM - materialni material

Glavni deli:

  1. Raspberry Pi V3 - 32,00 USD
  2. 5 -megapikselni senzor 1080p senzor OV5647 videokamera z mini kamero - 13,00 USD
  3. Tower Servo SG90 9G 180 stopinj mikro servo (2 X)- 4,00 USD
  4. Nosilec za kamero za premikanje in nagibanje kamere proti vibracijam z 2 servomotorjema (*) - 8,00 US $
  5. Upor 1K ohm (2X) - neobvezno
  6. 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:

Slika
Slika

To "povprečno" napetostno raven lahko uporabimo za nadzor svetlosti LED, na primer:

Slika
Slika

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

Namestitev Hw
Namestitev Hw
Namestitev Hw
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

Servo kalibracija
Servo kalibracija
Servo kalibracija
Servo kalibracija
Servo kalibracija
Servo kalibracija

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

Ustvarjanje skripta Python
Ustvarjanje skripta 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

Pan-Tilt mehanizem
Pan-Tilt mehanizem

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:

Slika
Slika

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

Pan -Tilt Mechanism - Mehanska konstrukcija
Pan -Tilt Mechanism - Mehanska konstrukcija
Pan -Tilt Mechanism - Mehanska konstrukcija
Pan -Tilt Mechanism - Mehanska konstrukcija
Pan -Tilt Mechanism - Mehanska konstrukcija
Pan -Tilt Mechanism - 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

Električni pomični/nagibni sklop
Električni pomični/nagibni sklop
Električni pomični/nagibni sklop
Električni pomični/nagibni sklop
Električni pomični/nagibni sklop
Električni pomični/nagibni sklop
Električni pomični/nagibni sklop
Električni pomični/nagibni sklop

Ko sestavite mehanizem Pan/Tilt, sledite fotografijam za popolno električno povezavo.

  1. Izklopite Pi.
  2. Izvedite vse električne povezave.
  3. Dvakrat preveri.
  4. Najprej vklopite svoj Pi.
  5. Č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:

Slika
Slika

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.

Slika
Slika

Zgornjo kodo, servoTest.py lahko prenesete z mojega GitHub -a.

11. korak: Zaključek

Zaključek
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:

Slika
Slika

Saludos z juga sveta!

Se vidimo v mojem naslednjem navodilu!

Hvala vam, Marcelo

Priporočena: