Alapok

A Raspberry Pi 4-es változaton futtatható Scratch 3 rengeteg bővítménye segítségével kiváló környezet a physical computing feladatok, projektek megoldására. A korábbi hardver verzióval rendelkezőknek sem kell azonban lemondaniuk arról, hogy a grafikus programmal tudjanak ledeket, motorokat kapcsolgatni, vagy gombokat kapcsolókat kiolvasni. Az alábbi leírásban egy olyan példát mutatunk be, ami az 1.4-es verzióra épül, és remekül működik a Raspberry Pi 3B, ill. 3B+ verziókon is.

A programkörnyezet

A GPIO port vezérlésére alkalmas Scratch verziót pl. a simplesi.net oldalról tudunk letölteni. Az oldal főmenüjében keressük meg a ScratchGPIO fület, álljunk rá az egérrel, és kattintsunk az Installing menüpontra. A betöltődő oldalról másoljuk ki a

wget https://git.io/vMS6T -O isgh8.sh

sort, és másoljuk be az LX Terminal ablakba, majd nyomjunk ENTER-t.

A telepítő letöltődése után másoljuk be a

sudo bash isgh8.sh

sort a terminálba és nyomjunk ENTERT-t. A telepítés néhány másodperc elteltével megtörténik.

Ezt követően a desktop-on az alábbi új ikonokat fogjuk látni:

A megjelenő új ikonkészletből az alulról második, Sratch GPIO 8-al tudjuk elindítani a bővített program változatot.

A megnyíló programfelület semmiben sem különbözik az „alap” változattól, néhány blokk azonban új lehetőségekkel bővült. Ilyen pl. a „Küldj üzenetet” blokk, ami ebben a változatban nem csak programon belüli, vagy párhuzamos szálak közötti adatátadásra ad lehetőséget, hanem segítségével „üzenetet” tudunk küldeni a GPIO port kiválasztott csatornájára.

Ha pl. a GPIO 11-es tüskéjét magas, majd alacsony szintre akarjuk állítani, akkor a következő üzeneteket kell elküldenünk:

A számozás ebben az esetben a fizikai sorszámot jelenti. Amennyiben a 11-es tüskére egy ledet kötünk (előtét ellenálláson keresztül), akkor az első esetben be, a második esetben pedig ki fog kapcsolni.

A hardver

Interaktív játékunkban négy darab kimenetet fogunk használni, a 11, 13, 15 illetve 16-os kimeneteket. Ezekre, az előbbi sorrendnek megfelelően egy piros, egy sárga, egy zöld, majd még egy piros ledet kapcsolunk. Az elkészítendő áramkör breadboard-on:

Áramkör breadboardon

illetve kapcsolási rajzon:

Áramkör kapcsolási elrendezése

A kapcsolás elkészítése után célszerű a ledeket egy egyszerű programmal kipróbálni, küldjünk üzeneteket a 11, 13, 15, 16-os tüskékre pin(sorszám)on, illetve pin(sorszám)off tartalommal. Ha minden rendben van, a ledek sorban ki- illetve bekapcsolnak.

A játékprogram

A játéktér:

Ezek után elkezdhetjük játékunk alapjait elkészíteni. Az első lépés a pálya, azaz a labirintus megrajzolása. Ezt feltétlenül „játéktérként” készítsük el, és a rajzolásnál vegyük figyelembe, hogy a készítendő pálya „falait” homogén színekkel rajzoljuk meg. Egy lehetséges megoldást mutat az alábbi ábra:

Játéktér

A második elem, amit el kell készítenünk, a labirintusban mozgatandó szereplő. A programkészítés első fázisában célszerű egy egyszerű objektumot készíteni, majd később, amikor már minden alapfunkció tökéletesen működik, szereplőnket bonyolultabb alakzattal is helyettesíthetjük!

A szereplő:

Az alábbi ábrán látható egy javasolt megoldás, alapja egy kitöltött kör, amibe egy szmájlit rajzoltunk:

Szereplő

Ha elkészültünk a grafikai elemekkel, a következő lépés annak a programrészletnek a megírása, ami a szereplő mozgatását fogja megoldani:

Irányítás:

A szereplő irányítását végző modul két alapfeladatot lát el. Az első, a kezdeti pozíció beállítása, ez célszerűen a labirintus bejárata (erre szolgál az „ugorj” parancs). Szintén ez a modul oldja meg a négy irányba történő mozgatást, a példában erre a kurzorbillentyűket használjuk. A programból látható, hogy a kezdőpozíciót, illetve az elmozdulást koordinátákkal adjuk meg. A scratch grafikus képernyőjét egy koordináta rendszernek képzelve, a képernyő közepe az origo, a (0,0) pont. Jobbra az ’x’ értékek pozitív, balra negatív tartománya, felfelé az ’y’ értékek pozitív, lefelé negatív tartománya található. A kurzorgombok egy-egy lenyomása a koordináták +/- eggyel történő változását okozzák.
Ha 1-nél nagyobb értéket adunk meg a szereplőnk gyorsabban (de szakaszosabban) fog mozogni.

Ütközés érzékelése:

Programunk ebben az állapotban már tudja mozgatni a szereplőt, de jelenleg még „át tudunk menni” a falakon. Ennek megakadályozására vezessünk be egy olyan modult, ami érzékeli a fallal való ütközést. Ezt legegyszerűbben színérzékeléssel tudjuk megoldani. Azt fogjuk figyelni, hogy az általunk mozgatott szereplő mikor fut rá „fal-színű” pixelre. Ezt nem csak figyelni, de számolni is fogjuk. Ehhez bevezetünk egy „hiba” nevű változót, itt fogjuk számolni, hogy hányszor vezetjük neki szereplőnket a falnak. Az alábbi ábrán az ütközés érzékelő modul látható:

A programrészlet működése egyszerű, amint a szereplőnk fal színű pixelt érint, a hibaszámláló értéke egyel nő, a szereplő a kezdőpozícióba ugrik (-207,100), majd 0.5 sec várakozás után újra irányíthatóvá válik. Erre a kis várakoztatásra azért van szükség, hogy a játékos le tudja venni az ujját a vezérlő gombról, a játékos ne „pattogjon” az aktuális pozíció és a fal között.
Amennyiben az ütközést a breadboard-on elkészített áramkörrel is szeretnénk érzékeltetni, akkor alkalmazzuk az alábbi módosítást:

Ebben az esetben, ha a szereplőnk nekimegy a falnak, megtörténik a hibaszámlálás, a kezdőpozícióba állítás, majd fél másodpercre bekapcsol a 16-os kimenetre kötött LED.
Ezek után nézzük meg a teljes programot, ami tartalmazza a hibaszámláló inicializálását (nullára állítás), a kezdőpozíció beállítását, a mozgató utasításokat, illetve az ütközésérzékelést, a hardveres bővítéssel együtt.

Program

Ha az ütközést grafikusan is szeretnénk jelezni, akkor készítsünk egy „hiba-kijelzőt”. Ez egy újabb szereplő bevezetését jelenti, ami több ún. jelmezzel fog rendelkezni. Készítsünk egy, az alábbi ábrán lévőhöz hasonló „kijelzőt”.

Az ábrán jól látható, hogy a szereplőnk két jelmezzel rendelkezik, a „jelmez1” az inaktív, míg a „jelmez2” az aktív állapotot jelenti. Ahhoz, hogy a „kijelzőnk” jelmezt tudjon váltani, a hozzá tartozó programnak érzékelni kell az általunk mozgatott szereplő fallal való ütközését. Erre az üzenetküldő blokkot fogjuk használni.

A kijelző „szereplő” programja az alábbiak szerint fog kinézni:

A program indításkor a szereplő2 a jelmez1 jelmezzel indul, majd ha irányított szereplőnket véletlenül a falnak vezetjük, a jelmez jelmez2-re vált, 0,5 másodperc várakozás után pedig újra jelmez1-re.
Ezzel párhuzamosan kapcsol ki illetve be a 16-os kimenetre kötött LED.

A fenti modulokat elkészítve szereplőnket már végig tudjuk vinni a labirintusban úgy, hogy a falakon már nem tudunk átmenni, illetve abban az esetben ha a falnak ütközünk, a kezdőpontra ugrunk. Ilyenkor hibaszámlálónk értéke egyel nő, illetve visszajelzést is kapunk, grafikusan illetve hardveresen.

A folytatásban azzal tesszük érdekesebbé a játékot, hogy a labirintus kijáratát a pálya indítása után pár másodperccel bezárjuk, amit három véletlenszerűen felbukkanó kulcs összeszedésével tudunk kinyitni!

A scratch 1.4 programot asztali gépre, laptopra erről a linkről tudod letölteni:
https://scratch.mit.edu/scratch_1.4/