Turinys:

„Pan-Tilt Multi Servo“valdymas: 11 žingsnių (su nuotraukomis)
„Pan-Tilt Multi Servo“valdymas: 11 žingsnių (su nuotraukomis)

Video: „Pan-Tilt Multi Servo“valdymas: 11 žingsnių (su nuotraukomis)

Video: „Pan-Tilt Multi Servo“valdymas: 11 žingsnių (su nuotraukomis)
Video: 10 įpročių tapti laimingu 2024, Liepa
Anonim
„Pan-Tilt Multi Servo Control“
„Pan-Tilt Multi Servo Control“

Šioje pamokoje mes išnagrinėsime, kaip valdyti kelias servo sistemas naudojant „Python“„Raspberry Pi“. Mūsų tikslas bus PAN/TILT mechanizmas, skirtas fotoaparatui („PiCam“) nustatyti.

Čia galite pamatyti, kaip veiks mūsų galutinis projektas:

Valdymo servo valdymo kilpos bandymas:

Vaizdas
Vaizdas

1 žingsnis: „BoM - Bill of Material“

Pagrindinės dalys:

  1. „Raspberry Pi V3“- 32,00 USD
  2. 5 megapikselių 1080p jutiklis OV5647 mini kameros vaizdo modulis - 13,00 USD
  3. „TowerPro SG90 9G“180 laipsnių „Micro Servo“(2 X)- 4,00 USD
  4. „Mini Pan/ Tilt“fotoaparato platformos anti -vibracijos kameros laikiklis su 2 servo (*) - 8,00 USD
  5. Rezistorius 1K omas (2X) - neprivaloma
  6. Įvairūs: metalinės dalys, juostos ir kt. (Jei sukursite „Pan/Tilt“mechanizmą)

(*) galite nusipirkti pilną „Pan/Tilt“platformą su servo servisais arba sukurti savo.

2 veiksmas: kaip veikia PWM

„Raspberry Pi“neturi analoginio išvesties, tačiau mes galime tai imituoti naudodami PWM (impulso pločio moduliacijos) metodą. Ką mes padarysime, tai sugeneruosime fiksuoto dažnio skaitmeninį signalą, kuriame pakeisime impulsinio traukinio plotį, kuris bus „išverstas“kaip „vidutinis“išėjimo įtampos lygis, kaip parodyta žemiau:

Vaizdas
Vaizdas

Mes galime naudoti šį „vidutinį“įtampos lygį LED šviesumui valdyti, pavyzdžiui:

Vaizdas
Vaizdas

Atkreipkite dėmesį, kad čia svarbu ne pats dažnis, o „darbo ciklas“, tai yra santykis tarp laiko, kai pulsas yra „didelis“, padalytas iš bangos periodo. Pavyzdžiui, tarkime, kad mes sukursime 50 Hz impulsų dažnį viename iš mūsų Raspberry Pi GPIO. Laikotarpis (p) bus atvirkštinis dažnis arba 20 ms (1/f). Jei norime, kad mūsų šviesos diodas būtų „perpus“šviesus, turime turėti 50%darbo ciklą, o tai reiškia „impulsą“, kuris bus „didelis“10 ms.

Šis principas mums bus labai svarbus, norint valdyti savo servo padėtį, kai „darbo ciklas“nustatys servo padėtį, kaip parodyta žemiau:

Servo

3 žingsnis: Hw įdiegimas

„Hw“diegimas
„Hw“diegimas
„Hw“diegimas
„Hw“diegimas

Servos bus prijungtos prie išorinio 5 V maitinimo šaltinio, o jų duomenų kaištis (mano atveju - geltona instaliacija) bus prijungtas prie „Raspberry Pi GPIO“, kaip nurodyta toliau:

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

Nepamirškite prijungti GND kartu ==> Raspberry Pi - Servos - išorinis maitinimo šaltinis)

Galite pasirinkti 1K omo rezistorių tarp „Raspberry Pi GPIO“ir serverio duomenų įvesties kaiščio. Tai apsaugotų jūsų RPi esant servo problemai.

4 žingsnis: Servo kalibravimas

Servo kalibravimas
Servo kalibravimas
Servo kalibravimas
Servo kalibravimas
Servo kalibravimas
Servo kalibravimas

Pirmas dalykas, kurį reikia padaryti, yra patvirtinti pagrindines jūsų servo savybes. Mano atveju aš naudoju „Power Pro SG90“.

Iš jo duomenų lapo galime apsvarstyti:

  • Diapazonas: 180o
  • Maitinimo šaltinis: 4.8V (išorinis 5VDC kaip USB maitinimo šaltinis veikia gerai)
  • Darbinis dažnis: 50Hz (periodas: 20 ms)
  • Impulsų plotis: nuo 1 ms iki 2 ms

Teoriškai servo bus ant jo

  • Pradinė padėtis (0 laipsnių), kai jos duomenų terminale yra taikomas 1 ms impulsas
  • Neutrali padėtis (90 laipsnių), kai jos duomenų terminale veikiamas 1,5 ms impulsas
  • Galutinė padėtis (180 laipsnių), kai jos duomenų terminale veikiamas 2 ms impulsas

Norint programuoti servo padėtį naudojant „Python“, bus labai svarbu žinoti aukščiau nurodytų pozicijų korespondentą „Darbo ciklas“, atlikime keletą skaičiavimų:

  • Pradinė padėtis ==> (0 laipsnių) Pulso plotis ==> 1ms ==> Darbo ciklas = 1ms/20ms ==> 2,0%
  • Neutrali padėtis (90 laipsnių) Pulso plotis 1,5 ms ==> Darbo ciklas = 1,5 ms/20 ms ==> 7,5%
  • Galutinė padėtis (180 laipsnių) Impulsų plotis 2 ms ==> Darbo ciklas = 2ms/20ms ==> 10%

Taigi darbo ciklas turėtų svyruoti nuo 2 iki 10 %.

Išbandykime servus atskirai. Norėdami tai padaryti, atidarykite „Raspberry“terminalą ir paleiskite „Python 3“apvalkalo redaktorių kaip „sudo“(nes jūs turite būti „super vartotojas“, tvarkantis su GPIO):

sudo python3

„Python Shell“

>>

Importuokite RPI. GPIO modulį ir pavadinkite jį GPIO:

importuoti RPi. GPIO kaip GPIO

Apibrėžkite, kurias PIN kodų schemas norite naudoti (BCM arba BOARD). Aš atlikau šį testą su BOARD, todėl kaiščiai, kuriuos naudojau, buvo fiziniai smeigtukai (GPIO 17 = Pin 11 ir GPIO 27 Pin 13). Man buvo lengva juos atpažinti ir nepadaryti klaidų testo metu (galutinėje programoje naudosiu BCM). Pasirinkite vieną iš jūsų pageidavimų:

GPIO.setmode (GPIO. BOARD)

Apibrėžkite naudojamą servo kaištį:

tiltPin = 11

Jei vietoj to naudojote BCM schemą, paskutines 2 komandas reikia pakeisti:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Dabar turime nurodyti, kad šis kaištis bus „išvestis“

GPIO nustatymas (tiltPin, GPIO. OUT)

Ir koks bus šio kaiščio generuojamas dažnis, kad mūsų servo bus 50 Hz:

pakreipti = GPIO. PWM (tiltPin, 50)

Dabar pradėkime generuoti PWM signalą ant kaiščio su pradiniu darbo ciklu (mes jį išlaikysime „0“):

pakreipti = pradėti (0)

Dabar galite įvesti skirtingas darbo ciklo vertes, stebėdami savo servo judėjimą. Pradėkime nuo 2% ir pažiūrėkime, kas atsitiks (matome, kad servo sistema eina į „nulinę padėtį“):

tilt. ChangeDutyCycle (2)

Mano atveju, servo sistema nukrypo į nulinę padėtį, bet kai pakeičiau darbo ciklą į 3%, pastebėjau, kad servo sistema liko toje pačioje padėtyje ir pradėjo judėti, kai darbo ciklai yra didesni nei 3%. Taigi, 3% yra mano pradinė padėtis (o laipsniai). Tas pats atsitiko su 10%, mano servo lygis viršijo šią vertę ir viršijo 13%. Taigi šio konkretaus servo rezultatas buvo toks:

  • 0 laipsnių ==> darbo ciklas 3%
  • 90 laipsnių ==> darbo ciklas 8%
  • 180 laipsnių ==> darbo ciklas 13%

Baigę testus, turite sustabdyti PWM ir išvalyti GPIO:

pakreipti = sustoti ()

GPIO.cleanup ()

Aukščiau pateiktame terminalo spausdinimo ekrane rodomas abiejų mano servo (kurio rezultatai panašūs) rezultatas. Jūsų diapazonas gali būti skirtingas.

5 veiksmas: sukurkite „Python“scenarijų

„Python“scenarijaus kūrimas
„Python“scenarijaus kūrimas

PWM komandos, siunčiamos į mūsų servo, yra „darbo cikluose“, kaip matėme paskutiniame žingsnyje. Tačiau paprastai „servo“valdymui turime naudoti „kampą“laipsniais. Taigi, mes turime konvertuoti „kampą“, kuris yra natūralesnis matavimas, kad mes veikimo cikle, kaip tai suprantama mūsų Pi.

Kaip tai padaryti? Labai paprasta! Mes žinome, kad darbo ciklo diapazonas svyruoja nuo 3% iki 13% ir kad tai atitinka kampus, kurie svyruoja nuo 0 iki 180 laipsnių. Be to, mes žinome, kad tie variantai yra tiesiniai, todėl galime sukurti proporcingą schemą, kaip parodyta aukščiau. Taigi, atsižvelgiant į kampą, galime turėti atitinkamą darbo ciklą:

darbo ciklas = kampas/18 + 3

Laikykitės šios formulės. Mes jį naudosime kitame kode.

Sukurkime „Python“scenarijų testams atlikti. Iš esmės pakartosime tai, ką darėme anksčiau „Python Shell“:

iš laiko importuoti miegą

importuoti RPi. GPIO kaip GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, kampas): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) miegas (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 ()

Aukščiau pateikto kodo esmė yra funkcija setServoAngle (servo, kampas). Ši funkcija gauna kaip argumentus, servo GPIO numerį ir kampo vertę, kur turi būti padėtas servo. Kai šios funkcijos įvestis yra „kampas“, turime ją konvertuoti į darbo ciklą procentais, naudodami anksčiau sukurtą formulę.

Kai scenarijus vykdomas, turite įvesti kaip parametrus, servo GPIO ir kampą.

Pavyzdžiui:

sudo python3 kampasServoCtrl.py 17 45

Aukščiau pateikta komanda nustatys „GPIO 17“prijungtą servo sistemą 45 laipsnių aukštyje. Panaši komanda gali būti naudojama „Pan Servo“valdymui (padėtis iki 45 laipsnių „azimute“):

45. „Sudo python“kampas

Failą angleServoCtrl.py galima atsisiųsti iš „GitHub“

6 žingsnis: „Pan-Tilt“mechanizmas

„Pan-Tilt“mechanizmas
„Pan-Tilt“mechanizmas

„Pan“servo sistema „fotoaparatą“perkels „horizontaliai“(„azimuto kampas“), o „Tilt“- „vertikaliai“(pakėlimo kampas).

Žemiau esančiame paveikslėlyje parodyta, kaip veikia „Pan/Tilt“mechanizmas:

Vaizdas
Vaizdas

Vystydamiesi mes nesileisime į „kraštutinumus“ir naudosime tik „Pan/Tilt“mechanizmą nuo 30 iki 150 laipsnių. Šio diapazono užteks naudoti su fotoaparatu.

7 žingsnis: „Pan -Tilt“mechanizmas - mechaninė konstrukcija

„Pan -Tilt“mechanizmas - mechaninė konstrukcija
„Pan -Tilt“mechanizmas - mechaninė konstrukcija
„Pan -Tilt“mechanizmas - mechaninė konstrukcija
„Pan -Tilt“mechanizmas - mechaninė konstrukcija
„Pan -Tilt“mechanizmas - mechaninė konstrukcija
„Pan -Tilt“mechanizmas - mechaninė konstrukcija

Dabar surinkime 2 servo sistemas kaip „Pan/Tilt“mechanizmą. Čia galite padaryti 2 dalykus. Pirkite „Pan-Tilt“platformos mechanizmą, kaip parodyta paskutiniame žingsnyje, arba susikurkite savo pagal savo poreikius.

Vienas iš pavyzdžių gali būti tas, kurį aš sukūriau, tik pririšdamas servo servisus vienas prie kito ir naudodamas mažus metalinius gabalus iš senų žaislų, kaip parodyta aukščiau esančiose nuotraukose.

8 veiksmas: elektrinės plokštės/pakreipimo surinkimas

Elektros pano/pakreipimo mazgas
Elektros pano/pakreipimo mazgas
Elektros pano/pakreipimo mazgas
Elektros pano/pakreipimo mazgas
Elektros pano/pakreipimo mazgas
Elektros pano/pakreipimo mazgas
Elektros pano/pakreipimo mazgas
Elektros pano/pakreipimo mazgas

Surinkę „Pan/Tilt“mechanizmą, vadovaukitės nuotraukomis, kad gautumėte visą elektros jungtį.

  1. Išjunkite „Pi“.
  2. Atlikite visas elektros jungtis.
  3. Dukart patikrinkite.
  4. Pirmiausia įjunkite „Pi“.
  5. Jei viskas gerai, įjunkite savo servus.

Šioje pamokoje nenagrinėsime, kaip nustatyti fotoaparatą, tai bus paaiškinta kitoje pamokoje.

9 veiksmas: „Python“scenarijus

Sukurkime „Python“scenarijų, kad vienu metu valdytume abu servus:

iš laiko importuoti miegą

importuoti RPi. GPIO kaip GPIO GPIO.setmode (GPIO. BCM) GPIO.setwingsings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # pilka ==> PAN def setServoAngle (servo, kampas): tvirtinimo kampas> = 30 ir kampas 90 (vidurinis taškas) ==> 150 setServoAngle (pakreipimas, int (sys.argv [2])) # 30 ==> 90 (vidurinis taškas) ==> 150 GPIO. Valymas ()

Vykdant scenarijų, kaip parametrus turite įvesti „Pan kampas“ir „Pakreipimo kampas“. Pavyzdžiui:

sudo python3 servoCtrl.py 45 120

Aukščiau pateikta komanda nustatys „Pan/Tilt“mechanizmą 45 laipsnių „azimutu“(pasukimo kampu) ir 120 laipsnių „pakilimu“(pakreipimo kampas). Atminkite, kad jei neįvedami jokie parametrai, numatytasis nustatymas yra tiek pasukimo, tiek pakreipimo kampai, nustatyti iki 90 laipsnių.

Žemiau galite pamatyti keletą testų:

Vaizdas
Vaizdas

ServoCtrl.py failą galima atsisiųsti iš „GitHub“.

10 veiksmas: serverių ciklo testas

Dabar sukurkime „Python“scenarijų, kad automatiškai išbandytume visą servo seriją:

iš laiko importuoti miegą

importuoti RPi. GPIO kaip GPIO GPIO.setmode (GPIO. BCM) GPIO.setwingsings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # pilka ==> PAN def setServoAngle (servo, kampas): įtvirtinimo kampas> = 30 ir kampas <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = kampas / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) miego režimas (0,3) pwm.stop (), jei _name_ == '_main_': i diapazone (30, 160, 15): setServoAngle (pan, i) setServoAngle (tilt, i) for i in diapazonas (150, 30, -15): setServoAngle (pan, i) setServoAngle (tilt, i) setServoAngle (pan, 100) setServoAngle (pakreipimas, 90) GPIO.cleanup ()

Programa automatiškai atliks kilpą nuo 30 iki 150 laipsnių abiem kampais.

Žemiau rezultato:

Aš prijungiau osciloskopą tik norėdamas iliustruoti PWM teoriją, kaip paaiškinta anksčiau.

Vaizdas
Vaizdas

Pirmiau pateiktą kodą servoTest.py galima atsisiųsti iš „GitHub“.

11 žingsnis: Išvada

Išvada
Išvada

Kaip visada, tikiuosi, kad šis projektas gali padėti kitiems rasti kelią į jaudinantį elektronikos pasaulį!

Norėdami gauti daugiau informacijos ir galutinį kodą, apsilankykite mano „GitHub“saugykloje: „RPi-Pan-Tilt-Servo-Control“

Norėdami gauti daugiau projektų, apsilankykite mano tinklaraštyje: MJRoBot.org

Žemiau žvilgsnis į kitą mano vadovėlį:

Vaizdas
Vaizdas

Saludos iš pasaulio pietų!

Iki pasimatymo mano kitoje pamokoje!

Ačiū, Marcelo

Rekomenduojamas: