2015-03-31

Servo motorų valdymas mikrovaldikliu


Įvairiems mechaniniams judesiams atlikti galima pasitelkti įvairius elektrinius motorus. Motorų rasime įvairių tipų, galios, voltažo, bešepetėlinių ir ne. Iš tokios gausybės ne visi pritaikyti valdymui mikrovaldikliu. Mechaniniams judesiams, pvz. mygtuko paspaudimui, detalių judėjimui ir t.t. įprasta naudoti mažus ir daug galios nereikalaujančius Servo motoriukus. Pirmąkart susidūrus su jais gali iškilti klausimų kaip valdyti bei kaip juos pajungti - vietoj dviejų įprastinių motoro laidų, turime net gi tris. Trumpai apie jų valdymą šiame straipsniuke.



I. Intro

Pirmiausia reiktų pristatyti, jog servo motoras (arba servas) yra priskiriamas prie tikslaus valdymo motorų, kadangi leidžia tiksliai keisti ašies pasisukimo kampą, greitį ir pan. Jis turi atskirą/papildomą laidą, kuriuo paduodamas valdymo signalas (impulsas). Pagrindinės charakteristikos be abejo yra sukimo momentas N*m ar kg*cm (kuo didesnis, tuo motoras stabiliau išlaiko savo pasisukimą ar priešinasi jo pasikeitimui), svoris bei elektrinė galia (naudojama įtampa/srovė). Motoro ašis nesisuka tol, kol valdymo linijoje nėra paduodamas valdymo signalas, t.y. nors ir būtų prijungta įtampą prie maitinimo (+/-) laidų. Servo viduje būna valdymo schema bei prie motoro ašies prijungtas įvairių dantračių kompleksas (reduktorius) sudarantis galimybę paaukoti dalį ašies sukimosi greičio paverčiant jį į didesnį sukimo momentą ir atvirkščiai. Reduktoriaus sistema, t.y. dantračiai būna tiek plastikiniai tiek ir metaliniai. Metaliniai žymiai ilgiau laiko, todėl juos deda į didesnio sukimo momento servas, bet, žinoma, plastikiniai - mažiau sveria. Kas būdinga servo motorams, jog motoro ašį galima pasukti tik intervale nuo 0 iki 180 laipsnių. Pavyzdžiui, norime, kad motoras pasisuktų į 120 laipsnių poziciją - tai paduodame atitinkamą signalą į valdymo liniją ir motoras pasuka ašį tiek, kiek reikia. Toliau žvelgsime į svarbiausią - kaip valdyti motorą.


II. Valdymas

Į servo motorą ateina trys laidai. Kaip jau anksčiau išsiaiškinome du iš jų (+/-, raudonas/juodas arba raudonas/rudas) yra skirti elektros energijos (galios) tiekimui, o likęs (baltas/geltonas) yra valdymo signalo linija. Valdymo signalas yra kas 20ms pasikartojantis kintamo pločio impulsas. Impulso plotis pasako motorui, į kokią poziciją jis turi pasukti ašį. Priimta, jog 1ms pločio aukštas (+5V ar +3V) impulsas atitinka ašies pasisukimą/poziciją į 0 laipsnių, o 2ms atitinka poziciją - 180 laipsnių (žr. paveikslą žemiau). Pavyzdžiui, 120 laipsnių kampą atitiktų impulsas, kurio plotis yra (1+120/180) = 1.66ms, o 90 laipsnių - 1.5ms ir t.t. Likusi signalo dalis yra žemas įtampos lygis - 0V. Bendras signalo periodas kartu su impulsu - 20ms.


Paveiksle kairėje pavaizduotas įprastinis PWM signalas skirtas valdyti paprastą šepetėlinį motorą. Skirtingai nei naudojant PWM - servo motorui išnaudojama mažiau energijos valdymo signalui generuoti. Taip pat neoperuojama tiesiogiai su energijos tiekimo-maitinimo linija.

Servo signalą galima generuoti tiek naudojant paprastą mikrovaldiklio I/O išvadų logiką su uždelsimu (delay) tiek su laikmačiu, tiek ir pasitelkus PWM. Norint generuoti su PWM - vieno ciklo (periodo) laikas turi atitikti signalo/kadro trukmę (t.y. būti lygus 20ms), o linijos aukšto signalo laikas 1-2ms nustatomas kaip 10-20% duty cycle.



Tuo metu, kai servo motorui signalo linijoje yra paduodama aukšta įtampa, servo motoras kiek įmanydamas stengiasi pasukti ašį į reikiamą poziciją, kurią nusako aukšto impulso plotis. Jeigu reikiama pozicija jau pasiekta - ašis nesisuka, tačiau priešinasi bet kokiems posūkio pokyčiams. Kuo didesnis pasipriešinimas sukeliamas, tuo daugiau galios naudojama iš energijos tiekimo šaltinio. Tas pats vyksta, jeigu motoro ašis yra blokuojama sukimosi metu dėl atsiradusios kliūties.

III. Pavyzdžiai

Dabar keletas pavyzdžių, kaip valdymą realizuoti praktiškai. Vienas iš lengviausias būdų - su Arduino. Tam net skirta atskira "Servo" biblioteka. Pavyzdinė realizacija pateikta žemiau. Joje pirmiausia servo motorui liepiame pasisukti į 180 laipsnių kampo padėtį, palaukiame 5 sekundes ir liepiame grįžti į 0 laipsnių kampo padėtį. Po penkių sekundžių viskas kartojama nuo pradžių.


Realizuojant analogišką variantą su Atmega be papildomų bibliotekų ir įmantrybių gautume:




Kitus du variantus - su laikmačiu (pertraukimais) ir su PWM palieku atlikti skaitytojui.

IV. Niuansai

Yra servo motorų, kurie gali suktis ne 0-180 laipsnių, bet 0-360 ar net daugiau. Kai kuriais atvejais galima turimą motorą taip modifikuoti, jog nebūtų ribojamas apsisukimų skaičius/kampas, bet nedažnai to prireikia.

Kitas svarbus dalykas yra servo motoro energijos tiekimo grandinės galia. Paprastą, mažą servą (5-9g) galima maitinti tiesiai iš mikrovaldiklio. Problema atsiranda, kai norime valdyti galingesnį servą, kuriam neužtenka mikrovaldiklio tiekiamos srovės (galios). Tokiu atveju reikia naudoti papildomą maitinimo šaltinį (Vdd), kuris gali tiekti kelis ar kelioliką amperų.



Taip pat reikia suprasti, jog motoras neduoda 100% garantijos, kad pasieks nurodytą ašies pasisukimo kampą. Jis tik "stengiasi" kaip galima greičiau ir tiksliau pasiekti savo tikslą - reikiamą kampą, bet jeigu eigoje užstrigtų ar sutiktų besipriešinančią kliūtį, tai tikslo gali ir nepasiekti. Norint to išvengti reikia būdo kaip nustatyti, koks iš tikrųjų yra ašies pasisukimas. Laimei tai jau senokai sugalvota - tam naudojami enkoderiai (encoders) - optinės/magnetinės sistemos sekančios tikrąją ašies padėtį. Enkoderiai naudojami specializuotuose ir brangesniuose (pramoniniuose) servo motoruose.



V. Reziume

Naudojant servo motorus galima padaryti iš ties įdomių dalykų. Su jais - mechaninis judėjimas paklūsta kompiuterio logikai. Panaudojimo atvejų begalės, kad ir susiprogramuoti judančius robotus, automatizuotą durų atidarymą, robotinę ranką, akvariumo žuvų maitinimo sistemą ir t.t. Šiam kartui tiek apie juos. Sėkmingo valdymo!




Komentarų nėra:

Rašyti komentarą