The Hernyow

A robot felépítése

A robot a hosszanti tengelyén elhelyezkedõ két hajtott kerék segítségével mozog, illetve két kis oldalsó kerék biztosítja az egyensúlyát.
A központi egység a robot tetején helyezkedik el, így a kerekeket ne zavarja az elfordulásban.
A cél egy kormányozható (de nem lánctalpas) robot megépítése volt, amely jól fordul, ezért az elsõ és a hátsó kerék is kormányozható. A két kerék együtt fordul, mindig ellentétes irányba, így a robot képes kis íven megfordulni.
Nézd meg a felvételt is!
A kerekeket hajtó motorok a kerekek mellett, szintén a robot hosszanti tengelyén helyezkednek el (így a robot alacsonyabb, ezáltal pedig stabilabb), és a kerekekkel együtt fordulnak.
A kerekek elfordításáról egy harmadik motor gondoskodik, amely a robot közepén helyezkedik el.
A motor ékszíjjal meghajt egy tengelyt, amelyen egy csigakerék található, ez pedig fogaskerék áttételen keresztül forgatja a kerekeket.


Érzékelők:
A robot elején három fényérzékelő található, melyek háromszög alakban helyezkednek el: kettő a motor előtt található (ezek az út szélét figyelik), egy pedig az első motor mögött (ez figyeli, hogy a robot az úton van-e). A fordulások során előfordulhat, hogy a robot nem tudja a kerekeket egyenes haladáshoz beállítani, ezért időnként újra kell kalibrálni a kerekek állását, amihez két nyomásérzékelőt használ. A Hernyow hátulján van egy lámpa, ami tolatáskor villog.


A program:
A Hernyow programja a legOS 0.2.5 könyvtárait használva C-ben íródott. Windows 95 alatt -- a Cygwin segítségével -- fordítottuk le a legOS kernelét, C könyvtárát és segédprogramjait.

A program forrása az alábbi négy fájlban található:
main3.c A main() függvény definíciója.
robot.h A program konstansai, makródefiníciók, a standard header fájlok include-olása és a robot.c-beli függvények deklarációja.
robot.c A többi C függvény definíciója, amiből a programunk összeáll.
5_music.c A dallamokat tartalmazó tömbök definíciója. A robot.c include-olja ezt a fájlt, nem fordítjuk külön.
A főprogram az inicializálás után kalibrálja a fényérzékelést, majd a kormányzást, aztán elindítja a robotot a halad() függvény meghívásával, majd a main_loop() függvényt meghívva belép a fő ciklusba, ahonnan nem is fog kikerülni, mert végül eltávolítottuk belőle az időkorlátot, és így végtelen, de azért biztos ami biztos a főprogramban még ott látható a robot leállítása a leall() hívással, és a main függvényből történő sikeres visszatérés.

Inicializálás: az init() függvény meghívásával a fényérzékelők aktív módba kapcsolása és a tolatólámpát villogtató szál elindítása. Ezt a szálat a blinker_thread() nevű függvény írja le.

Fényérzékelés kalibrálása: a calibrate_light() függvény meghívásával mindhárom fényérzékelőre beállítjuk a küszöbértéket -- először az útra kell helyezni a robotot, majd a földre, az LCD kijelzőn megjelenő utra ill. fold utasításnak megfelelően. Mindhárom érzékelőn a mért két érték számtani közepe lesz a küszöbérték.

Kormányzás kalibrálása: a calibrate_steer() függvény meghívásával a nyomásérzékelőket figyelve mindkét irányban megmérjük, hogy mennyi ideig tart az egyik végállásból a másikba `forgatni a kormányt'. Ezeket az időtartamokat a bal_ido és jobb_ido nevű globális változókban tároljuk.

A program fő ciklusa: a main_loop() függvényben leírt végtelen ciklus (amíg ki nem tépi a tápkábelt és le nem meríti az elemeket, addig a robotunk meg nem áll!), ami állapotváltozásra vár, és az állapotváltozásnak megfelelő függvényt meghívja. A state_change_wakeup() függvény figyeli az állapotváltozást, és a state globális változóban meg is jegyzi a jelenlegi állapotot. A delta() függvény visszatérési értéke az állapotváltozásnak megfelelő parancs -- mit kell most csinálni. Ezzel a függvénnyel egy állapotátmenet gráfot valósítottunk meg.

A lehetséges parancsok, illetve a szükséges függvényhívás:
CMD_ELORE Menj tovább!
CMD_KIS_JOBB Kicsit korrigálj jobbra! korrigal(JOBBRA)
CMD_KIS_BAL Kicsit korrigálj balra! korrigal(BALRA)
CMD_EXT_JOBB Extrém jobbra fordulás, amíg meg nem találod az utat! extrem(JOBBRA)
CMD_EXT_BAL Extrém balra fordulás, amíg meg nem találod az utat! extrem(BALRA)

Kis korrekció: a robot megáll, elfordítja a kormányt egy kicsit, elindul és így megy egy darabig, majd visszaszedi a kormányt, és megpróbálja megállapítani, hogy merre van az út (a poll_road() hívással).

Extrém fordulás: elkezdi játszani a `Mission Impossible' dallamot, majd megáll, elfordítja a kormányt majdnem teljesen az adott irányban (minden ötödiknél újrakalibrálja a kormányzást is, ha már egyszer úgyis ott van a nyomásérzékelők közelében), ezután elindul előrefelé, és addig megy, amíg a hátsó fényérzékelővel ismét meg nem találja az utat. Ekkor addig megy még tovább előre, amíg a kormányt egyenesbe szedi. Ha eközben lemegy az útról, akkor visszatolat (a tolatólámpát villogtatva), amíg meg nem találja.

Röviden összefoglalva tehát:
A robot az indítás után bekalibrálja magát, azaz beállítja a kerekeket középállásba. Ezután megindul egyenesen előre, amíg valamelyik érzékelő ez útra nem ér, innentől megpróbálja az utat követni. Ha a két első érzékelő valamelyike lefut az útról, akkor az adott irányba fordul egy kicsit és így halad tovább, de ha eközben a hátsó érzékelő is lefut, akkor megáll, és élesen fordul, és csak ezután halad tovább előre. A kerekeket akkor állítja ismét egyenesbe, mikor a hátsó érzékelő is felér az útra. Eközben még halad előre, álló helyzetben ugyanis nehezebben fordul, és nem egyenes állásba érne vissza. Még így is előfordul, hogy nem talál vissza középállásba, ezért minden ötödik éleskanyar után kalibrációt végez. Éleskanyar után előfordulhat, hogy mire a kerekek egyenesbe állnak, az érzékelők már lefutottak az útról, ezért ilyenkor a robot visszatolat, míg ismét nem érzékeli az utat, és ebből az állapotból halad tovább. A robot haladás közben az Indiana Jones zenéjét játsza, tolatáskor azonban átvált a Mission Impossible-re.
Előfordul, hogy kanyarodáskor a robot túlfordul, és visszafelé indúl el az úton. Ez azért van, mert a robot az úton szabadon mozoghat, és egyszer az út jobboldalát, egyszer pedig a baloldalát figyeli. Ezt a hibát úgy lehetne kiküszöbölni, ha a kanyarodás mértékét az út szélességének megfelelően mindíg beállítanánk (vagy csak az út egyik szélét követné).
Az állapotátmenet gráf mutatja, hogy a robot milyen állapotban milyen manővert végez.

Készült néhány mozgó felvétel is: 1. felvétel 2. felvétel

Készítették:
Locher Kornél
Oroszi Sándor
Szabó Dániel
Vitéz László