Skip to main content.

A kiindulás

2009-ben építettem egy kartonpapír szerkezetű, két motorral és egy szonarral felszerelt robotot, ami egy Arduino mikrokontroller segítségével egyszerű akadálykikerülést végzett. A robot elkészítéséről akkor részletesen írtam, az akkori robot végül ilyen lett.

artu total

A tapasztalatok alapján úgy döntöttem, hogy a továbblépéshez valamivel komolyabb vázat fogok használni, illetve a robotot is céltudatosabbá teszem, kitalálok egy egyszerű feladatot is neki. Ugyanakkor továbbra is fontos szempont, hogy a robot viszonylag olcsó, egyszerűen összeépíthető legyen.

Ezen az oldalon az új robotot fogom bemutatni. Ezúttal nem térek ki az elkészítés legkisebb részleteire, mint azt a kartonrobotnál tettem, hanem inkább a lényegesebb újdonságokra koncentrálok.

Az elkészült új robot, aktuális jelmezében így néz ki:

begr

A feladat

A robotika blog-hoz anyagot gyűjtve bukkantam az alábbi kis filmre, ami alapján ezt a bejegyzést írtam.

A filmen szereplő robot bögréjét rázva pénzt gyűjt. Én ehhez hasonló mozgó robotot szerettem volna csinálni.

A korábbi kartonrobot két motorra és egy szonárra épülő mozgása megfelelő alap az új robotnak is. Ebből kiindulva azt kellett elérni, hogy a robot ne faltól falig menjen, hanem időnként körülnézzen, irányt váltson és megrázza a bögréjét. Az összetettebb mozgáshoz több motorra és bonyolultabb program van szükség.

A korábbi alkatrészek közül az Arduino Duemilanove, a 2 db Parallax körbeforgó szervomotor, a Parallax Ping ultrahangos szenzor és az elemtartó az új robotban is szerepet kap. A felhasznált alkatrészek listája a következőkkel bővül:

1 db Merkur építőkészlet (a képet a retronom.hu-ról vettem)

Merkur építőkészlet

2db Parallax (Futaba) standard, 180 fokot forduló szervomotor

szervo

2 db játékautókerék

kerék

1 db egyszerű, barkácsáruházból beszerezhető görgő kerék

görgő

1 db próbapanel

próbapanel

1 köteg vezeték

vezeték

  • műanyag ételhordó doboz
  • egy füles fémbögre
  • sok kisméretű csavar és anya
  • jelmez tetszés szerint
 

Az elkészítéshez és működtetéshez felhasznált eszközök sem változtattak a lényegen: a program feltöltéséhez szükséges USB A-B típusú kábel mellett, az arduino fejlesztői környezettel rendelkező számítógépen, és csavarhúzón kívül mást nem nagyon használtam.

Beszerzés

A felsorolt eszközöket és alkatrészeket némi utánajárással - illetve házhoz szállításos online rendelés esetén anélkül is - be lehet szerezni.
A két szervót ismét a Chipcadnél vásároltam, 3000 Ft + ÁFÁ-ért darabját. A Merkur építőkészlet legalább 25 éves, megteszi helyette más hasonló is, lényeg, hogy viszonylag stabil legyen és hozzá lehessen csavarozni a többi, nem a készlethez tartozó alkatrészt.
A játékautókerék egy újabban kiszuperált gyerekjátékról került elő, a görgőt az OBI-ban vettem, párszáz forintért.
A kisméretű, az ételhordóba beférő próbapanelt és egy csomag vezetéket a hestore-ban vettem, együtt még 2000 forintba sem kerültek. Segítségükkel az elektronikát forrasztás nélkül össze lehetett állítani. A csatlakozóval ellátott vezetékek azért is hasznosak, mert az Arduino-n és a próbapanelen meglévő tüskékbe könnyen beilleszkednek, és utána biztosan benne is maradnak. Az egyszerű rézvezetékről egyik sem mondható el, a korábbi szerelés és programozás során ez elég sok fejfájást okozott.

A váz építése

A váz elkészítése az én Merkur készletem legnagyobb felületű két elemének egymáshoz rögzítésével kezdődik. Erre van rácsavarozva a műanyag doboz, melyben az Arduino, a próbapanel, az elemtartó és a vezetékek nagy része helyezkedik el. A műanyag doboz segítségével elérhető, hogy az Arduino fém részei ne érjenek össze a szerkezet többi részével, mert az rövidzárlatot okoz. A további alkatrészeket különböző hosszúságú, vékony egyenes elemekkel rögzítettem az alaphoz. Alulról a két körbeforgó szervót, azokra a játékautó-kereket, hátul egy kis felfüggesztéssel a görgőt. A kerekek rögzítéséhez a szervó szarvakat és a kerék belső oldalát is óvatosan át kellett fúrni. Ez így sokkal megbízhatóbb összekötést nyújt a korábbi kartonkerékhez képest.
Fölfelé terjeszkedve a leghosszabb elemek felhasználásával sikerült viszonylag magas robotot összehozni. Ezekre a hosszú elemekre került elölről a szonár, fölé a bögrét mozgató standard szervó, hozzárögzítve a fémbögre. Felülről egy nagy felületű elem zárja le vízszintesen a törzset, amihez a negyedik, fejet forgató standard szervó rögzül.

begr1 begr2
begr3begr4
Ezen kívül még néhány keresztrögzítésre, illetve egy hátsó ellensúlyra volt szükség, mert a hosszúkás alak sok pénzzel a bögréjében hajlamossá vált orra bukni.
A váz összeállítása jó néhány óráig eltartott és az itteni leírással szemben nem volt mindig előre haladó, többször vissza kellett bontani egyes részeket, sőt új alkatrészt kellett találni/venni, amikor egy megoldás nem vált be. Például a görgő a harmadik változat a hátsó támasztás biztosítására.
A végeredménynél szempont volt, hogy a mikrokontrollerhez könnyen lehessen csatlakozni és az elemeket bármikor ki lehessen cserélni.

A jelmezzel kapcsolatban csupán arra kellett figyelni, hogy a forgó alkatrészek ne csíphessék be, valamint hogy a szonár ne kerüljön a ruha takarásába, mert különben mindig közeli akadályt jelez.

Elektronika

Az elektronika kialakítása a korábbi cikkhez képest jórészt annyiban változik, hogy két új motort kell tudni kezelni. Ezen kívül az összes eszköz fázisát, ideértve a korábban kihagyott mikrokontrollerét összekötve a robot egyaránt működhet az USB-n keresztül a PC-től kapott árammal, illetve a négy ceruzaelemmel.
Így a korábbi hiányolt autonómia már megoldható. Az alábbi ábra a pénzgyűjtő robot összeköttetéseit mutatja.

huzalozás

Programozás

A robot programozása a korábban használt Arduino programozási nyelven írt kód átalakítását jelenti. A programot az Arduino saját fejlesztői környezetében készítettem el, majd az USB kapcsolaton keresztül a robotra töltöttem.

ide

Az új program két működési módot biztosít: ha a robot a számítógéphez van csatlakoztatva, akkor a soros porton keresztül parancsok küldhetők neki, egyébként önálló mozgásba kezd.
Az irányított módban az összes aktorát be lehet kapcsolni, azaz a robot képes előre és hátra elmozdulni, elfordulni, megrázni a bögréjét és forgatni a fejét, valamint a szonár alapján a szemben lévő akadályok távolságát megmérni. Később, ha bluetooth kapcsolatot építek ki az Arduinoval (az eddigi próbálkozások Arduino BT-vel valamint egy Bluegiga bluetooth modullal nem jártak sikerrel), akkor ez a mód valódi távirányításnak felel meg, mely akár okostelefonról is használható lesz.

A bögre egyszeri megrázása a cupServo inicializálása után az alábbi egyszerű kóddal történik:

void shakeOnce(){   cupServo.write(100);   delay(100);   cupServo.write(80);   delay(100); }

Mivel a standard szervó a 0-tól 180 fokig tud fordulni, ezért a 90 érték átadása a write eljárásnak ép az alapállapotot, a 100-as az egyik, a 80-as a másik irányba 10 fokos elfordulást jelenti. A bögre rázásához ezt a shakeOnce-ot hívom meg háromszor.
A fej forgatása ehhez teljesen hasonló, egyszeri, nagyobb szögű körülnézés:

void turnHead(){   headServo.write(150);   delay(300);   headServo.write(30);   delay(600);   headServo.write(90); }

Az automatikus mód a korábbi egyenes haladás és akadálykikerülés kiterjesztése, melyet a loop függvényben ciklusonként meghívott következő kód határoz meg:

void beg() { if( state == TURN ) { if( millis() - actionStart < TURNTIME ) { turn(turnDirection); return; } else { startMove(); } } // finding obstacles if( cms[0] != 0 ) { // moving sensing queue forward for( int i = NO_PINGS -1; i > 0; --i) { cms[i] = cms[i-1]; } } cms[0] = ping(); // new sensation int isWallClose = 0; for( int i = 0; i < NO_PINGS; ++i) { // finding obstacle if( cms[i] < 30 && cms[i] > 0 ) { isWallClose = 1; } } if( isWallClose ) { // wall/person found goStop(); shakeAndStartTurn(); } else { if( millis() - actionStart < moveTime ) { goForward(); } else { goStop(); turnHead(); shakeAndStartTurn(); } } }

Annak érdekében, hogy a robot ne mindig faltól-falig haladjon, ezért véletlenszerű időközönként a robot közeli akadály jelenléte nélkül is elfordul. Ehhez az egyenes vonalú mozgás megkezdésekor meghívott startMove eljárás egyrészt eltárolja az aktuális időt a millis beépített függvény meghívásával, másrészt meghatározza, hogy az előre konfigurált 3-7 másodperc között mi legyen az az időintervallum, amit a robot mozgásban tölt.

void startMove() { state = MOVE; moveTime = random(MOVEMAX-MOVEMIN) + MOVEMIN; actionStart = millis(); }

Ha eközben nem érzékel akadályt a robot - amit az isWallClose változóba gyűjtve határoz meg -, akkor előrefelé megy, majd a kijelölt idő leteltével megforgatja a fejét, megrázza a bögrét és valamilyen irányba elfordul. Ha mégis akadályba ütközne, akkor hamarabb megkezdi az elfordulást (shakeAndStartTurn eljárás két hívása az utolsó előtti if két ágában).

Annak megállapítása, hogy van-e akadály a robot előtt, egy picit trükkös, mivel a szonár nem teljesen megbízhatóan szállítja az érzeteket az Arduinonak. A kód középső, finding obstacles megjegyzéstől kezdődő része a paraméterezésnek megfelelően három egymás utáni szonár mérést tárol el egy tömbként implementált FIFO sorban. Ha a három érvényes, tehát nem nulla mérés között van olyan, ami 30 centiméternél kisebb értéket jelez, akkor a robot úgy veszi, hogy akadály van hozzá közel. A nulla érték azt jelzi, hogy a szonárnak a rendelkezésre álló fél tizedmásodpercben nem sikerült visszaverődő impulzust fogadnia.
Az adatok több méréssel való biztosítására azért is szükség van, mert ha a szonár jele nem merőlegesen érkezik meg egy akadályra, akkor a jel elveszhet, illetve többszöri visszaverődés miatti túl nagy érték jelenhet meg.

Mielőtt a robot nekilát a fordulásnak, megrázza a bögréjét, hátha az akadály egy ember, így elérkezett az ideje a pénzgyűjtésnek. Egy másodperccel később kiválasztja az elfordulás irányát, törli az eddig begyűjtött szonár méréseket, hisz a legközelebbi egyenes mozgásnál tiszta lappal lehet indulni. Ezen kívül eltárolja a fordulás kezdő időpontját. Mindezt a shakeAndStartTurn eljárás az alábbi módon definiálja:

void shakeAndStartTurn() { state = TURN; // robot turns clearSenses(); // cleaning up to pings because we will turn for a while shake(); // shake, may be the obstacle is a person delay(1000); //waits for 1 seconds turnDirection = random(2)*2-1; // setting turning direction actionStart = millis(); }

Visszatérve a fő eljárásra látható, hogy amennyiben fordulási módban (state = TURN) van a robot, akkor mindaddig a kiválasztott irányba fordul, amíg TURNTIME idő le nem telik, ami jelenleg fél másodperc. Ezután ismét visszatér a startMove eljáráshoz, azaz az egyenes haladáshoz.

Az eddigiekből kiderül, hogy a state változó segítségével egy egyszerű kétállapotú automatát írtam le, melyben az állapotok közti váltásokat az akadályok, illetve a többnyire véletlenszerű időzítés határozza meg.
Annak is fontos szerepe van, hogy nem egyszerűen delay(TIME) módon oldom meg egy adott tevékenység meghatározott ideig történő végrehajtását. Ez ugyanis blokkolna minden más kódot, így például a haladás közben nem lehetne az akadályok felbukkanását vizsgálni. Ehelyett eltárolom a tevékenység kezdetének idejét, és egyéb programrészek futása közben is folyamatosan figyelni tudom, hogy eltelt-e már az adott feladatra szánt idő.

A robot teljes kódja innen tölthető le.
A robotra töltés után a program rögtön el is indul, vagyis elkezdi küldeni a jeleket a szervók felé, így továbbra is érdemes volna egy kapcsolót a robotra szerelni.

Eredmények, folytatás

Az elkészült robot a korábbi változatnál lényegesen masszívabb és megbízhatóbban is mozog. Az ügyesebb összekötés miatt az áramellátáshoz már nem szükséges számítógépes kapcsolat. Az új program érdekesebb feladatot végez, mint elődje.

A jobb kerekek és a görgő segítségével már többféle talajon, így parkettán, padlólapon, szőnyegen is jól mozog a robot.

Az alábbi film a robot működését mutatja be:

A farsangra készülő robottal kapcsolatos első elképzelés az volt, hogy bluetooth kapcsolaton keresztül távirányítva fog működni. Mivel ezt egyelőre nem sikerült megoldani, ezért tértem át az önállóan is működőképes robotra. Magyarázva a bizonyítványt ennek megvan az az előnye, hogy az autonómia szembeszökőbb, így önálló lényként jobban értelmezhető a gyerekek számára.
A bluetooth kapcsolatot persze továbbra is érdemes volna megoldani, mert a robotra helyezett laptoppal vagy még inkább mobiltelefonnal kommunikálva sokkal többre lenne képes, például a képek alapján navigálhatna.

A használt szervók nem túl gyorsak, ha nagyobb szöget írnék elő a bögre rázásához vagy gyorsítani próbálnám a fej mozgatását, akkor nem járnék sikerrel, a "végtag" hamarabb elkezdené a visszafele mozgást, minthogy célba érne. Emiatt egy komolyabb robotnál komolyabb meghajtásra is lesz szükség.

További hasznos oldalak

Magyarul Angolul

Ha ismersz még ide tartozó érdekes oldalt, különösen magyar robotikai eredményeket, kérlek, írd meg!

Copyright © 2011, Szabó Richárd
richard_szabo@nospam.invitel.hu (a nospam törlendő)
Courtesy Open Web DesignThanks to Florida Vacation Homes