Teniso kamuoliuką mušinėjantis robotas

Kažkada internete pamačiau tokį projektą – stalo teniso kamuoliuką mušinėjantis robotas. Man pasirodė įdomus pats principas, kokiu nustato kur atsimušė kamuoliukas. Kaip davikliai naudojami mikrofonai, ir matuojama kurį mikrofoną garsas pasiekė greičiau. Pagal tai nustatoma kurioje vietoje kamuoliukas atsimušė į pagrindą. Nutariau pabandyt padaryk kažką panašaus.

Iš tikro man turbūt niekada nebūtų atėjusi tokia mintis, kad galima panaudoti tokį būdą. Juk mikrofonai visai netoli vienas nuo kito. Reiškia ir laikas, per kiek garsas ore nueina keletos cm atstumą labai mažas. Bet pasirodo galima išmatuoti tą laiką pakankamai tiksliai ir visai paprastomis priemonėmis.

Taigi, pirmiausiai reikia padaryti patį mechanizmą, kuris mušinės kamuoliuką. Renkantis pagrindą, į kurį atsimušinės kamuoliukas reikia atsižvelgti į tai, kaip kamuoliukas atšoka. Ne bet kas tinka. Po eksperimentų pasirinkau plastmasės plokštę, kuri iš abiejų pusių padengta aliuminiu. Naudojama reklamoje. Ji pakankamai kieta ir nesunki. Kamuoliukas atšoka gerai ir sukelia gana stiprų garsą. Tai svarbu. Dydis 29×29 cm. Plokštės kraštuose matosi pritvirtinti mikrofonai.

Kilnojimo mechanizmui pasirinkau tris servomechanizmus. Galima naudoti žingsninius variklius, bet servomechanizmai paprasčiau. Ir pradžių paėmiau MG995. Jau buvau atsispausdinęs laikiklius bet sugalvojau pabandyt kaip jie elgsis kada pastoviai kaitalioja kryptį.

Pasirodo net laisva eiga po poros minučių jie stipriai įkaista. Keista. Matomai toks režimas jiems nelabai patinka. Tada pabandžiau įvairius kitokius kokius turėjau. Paaiškėjo, kad maži veikia normaliau – nekaista. Neturėjau trijų vienodų, tai nusipirkau MG92B. Šitie veikia neblogai. Dideli čia ir nereikalingi, daug jėgos nereikia.

Servomechanizmai turi kažkaip kilnoti mušinėjimo pagrindą. Kadangi servos trys, reiškia išdėstymas apskritimu kas 120 laipsnių. Sujungimas su pagrindu turi judėti visomis kryptimis. Atsispausdinau laikiklius.

Sujungimui panaudojau metalinius šratus ir magnetus. Paprasta ir juda visomis kryptimis.

Mikrofonų laikikliai irgi atspausdinti.

Viskas sumontuota ant baldinės plokštės gabalo.

Kaip veikia padėties nustatymas. Kiekvienoje ašyje po du mikrofonus. Abi ašys veikia vienodai, tai panagrinėkim vieną iš jų. Signalas iš mikrofonų eina į komparatorius. Už jų stovi trigerai. Trigeris reikalingas tam, kad užfiksuotų signalą (persiverstų) vieną kartą, vos tik jis atėjo iš mikrofono. Taigi, abiems mikrofonams po trigerį. Mikrokontroleris pastoviai seka šiuos du įėjimus (viena ašis). Vos tik signalas pasirodo viename iš įėjimų, paleidžiamas skaitiklis. Į kurią pusę jis skaičiuos priklauso nuo to, kurį mikrofoną garsas pasiekė anksčiau. Skaitiklis veikia tol, kol garsas pasiekia antrą mikrofoną. Tada matavimas baigiasi, galima nustatyti kurioje vietoje tarp mikrofonų atsimušė kamuoliukas. Trigeriai numetami į pradinę padėtį, o rezultatas perduodamas per RS232. Šitas mikrokontroleris nieko daugiau nedaro, reikia maksimalaus greičio, kad galima būtų kuo tiksliau nustatytį garso sklidimo tarp mikrofonų laiką. Atsimušimo garsas gana skardus, jis žymiai stipresnis už aplinkinius garsus. Komparatorius galima sureguliuoti taip, kad atsimušimo garsas būtų priimamas, o aplinkinių garsų nejaustų.

Kitas mikrokontroleris priima kamuoliuko padėtį ir pagal tai pakreipia pagrindą į reikiamą pusę. Tuo pačiu metu servos pastoviai atlieka pagrindo kilnojimą, kad atmušinėt kamuoliuką. Kada reikia atmušti sinchronizuojasi pagal prieš tai buvusį kamuoliuko atsimušimo garsą.

Abu kontroleriai ant to pačio pagrrindo.

Antrame Arduino (abu atmega328) veikia PD kontroleris. Tik PD, I šiuo atveju nereikalingas, nieko naudingo man su juo pasiekti nepavyko. Reikia pastebėti, kad po kamuoliuko atsimušimo vietos nustatymo, rezultatas panaudojamas tik sekančio atmušimo metu. Neįmanoma nustatyti kur atsimuš kamuoliukas, kol jis dar neatsimušė. Reiškia visada yra vieno mušimo vėlavimas.

Toks padėties nustatymas veikia visai neblogai. Tiesa, yra ir minusų. Blogai veikia, kai atsimuša į plokštės kampą. Mikrofonai ne visada pagauna garsą. Tai suprantama. Bet į ten atsimuša retai, ir šiaip veikia geriau nei aš tikėjausi. Su padėties nustatymu nemažai eksperimentavau, todėl pasidariau programą, kuri rodo kur atsimušė kamuoliukas (matosi video). Parašyta Python’u.

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

2 Responses to Teniso kamuoliuką mušinėjantis robotas

  1. Gintaras says:

    Labai linksmas projektas! Gal ir gerai, kad mums su ta mobilia aplikacija nieko nesigavo – būtum šiam projektui laiko neturėjęs :) O kam net keturi mikrofonai reikalingi? Argi trijų neužtektų?

  2. ReM says:

    Tokie projektai mažai kam trukdo. Šitą dariau gal kokius pusę metų. Paguli kokį mėnesį pamirštas – vėl kažkiek pakrutinu. :)
    Iš pradžių aš ir galvojau, kad užteks trijų mikrofonų. Tačiau geriau pagalvojus – ne, taip nieko nesigaus. Nėra atskaitos taško. Kad galima būtų naudot trianguliaciją, reikia tiksliai žinoti, kada kamuoliukas atsimušė. Tada galima skaičiuoti laiką, per kiek garsas pasiekė kiekvieną mikrofoną ir apskaičiuoti vietą. Bet kaip tik tos pradžios ir nėra.
    Pvz. mobilaus telefono vietą tarp trijų bokštų apskaičiuoti galima nes yra atgalinis ryšys. O šiuo atveju atgalinio ryšio nėra.
    Nors čia tik mano nuomonė. Gal visgi būtų galima kaip nors sugalvot. Kartais būna labai nestandartinių sprendimų..

Leave a Reply

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