Balansuojantis robotas (2 dalis)

Prieš metus jau bandžiau padaryti balansuojantį robotą. Gavosi neblogai, bet visada galima padaryti geriau. Šį kartą pabandžiau atsižvelgti į visus pirmojo trūkumus. Pirmajame buvo visai paprasti varikliai. Reikėjo geresnių. Vis dar buvo klausimas, kokios turėtų būti šių variklių apsukos? Pirmojo roboto varikliai sukosi tikrai per lėtai. Bandžiau pamatuoti, kokios yra jų apsukos. Paaiškėjo, kad maždaug 150RPM. Nusprendžiau, kad 300RPM turėtų būti gerai.

Internetinėse parduotuvėse nemažas tokių variklių pasirinkimas, bet kas žino kurie iš jų geresni… Rinkausi pagal kainą ir ašies storį (6mm), kad tiktų ratai. Kaip paaiškėjo, varikliai neblogi, bet jų reduktoriai turi laisvumo. T.y. ašis šiek tiek kliba. Tai labai negerai šiam robotui. Nors varikliai daug didesni už naudotus pirmajame robote, srovės ima dvigubai mažiau.

Kartu nusipirkau dar du mažesnius variklius. Šių reduktoriai geresni, laisvumas nedidelis.

Variklių draiverį panaudojau paprastą ir visai neblogą. L298N. eBay su visa plokšte kainuoja pigiau nei pas mus vien tik mikroschema.

Norėjau, kad ratai šiam robotui būtų 9-10cm diametro. Paaiškėjo, kad galima tokių rasti, bet jų kaina visai nedžiugina. Visgi pagaliau pavyko rasti ratus visai nebrangiai (po 1$) Indijoje. Nusipirkau keturis, bet jų siuntimas į Lietuvą buvo du kartus brangesnis. Bet vis tiek gavosi gerokai pigiau nei kitur… Tačiau gavęs juos, eilinį kartą įsitikinau, kad pigiai ir gerai nebūna. Patys ratai būtų visai neblogi jei ne skylė centre. Matomai indai skyles gręžia iš rankos, staklių neturi. Skylės buvo ne visai centre, bet to išgręžta ne statmenai. Teko bandyti kaip nors taisyti padėtį. Susiradau stakles, kad galima būtų išgręžti statmenai. Pragręžiau 7 mm skyles (buvo 6 mm), ir įdėjau aliuminio vamzdelius. Turėjau idealiai tinkančio vamzdžio, išorinis diametras 7mm, vidinis 6mm. Statmenumas pagerėjo, bet centras vis tiek buvo ne visai vietoje. Gręždamas centrą atstatyti neturėjau jokių galimybių, todėl tiesiog iš keturių pasirinkau du geresnius.

Kontroleris toks pat kaip ir praeitą kartą – Arduino su atmega328. Tik šį kartą nusipirkau Arduino Pro Mini plokštę, kuri irgi pigesnė nei vien tik mikrokontroleris. Kinijos keistenybės. :)

Varikliai 12V, o akumuliatorius duoda 12,5V kai pakrautas, ir išsikrauti gali iki 9V. Kadangi kintant įtampai, keičiasi ir variklių apsukos, įdėjau STEP-UP stabilizatorių, kad galėčiau nustatyti stabilią įtampą visą laiką – 14V. Ant variklių draiverių krinta apie 2V, todėl gaunasi 12V. Šiuo metu nustatyta 13V, reiškia varikliai gauna apie 11V.

Daviklis – MPU6050. Geras tuo, kad visai pigus (šiuo metu 3$ su plokšte), ir turi viename korpuse 3 giroskopus, ir 3 akselerometrus. Su juo bendraujama per I2C. Visai paprasta pasijungti prie Arduino, yra tam sukurta biblioteka, arba galima ir be bibliotekos, nieko sudėtingo ten nėra. Tas pats daviklis dabar dažnai naudojamas ir kopterių kontroleriuose.

Korpusas, jei tai galima pavadinti korpusu, padarytas iš trijų stiklo tekstolito plokščių ir keturių 4mm strypų su sriegiu. Akumuliatoriai tie patys kuriuos naudoju ir kopteriuose. 3000-3600 mAh.

Beskaitinėdamas apie balansuojančius robotus atradau įdomų projektą – Balanduino. Atviro kodo projektas, sukūrė žmogus iš Danijos, ir netgi ketina tokius robotus pardavinėt. Nesiimu spręsti kiek toks bandymas gali būti sėkmingas, nors man tai atrodo abejotinai. Aš gerokai panagrinėjau jo programą, ir kai kurias idėjas panaudojau savo robote. Ten naudojama kitokia „geležis“, bet irgi Arduino. Panaudoti daug brangesni varikliai su gerais enkoderiais. Ir galutinis rezultatas daug geresnis. Yra parašyta visai nebloga programa Androidui, kuri leidžia valdyti robotą. Aš ją naudoju ir savo roboto valdymui, patiko man ta programa. Tiesa, šiek tiek aš ją pakeičiau, nes ne viskas man ten veikė. Ne viskas veikia ir dabar, bet tai, kas man reikalinga, veikia. T.y. roboto valdymas džoistiku, valdymas telefono vartymu, PID nustatymai.

Pirmiausiai išbandžiau kaip robotas balansuos be enkoderių. Balansavo, bet iš karto matėsi, kad reduktorių laisvumas neleidžia sureguliuoti taip, kad stovėtų beveik nejudėdamas. Nors šiaip jau viskas veikė visai neblogai.

Tokio roboto veikimą iš esmės pagerina enkoderiai. Enkoderis – tai daviklis, kuris parodo, kiek pasisuko ratas. Žinant, kiek pasisuko per kažkokį laiką, galima nustatyti kokių greičiu važiuoja robotas. Be to, žinant kiek ratas pasisuko, galima grįžti į pradinę padėtį, t.y. balansuoti vienoje vietoje, o ne važinėti po visą kambarį.

Enkoderiai būna įvairūs, vienas iš variantų – optinis. Principas paprastas. Ant ratų dedamas juodai-baltai sugraduotas diskas. Šviesos diodas šviečia į šį diską, o šalia esantis optinis daviklis gaudo atsispindinčią šviesą. Kur balta – atsispindi, kur juoda – neatsispindi. Besisukant ratui, galima skaičiuoti šiuos impulsus ir taip suskaičiuoti kiek pasisuko ratas. Paprasta, bet yra ir minusų. Tokio enkoderio rezoliucija yra nedidelė. Mano atveju yra 35 juodos ir 35 baltos zonos. Daugiau padaryti neina, nes optinis daviklis neatskiria kur juoda, kur balta. Su tiek dar dirba stabiliai. Kadangi skaičiuoju impulsus kai pereinama iš juodos zonos į baltą, ir iš baltos į juodą, gaunu 70 impulsų ratui apsisukus vieną kartą. Tai visai nedaug, pvz. Balanduino naudojami enkoderiai, ratui apsisukus vieną kartą, suskaičiuoja ~900 impulsų. Be to, pas mane yra tik vienas optinis daviklis enkoderyje. Taip neįmanoma nustatyti į kurią pusę sukasi ratas. Yra tik vienas būdas šiuo atveju – nustatinėti pagal paduotą varikliui komandą. Jei kontroleris duoda komandą suktis į priekį, tai skaičiuojant impulsus skaitau, kad ratas sukasi į priekį, jei komanda atgal, reiškia sukasi atgal. Tai irgi nėra visai tikslu, bet visgi veikia, ir veikia geriau nei aš tikėjausi.

Kai yra enkoderiai, galima paskaičiuoti kiek robotas pavažiavo pvz. jį pastūmus. Žinant kiek pavažiavo, galima vėl gražinti į tą pačią vietą. Rezultatas – balansuoja vienoje vietoje. Taip pat galima nustatyti kokių greičiu važiuoja robotas ir taip gerokai pagerinti jo važinėjimą valdant. Kaip tai veikia? Sakykim, kad robotas pradeda važiuoti į priekį. Tam jis turi kažkiek pasvirti į priekį. Pradeda važiuoti, kuo greičiau važiuoja, tuo kampas turi būti mažesnis. Kai žinomas greitis, pagal tai galima keisti pasvirimo kampą. Kuo greičiau važiuoja, tuo labiau atsitiesia. Gali važiuoti maksimaliu greičiu ir negriūti. Jei reikia staigiai sustoti, būtina pasvirti atgal. Šis kampas irgi apskaičiuojamas priklausomai nuo buvusio roboto greičio stabdymo metu. Rezultatas – žymiai geresnis valdymas.

Tokio roboto sureguliavimas nėra paprastas. Priklauso nuo visko: pvz. kokiame aukštyje yra akumuliatorius, koks jo svoris. Nemažai eksperimentavau su roboto aukščiu. Uždėjus lengvesnį akumuliatorių, balansavimas pablogėja. Bet panašu, kad labiausiai dėl reduktorių laisvumo. Ir enkoderiai įneša nemažai painiavos. Nors jų tikslumas blogas, man pavyko suderinti visai neblogai. Vienintelis dalykas – negali stabiliai stovėti vienoje vietoje. Kalti reduktoriai.

Ką dar galima patobulinti? Pirmiausiai enkoderius. Galima sudėti po du optinius daviklius kiekvienam enkoderiui, būtų galima nustatyti į kurią pusę sukasi ratas. Kaip tai padaroma aš dabar nenagrinėsiu, lengva rasti internete. Šį variantą tikrai pabandysiu. Ir reikėtų pakeisti variklius. Reikia, kad reduktorių laisvumas būtų kuo mažesnis. Negaliu dabar paprastai įdėti kitus turimus variklius, nes jų ašis kitokio storio, reikia daryti kokius nors perėjimus. Dėl reduktorių laisvumo ir enkoderių mažo tikslumo robotas negali balansuoti ant nehorizontalaus paviršiaus.

Ne visada brangesnis varikliai geresni. Pvz. pirmajame robote panaudoti plastmasiniai reduktoriai neturi jokio laisvumo.

Kaip robotas veikia galima pamatyti šiame video:

Matosi mano minėti dalykai, kaip robotas pastūmus grįžta į tą pačią vietą, kaip keičiasi pasvirimo kampas važiuojant ir stabdant (girdisi pyptelėjimas), kaip valdomas telefonu.

This entry was posted in Elektronika, Programavimas, Robotai. Bookmark the permalink.

5 Responses to Balansuojantis robotas (2 dalis)

  1. ecka333 says:

    Matau nuotraukoje, kad savo robotui naudoji HC-05 ar panasu bluetooth moduli. Norejau pasiteirauti, ar jis stabiliai veikia, ar nebuna netiketu rysio dingimo tarp modulio ir smartfono? Gal esi bandes uzmegzti rysi tarp PC (windows) ir sito modulio?

  2. ReM says:

    Taip, žinoma bandžiau ir su PC. Veikia puikiai, jokių ryšio dinginėjimų.

  3. pagrandukas says:

    Sveikas:)
    Daryk ball ballance robot. Tu gali:)

  4. ecka333 says:

    Idomu koki baitu perdavimo greiti galima pasiekti su bluetooth moduliu? Kiek ieskojau tokios info internete, niekur neradau. Gal esi demesi atkreipes i tai?

  5. ReM says:

    Nebandžiau specialiai greičio. Bet bluetooth standartas sako, kad greitis didesnis nei RS232. Sakykim jei naudojam 115200 ryšiui su moduliu, tai tiek tikrai praeis. Žinoma, tai priklauso nuo atstumo…

Leave a Reply

Your email address will not be published. Required fields are marked *