Sadržaj:

Pan-Tilt Multi Servo kontrola: 11 koraka (sa slikama)
Pan-Tilt Multi Servo kontrola: 11 koraka (sa slikama)

Video: Pan-Tilt Multi Servo kontrola: 11 koraka (sa slikama)

Video: Pan-Tilt Multi Servo kontrola: 11 koraka (sa slikama)
Video: КАКИМ БУДЕТ PORTAL 3 2024, Novembar
Anonim
Pan-Tilt Multi Servo kontrola
Pan-Tilt Multi Servo kontrola

U ovom vodiču ćemo istražiti kako kontrolirati više servo upravljača koristeći Python na Raspberry Pi -u. Naš cilj će biti PAN/TILT mehanizam za postavljanje kamere (PiCam).

Ovdje možete vidjeti kako će funkcionirati naš završni projekt:

Kontrolni servo Test kontrolne petlje:

Image
Image

Korak 1: BoM - Predmet materijala

Glavni delovi:

  1. Raspberry Pi V3 - 32,00 US $
  2. 5 -megapikselni 1080p senzorski senzor OV5647 videokamera za mini kameru - 13,00 US $
  3. Tower Servo SG90 9G 180 stupnjeva mikro servo (2 x)- 4,00 USD
  4. Platforma za mini kameru sa nagibom/ nagibom Montiranje kamere protiv vibracija sa 2 servo servera (*) - 8,00 US $
  5. Otpornik 1K ohm (2X) - Opcionalno
  6. Ostalo: metalni dijelovi, trake itd. (U slučaju da konstruirate svoj Pan/Tilt mehanizam)

(*) možete kupiti kompletnu Pan/Tilt platformu sa servo pogonima ili je sami izraditi.

Korak 2: Kako funkcionira PWM

Raspberry Pi nema analogni izlaz, ali to možemo simulirati koristeći PWM (Pulse Width Modulation) pristup. Ono što ćemo učiniti je generirati digitalni signal s fiksnom frekvencijom, gdje ćemo promijeniti širinu niza impulsa, što će se "prevesti" kao "prosječni" nivo izlaznog napona, kao što je prikazano u nastavku:

Image
Image

Ovaj "prosječni" naponski nivo možemo koristiti za kontrolu svjetline LED diode, na primjer:

Image
Image

Imajte na umu da ovdje nije važna sama frekvencija, već "radni ciklus", to jest odnos između vremena u kojem je puls "visok" podijeljen s valnim razdobljem. Na primjer, pretpostavimo da ćemo generirati frekvenciju od 50Hz na jednom od naših Raspberry Pi GPIO. Tačka (p) će biti inverzna frekvenciji ili 20 ms (1/f). Ako želimo da naša LED dioda sa "pola" svijetlom, moramo imati radni ciklus od 50%, to znači "puls" koji će biti "visok" za 10 ms.

Ovaj princip bit će nam vrlo važan za kontrolu našeg servo položaja, nakon što "Radni ciklus" definira servo položaj kao što je prikazano u nastavku:

Servo

Korak 3: Instaliranje Hw -a

Instaliranje Hw
Instaliranje Hw
Instaliranje Hw
Instaliranje Hw

Servo uređaji će biti spojeni na vanjsko napajanje od 5 V, a njihov podatkovni pin (u mom slučaju, njihovo žuto ožičenje) spojen je na Raspberry Pi GPIO kao što je dolje:

  • GPIO 17 ==> Nagibni servo
  • GPIO 27 ==> Pan Servo

Ne zaboravite spojiti GND zajedno ==> Raspberry Pi - Servo - vanjsko napajanje)

Kao opciju možete imati otpornik od 1K ohma između Raspberry Pi GPIO i pin -a za unos podataka servera. Ovo bi zaštitilo vaš RPi u slučaju problema sa servom.

Korak 4: Kalibracija servomotora

Servos kalibracija
Servos kalibracija
Servos kalibracija
Servos kalibracija
Servos kalibracija
Servos kalibracija

Prvo što trebate učiniti je potvrditi glavne karakteristike vaših servo pogona. U mom slučaju koristim Power Pro SG90.

Iz njegove tablice podataka možemo uzeti u obzir:

  • Domet: 180o
  • Napajanje: 4.8V (vanjsko 5VDC kao USB napajanje radi dobro)
  • Radna frekvencija: 50Hz (period: 20 ms)
  • Širina impulsa: od 1ms do 2ms

U teoriji, servo će biti uključen

  • Početna pozicija (0 stepeni) kada se impuls od 1 ms primijeni na terminal za podatke
  • Neutralni položaj (90 stepeni) kada se impuls od 1,5 ms primijeni na njegov terminal za podatke
  • Konačni položaj (180 stepeni) kada se impuls od 2 ms primijeni na njegov terminal za podatke

Za programiranje servo pozicije pomoću Pythona bit će vrlo važno poznavati dopisnog "Duty Cycle" za gore navedene pozicije, napravimo neki izračun:

  • Početni položaj ==> (0 stepeni) Širina impulsa ==> 1ms ==> Radni ciklus = 1ms/20ms ==> 2,0%
  • Neutralni položaj (90 stepeni) Širina impulsa od 1,5 ms ==> Radni ciklus = 1,5ms/20ms ==> 7,5%
  • Krajnji položaj (180 stepeni) Širina impulsa od 2 ms ==> Radni ciklus = 2ms/20ms ==> 10%

Dakle, radni ciklus bi trebao varirati u rasponu od 2 do 10 %.

Testirajmo servo pogone pojedinačno. U tu svrhu otvorite svoj Raspberry terminal i pokrenite svoj uređivač ljuske Python 3 kao "sudo" (jer biste trebali biti "super korisnik" za rukovanje s GPIO -ovima):

sudo python3

Na Python Shell -u

>>

Uvezite modul RPI. GPIO i nazovite ga GPIO:

uvezite RPi. GPIO kao GPIO

Definirajte sheme numeriranja pin-ova koje želite koristiti (BCM ili BOARD). Ovaj test sam napravio s BOARD -om, pa su igle koje sam koristio bile fizičke (GPIO 17 = Pin 11 i GPIO 27 Pin 13). Bilo mi je lako da ih identifikujem i ne napravim greške tokom testa (u finalnom programu ću koristiti BCM). Odaberite onu koju želite:

GPIO.setmode (GPIO. BOARD)

Definirajte servo pin koji koristite:

tiltPin = 11

Ako ste umjesto toga koristili BCM shemu, posljednje 2 naredbe treba zamijeniti:

Način rada GPIO.set (GPIO. BCM)

tiltPin = 17

Sada moramo navesti da će ovaj pin biti "izlaz"

GPIO.setup (tiltPin, GPIO. OUT)

Kolika će biti frekvencija generirana na ovom pinu, za naš servo će biti 50Hz:

nagib = GPIO. PWM (tiltPin, 50)

Sada počnimo stvarati PWM signal na pinu s početnim radnim ciklusom (zadržat ćemo ga na "0"):

nagib = početak (0)

Sada možete unijeti različite vrijednosti radnog ciklusa, promatrajući kretanje vašeg serva. Počnimo s 2% i vidimo što će se dogoditi (spektriramo da servo prelazi u "nultu poziciju"):

tilt. ChangeDutyCycle (2)

U mom slučaju, servo je otišao u nulti položaj, ali kad sam promijenio radni ciklus na 3% primijetio sam da je servo ostao u istom položaju, počevši se kretati s radnim ciklusima većim od 3%. Dakle, 3% je moja početna pozicija (o stepeni). Isto se dogodilo i sa 10%, moj servo je prešao ovu vrijednost, dostigavši kraj od 13%. Dakle, za ovaj servo, rezultat je bio:

  • 0 stepen ==> radni ciklus od 3%
  • 90 stepeni ==> radni ciklus od 8%
  • 180 stepeni ==> radni ciklus od 13%

Nakon što završite s testiranjem, morate zaustaviti PWM i očistiti GPIO -ove:

tilt = stop ()

GPIO.cleanup ()

Gornji ekran za ispis terminala prikazuje rezultat za oba moja servo servera (koji ima slične rezultate). Vaš raspon može biti drugačiji.

Korak 5: Kreiranje Python skripte

Kreiranje Python skripte
Kreiranje Python skripte

PWM komande koje se šalju na naš servo su u "radnim ciklusima" kao što smo videli na poslednjem koraku. Ali obično moramo koristiti "angle" u stupnjevima kao parametar za upravljanje servo pogonom. Dakle, moramo pretvoriti "kut" koji je za nas prirodnije mjerenje u radnom ciklusu kako ga razumije naš Pi.

Kako uraditi? Veoma jednostavno! Znamo da raspon radnog ciklusa ide od 3% do 13% i da je to ekvivalentno kutovima koji će se kretati od 0 do 180 stepeni. Također, znamo da su te varijacije linearne, pa možemo konstruirati proporcionalnu shemu kao što je gore prikazano. tako, s obzirom na kut, možemo imati odgovarajući radni ciklus:

radni ciklus = kut/18 + 3

Zadržite ovu formulu. Koristit ćemo ga u sljedećem kodu.

Kreirajmo Python skriptu za izvršavanje testova. U osnovi ćemo ponoviti ono što smo ranije radili na Python Shell -u:

od vremena uvoza sleep

uvoz RPi. GPIO kao GPIO GPIO.način podešavanja (GPIO. BCM) GPIO.upozorenja (lažno) def setServoAngle (servo, kut): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = kut / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) spavanje (0,3) pwm.stop () ako je _name_ == '_main_': uvoz sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (servo, int (sys.argv [2])) GPIO.cleanup ()

Jezgra gornjeg koda je funkcija setServoAngle (servo, kut). Ova funkcija prima kao argumente, servo GPIO broj i vrijednost kuta do mjesta gdje servo mora biti pozicioniran. Nakon što je ulaz ove funkcije "kut", moramo ga pretvoriti u radni ciklus u postocima, koristeći prethodno razvijenu formulu.

Kada se skripta izvrši, morate unijeti parametre, servo GPIO i kut.

Na primjer:

sudo python3 angleServoCtrl.py 17 45

Gornja naredba će postaviti servo spojen na GPIO 17 sa 45 stepeni u "elevaciji". Slična naredba mogla bi se koristiti za Pan Servo kontrolu (položaj do 45 stepeni u "azimutu"):

sudo python angleServoCtrl.py 27 45

Datoteka angleServoCtrl.py može se preuzeti sa mog GitHub -a

Korak 6: Pan-Tilt mehanizam

Pan-Tilt mehanizam
Pan-Tilt mehanizam

Servo "Pan" pomaknut će "vodoravno" našu kameru ("azimutni kut"), a naš "Tilt" servo pomaknut će ga "okomito" (kut visine).

Donja slika prikazuje kako funkcionira Pan/Tilt mehanizam:

Image
Image

Tokom našeg razvoja nećemo ići u "krajnosti" i koristićemo naš Pan/Tilt mehanizam samo od 30 do 150 stepeni. Ovaj raspon bit će dovoljan za korištenje s kamerom.

Korak 7: Pan -Tilt mehanizam - mehanička konstrukcija

Pan -Tilt mehanizam - mehanička konstrukcija
Pan -Tilt mehanizam - mehanička konstrukcija
Pan -Tilt mehanizam - mehanička konstrukcija
Pan -Tilt mehanizam - mehanička konstrukcija
Pan -Tilt mehanizam - mehanička konstrukcija
Pan -Tilt mehanizam - mehanička konstrukcija

Ajmo sada sastaviti naša 2 servo motora kao Pan/Tilt mehanizam. Ovdje možete učiniti 2 stvari. Kupite mehanizam platforme Pan-Tilt kao onaj prikazan na posljednjem koraku ili napravite svoj prema svojim potrebama.

Jedan primjer može biti onaj koji sam napravio, samo pričvršćujući servo pogone jedan za drugi i koristeći male metalne komade iz starih igračaka kako je prikazano na gornjim fotografijama.

Korak 8: Sklop električnog pomicanja/nagiba

Električni Pan/Tilt sklop
Električni Pan/Tilt sklop
Električni Pan/Tilt sklop
Električni Pan/Tilt sklop
Električni Pan/Tilt sklop
Električni Pan/Tilt sklop
Električni Pan/Tilt sklop
Električni Pan/Tilt sklop

Nakon što sastavite svoj Pan/Tilt mehanizam, slijedite fotografije za potpunu električnu vezu.

  1. Isključite svoj Pi.
  2. Izvedite sve električne priključke.
  3. Proverite još jednom.
  4. Prvo uključite svoj Pi.
  5. Ako je sve u redu, uključite servo pogone.

U ovom vodiču nećemo istraživati kako postaviti kameru, to će biti objašnjeno u sljedećem vodiču.

Korak 9: Python skripta

Kreirajmo Python Script za istovremenu kontrolu oba serva:

od vremena uvoza sleep

uvoz RPi. GPIO kao GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # grey ==> PAN def setServoAngle (servo, kut): potvrdite kut> = 30 i kut 90 (srednja točka) ==> 150 setServoAngle (nagib, int (sys.argv [2])) # 30 ==> 90 (srednja tačka) ==> 150 GPIO.cleanup ()

Kada se skripta izvrši, morate unijeti kao parametre Pan angle i Tilt angle. Na primjer:

sudo python3 servoCtrl.py 45 120

Gornja naredba će pozicionirati Pan/Tilt mehanizam sa 45 stepeni u "azimutu" (Pan kut) i 120 stepeni "elevacije" (Tilt Angle). Imajte na umu da će, ako se ne unesu parametri, zadane vrijednosti biti i uglovi pomicanja i nagiba postavljeni do 90 stepeni.

Ispod možete vidjeti neke testove:

Image
Image

Datoteka servoCtrl.py može se preuzeti sa mog GitHub -a.

Korak 10: Loop test servera

Kreirajmo sada Python Script za automatsko testiranje cijelog raspona servo pogona:

od vremena uvoza sleep

uvoz RPi. GPIO kao GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # grey ==> PAN def setServoAngle (servo, kut): potvrdite kut> = 30 i kut <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = kut / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) spavanje (0,3) pwm.stop () ako je _name_ == '_main_': za i u rasponu (30, 160, 15): setServoAngle (pan, i) setServoAngle (nagib, i) za i in raspon (150, 30, -15): setServoAngle (pan, i) setServoAngle (tilt, i) setServoAngle (pan, 100) setServoAngle (tilt, 90) GPIO.cleanup ()

Program će automatski izvršiti petlju od 30 do 150 stepeni u oba ugla.

Ispod rezultata:

Spojio sam osciloskop samo da ilustriram PWM teoriju kako je ranije objašnjeno.

Image
Image

Gornji kod, servoTest.py može se preuzeti sa mog GitHub -a.

Korak 11: Zaključak

Zaključak
Zaključak

Kao i uvijek, nadam se da će ovaj projekt pomoći drugima da pronađu svoj put u uzbudljivi svijet elektronike!

Za detalje i konačni kod posjetite moje skladište GitHub: RPi-Pan-Tilt-Servo-Control

Za više projekata posjetite moj blog: MJRoBot.org

Ispod pogleda mog sljedećeg vodiča:

Image
Image

Saludos sa juga svijeta!

Vidimo se u mom sljedećem uputstvu!

Hvala ti, Marcelo

Preporučuje se: