Sadržaj:
- Korak 1: BoM - Opis materijala
- Korak 2: Kako PWM radi
- Korak 3: Instaliranje Hw -a
- Korak 4: Kalibracija servomotora
- Korak 5: Stvaranje Python skripte
- Korak 6: Pan-Tilt mehanizam
- Korak 7: Pan -Tilt mehanizam - mehanička konstrukcija
- Korak 8: Sklop električnog pomicanja/nagiba
- Korak 9: Python skripta
- Korak 10: Petlja testiranja poslužitelja
- Korak 11: Zaključak
Video: Pan-Tilt Multi Servo kontrola: 11 koraka (sa slikama)
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:37
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:
Korak 1: BoM - Opis materijala
Glavni dijelovi:
- Raspberry Pi V3 - 32,00 US $
- 5 -megapikselni 1080p senzor OV5647 videokamera mini kamere - 13,00 US $
- Tower Servo SG90 9G 180 stupnjeva mikro servo (2 X)- 4,00 USD
- Platforma za mini kameru sa nagibom/ nagibom Montiranje kamere protiv vibracija s 2 servo servera (*) - 8,00 USD
- Otpornik 1K ohm (2X) - izborno
- 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:
Ovu "prosječnu" razinu napona možemo koristiti za kontrolu svjetline LED diode, na primjer:
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
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
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
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
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:
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
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
Nakon što sastavite svoj Pan/Tilt mehanizam, slijedite fotografije za potpunu električnu vezu.
- Isključite svoj Pi.
- Izvedite sve električne priključke.
- Dvaput provjeri.
- Prvo uključite svoj Pi.
- 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:
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.
Gornji kod, servoTest.py može se preuzeti s mog GitHub -a.
Korak 11: 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:
Saludos s juga svijeta!
Vidimo se u mom sljedećem uputstvu!
Hvala vam, Marcelo
Preporučeni:
Rotirajući ventilator pomoću servo motora i kontrola brzine: 6 koraka
Rotirajući ventilator pomoću servo motora i kontrole brzine: U ovom ćemo vodiču naučiti kako rotirati ventilator s podesivom brzinom pomoću servo motora, potenciometra, arduina i Visuina. Pogledajte video
Cat kontrola pristupa hrani (ESP8266 + servo motor + 3D ispis): 5 koraka (sa slikama)
Kontrola pristupa hrani za mačke (ESP8266 + Servo motor + 3D ispis): Ovaj projekt prelazi proces koji sam upotrijebio za izradu automatizirane zdjele za hranu za mačke, za moju stariju mačku s dijabetesom Chaz. Vidite, on mora doručkovati prije nego što dobije inzulin, ali često zaboravim pokupiti njegovo jelo s hranom prije nego što odem u krevet, što
Multi-timer W/ Vanjska kontrola: 13 koraka
Multi-Timer W/ Vanjska kontrola: Ovaj projekt Instructable je sastavljen od višenamjenskog Timer-a. Ovaj timer može funkcionirati kao: Alarm opće namjene s mogućnošću odabira vremena između 1 sekunde i +90 sati. Odbrojavanje uz zvučni alarm i/ili upravljanje vanjskim
Kontrola svjetline PWM LED kontrola pomoću tipki, Raspberry Pi i ogrebotina: 8 koraka (sa slikama)
Kontrola svjetline PWM LED kontrola temeljena na tipkama, Raspberry Pi i Scratch: Pokušavao sam pronaći način da svojim učenicima objasnim kako PWM radi, pa sam si postavio zadatak pokušati kontrolirati svjetlinu LED diode pomoću 2 tipke - jedan gumb povećava svjetlinu LED -a, a drugi ga prigušuje. Za program
IOT123 - SOLARNI TRACKER - NAPON/PAN, OKVIR PANELE, LDR NOSAČI RIG: 9 koraka (sa slikama)
IOT123 - SOLARNI TRACKER - TILT/PAN, PANEL FRAME, LDR MOUNTS RIG: Većina DIY dizajna za dvoosne solarne tragove " vani " temelje se na 9G Micro Servo-u koji je stvarno nedovoljno ocijenjen da bi mogao progurati nekoliko solarnih ćelija, mikrokontroler, bateriju i kućište. Možete dizajnirati oko