1. A feladat leírása
Feladatunk egy olyan robot készítése, amelyik képes egy megadott útvonalat követni. Az útvonal alatt egy megfelelõ szélességû, tetszõlegesen kanyarodó, a padlózat színétõl jelentõs mértékben eltérõ csíkot értünk.
A feladat kivitelezésében fontos szerepet jatszakan a következõ tényezõk:
2. Megoldásaink
Ebben a dokumentációban
a feladat megoldásának kétféle változata
kerül bemutatásra. Az elsõ változat tulajdonképpen
csak a megépített robot tesztelésére szolgál,
többnyire csak alapfunkciókat valósít meg, míg
a második verzióban történtek a részletek
alaposabb kidolgozásai, illetve a különbözõ
extra funkciók megvalósításai (lásd
késõbb).
3. A robot
A megépített
robot tulajdonképpen egy lánctalpas kiskocsi, amit az alábbi
képek szemléltetnek. A két lánctalpat két
külön motor üzemelteti, ezen kívül mindkét
motor rendelkezik egy-egy fényérzékelõvel is.
A kiskocsi elején található fehér, nyomógombra
emlékeztetõ szerkezet nem más, mint egy ütközésérzékelõ,
aminek megnyomása a robot megállását eredményezi.
(ez azt jelenti, hogy ha a robot nekimegy valaminek, akkor automatikusan
megáll). Ezen kívül a robot elsõ részének
közepén egy újabb fényérzékelõ
található, aminek szerepe a kocsit az útvonalon tartani.
4. Az útvonal
Az általunk megépített robot sötét háttérre ragasztott világos színû (fehér) útvonalat képes követni. Nem célszerû az útvonalat túl fényes felületre
ragasztani, illetve
maga az út se legyen fényes (pl. ragasztószalag),
mert a fényvisszaverõdés megzavarja a robot fényérzékelõit,
amelyek azután nem bitzos, hogy helyesen mûködnek majd.
A legcélszerûbb (a tesztelést is ilyen körülmények
között végeztük) a papírcsíkokból
készített útvonal.
5. Az elsõ változat
(két érzékelõs változat; a középsõ, utat figyelõ érzékelõ nincs beleépítve)
Az A, B, C érzékelõk közül:
#define SPEED 4
int rnd;
A programozási fázis megkezdése elõtt kikisérleteztük azokat a küszöbértékeket, amelyek alapján a fényérzékelõk meg tudják határozni, hogy utat látnak-e vagy nem.
#define HATAR 40
Ezután következett a fõprogram megírása, amely az alábbi fontosabb részekbõl áll:
Amíg az ütközésérzékelõ értéke kisebb, mint 1000, a robot halad elõre. Ha ez az érték 1000 fölé ugrott, az azt jelenti, hogy az ütközésérzékelõ gombja meg lett nyomva, azaz a robot nekiment egy akadálynak, és nem tud továbbhaladni. Amennyiben a bal fényérzékelõ nem érzékel utat, akkor kikapcsolja a bal motort, azaz a kocsi balra fordul. Hasonlóképpen mûködik a jobb oldali fényérzékelõ is. Különben a robot halad elõre a kezdetben definiált sebességgel. Ezt a feladatot a következõ programrész valósítja meg:
while(SENSOR_2 <1000) {if(SENSOR_1 >= HATAR) { Off(OUT_A); } else {SetPower(OUT_A, SPEED); OnFwd(OUT_A); } if(SENSOR_3 >= HATAR) {Off(OUT_C); } else {SetPower(OUT_C, SPEED); OnRev(OUT_C); } }Gond akkor lép fel, ha a robot mindkét érzékelõje útra téved. Ekkor ahhoz, hogy erre a helyzetre is reagálni tudjon valamit a robot, bevezettük azt a megoldást, hogy ilyenkor véletlenszerû sebességgel egy bizonyos ideig hátrafelé halad.
if (SENSOR_1 >=HATAR && SENSOR_3 >=HATAR) { rnd=Random(5); SetPower(OUT_A, rnd); rnd=Random(5); SetPower(OUT_C, rnd); OnRev(OUT_A); OnFwd(OUT_C); Wait(50); Off(OUT_A+OUT_C); }
6. A második
változat
Ez tulajdonképpen már a három fényérzékelõs változat, amit úgy oldottunk meg, hogy a középsõ érzékelõre (B) két eszközt tettünk (fény- és ütközésérzékelõt). A program kezdeti mintavételezéssel indul.
A robot az olyan helyzeteket detektálja útként, amikor teljesül, hogy a középsõ fényérzékelõje fehér csíkon van, a szélsõ kettõ pedig nem. Kezdetben a program feltételezi ezt az állapotot. Ez azt jelenti, hogy amennyiben a bal érzékelõ is utat érzékel, a robotnak balra kell fordulnia, illetve, ha a jobb érzékelõ is útra téved, akkor jobbra fordulással próbálja visszaállítani az alapállapotot. A robot leállásának a feltétele is változott, miszerint a kocsi addig mûködik, amíg akadályba nem ütközik, vagy 3 mp. elõrehaladás után sem érzékel utat. Abban a szélsõséges esetben, amikor a két külsõ érzékelõ utat érzékel, viszont a középsõ nem, a robot hátratolat, amig ez az állapot meg nem szûnik.
A feladatot megvalósító programkódrészlet:
task main() { inicializáló rész while(END && (no_road==FALSE || (no_road==TRUE && Timer(1)<30))) { if(!LEFT && !RIGHT && !CENTER) { go_forward(); } if(LEFT && !RIGHT && !CENTER) { turn_left(); panic=FALSE; panicleft=TRUE; while(LEFT && END && (panic==FALSE || (panic==TRUE && panicleft==FALSE))) { if(RIGHT && panic==FALSE) { SetPower(OUT_A, TURN_SPEED); SetPower(OUT_C, INIT_SPEED); OnFwd(OUT_A);OnFwd(OUT_C); panic=TRUE; } } ... }A dõlt betûvel jelölt kódrészlet általunk megvalósított függvényeket, eljárásokat, illetve inicializációs részt tartalmaz.