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: ИСТОРИЯ СЕРБОВ: От славянской прародины до турецкого ига 2024, Studeni
Anonim
Pan-Tilt Multi Servo kontrola
Pan-Tilt Multi Servo kontrola

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

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

Kontrolni servo Test kontrolne petlje:

Slika
Slika

Korak 1: BoM - Opis materijala

Glavni dijelovi:

  1. Raspberry Pi V3 - 32,00 US $
  2. 5 -megapikselni 1080p senzor OV5647 videokamera mini kamere - 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 s 2 servo servera (*) - 8,00 USD
  5. Otpornik 1K ohm (2X) - izborno
  6. Ostalo: metalni dijelovi, trake itd. (U slučaju da konstruirate svoj mehanizam za pomicanje/naginjanje)

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

Korak 2: Kako PWM radi

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 impulsnog niza, što će se "prevesti" kao "prosječna" razina izlaznog napona, kao što je prikazano u nastavku:

Slika
Slika

Ovu "prosječnu" razinu napona možemo koristiti za kontrolu svjetline LED diode, na primjer:

Slika
Slika

Imajte na umu da ovdje nije važna sama frekvencija, već "radni ciklus", to jest odnos između vremena kada je puls "visok" podijeljen s valnim razdobljem. Na primjer, pretpostavimo da ćemo generirati pulsnu frekvenciju od 50Hz na jednom od naših Raspberry Pi GPIO. Razdoblje (p) će biti obrnuto od frekvencije 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.

Ovo načelo bit će nam jako važno za kontrolu našeg servo položaja, nakon što "Duty Cycle" definira servo položaj kako je dolje prikazano:

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 za unos podataka poslužitelja. Ovo bi zaštitilo vaš RPi u slučaju problema sa servom.

Korak 4: Kalibracija servomotora

Servo kalibracija
Servo kalibracija
Servo kalibracija
Servo kalibracija
Servo kalibracija
Servo 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 1 ms do 2 ms

U teoriji, servo će raditi

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

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

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

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

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

sudo python3

Na Python ljusci

>>

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 sam test 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 prepoznati ih i ne pogriješiti tijekom testa (u završnom programu koristit ću BCM). Odaberite onu koju želite:

Način rada GPIO.set (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, to će za naš servo biti 50Hz:

nagib = GPIO. PWM (tiltPin, 50)

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 "nulti položaj"):

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 moj početni položaj (o stupnjeva). Isto se dogodilo s 10%, moj servo je prešao ovu vrijednost, dostigavši svoj kraj od 13%. Dakle, za ovaj servo, rezultat je bio:

  • 0 stupanj ==> radni ciklus od 3%
  • 90 stupnjeva ==> radni ciklus od 8%
  • 180 stupnjeva ==> radni ciklus od 13%

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

nagib = zaustavi ()

GPIO.cleanup ()

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

Korak 5: Stvaranje Python skripte

Stvaranje Python skripte
Stvaranje Python skripte

PWM naredbe koje se šalju na naš servo su u "radnim ciklusima" kao što smo vidjeli na posljednjem koraku. Ali obično moramo koristiti "kut" 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 to učiniti? Jako 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 stupnjeva. Također, znamo da su te varijacije linearne, pa možemo konstruirati proporcionalnu shemu kao što je gore prikazano. pa, 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.

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

od vremena uvoz sna

uvoz RPi. GPIO kao GPIO GPIO.način rada (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) 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 ()

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 postavit će servo spojen na GPIO 17 s 45 stupnjeva u "visini". Slična naredba mogla bi se koristiti za upravljanje Pan Servo -om (položaj do 45 stupnjeva u "azimutu"):

sudo python angleServoCtrl.py 27 45

Datoteka angleServoCtrl.py može se preuzeti s 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:

Slika
Slika

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

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

Pan -Tilt Mechanism - Mehanička konstrukcija
Pan -Tilt Mechanism - Mehanička konstrukcija
Pan -Tilt Mechanism - Mehanička konstrukcija
Pan -Tilt Mechanism - Mehanička konstrukcija
Pan -Tilt Mechanism - Mehanička konstrukcija
Pan -Tilt Mechanism - Mehanička konstrukcija

Ajmo sada sastaviti naša 2 serva 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 izgradio, 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 sklop Pan/Tilt
Električni sklop Pan/Tilt
Električni sklop Pan/Tilt
Električni sklop Pan/Tilt
Električni sklop Pan/Tilt
Električni sklop Pan/Tilt
Električni sklop Pan/Tilt
Električni sklop Pan/Tilt

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. Dvaput provjeri.
  4. Prvo uključite svoj Pi.
  5. Ako je sve u redu, uključite svoje 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

Napravimo Python Script za istodobno upravljanje s oba serva:

od vremena uvoz sna

uvesti 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 točka) ==> 150 GPIO.cleanup ()

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

sudo python3 servoCtrl.py 45 120

Gornja naredba će postaviti Pan/Tilt mehanizam s 45 stupnjeva u "azimutu" (Pan kut) i 120 stupnjeva "elevacije" (Tilt Angle). Imajte na umu da će, ako ne unesete parametre, zadani biti i kutovi pomicanja i nagiba postavljeni do 90 stupnjeva.

Ispod možete vidjeti neke testove:

Slika
Slika

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

Korak 10: Petlja testiranja poslužitelja

Sada stvorimo Python Script za automatsko testiranje cijelog raspona servomotora:

od vremena uvoz sna

uvesti 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): potvrditi 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 (tilt, 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 izvesti petlju od 30 do 150 stupnjeva u oba kuta.

Ispod rezultata:

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

Slika
Slika

Gornji kod, servoTest.py može se preuzeti s 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 kôd posjetite moje skladište GitHub: RPi-Pan-Tilt-Servo-Control

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

Ispod pregleda mog sljedećeg vodiča:

Slika
Slika

Saludos s juga svijeta!

Vidimo se u mom sljedećem uputstvu!

Hvala vam, Marcelo

Preporučeni: