Sadržaj:
- Korak 1: BoM - Predmet materijala
- Korak 2: Kako funkcionira PWM
- Korak 3: Instaliranje Hw -a
- Korak 4: Kalibracija servomotora
- Korak 5: Kreiranje 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: Loop test servera
- Korak 11: Zaključak
Video: Pan-Tilt Multi Servo kontrola: 11 koraka (sa slikama)
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-30 08:08
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:
Korak 1: BoM - Predmet materijala
Glavni delovi:
- Raspberry Pi V3 - 32,00 US $
- 5 -megapikselni 1080p senzorski senzor OV5647 videokamera za mini kameru - 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 sa 2 servo servera (*) - 8,00 US $
- Otpornik 1K ohm (2X) - Opcionalno
- 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:
Ovaj "prosječni" naponski nivo 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 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
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
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
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
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:
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
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
Nakon što sastavite svoj Pan/Tilt mehanizam, slijedite fotografije za potpunu električnu vezu.
- Isključite svoj Pi.
- Izvedite sve električne priključke.
- Proverite još jednom.
- Prvo uključite svoj Pi.
- 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:
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.
Gornji kod, servoTest.py može se preuzeti sa 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 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:
Saludos sa juga svijeta!
Vidimo se u mom sljedećem uputstvu!
Hvala ti, Marcelo
Preporučuje se:
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 koristio za stvaranje automatizirane zdjele za hranu za mačke, za moju stariju mačku sa dijabetesom Chaz. Vidite, mora doručkovati prije nego što dobije inzulin, ali često zaboravim uzeti mu jelo s hranom prije nego što odem u krevet, što
Multi-timer W/ Vanjska kontrola: 13 koraka
Multi-Timer W/ Eksterna kontrola: Ovaj projekat Instructable je sastavljen od višefunkcionalnog Timer-a. Ovaj timer može funkcionirati kao: Alarm opće namjene sa odabranim vremenima između 1 sekunde i +90 sati. Odbrojavanje sa zvučnim alarmom i/ili kontrolom vanjskog
Kontrola svjetline PWM LED kontrola zasnovana na tipkama, Raspberry Pi i grebanju: 8 koraka (sa slikama)
Kontrola svjetline Kontrola LED -a zasnovana na PWM -u pomoću tipki, Raspberry Pi i grebanja: Pokušavao sam pronaći način da svojim učenicima objasnim kako PWM radi, pa sam sebi postavio zadatak da pokušam kontrolirati svjetlinu LED -a pomoću 2 tipke - jedno dugme povećava svjetlinu LED -a, a drugo 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 zaista nedovoljno ocijenjen da bi mogao progurati nekoliko solarnih ćelija, mikrokontroler, bateriju i kućište. Možete dizajnirati oko