Përmbajtje:

Pan-Tilt Multi Servo Control: 11 hapa (me fotografi)
Pan-Tilt Multi Servo Control: 11 hapa (me fotografi)

Video: Pan-Tilt Multi Servo Control: 11 hapa (me fotografi)

Video: Pan-Tilt Multi Servo Control: 11 hapa (me fotografi)
Video: New Style Transfer Extension, ControlNet of Automatic1111 Stable Diffusion T2I-Adapter Color Control 2024, Korrik
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

Në këtë tutorial, ne do të eksplorojmë se si të kontrollojmë shërbime të shumta duke përdorur Python në një Raspberry Pi. Qëllimi ynë do të jetë një mekanizëm PAN/TILT për të pozicionuar një aparat fotografik (një PiCam).

Këtu mund të shihni se si do të funksionojë projekti ynë përfundimtar:

Testi i lakut të kontrollit të servo Control:

Imazhi
Imazhi

Hapi 1: BM - Fatura e Materialit

Pjesët kryesore:

  1. Raspberry Pi V3 - 32,00 dollarë amerikanë
  2. 5 Megapixels 1080p Sensor OV5647 Mini Kamera Modul Video - 13,00 US $
  3. TowerPro SG90 9G 180 gradë Mikro Servo (2 X)- 4.00 dollarë amerikanë
  4. Mini Pan/ Platforma e kamerës Tilt Kamera Anti -Vibration Mount me 2 Servos (*) - 8.00 US $
  5. Rezistenca 1K ohm (2X) - Opsionale
  6. Të ndryshme: pjesë metalike, shirita, etj (në rast se do të ndërtoni mekanizmin tuaj Pan/Tilt)

(*) mund të blini një platformë të plotë Pan/Tilt me servos ose të krijoni tuajin.

Hapi 2: Si funksionon PWM

Raspberry Pi nuk ka dalje analoge, por ne mund ta simulojmë këtë, duke përdorur një qasje PWM (Modulimi i Gjerësisë së Pulsit). Ajo që ne do të bëjmë është të gjenerojmë një sinjal dixhital me një frekuencë fikse, ku do të ndryshojmë gjerësinë e trenit të pulsit, atë që do të "përkthehet" si një nivel "mesatar" i tensionit të daljes siç tregohet më poshtë:

Imazhi
Imazhi

Ne mund të përdorim këtë nivel "mesatar" të tensionit për të kontrolluar ndriçimin LED, për shembull:

Imazhi
Imazhi

Vini re se ajo që ka rëndësi këtu nuk është vetë frekuenca, por "Cikli i Detyrës", kjo është marrëdhënia midis kohës kur pulset janë "të larta" të ndara me periudhën e valës. Për shembull, supozoni se ne do të gjenerojmë një frekuencë impulsi 50Hz në një nga Raspberry Pi GPIO -në tonë. Periudha (p) do të jetë e kundërta e frekuencës ose 20ms (1/f). Nëse duam që LED -i ynë me një "gjysmë" të ndritshme, ne duhet të kemi një Cikël Detyre prej 50%, që do të thotë një "puls" që do të jetë "Lartë" për 10ms.

Ky parim do të jetë shumë i rëndësishëm për ne, për të kontrolluar pozicionin tonë servo, pasi "Cikli i Detyrës" do të përcaktojë pozicionin e servo siç tregohet më poshtë:

Servo

Hapi 3: Instalimi i Hw

Instalimi i Hw
Instalimi i Hw
Instalimi i Hw
Instalimi i Hw

Servo -të do të lidhen me një furnizim të jashtëm 5V, duke pasur pinin e tyre të të dhënave (në rastin tim, telat e tyre të verdhë) të lidhen me Raspberry Pi GPIO si më poshtë:

  • GPIO 17 ==> Tilt Servo
  • GPIO 27 ==> Pan Servo

Mos harroni të lidhni GND -të së bashku ==> Raspberry Pi - Servos - Furnizimi me energji i jashtme)

Ju mund të keni si opsion, një rezistencë prej 1K ohm midis Raspberry Pi GPIO dhe pinit të të dhënave të serverit. Kjo do të mbronte RPi -në tuaj në rast të një problemi servo.

Hapi 4: Kalibrimi i Servos

Kalibrimi i Servos
Kalibrimi i Servos
Kalibrimi i Servos
Kalibrimi i Servos
Kalibrimi i Servos
Kalibrimi i Servos

Gjëja e parë që duhet bërë është të konfirmoni karakteristikat kryesore të servos tuaj. Në rastin tim, unë jam duke përdorur një Power Pro SG90.

Nga fleta e të dhënave të tij, ne mund të marrim parasysh:

  • Gama: 180o
  • Furnizimi me energji elektrike: 4.8V (5VDC e jashtme si furnizim me energji USB funksionon mirë)
  • Frekuenca e punës: 50Hz (Periudha: 20 ms)
  • Gjerësia e pulsit: nga 1ms në 2ms

Në teori, servo do të jetë në funksion

  • Pozicioni Fillestar (0 gradë) kur një impuls 1ms zbatohet në terminalin e të dhënave të tij
  • Pozicioni neutral (90 gradë) kur një impuls prej 1.5 ms aplikohet në terminalin e të dhënave të tij
  • Pozicioni Përfundimtar (180 gradë) kur një impuls prej 2 ms aplikohet në terminalin e të dhënave të tij

Për të programuar një pozicion servo duke përdorur Python do të jetë shumë e rëndësishme të njihni korrespondentin "Cikli i Detyrës" për pozicionet e mësipërme, le të bëjmë një llogaritje:

  • Pozicioni fillestar ==> (0 gradë) Gjerësia e pulsit ==> 1ms ==> Cikli i punës = 1ms/20ms ==> 2.0%
  • Pozicioni neutral (90 gradë) Gjerësia e pulsit prej 1.5 ms ==> Cikli i punës = 1.5ms/20ms ==> 7.5%
  • Pozicioni Përfundimtar (180 gradë) Gjerësia e pulsit prej 2 ms ==> Cikli i punës = 2ms/20ms ==> 10%

Pra, Cikli i Detyrës duhet të ndryshojë në një gamë prej 2 deri në 10 %.

Le t'i testojmë servot individualisht. Për këtë, hapni terminalin tuaj Raspberry dhe filloni redaktorin tuaj të guaskës Python 3 si "sudo" (për shkak se ju duhet të jeni një "super përdorues" për tu trajtuar me GPIO):

sudo python3

Në Python Shell

>>

Importoni modulin RPI. GPIO dhe quajeni GPIO:

importoni RPi. GPIO si GPIO

Përcaktoni cilat skema të numërimit të pinit dëshironi të përdorni (BCM ose BOARD). E bëra këtë test me BOARD, kështu që kunjat që kam përdorur ishin kunjat fizikë (GPIO 17 = Pin 11 dhe GPIO 27 Pin 13). Ishte e lehtë për mua t'i identifikoja ato dhe të mos bëja gabime gjatë testit (Në programin përfundimtar do të përdor BCM). Zgjidhni një nga preferencat tuaja:

GPIO.setmode (GPIO. BOARD)

Përcaktoni servo pin që po përdorni:

pjerrësi = 11

Nëse në vend të kësaj, ju keni përdorur skemën BCM, 2 komandat e fundit duhet të zëvendësohen me:

GPIO.setmode (GPIO. BCM)

pjerrësi = 17

Tani, ne duhet të specifikojmë që ky pin do të jetë një "dalje"

GPIO.setup (tiltPin, GPIO. OUT)

Dhe, cila do të jetë frekuenca e gjeneruar në këtë pin, që për servo -në tonë do të jetë 50Hz:

anim = GPIO. PWM (tiltPin, 50)

Tani, le të fillojmë të gjenerojmë një sinjal PWM në kunj me një cikël fillestar të punës (ne do ta mbajmë atë "0"):

anim = fillimi (0)

Tani, mund të futni vlera të ndryshme të ciklit të punës, duke vëzhguar lëvizjen e servos tuaj. Le të fillojmë me 2% dhe të shohim se çfarë ndodh (ne shikojmë se servo shkon në "pozicion zero"):

anim. ChangeDutyCycle (2)

Në rastin tim, servo shkoi në pozicion zero, por kur ndryshova ciklin e punës në 3%, vura re që servo qëndroi në të njëjtin pozicion, duke filluar të lëvizte me cikle pune më të mëdha se 3%. Pra, 3% është pozicioni im fillestar (o gradë). E njëjta gjë ndodhi me 10%, servo ime shkoi mbi këtë vlerë, duke arritur fundin e saj në 13%. Pra, për këtë shërbim të veçantë, rezultati ishte:

  • 0 shkallë ==> cikli i punës prej 3%
  • 90 gradë ==> cikli i punës prej 8%
  • 180 gradë ==> cikli i punës 13%

Pasi të keni përfunduar testet tuaja, duhet të ndaloni PWM dhe të pastroni GPIO -të:

anim = ndal ()

GPIO.cleanup ()

Ekrani i printimit të mësipërm i Terminalit tregon rezultatin për të dy servos e mi (që ka rezultate të ngjashme). Gama juaj mund të jetë e ndryshme.

Hapi 5: Krijimi i një Skripti Python

Krijimi i një Skripti Python
Krijimi i një Skripti Python

Komandat PWM që do të dërgohen në servo -në tonë janë në "cikle detyre" siç pamë në hapin e fundit. Por zakonisht, ne duhet të përdorim "këndin" në gradë si një parametër për të kontrolluar një servo. Pra, ne duhet të konvertojmë "këndin" që është një matje më e natyrshme për ne në ciklin e punës si të kuptueshëm nga Pi -ja jonë.

Si të bëhet? Shume e thjeshte! Ne e dimë se diapazoni i ciklit të punës shkon nga 3% në 13% dhe se kjo është ekuivalente me kënde që do të shkojnë nga 0 në 180 gradë. Gjithashtu, ne e dimë se ato ndryshime janë lineare, kështu që ne mund të ndërtojmë një skemë proporcionale siç tregohet më sipër. kështu, duke pasur parasysh një kënd, ne mund të kemi një cikël detyre korresponduese:

cikli i punës = këndi/18 + 3

Mbani këtë formulë. Ne do ta përdorim atë në kodin tjetër.

Le të krijojmë një shkrim Python për të ekzekutuar testet. Në thelb, ne do të përsërisim atë që bëmë më parë në Python Shell:

nga koha import gjumi

importo RPi. GPIO si GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, kënd): pwm = GPIO. PWM (servo, 50) pwm.start (8) detyrëCikli = kënd / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) gjumi (0.3) pwm.stop () nëse _name_ == '_main_': import sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (servo, int (sys.argv [2])) GPIO.cleanup ()

Thelbi i kodit të mësipërm është funksioni setServoAngle (servo, kënd). Ky funksion merr si argumente, një numër servo GPIO dhe një vlerë këndi se ku duhet të pozicionohet servo. Pasi hyrja e këtij funksioni të jetë "kënd", ne duhet ta konvertojmë atë në cikël detyre në përqindje, duke përdorur formulën e zhvilluar më parë.

Kur skenari ekzekutohet, duhet të futni si parametra, servo GPIO dhe kënd.

Për shembull:

sudo python3 angleServoCtrl.py 17 45

Komanda e mësipërme do të pozicionojë servo të lidhur në GPIO 17 me 45 gradë në "lartësi". Një komandë e ngjashme mund të përdoret për kontrollin Pan Servo (pozicioni në 45 gradë në "azimuth"):

kënd sudo pythonServoCtrl.py 27 45

Skedari angleServoCtrl.py mund të shkarkohet nga GitHub im

Hapi 6: Mekanizmi Pan-Tilt

Mekanizmi Pan-Tilt
Mekanizmi Pan-Tilt

Servo "Pan" do të lëvizë "horizontalisht" kamerën tonë ("këndi azimuth") dhe servo jonë "Tilt" do ta lëvizë atë "vertikalisht" (këndi i ngritjes).

Fotografia e mëposhtme tregon se si funksionon mekanizmi Pan/Tilt:

Imazhi
Imazhi

Gjatë zhvillimit tonë ne nuk do të shkojmë në "ekstreme" dhe do të përdorim mekanizmin tonë Pan/Tilt vetëm nga 30 në 150 gradë. Ky varg do të jetë i mjaftueshëm për t'u përdorur me një aparat fotografik.

Hapi 7: Mekanizmi Pan -Tilt - Ndërtimi Mekanik

Mekanizmi Pan -Tilt - Ndërtimi Mekanik
Mekanizmi Pan -Tilt - Ndërtimi Mekanik
Mekanizmi Pan -Tilt - Ndërtimi Mekanik
Mekanizmi Pan -Tilt - Ndërtimi Mekanik
Mekanizmi Pan -Tilt - Ndërtimi Mekanik
Mekanizmi Pan -Tilt - Ndërtimi Mekanik

Le të montojmë tani 2 servot tanë si një mekanizëm Pan/Tilt. Këtu mund të bëni 2 gjëra. Blini një mekanizëm të platformës Pan-Tilt si ai i treguar në hapin e fundit ose ndërtoni tuajin sipas nevojave tuaja.

Një shembull mund të jetë ai që kam ndërtuar, vetëm duke lidhur servot njëri me tjetrin dhe duke përdorur copa të vogla metalike nga lodrat e vjetra siç tregohet në fotot e mësipërme.

Hapi 8: Montimi elektrik i tiganit/pjerrësisë

Montimi Elektrik i Panit/Pjerrësisë
Montimi Elektrik i Panit/Pjerrësisë
Montimi Elektrik i Panit/Pjerrësisë
Montimi Elektrik i Panit/Pjerrësisë
Montimi Elektrik i Panit/Pjerrësisë
Montimi Elektrik i Panit/Pjerrësisë
Montimi Elektrik i Panit/Pjerrësisë
Montimi Elektrik i Panit/Pjerrësisë

Pasi të keni mbledhur mekanizmin tuaj Pan/Tilt, ndiqni fotot për lidhje të plotë elektrike.

  1. Fikni Pi tuaj.
  2. Bëni të gjitha lidhjet elektrike.
  3. Kontrolloni dy herë.
  4. Fillimisht aktivizoni Pi -në tuaj.
  5. Nëse gjithçka është në rregull, ndizni shërbimet tuaja.

Ne nuk do të eksplorojmë në këtë tutorial se si të vendosni kamerën, kjo do të shpjegohet në tutorialin tjetër.

Hapi 9: Shkrimi Python

Le të krijojmë një Script Python për të kontrolluar të dy servos njëkohësisht:

nga koha import gjumi

importo RPi. GPIO si GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 anim = 17 GPIO.setup (anim, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # gri ==> PAN def setServoAngle (servo, kënd): pohoni këndin> = 30 dhe këndin 90 (pika e mesme) ==> 150 setServoAngle (anim, int (sys.argv [2])) # 30 ==> 90 (pika e mesme) ==> 150 GPIO.cleanup ()

Kur skenari ekzekutohet, duhet të futni si parametra, Këndi i panit dhe Këndi i pjerrësisë. Për shembull:

sudo python3 servoCtrl.py 45 120

Komanda e mësipërme do të pozicionojë mekanizmin Pan/Tilt me 45 gradë në "azimuth" (kënd Pan) dhe 120 gradë "lartësi" (Tilt Angle). Vini re se nëse nuk futen parametra, parazgjedhja do të jetë të dyja, këndet e pjerrësisë dhe të pjerrësisë të vendosura deri në 90 gradë.

Më poshtë mund të shihni disa teste:

Imazhi
Imazhi

Skedari servoCtrl.py mund të shkarkohet nga GitHub im.

Hapi 10: Testi i lakut të serverëve

Le të krijojmë tani një Script Python për të testuar automatikisht gamën e plotë të servos:

nga koha import gjumi

importoni RPi. GPIO si GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 anim = 17 GPIO.setup (anim, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # gri ==> PAN def setServoAngle (servo, kënd): pohoni këndin> = 30 dhe këndin <= 150 pwm = GPIO. PWM (servo, 50) pwm.filloni (8) detyraCikli = këndi / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) gjumë (0.3) pwm.stop () nëse _name_ == '_main_': për i në rang (30, 160, 15): setServoAngle (pan, i) setServoAngle (anim, i) për i in diapazoni (150, 30, -15): setServoAngle (tigan, i) setServoAngle (anim, i) setServoAngle (pan, 100) setServoAngle (anim, 90) GPIO.cleanup ()

Programi do të ekzekutojë automatikisht një lak nga 30 në 150 gradë në të dy këndet.

Më poshtë rezultatit:

Kam lidhur një oshiloskop vetëm për të ilustruar teorinë e PWM siç është shpjeguar më parë.

Imazhi
Imazhi

Kodi i mësipërm, servoTest.py mund të shkarkohet nga GitHub im.

Hapi 11: Përfundim

Përfundim
Përfundim

Si gjithmonë, shpresoj se ky projekt mund të ndihmojë të tjerët të gjejnë rrugën e tyre në botën emocionuese të elektronikës!

Për detaje dhe kodin përfundimtar, ju lutemi vizitoni depozitimin tim GitHub: RPi-Pan-Tilt-Servo-Control

Për më shumë projekte, ju lutemi vizitoni blogun tim: MJRoBot.org

Më poshtë një paraqitje e shkurtër e mësimit tim të ardhshëm:

Imazhi
Imazhi

Saludos nga jugu i botës!

Shihemi në udhëzimin tim të ardhshëm!

Faleminderit, Marcelo

Recommended: