Robotkommunikáció 2. rész



Hasonló dokumentumok
Robotkommunikáció 1. rész

Robotkéz. Évfolyam: 9. Iskola: Bányai Júlia Gimnázium, 6000 Kecskemét, nyíri u. 11.

6000 Kecskemét Nyíri út 11. Telefon: 76/ ; Fax: 76/ Gyakorló feladatok

A LEGO Mindstorms EV3 programozása

A B C NXT A B C. Szolga 1. Szolga 3. NXT. Szolga 2.

VERSENYFELHÍVÁS. A verseny célja:

VI. Robotprogramozó Országos Csapatverseny Döntő versenyfeladatok. 5. évfolyam

VI. Robotprogramozó Országos Csapatverseny évfolyam

IV. LEGO Robotprogramozó Országos Csapatverseny

VIII. Robotprogramozó Országos Csapatverseny Regionális versenyfeladatok évfolyam

Eljárások és függvények

2-VEZETÉKES KAPUTELEFON RENDSZER Telefonos illesztő / Telefonhívó modul. VDT-TPC Felhasználói és telepítői kézikönyv VDT-TPC. VDT-TPC Leírás v1.0.

Megoldás. Feladat 1. Statikus teszt Specifikáció felülvizsgálat

PLC Versenyfeladat. XIV. Országos Irányítástechnikai Programozó Verseny Budapest, március Összeállította az EvoPro Kft.

SZENZORMODUL ILLESZTÉSE LEGO NXT PLATFORMHOZ. Készítette: Horváth András MSc Önálló laboratórium 2 Konzulens: Orosz György

Elektródás kazán vezérlés használati útmutató

Csapat: Feladat: Ismertetni:

Programozott vezérlések (NGB_AU026)

Szélkövetés: Ehhez az üzemmódhoz a PR3-as paraméter értékét 0-ra kell állítani.

TERC V.I.P. hardverkulcs regisztráció

BEÁGYAZOTT RENDSZEREK TERVEZÉSE UDP csomag küldése és fogadása beágyazott rendszerrel példa

Neumann János Számítógép-tudományi Társaság Programozás, robotprogramozás szakkör Három félév 3 * 8 foglalkozás

A tanulók gyűjtsenek saját tapasztalatot az adott szenzorral mérhető tartomány határairól.

A FOGLAKOZÁS ADATAI: SZERZŐ. Kiss Róbert. Körhinta A FOGLALKOZÁS CÍME A FOGLALKOZÁS RÖVID

RÖVID LEÍRÁS: VIDEÓ: A ROBOT MEGÉPÍTÉSI IDEJE: ~1,5 óra ROBOTFACTORY ELTE, APÁCZAI CSERE JÁNOS

Roger UT-2. Kommunikációs interfész V3.0

Számítógép felépítése

vialan OS-103 vonalfordító készülék kezelési útmutató

Korszerű információs technológiák

Kris Burm játéka. Tartozékok

A vezérlő alkalmas 1x16, 2x16, 2x20, 4x20 karakteres kijelzők meghajtására. Az 1. ábrán látható a modul bekötése.

Mérési jegyzőkönyv. az ötödik méréshez

WP1 Vezérlő Használati Útmutató

A számítógép részei. Rendszeregység

Intelligens biztonsági megoldások. Távfelügyelet

Panel bekötési pontok:

A továbbiakban a mért esési időt felhasználhatjuk a nehézségi gyorsulás meghatározására.

Radioaktív anyag felezési idejének mérése

Választás /Program gomb Forgató gomb Start/ Stop gomb

Occam 1. Készítette: Szabó Éva

2-VEZETÉKES KAPUTELEFON RENDSZER. Telefonhívó egység VDT TPS. VDT-TPS Leírás v1.0.pdf

WS-Pro WPX38 MD+ PROGRAMOZÓI KÓDOK ÖSSZESÍTÉSE

Dinnyeválogató v2.0. Típus: Dinnyeválogató v2.0 Program: Dinnye2 Gyártási év: 2011 Sorozatszám:

Adam Kałuża játéka Piotr Socha rajzaival J á t é k s z a b á l y

SZERZŐ: Kiss Róbert. Oldal1

Használati útmutató. JY-M19-CW típusú (KM0160) vezeték nélküli Km óra

Szkriptnyelvek. 1. UNIX shell

RIEL Elektronikai Kft v1.0

PRN1 / PRN 2 A távirányítók 433 MHz frekvencián működnek

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Gyors-programozási Segédlet

Készítette: X. Y. 12.F. Konzulens tanár: W. Z.

1. Ismerd meg az új barátodat: Alpha 1 PRO

Dobble Denis Blanchot játéka 2-8 játékos számára 7 éves kortól

GoWebeye Monitor Release Üzenetküldés

Folyamatirányítás labor 4. mérés Gyártósori szállítószalag modell irányítása Modicon M340 PLC-vel. Feladat leírás

Kétszemélyes négyes sor játék

1. A berendezés programozása

Billentyűzet. Csatlakozók: A billentyűzetet kétféle csatlakozóval szerelhetik. 5 pólusú DIN (AT vagy XT billentyűzet csatlakozó),

Mi van a Lajtner Machine hátterében?

OEP Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1. Feladat. Elemzés 1

HASZNÁLATI UTASÍTÁS PM Bluetooth Sminktetováló Készülék

A 2010/2011 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Bár a szoftverleltárt elsősorban magamnak készítettem, de ha már itt van, miért is ne használhatná más is.

SZERZŐ: Kiss Róbert. Oldal1

LETÉTKEZELŐ NYILVÁNTARTÁSI RENDSZER

1. Fejezet Hardver Installálás

DebitTray program Leírás

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

C programozási nyelv

Mezőgazdasági robot fejlesztése és jövőbeli bővíthetősége

Városi tömegközlekedés és utastájékoztatás szoftver támogatása

Felvételi tematika INFORMATIKA

Robotkocsi mikrovezérlővel

nagyoknak kicsiknek SKOLÁBA ISKOLÁBA ISKOLÁBA ISKOLÁ PROGRAMOZÁS ROBOTIKA BEHOZZUK A ZÖLD ENERGIÁKAT AZ OSZTÁLYTERMEKBE

Kezelési leírás. Portos motor DELUX-R

A TERC VIP költségvetés-készítő program telepítése, Interneten keresztül, manuálisan

Az AVR programozás alapjai. Előadja: Both Tamás

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

Számítógépes Hálózatok. 7. gyakorlat

DIALOG időkapcsoló PROGRAMOZÁSI ÚTMUTATÓ

Black Jack A játék menete és további szabályok

Kommunika cio s protokoll. Verzió 1.0

SMS küldő központ Leírás

A megfelelőségi nyilatkozat letölthető a honlapról

Felhasználói útmutató CVR mobil kliens, ios rendszerhez.

Útmutató EDC kézivezérlőhöz

Örökmozgók. 10. évfolyam

A GYORS REFLEXEK JÁTÉKA 2 5 JÁTÉKOS RÉSZÉRE 4 ÉVES KORTÓL

Rendszám felismerő rendszer általános működési leírás

Procontrol Device Detector. Felhasználói leírás

Örömmel értesítjük, hogy csapatuk bejutott a verseny döntőjébe!

Dusza Árpád Országos Programozói Emlékverseny 2012/2013

Regionális forduló november 18.

SZERZŐ: Kiss Róbert. Oldal1

ContractTray program Leírás

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

MATEMATIKA ÍRÁSBELI VIZSGA KÖZÉPSZINT% II. ÉRETTSÉGI VIZSGA május 3. MINISZTÉRIUM NEMZETI ERFORRÁS május 3. 8:00. Idtartam: 135 perc

Motorizált infravörös vonali füstérzékelő. Kiegészítő információ

Átírás:

Barna Zsombor, Kiss Ádám Robotkommunikáció 2. rész BEVEZETŐ ÉS PROJEKTSPECIFIKÁCIÓ A kommunikáció az információcsere folyamata. Minden olyan eseményt tekintsünk kommunikációnak, amelyben valamely dolog (adó) kibocsát egy jelet, amelyre egy másik dolog (vevő) valamilyen válaszfolyamattal reagál. Az állatvilágban is megfigyelhető a kommunikáció számos formája. A különböző fajok nagyon eltérő jelrendszert használnak a kommunikációjuk során. Ez lehet hang, szín, illat, mozgás, Az emberi kommunikációnak is nagyon sok formája és közege létezik. Információt hordozhat pl.: a hangsúly, a mimika, a mozgás. Az informatika alapvetően a kommunikációra épül, akár hálózati számítógépek közötti kommunikációról van szó, akár egyetlen számítógép különböző hardver vagy szoftver eszközeiről. A számítástechnika fejlődése maga után vonta a robotika megjelenését és fejlődését is. Az 1960-as évek elejétől beszélhetünk mobil- illetve ipari robotokról. Ettől kezdve felgyorsult a robotika fejlődése. Bár a science fiction irodalomban vázolt intelligens robotok megjelenésétől még távol vagyunk, de a mesterséges intelligencia kutatásnak már vannak eredményei. A robotok közötti kommunikáció pedig korlátlan lehetőségeket biztosít. A projektünkben a robotkommunikációnak egy evolúcióját mutatjuk be abban az értelemben, hogy egyre összetettebb, bonyolultabb kommunikációs technikát használunk. Eszközként a MINDSTORMS NXT robotokat alkalmazzuk, amelyek rendelkeznek beépített bluetooth alapú adó-vevővel. Tehát a kommunikációs csatornaként rádióhullámokat használunk. A Mindtsorms NXT robotok kommunikációjának technikai részleteit röviden bemutatjuk, hogy a további specifikáció érthető legyen. Összesen négy NXT minikomputer kapcsolható össze alapesetben bluetooth-on hálózattá. Ezek közül az egyiknek kitüntetett szerepe van, ez a master robot, a többi a slave. A slave robotok csak a masteren keresztül küldhetnek üzeneteket egymásnak (az üzenet lehet szám, szöveg, vagy logikai érték). A kapcsolat létrehozása során a master roboton meg kell adni az adott slave melyik kommunikációs csatornára kapcsolódik (1-es, 2- es, vagy 3-as). Minden minikomputer tartalmaz 10 db mailboxot, amelyek puffer jellegű tárolók, a küldött adatok tárolására. Tehát egy robot 10 különböző értéket tud egyszerre kommunikációs szempontból tárolni (a puffer kiürítésével ezek a tárolók újra használhatók). Az információküldés során az adat a pufferbe kerül, a tényleges továbbítás még nem történik meg. Az olvasási művelet során kerül át az adat az egyik robotról a másikra, így minden robot lehet master és slave is, hiszen nincs szükség többletpufferekre. 1

A kommunikáció tehát kétirányú ugyan, de a két irány különböző csatornán zajlik (wireless és bluetooth). A konstrukció jól használható olyan helyeken, ahová az akadályok miatt az ember nem képes bejutni. A konstrukciók és a programok részletes leírása a későbbiekben. 2. alprojekt (lásd: Robotkommunikáció 1. rész) Kétirányú, azonos csatornás kommunikáció. A wireless kamera jelét nem képes a robot továbbítani a bluetooth technológia átviteli sebessége miatt. A tényleges kétirányú kommunikációhoz nem kameraképet sugárzunk, hanem ultrahangos távolságérzékelővel mért távolságadatokat. Tehát a robotot továbbra is egy távirányító vezérli, de járműre szerelt ultrahangszenzor képes 180 o -os látószöggel szkennelni a környezetét. Az így mért távolságértékeket bluetooth-on visszaküldi a távvezérlőnek, amely LCD képernyőjén megjeleníti a radarjeleket (miután a polár-koordinátákat descartes-koordinátákká transzformálja). Most már valódi kétirányú kommunikációról van szó, hiszen a robotok odavissza ugyanazon a csatornán cserélnek információt. A radarkép alapján a távvezérlőt még mindig egy ember irányítja. A kamerás megoldáshoz képest az előny, hogy a használt ultrahang technológia miatt nincs szükség fényre a környezet észleléséhez, így sötétben is teljes hatékonysággal működik. Az elkészített járműkonstrukció lényegesen bonyolultabb, mint a korábbiak. Két hajtott és két pár forduló kerékkel rendelkezik. A hajtott kerekek differenciálműhöz csatlakoznak, míg a forduló kerekek felfüggesztése mozgatható és rugalmas, valamint az első illetve hátsó kerékpár szinkronban, de ellentétesen fordul. A konstrukció és a programok részletes leírása a későbbiekben. Távirányító Radaros jármű 3

3. alprojekt Autonóm robotkommunikáció. Amennyiben a kommunikációs folyamatból az emberi tényezőt is ki szeretnénk zárni, akkor olyan információ feldolgozó programot kellene írni az előző alprojektben bemutatott konstrukcióhoz, amely meghaladja az NXT minikomputer lehetőségeit, hiszen a beérkező radarjelek feldolgozását a minikomputernek kellene önállóan elvégezni. Így egy másik példán keresztül szemléltetjük a folyamatot. Az elmúlt évi Szabadfogású számítógép versenyen már bemutatott robotkéz konstrukció egy lényegesen továbbfejlesztett változatát készítettük el. Elkészült két kéz, egy jobb és egy bal. A két kéz a közismert kő-papír-olló játékot játszza egymással, emberi beavatkozás nélkül. Mindkét kéz két-két NXT minikomputert tartalmaz, és a teljes játékot egy különálló egység vezérli (automatikusan). Összesen 5 db NXT tégla kommunikál egymással. Azért, hogy az emberi tevékenységet ne zárjuk ki teljesen, a konstrukciót kiegészítettük egy fogadó egységgel, amelyen keresztül téteket lehet feltenni arra, hogy melyik kéz nyeri a játékot. A játék látványos, és helyenként intelligensnek tűnő módon viselkednek a kezek, hiszen egymás információira reagálnak, de a háttérben a véletlenszám előállítás dominál, amelyre egyszerű döntési algoritmusok épülnek. Ezeknek a döntési algoritmusoknak a mesterséges intelligencia előállítása szempontjából is nagy szerepük van, hiszen az emberi irányítási folyamat nagy része is ezen alapul (információk alapján a cél érdekében döntéseket hozni). A konstrukciós és programozási részletek a továbbiakban olvashatók. 4

A KONSTRUKCIÓK (HARDVER) BEMUTATÁSA 3. alprojekt konstrukció (kő-papír-olló játékgép). A kő-papír-olló az egyik legismertebb játék, szabályai igen egyszerűek. Három jel van (kő, papír, olló) és két játékos játszik egymással. A játékosok egyszerre mutatják az álltaluk véletlenszerűen kiválasztott jelet. A győztes megállapítása az alábbiak szerint történik: - A kő minden esetben jobb az ollónál. - Az olló minden esetben jobb a papírnál. - A papír minden esetben jobb a kőnél. - Ha a mutatott jelek megegyeznek döntetlen áll fenn. A jelek körkörösen ütik egymást, ezért nincs nyerő stratégia. A győztes stratégia hiányában ideálisnak tűnt a játék a robotokra, való átvitelre. A játszó felek legyenek azok emberek, vagy robotok, egymástól függetlenül véletlenszerűen választják ki az általuk mutatott jelet. Ezután a felek a mindkettőjük által ismert szabályok alapján eldöntik a győztes kilétét. A játékhoz szükség van tehát két kézre, a győztest meghatározó szabályokra és egy döntőbíróra, aki a szabályok alapján dönt. Mi ezt a játékot kiegészítettük egy fogadás résszel is. Ezáltal az általunk konstruált robot egy játékgépet szimbolizál. Az ember szerepe csupán a fogadások megtételére szorítkozik, ezután a robot automatikusan bonyolítja a játékot. A játék kezdete előtt zsetonokkal lehet fogadni a győztes kilétére. Ha a tétet a későbbi győztesre kerültek, a fogadógép a játék befejeztével visszaadja a játék elején behelyezett tétek kétszeresét. Ha a másik kéz nyer akkor a rossz helyre rakott tétek elvesznek. De természetesen mindkét játékosra lehet fogadni, bár ez nem kifizetődő mivel az egyik tét elvesztése biztosra vehető. Ha a végeredmény döntetlen, akkor a bank nyer és az összes elhelyezett tétet a bank kapja meg (vagyis a zsetonok bent maradnak, és a gép nem ad vissza semmit). Fogadni csak a játék elején lehet, menet közben további tétek nem helyezhetők el. Fogadni maximum öt zseton értékben lehet. Amennyiben ennél nagyobb tétet helyez a játékos valamelyik kézre, akkor azt a gép a játék megkezdése előtt visszaadja. Két kéz öt nyert menetig játszik egymás ellen. Az lesz a végső győztes, amelyik először eléri az öt nyert játszmát. A játék döntetlennel is végződhet amennyiben a kisorsolt értékek megegyeznek. A játékgépnél kialakított hálózati struktúra A játékgép-robot működéséhez öt NXT téglát használtunk. Két-két tégla szükséges kezek vezérléséhez, hiszen az öt ujj mindegyikét egy-egy motor működteti egymástól függetlenül, így kezenként öt szervo motor szükséges. Az ötödik tégla veszi át az irányító szerepét. Hozzá futnak be a kezek által sorsolt véletlen számok, és Ő adja a vezérlő jeleket a kezeknek a megfelelő mozgás megkezdésére. 5

Az ábra szemléletesen mutatja a hálózati sémát. A képen látható hierarchikus viszonyt a következőképpen értelmezhetjük: A fő Master csak a kezek mastereivel áll közvetlen kétirányú bluetooth kapcsolatban, és az elméleti munkát ő végzi. A bal kéz mastere az 1-es bluetooth portján kapcsolódik a hosttal, a jobb kézé pedig a 2-es kapun csatlakozik. Mindkét előbb említett vezérlő az egyes mailboxába kapja az üzeneteket. A kezek vezérlői I 2 C porton (4-es port) keresztül kapcsolódnak szolgáikhoz. A roboton belül a bluetooth kapcsolatok kétirányúak, míg az I 2 C kapcsolatok egyirányúak. A robot működésének leírása A kezeket két-két tégla vezérli. A kézvezérlő téglák közül a masternek nevezett mozgat 3 ujjat, míg a másik (slave) kettőt. A két tégla I 2 C buszon keresztül kapcsolódik. A kéz master téglája sorsol egy 1-3 közötti véletlen számot, amely a kő-papír-olló szimbólumoknak felel meg, és a sorsolt számnak megfelelően behajlítja az ujjakat. A master küldi a jelet a slavenek, amely alapján az behajlítja az általa vezérelt két ujjat vagy nem. A master a sorsolt számnak megfelelően szintén behajlítja a megfelelő általa vezérelt ujjakat. Minden ujj egymástól függetlenül mozog. A kéz master téglája átküldi a fő masternek a sorsolt számot. Mindkét kéz azonos algoritmussal dolgozik és a saját véletlen számát ismeri csupán. Ennek megfelelően tudja az ujjakat hajlítani. A kiértékelés, döntés és a folyamat vezérlése a fő master feladata. A fő master bluetooth-on kapcsolódik mindkét kézvezérlő master téglájához. A fő master feladatai: - A játék fogadásának bonyolítása - A játék elején a tétek ellenőrzése, nyilvántartása. - A játék végén a nyeremény visszaadása. - A játék közben vezérlő jelek küldése a kezeknek a mozgások, sorsolás megkezdésére, a pillanatnyi állás megjelenítésére. - A játék egyes meneteiben a győztes megállapítása, az eredmény nyilvántartása. - A játék egyes elemeinek hangfájlok segítségével történő megszólaltatása. A játék menete, algoritmusa: - A fő master kezeli a téteket. Ütközésérzékelők segítségével megállapítja, hogy az emberi játékos melyik kézre mekkora tétet helyezett. Ha egy kézre 5-nél nagyobb tét került, akkor visszaadja az 5 fölötti zsetonokat. Ütközésérzékelővel jelzi az emberi játékos a tétek befejezését. - A fő master a téteknek megfelelően hanggal (rso hangfájl) kimondja a két kézre tett zsetonok számát. - A játék az ütközésérzékelő benyomására indul. - A fő master jelet küld (1-es érték) a két kézvezérlő master téglának. - A megkapott jel hatására a két kéz ujjai hullámzó mozgásba kezdenek, így várakoznak a következő vezérlő jelre, amely a sorsolás kezdetét jelzi. - A fő master bizonyos idő után újabb vezérlő jelet küld (1-es érték) bluetooth-on keresztül mindkét kéznek. 6

- A két kéz erre a jelre sorsol egy véletlen számot, majd a kisorsolt számnak megfelelően mutatja a kő, papír vagy olló szimbólumot, és a fő masternek szintén bluetooth-on keresztül elküldi a sorsolt számot. kő papír olló - A fő master a megkapott véletlen számok alapján meghatározza a sorsolt szimbólumot és rso fájlok segítségével kimondja a két kéz által megjelenített jeleket. Megállapítja az aktuális győztest, és a pillanatnyi állást. Mindezt a képernyőjén is megjeleníti, valamint hangfájlokkal ki is mondja. Fő master képernyője - A pillanatnyi állásnak megfelelően átküldi mindkét kéz számára az aktuális pontszámukat (győzelmek száma + döntetlenek száma). - Mindkét kéz a megkapott számoknak megfelelően mutatja az aktuális állást, majd várakozik a fő master vezérlő jelére. - A fő master egy bizonyos idő eltelte után újabb vezérlő jelet küld a két kéznek, a hullámzó mozgás megkezdésére. Az algoritmus innentől megegyezik az előző lépések ismétlésével. Mindez addig folytatódik, míg valamelyik kéz pontszáma eléri az ötöt. - Ha valamelyik kéz pontszáma elérte az ötöt, akkor a fő master megállapítja a győztest (bal vagy jobb), mindezt kimondja hangosan is. Döntetlen esetén hasonlóan. - A győztes számára visszaad a kezdeti tét kétszeresének megfelelő zsetont, döntetlen esetén nem ad vissza. Konstrukció (hardver) A kezek: Ha az ember röviden próbálja összegezni a robot konstrukcióját, nincs könnyű dolga. Ez egy igen összetett szerkezet ahol nem a stabilitást, hanem a funkcionalitást tartottuk szem előtt így igen érzékeny az alkatrészek 7

kopására. Maga a konstrukció három részből áll: - Fogadógép - Jobb kéz - Bal kéz A jobb és a bal kéz felépítése teljesen azonos, tükörszimmetrikus, hasonlóan az emberi kézhez. A két végtagon használt forráskódok is csak egy apró részletében térnek el egymástól. Mindkét kéznek öt ujja van melyek külön - külön egymástól függetlenül mozgathatók. Az ujjak három-három ujjpercet foglalnak magukba, kivéve a nagyujjakat melyek csak kettővel rendelkeznek, hasonlóan az emberi kézhez. Csuklóízülettel nem rendelkezik, ám ez a szimulált játék szempontjából felesleges. A robot kéztőcsontjai az emberéhez hasonló szögben állnak. Ezek előtt haladnak el az inai. Ezek az inak 0,8 cm széles és 45 cm hosszú műanyag kábelkötegelők melyek belső oldala redőzött, így fogaslécsorként használható. A fogaslécsorra egy-egy 24 fogú LEGO fogaskereket helyeztünk csillagkeréknek. Ebből a meghajtási formából mindkét kéz négy-négy dbot tartalmaz. Mivel a nagyujj a többi ujjra merőlegesen helyezkedik el, a nagyujj esetében vékonyabb (0,5 * 30 cm es) műanyag bovdent használtunk. A vastagabb ín a nagyujj mozgatására merevsége miatt alkalmatlan volt. Mivel a nagyujj bovdene keskenyebb 0,3 cm-rel (0,8 0,5), a többi ujjnál is használt csillagkerekek túl szélesek voltak, ahogyan a többi LEGO fogaskerék is. Így egy egészen különböző hajtásrendszert építettünk a nagyujjba. Két fogaskerékből egy dobot készítettünk, mely forgás közben magára tekeri a műanyag inakat, így hajlítva be az ujjat. Az ujjpercek eredeti állapotba (kinyújtottba) való visszaállításához a már az előbbiekben hátrányként említett merevséget használtuk ki. Miután a fogaskerekek elkezdenek visszafelé forogni, az ujjpercek vége és az alkar alja között levő bovdenszál hossza megnő. Ezután az ín megpróbálja visszanyerni eredeti (egyenes) alakját, eközben kinyújtja az ujjat. Mindkét kézen ezt a technikát alkalmazzuk az ujjak alapállapotba való visszaállításához. A bovdenek az alkar alatt elhelyezett szervomotorokig a kezet tartó alkarcsontokkal párhozamosan futnak, ahol két ponton is egy vezetőkosáron haladnak át. Ezekre azért van szükség, mert a szervomotorok ugyan az ujjaknak megfelelő távolságra vannak elhelyezve egymástól, ám egymással párhuzamosak. Az ujjak ezzel szemben az emberi kézhez hasonlóan szétállnak egy kicsit, így az egyenes, merev bovdenek a csukló irányába összetartanak. Ezért van szükség a vezetőkosarakra. Miután az inak elhaladtak az alkar előtt, egymással párhuzamosan érkeznek meg a szervomotorokhoz, ahol a már előbb említett fogaskerékhajtásnak köszönhetően a 8

hosszuk tetszőlegesen állítható, ezáltal az ujjak dőlésszöge is. A nagyujj motorja hasonlóan az általa mozgatott ujjpercekhez a többi motorra merőlegesen helyezkedik el. Ez stabilabbá, ugyanakkor esztétikusabbá is teszi a szerkezetet. Mivel a bovdenek a motorok hátuljánál folyamatosan mozognak, és néha kéz hátsó síkja mögé is kilógnak nem tehettük a szerkezetet egyszerűen a földre, mert a bovdenek mozgása miatt a kéz elmászott volna a mozgatása közben. Ezért egy olyan alátámasztást készítettünk neki mely stabilabbá teszi, ugyanakkor a robot alját elemeli egy kicsit a földtől, így a mozgató inak nem érnek le odáig. Az NXT vezérlőegységeket a kezek mögött helyeztük el, kicsit megdöntve. Így kényelmesebb kezelni mivel nem kell leguggolni, hogy a szemünk egy vonalba, kerüljön a képernyővel. Mindkét kézhez két tégla tartozik. Mivel mind az öt ujjat külön szerettük volna mozgatni, öt motorra volt szükségünk egy kézhez. Minden ujjhoz egy szervo tartozik. Itt azonban újabb probléma merült fel. Hogyan kommunikáljanak egymással. (Erről a részről bővebben a hálózati struktúra résznél). Végül az I 2 C vezetékes kapcsolat mellet döntöttünk. Így az egyik NXT-re praktikussági okokból a kis és gyűrűs ujj került, míg a másikra a többi. A kis és gyűrűs ujjat birtokló robot, (nevezzük Slave-nek) külön egységként kezeli a két ujjat, bár a jelek ezt nem követelik meg. Például: Ha követ szeretnénk mutatni mind az öt ujjat behajlítjuk, ha papírt akkor mindet kinyújtjuk, ha viszont ollót akkor a slave mindkét ujját szintén behajlítjuk (lásd fényképek fentebb). Jól látható hogy a kis- és gyűrűs ujjak minden esetben együtt mozognak. Akkor miért volt szükség a külön mozgatásra? A mindenki által ismert szabályok szerint a felek az álltaluk választott jel mutatása előtt háromszor megrázzák a kezüket, (kő, papír, olló) ezáltal biztosítva hogy egyszerre mutatják a jelet. Mivel a mi robotunk se könyék sem csuklóízülettel nem rendelkezik, szükséges valamivel kipótolni a kézrázást. Erre szolgál a videón jól megfigyelhető hullámzás mikor az ujjak egymást követően behajlanak, majd kinyúlnak. Ez a mozgás csak úgy kivitelezhető, ha az összes ujj képes egymástól függetlenül egyszerre hajlani, amit programunk és konstrukciónk egyaránt lehetővé tesz. Ezen kívül a robot mutatja a képernyőjén az éppen aktuális állás, valamit ki is mondja a jobb és bal kéz által sorsolt jelet, valamit,a győztes nevét ( jobb kéz vagy bal kéz ). Tehát most már van két végtagunk melyek képesek követ papírt és ollót mutatni valamint várakozni az egyszerre mutatása. Ezek után már csak egy agyra van szükségünk mely levezérli a játékot. Az agy (fogadógép): Ahogy a neve is mutatja ez az egész konstrukció agya. Ez a robot összegzi az eredményeket, dönti el a vesztes és a győztes kilétét, adja ki az utasítást a sorsolásra várakozásra vagy éppen az állást közli a szolgáival. Egyszóval ez a szerkezet irányítja a játék folyamatát. 9

Attól függetlenül, hogy a fogadógép valójában egy egységnek tűnik, a programja kettéosztja (lásd bővebben: forráskód leírása). A fő masterre, és a fogadógépre. Mi most a konstrukció szempontjából érdekesebbel foglalkozunk, a fogadógéppel. Ez a szerkezet a játék feldobására készült. Sokkal izgalmasabb nézni egy-egy menetet, ha az ember előzőleg fogadott valamelyik félre, és ha még nyeremény is van A fogadás szabályai a következők: - Fogadni csak a játék kezdetekor lehet. - Fogadni maximum öt értékben lehet (egy kézre). - Mindkét kézre lehet fogadni, akár egyszerre is. - Aki a győztesre fogadott a játék elején, az a tétjének kétszeresét kapja vissza. - Azok a tétek, amelyek nem a győztesen vannak elvesztek. - Döntetlen esetén a bank nyert (az összes tét elveszett). Ezek a szabályok érvényesek a fogadás alatt. A robot a képernyőjén mindig kijelzi a fogadás adatait, a feltett tétek számát a játék elején, a végén pedig az esetleges nyereményeket. Minden bedobott zsetonnál lép egyet a képernyőn lévő számláló a megfelelő kéz felirata alatt. De előfordulhatnak bakik. Valaki például berak 5 zsetont a jobb kézre, Majd 4-et a balra. Ezután rárak még egyet a jobbra. Így tehát a bal kézen 4 zseton, míg a jobbon 6 van. Ez a következő okokból kifolyólag nem jó: A robot csak 14 visszaadható zsetonnal rendelkezik, ezért ha mondjuk valaki 8 zsetont fogad és győz, akkor a gép nem bír visszaadni. Ezért van az ötzsetonos szabály. Térjünk vissza az eredeti fogadásra 4 a balkézen 6 a jobbon. Ez esetben a hatodik bedobott zseton a jobb kézen elveszne. Ez azonban nem túl szép egy játék automatától, így a gép az ötön fölül bedobott zsetonokat visszaadja, a számláló sem lép tovább ötnél. A baloldalon lévő gombbal lehet jelezni a fogadás végét. A robot a gomb lenyomása után bemondja a bal és a jobb kézre tett téteket. A gomb ismételt megnyomásával indul a program. A fogadógép konstrukciója a következő képen néz ki: A robot szimmetrikus, mindkét oldalán található egyegy kis doboz melynek tetején van egy-egy nyílás, ahol a zsetonokat kell bedobálni. Mindkét nyílásnál van egy touch szenzor amely vége belóg a bedobáló vágatba, így ha ezen átmegy egy zseton azt a szenzor érzékeli, de csak akkor, ha a zseton legvastagabb terjedelme is áthaladt a bedobó nyíláson. Ekkor a képernyőn lévő számláló lép egyet (kivéve, ha a bedobott korongok száma már elérte az ötöt). A fogadott zsetonokat tartalmazó dobozok oldala levehető, így a játék végén könnyen és gyorsan kivehetők a korongok. A következő izgalmas rész a játék végén van, miután kiderült ki a győztes. Lényegében a fogadógép csak a játék elején és végén aktív. Miután kiderült, hogy ki a győztes, a robot eldönti, hogy van-e a nyertes kézen tét. Ha van, a kétszeresét adja vissza a következő módon: 10

A robot rendelkezik egy hosszú csővel melyben egymás fölött fekszenek a visszaadandó zsetonok. Ez alatt egy bütykös lánctalp forog körbe. Ha az egyik bütyök beleakad egy korongba, akkor viszi magával, majd a futószalag elején ledobja. Eközben a zsetonok lejjebb csúsznak a csőben és egy újabb korong kerül a futószalagra, hogy a következő bütyök elvihesse. A bütykök olyan távolságokra vannak elhelyezve, hogy pontosan egy korong férjen be közéjük. Így mire az első korong leér a második már úton van a persely felé. Ezzel a megoldással kellő pontossággal és gyorsasággal adhatók ki a korongok. Így tudja kiadni a robot a nyeremény kétszeresét. A gravitáció mellet a zsetonok csőben való lejjebbkerülését egy gumis szorítópánt is segíti. A futószalag előtt praktikussági okokból egy kis persely van, melybe a nyeremény belepotyog, így nem kell az embernek a markát tartania. A lánctalp hajtását két motor végzi. Egy is elég lenne, de a másodikra a szimmetria miatt van szükség. Mivel ez az alkatrész helyezkedik el a szerkezet közepén, ennek az elemnek az aszimmetriája megbonthatná a szerkezet stabilitását. 11

A PROGRAMOK (FORRÁSKÓD) BEMUTATÁSA 3. alprojekt forráskódjai és magyarázatuk A robot forráskódja 3 jól elkülöníthető részre oszlik: Autonom_master.nxc A főmaster programja. A játék vezérlését végzi. Autonom_master_I2C_bal.nxc és Autonom_master_I2C_jobb.nxc A főmasterhez Bluetooth-on kapcsolódó téglák programja. Három ujj vezérlését és a sorsolást végzi. Autonom_slave_I2C.nxc A kéz két-két ujját vezérlő, I2C porton csatlakoztatott slave programja. A robot által használt saját függvények listája: Autonom_master.nxc: void kidob( int db ) void fogad_kezd() void fogad_veg() void kepernyo( int bal, int jobb ) void sorsol_eredm( int bal, int jobb) void ertekel(int bal, int jobb) task main() Autonom_master_I2C_bal.nxc és Autonom_master_I2C_jobb.nxc: void SendRS485String( const string msg ) void WaitForMessageToBeSent() void hajlit( string a, int b, int c, int d ) void sorsol() void szamot_mutat( int szam ) void varakozik() task ujj3() task ujj4() task ujj5() task main() A robotok programjaiban használunk saját hangfájlokat is. A főmaster kivételével minden téglán futó program többszálú. A programokat a hálózatnak megfelelő hierarchia alapján mutatjuk be vázlatosan. Az egyes forráskód részletekről a programsorokhoz fűzött megjegyzések tartalmaznak további részleteket. Az Autonom_master.nxc program Négy egész típusú szám tárolására alkalmas globális változót használ a program. A négy változó olyan értékeket tárol, amelyekre a teljes program során szükség van és több függvénynek is el kell érnie az aktuális értéküket. Lehetett volna cím szerinti paraméterátadással is kezelni őket, de a globális változók használata mellett döntöttünk. int eredm_b=1, eredm_j=1, jobb_fog=0, bal_fog=0; 12

Az első két változó tárolja a bal és jobb kéz által megnyert vagy döntetlennel végződött mérkőzések számát, míg a második két változó a bal illetve jobb kézre feltett tétek számát. Az első két változó kezdő értéke 1, mivel a bluetooth-os kommunikáció alkalmával a slave tégla is megkapja őket, és a nulla értéket a kommunikációs puffer ürességének jelzésére használtuk. A fogad_kezd() függvény vezényli le a fogadás első szakaszát. A robot touch szenzorok segítségével figyeli a behelyezett tétek összegét, ezenkívül ez a programrész felel az engedélyezett 5 ön felül berakott tétek visszaadásáért is. Alfüggvénye a kidob(), amely csak a kidobó (A; B) motorokat vezérli. A kidob függvény argumentuma a db változó, amely a kidobni kívánt zsetonok számát adja meg. A függvény a touch szenzorok inicializálásával kezdődik, valamint a képernyőre írja az állandó szöveget: Az ennyi változó kezeli a fogadás lezárását, amit az 1-es portra kötött touch szenzor benyomása vezérel. Ha a 2-es vagy 3-as portra csatlakoztatott szenzorokat nyomás éri, akkor a megfelelő kézre tett téteket tároló változó értéke eggyel nő. Amennyiben a tétek átlépik az engedélyezett 5 értéket a változó értéke eggyel csökken és a kidob() függvény hívásával a konstrukció visszaad egy zsetont. A kidob(1) függvény csupán a zsetonvisszaadást vezérli egy motor bekapcsolásával. 13

A tétmaximálás egyik oka hogy a robot maximum 5-ig bírja kimondani a számokat a tégla memóriakorlátja miatt. A téteknek megfelelő számok hangalakja rso kiterjesztésű fájlokban tárolódnak. A fogadás lezárta után (1-es portra kötött touch szenzort nyomás éri) ezeket hangfájlokat a robot ki is mondja (pl. a bal kéz esetén): Minden hangfájl lejátszása után adott milliszekundum értékig várakozni kell, mivel az utasítás végrehajtás továbblép a hangfájl elindítása után, tehát nem várakozik annak befejezéséig. A várakozási időtartam a hangfájl hosszától függ, általában 1 vagy 1,5 másodperc. A kepernyo() függvény a képernyőre írt adatok és szövegek megjelenítését végző függvény. Paraméterként megkapja a két kéz által sorsolt számokat (1-3 kő, papír, olló). A függvény a meghívásakor frissíti a játék állását a képernyőn. Ez a függvény azért praktikus, mert nem kell állandóan beírni ugyan azokat a forráskód részleteket a képernyőkezeléshez. A számként megkapott sorsolási értéket a képernyőre íratáshoz szöveges formában is tároljuk. Ezt a célt szolgálja a program középső részének if else szerkezete, valamint a belső változóként létrehozott s_bal és s_jobb string típusú változók. A függvény a képernyőre írja az aktuális menet eredményei mellett a globális változókban tárolt állást is, az eredm_b illetve eredm_j változók értékei alapján (eggyel kisebb számokat kell kiírnia, mivel a változók kezdő értéke 1 volt). 14

A sorsol_eredm() függvény a sorsolás eredményének hangfájl formájában történő kimondását lehetővé tévő függvény. Bemenő paraméterként megkapja a két kezet vezérlő tégla által kisorsolt számot, amit a robot a main() taszk adatfogadás részénél már megkapott. A balkez.rso, jobbkez.rso, ko.rso, papír.rso, ollo.rso fájlokat használja a hanglejátszás során. Az ertekel() függvény a kiértékelést végző függvény. Meghatározza, hogy két kezet vezérlő téglák által sorsolt számok alapján melyik kéz nyert az aktuális menetben. Ennek megfelelően az eredményt tároló eredm_b vagy eredm_j változók értékét eggyel növeli és a győztesnek megfelelő hangfájlt le is játssza. Bemenő paraméterként megkapja a két kezet vezérlő téglák által sorsolt számokat, amelyek alapján a későbbi döntést végzi. Az aktuális menet győztesének megállapításához, valamint a megfelelő eredmény változó növeléséhez if - else szerkezetet használtunk. Első lépésben a döntetlen (azonos sorsolt érték) ellenőrzése történik. Ebben az esetben mindkét eredmény változó értéke nő eggyel. Ha nem azonosak a sorsolt számok, akkor van győztes és csak a győztes kéz eredmény változóját növeljük. Döntetlen esetén: Ha nem döntetlen az eredmény (else), akkor van győztes és első lépésben megvizsgáljuk, hogy a bal kéz követ sorsolt-e (bal==1). Ekkor ha a jobb kéz papírt sorsolt (jobb==2), akkor a jobb nyert, egyébként (a jobb ollót sorsolt, jobb==3) a bal nyert. 15

Ha a bal kéz nem követ sorsolt (else), akkor megvizsgáljuk, hogy az általa sorsolt érték papír-e (bal==2). A döntés algoritmusa hasonló az előzőhöz. Végül ha az egyik korábbi eset sem teljesült, akkor a bal kéz már csak ollót sorsolhatott (else), így a győztesre vonatkozó döntés a korábbiak alapján lehetséges. Ezzel zárul a döntetlen vizsgálatánál kezdődő egymásba ágyazott elágazásokat tartalmazó programszerkezet. 16

A függvény megszólaltatja az aktuális állásnak megfelelő hangfájlokat az eredmény változók értékei alapján. Például a bal kéz összesített eredményére vonatkozóan: A main() függvényben történik az üzenetek küldése a bluetooth kapcsolaton keresztül a slave tégláknak, valamint a korábban bemutatott függvények hívása. Az üzenetek a bal kéz számára az 1-es kommunikációs csatorna 1-es mailboxába, míg a jobb kéz esetén a 2-es kommunikációs csatorna 2-es mailboxába továbbítódnak, valamint az üzenetfogadáshoz az azonos sorszámú mailboxoba érkeznek. A vezérlés során kétféle értéket továbbít a master tégla. 1-es értéket, mint vezérlő jelet, amely valamely tevékenység megkezdésére utasítja a slave-et, valamint az aktuális eredményt (1-5 közötti szám), amely a kezeket a megkapott szám mutatására utasítja. Adatfogadásként 1-3 közötti értéket kap, az adott kéz által sorsolt érték szerint (kő-papír-olló). A program kezdéseként a fogad_kezd() függvény hívása történik meg, majd várakozás az 1-es portra csatlakoztatott ütközésérzékelő benyomására. Ha ez megtörtént, akkor indul a kommunikációs ciklus, amely addig fut, amíg mindkét kéz eredménye 6 alatti. Az első két üzenetküldés a bal és jobb kéz slave tégláját utasítja a hullámzó mozgás megkezdésére (elküldött vezérlőjel: 1). Három másodperc várakozás után újabb vezérlőjel küldése történik a bal és jobb kéz téglájának, amely hatására megtörténik a sorsolás. Ezután a slave téglák a kisorsolt számokat visszaküldik és a master egy-egy ciklus segítségével ezekt kiolvassa a megfelelő mailboxokból, miután lejátszotta a sorsolas.rso hangfájlt. Az adatfogadásnál a pufferek kiürítése is megtörténik, így a bennük tárolt nulla érték megváltozása jelzi, ha adat érkezett (ennek megfelelően a kapott értékek tárolására használt változók értéke is nullázódik a pufferból történő olvasás előtt). 17

A slave téglák által sorsolt értékek megérkezése után történik a képernyő frissítése a megkapott értékek alapján (kepernyo() fgv. hívása), a sorsolt értékeknek megfelelő hangfájlok lejátszása (sorsol_eredm() fgv. hívása), valamint a sorsolt számoknak megfelelően a menet győztesének megállapítása és a megfelelő globális változók növelése (ertekel() fgv. hívása). A képernyőfrissítés a már aktualizált értékekkel ismét megtörténik. Végül a két kéz számára elküldésre kerül az összesített eredmény (eredm_b és eredm_j változók), hogy a kezek mutatni tudják a pillanatnyi állást. A ciklus befejezése után (ha valamelyik kéz átlépte az 5-ös értéket), akkor a fogadás tétjének megfelelően a feltett zsetonok kétszeresének visszaadása a feladat (döntetlen esetén nincs visszaadás), valamint a megfelelő hangfájlok megszólaltatása, amelyek a végeredményt közlik. 18

A tétek visszaadását a fogad_veg() függvény végzi. A kidob() függvény segítségével adja vissza a tét kétszeresét a győztes kézre fogadónak, és a képernyőn is dokumentálja az eredményt. 19

Az Autonom_master_I2C_bal.nxc illetve az Autonom_master_I2C_jobb.nxc program A kezek masterei a feladatokat abban a sorrendben végzik el, amelyben az alábbiakban leírjuk. A kódjuk különbsége egyedül ott van, hogy másik bluetooth portra csatlakoznak, ezért csak az egyik kéz forráskódját mutatjuk be. A void SendRS485String(const string msg) és a void WaitForMessageToBeSent() függvények nem saját fejlesztésűek. Ezek a függvények az I2C porton keresztüli kommunikációhoz szükségesek és a Kiss-Pásztor: Mobilrobotok programozása NXC és NXT-G nyelven című, KF GAMF Karán megjelent jegyzetből származnak változatlan formában. A téglákon futó programot a működés folyamatának megfelelően mutatjuk be. A használt saját függvényeket a főprogramból történő meghívásukkor részletezzük. A main() függvény végzi az adatcserét a főmasterrel és a megkapott vezérlőjelek alapján a kéz három ujjának (középső, mutató, nagy) mozgatását, valamint a sorsolást, a megfelelő függvények meghívásával. Továbbá a hozzá I2C porton csatlakozó tégla irányítását, amely a kéz másik két ujját (gyűrűs és kisujj) mozgatja. A program az I2C port inicializálásával és a három ujjat vezérlő taszkok indításával kezdődik. Egyetlen egész típusú belső változót használ a jel nevűt. A változó szerepe a mastertől érkező vezérlő jelek és adatok fogadása és átmeneti tárolása. A tégla a mastertől kétféle adatot kaphat. 1-es vezérlő jel érkezik, ha valamilyen tevékenységet kell kezdeményeznie a kéznek, 20

vagy 1-5 közötti számot kap a játék pillanatnyi állásának megfelelően. Mivel aza adatok érkezésének sorrendje kötött, ezért nem történhet kavarodás. A taszkok elindítása után egy végtelen ciklus indul, amely a kommunikációs utasításokat és a saját függvények hívását tartalmazza. A kéz mindaddig nem végez mozgást, amíg a főmastertől meg nem kapja az első vezérlőjelet. Az üzenet érkezését az egyes mailboxba kerülő nullától különböző érték (1) jelzi. A puffert minden olvasás után kiürítjük és az adatfogadás előtt a jel változó értékét is nullázzuk, így érve el, hogy csak akkor léphetünk túl az adatolvasó cikluson, ha tényleges üzenet érkezett. Ekkor a kezet alaphelyzetbe állítjuk a függvény hívásával, majd egy hullámzó mozgást kezdeményezünk a varakozik() függvénnyel mindaddig, amíg meg nem érkezik az újabb vezérlő jel. A vezérlőjel megérkezése után kerül sor a véletlen szám sorsolására (1-3 közötti kő-papírolló) a sorsol() függvény hívásával. A függvény végzi a kisorsolt szám főmaster felé továbbítását is. Újabb várakozási ciklus indul, amely a főmastertől érkező eredményre vár. A megkapott szám alapján kell mutatnia az aktuális kéznek az állást. A kéz alaphelyzetbe állítása után ezt a szamot_mutat() függvény végzi. A függvénynek átadott paraméter eggyel kisebb, mint a főmastertől megkapott szám, mivel a nulla értéket a puffer ürességének jelzésére használjuk, így az eredmény változók kezdőértéke 1 volt. Ezután a ciklus újra indul és a kommunikációs ciklus kezdődik elölről. Az ujjak mozgását vezérlő taszkok: task ujj3() és task ujj4() és task ujj5(). Mindhárom taszk azonos felépítésű, csupán a használt motor portszámában térnek el egymástól. Így a működést az ujj 3 esetén mutatjuk be. Az ujjak vezérlése azért került külön taszkokba, mert így érhettük el, hogy egymástól függetlenül, párhuzamosan lehessen őket mozgatni, hajlítani. A taszkban használt két egész típusú belső változó közül a merre fölösleges. Egy korábbi kézkonstrukció esetén az ujjakat vezérlő motorok különböző forgásiránnyal voltak beszerelve néhány ujj esetén. Így a mozgatás során a fordított motorállásnál a hajlításhoz ellentétes forgásirány volt szükséges. Ezt szabályoztuk a változón keresztül. Mivel a jelenlegi konstrukciónál minden ujjvezérlő motor azonos állású, így a változó értéke mindig -1, de az általános megoldás miatt meghagytuk a programkódban. A másik egész típusú változó a melyik tartalmazza az aktuális ujjat vezérlő motor azonosítóját. Az A motor esetén 0, a B motor esetén 1, míg a C motor esetén 2. A három ujjvezérlő taszk ebben az értékben különbözik. Az ujjak mozgatása két irányba történhet: behajlítás vagy kiegyenesítés. A behajlítást abban az esetben kell elvégezni, ha globális változóként létrehozott hajlik3, hajlik4, hajlik5 21

értéke 1. Ezt az értéket a hajlik() függvény kezeli. Ha a megfelelő változó értéke 0, akkor a kiegyenesítést kell végezni. A hajlítás során egy konstansként beállított motorelfordulási szög is szerepel, ami a maximális hajlítás értékét tartalmazza (#define SZOG 200). A behajlítás tehát leáll, ha ezt a szög értéket elérte a motor elfordulási szöge (200 fok). A kiegyenesítés pedig mindaddig tart, amíg a motor elfordulási szöge pozitív, tehát a nulla alaphelyzetig. A hajlit() függvény végzi a megfelelő ujjak hajlítását vagy kiegyenesítését vezérlő változók értékadását. A függvény a paraméterein keresztül megkapott értékekkel tölti fel a változókat. A 3-4-5-ös ujj esetén ez az érték 1 vagy 0, aszerint, hogy hajlítani vagy kiegyenesíteni kell-e. Az 1-es és 2-es ujjat az I2C porton keresztül kapcsolódó tégla vezérli, így ebben az esetben az első paraméterként megkapott stringet küldi a 4-es porton keresztül a másik két ujjat vezérlő téglának. Ennek a változónak az értéke négyféle lehet: 0 0-0 egyik ujj sem mozdul 1 0-1 kisujj mozdul, gyűrűs nem 2 1-0 gyűrűs mozdul, kisujj nem 3 1-1 mindkettő ujj mozdul Az átküldött adat feldolgozását, konvertálását, értelmezését az I2C slave végzi. A sorsol() függvény végzi az 1-3 közötti véletlen szám előállítását és a kisorsolt szám masternek történő elküldését. A függvény gondoskodik a kisorsolt számnak megfelelő jel mutatásáról is, a hajlit() függvény megfelelően paraméterezett meghívásával. Az 1-es sorsolt értéknek felel meg a kő. Ebben az esetben minden ujjat be kell hajlítani, így a függvényhívás történik. Minden változó 1-es értéket kap, ami a behajlítást eredményezi. A 2-es érték sorsolása jelenti a papír szimbólumot. Ekkor egyetlen ujjat sem kell hajlítani, sőt kiegyenesíteni kell valamennyit. Ez a csupa nulla paraméterrel történő függvényhívást jelenti. A 3-as érték felel meg az olló szimbólumnak. Ekkor a kisujj és gyűrűs ujj behajlik. Ezeket az I2C portos slave kezeli, tehát a 3 -as érték kerül átadásra, valamint a nagyujj is behajlik, tehát a függvény negyedik paraméter is 1. A másik két ujj egyenes, tehát a 2. és 3. paraméter értéke 0. 22

A szamot_mutat() függvény gondoskodik arról, hogy a főmastertől megkapott pillanatnyi állásnak megfelelő eredményt mutassa a kéz. Egyszerű többszörös elágazást tartalmazó programszerkezet valósítja meg az ujjak megfelelő mozgatását, a korábban bemutatott hajlit() függvény megfelelően paraméterezett meghívásával. A függvény bemenő paraméterként megkapja a főmastertől érkező eredmény értéket a szam változón keresztül. A varakozik() függvény hatására az ujjak ciklikusan hullámzó mozgásba kezdenek. A hullámzó mozgást az ido valtozóval való késleltetett elindulással értük el, a hajlit() függvény egymás utáni meghívásaival. A függvény egyszeri meghívása egyetlen hullám végigfutását eredményezi az ujjakon. A várakozás alkalmával a függvényt többször hívjuk meg, mindaddig, amíg a főmastertől kapott vezérlő jel meg nem szakítja a főtaszkban futó ciklust. A gyakorlatban ez kb. kettő-három hullám lefutását jelenti. 23

Az Autonom_slave_I2C.nxc program Itt is megtalálhatóak a kézmasterek ujjfüggvényei, melyek csak az álltaluk irányított ujjakban különböznek. A főtaszk elindítja az ujjtaszkokat és vár egészen addig, amíg az I2C porton nem kap adatot arról, hogy melyik ujjat kellene megmozdítania, amit egy karakterláncból olvas ki és átkonvertálja egész számmá a StrToNum() függvénnyel. Mivel az ujjakat mozgató taszkok teljes egészében megegyeznek a korábban bemutatottakkal, ezért ezeket nem részletezzük. A használt HS függvények a Kiss-Pásztor: Mobilrobotok programozása NXC és NXT-G nyelven című, KF GAMF Karán megjelent jegyzetből származnak változatlan formában. A programból egyetlen részlethez fűzünk magyarázatot. A kézmastertől megkapott vezérlőjel, amely a slave által vezérelt két ujj mozgását irányítja egy string típusú érték, amely 0-3 közötti lehet. Egész számmá alakítva a kapott szám egy kettes számrendszerbeli kód tízes számrendszerbeli alakja. 0 00 egyik ujj sem mozdul 1 01 kisujj mozdul, gyűrűs nem 2 10 gyűrűs mozdul, kisujj nem 3 11 mindkettő ujj mozdul A kettes számrendszerbeli két bit visszaalakítását és ennek megfelelően a vezérlő jel kinyerését a 2-vel történő egész osztás utáni hányados és maradék szolgáltatja. A hajlik1 és hajlik2 változó szerepe a kézmasternél bemutatott hasonló nevű változókéval egyezik meg, és 1-es érték esetén a behajlítást, míg 0 érték esetén az ujj kiegyenesítését eredményezik a megfelelő ujjvezérlő taszkon keresztül. A main() taszk teljes forráskódja: 24

A projektek elkészítése során használt szoftverek, források Szoftverek Képszerkesztés Video szerkesztés PIP video szerkesztés Wireless képátvitel Programozói szoftverkörnyezet A programírás során felhasznált források Kiss Róbert, Pásztor Attila: Mobil robotok programozása NXC és NXT-G nyelven, Kecskeméti Főiskola GAMF Kar, főiskolai jegyzet, 2009 Kiss Róbert, Badó Zsolt: Egyszerű robotika A Mindstorms NXT robotok programozásának alapjai, National Instruments Hungary, elektronikus könyv, 2010 Dave Baum: NQC Programmer's Guide, elektronikus könyv, 2003 Doxygen: NXC Version 1.2.1 r4, elektronikus könyv, 2010 25