Bevezetés
Amikor a „programozásról” beszélünk a hétköznapokban, általában az algoritmus és a szoftver létrehozására gondolunk. A kódolás azonban bizonyos esetekben több mint egy olyan szoftver megírása, ami a gépünkön fut, és az eredménye a képernyőn látható. A programoknak lehet hatásuk a környezetre az alkalmazott hardvereken keresztül. Egy szoftver gyűjthet adatok a környezetről szenzorokon keresztül, majd végezhet beavatkozásokat az értékek függvényében. A számítógép és a rajta futó programok ilyen típusú alkalmazását physical computing-nak nevezzük. Az ilyen jellegű alkalmazások az alapjai a robotikában, az IoT, illetve a Smart technológiában felhasznált IT eszközöknek.
Az előbbiekben említett témakörök működésének megismeréséhez, gyakorlati kipróbálásához kiváló eszköz a Raspberry Pi számítógép. 40 tűs csatlakozó felülete, a GPIO port, és a rajta futtatható programok lehetővé teszik, hogy egyszerűbb illetve összetettebb modelleken ismerjük meg és teszteljük a különböző, manapság a hétköznapokban egyre gyakrabban megjelenő robotikai, IoT, illetve Smart megoldásokat.
Alapok
1. A Raspberry Pi GPIO port
Az RPi egyik szélén található egy 40 tüskéből álló csatlakozó sáv, az ún. Általános célú IO port. Ezen a tüskesoron keresztül tud a számítógép változatos módon kommunikálni a külvilággal.
A tüskék egy része tápfeszültséget szolgáltat a projektjeinkben szereplő eszközök (érzékelők, beavatkozó szervek) számára, természetesen figyelembe véve az ide vonatkozó feszültség és áramerősség korlátokat. A csatlakozók másik csoportja számtalan adat-kommunikációs lehetőséget képes megvalósítani az egyszerű kétállapotú digitális információ átadástól az összetettebb, iparban, szórakoztató elektronikában elterjedt kommunikációs protokollokig (pl. I2C, 1-wire, SPI, RX/TX stb.)
A tüskék szerepét az alábbi ábra mutatja be összefoglalóan, piros, narancssárga, illetve fekete színnel jelölve a tápfeszültség, zölddel az általános célú I/O, illetve egyéb színekkel a további lábak funkcióit:
2. Breadboard, csatlakozó kábelek és alkatrészek
A GPIO port úgymond a feladat egyik része, innen tudjuk vezérelni alkalmazásainkat, illetve ide futnak be a jelek az érzékelőktől. A tesztelendő, programozandó áramköröket egy ún. Breadboard-on, azaz prototípus építő panelen tudjuk összeállítani. Ennek nagy előnye, hogy forrasztás nélkül tudjuk összekötni az alkatrészeket a segítségével.
A breadboard egy műanyag lap, amin rengeteg furat található az alkatrészek rögzítésére, és ezek a furatok a műanyag panel hátoldalán meghatározott rendszerben össze vannak kötve.
A breadboard felépítése:
További „tartozékok” az egyszerű áramkörök megépítéséhez az összekötő kábelek, nyomógombok, ledek, ellenállások:
3. Programozás
A breadboard-on összerakott alkatrészek, áramkörök működtetéséhez a Raspberry Pi-n több programozási környezet is rendelkezésre áll. Ezek közül a Szakképzés 4.0 programtanterveihez illeszkedve a Scratch 3, illetve a Python környezetet fogjuk megismerni.
A Scratch objektumorientált, interpretált, dinamikus és vizuális programozási nyelv, amelyet elsősorban a programozással ismerkedők számára fejlesztenek. A Raspberry Pi alapítvány olyan beépülő modulokkal egészítette ki a programot, amelyek segítségével alkalmassá vált a GPIO port kezelésére. Így a „bővített” változat alkalmas a szabadon programozható 16 ki- illetve bemenet programozására.
A Scratch indítása:
Amennyiben olyan raspbian image van a gépünkön, ami nem tartalmazza a Scratch 3-as verziót, akkor a letöltést legegyszerűbben a terminál ablakban tudjuk megoldani a következő paranccsal:
sudo apt-get update
sudo apt-get install scratch3
A telepítés után a programozás almenüből indítható a program. Az indítás után a következő képernyőképet láthatjuk:
A programablak bal alsó sarkában található ikonra kattintva betölthetjük a GPIO port vezérléséhez szükséges modulokat:
Ennek hatására megjelenik két további blokk-csoport:
Az új blokkok segítségével lehetőségünk nyílik pl. kimenetek vezérlésére:
A fenti parancsok a 22-es GPIO port (ez a tüskesor 15. kivezetése) kimeneti szintjét állítják 3.3V-ra (high), illetve 0V-ra (low). Ha erre a port-ra pl. egy LED-et kapcsolunk egy előtét ellenálláson keresztül, akkor azt a két parancs segítségével ki- illetve bekapcsolhatjuk.
Hasonló módon tudjuk a tüskéket bemenetként használni:
A fenti parancsok a 17-es illetve a 27-es GPIO portokat (ezek a tüskesor 11. illetve 13. kivezetései) állítják be bemenetnek. Mit jelentenek a parancsban látható „notpulled” beállítások? A nagy ellenállással rendelkező bemenetek esetén bevett eljárás, hogy ezeket a bemeneteket egy un. felhúzó, vagy lehúzó ellenállás segítségével vagy a GND vagy a pozitív tápfeszültség potenciáljára „húzzuk”. Így meg tudjuk akadályozni, hogy a bemenet bizonytalan logikai állapotba kerüljön, azaz „lebegjen” Az ebben az esetben alkalmazott pl. nyomógomb, az ellenállással beállított szinthez képest az ellentétes állapotba tudja billenteni a bemenetet a gomb lenyomása esetén.
A Scratch program lehetőséget ad arra, hogy a kiválasztott bemenetet akár külső, hardveres ellenállással (notpulled), akár a Raspberry Pi beépített ellenállásainak programból történő aktiválásával alacsony, vagy magas szintre állítsuk. A bementre kapcsolt nyomógomb ebből az állapotból billenti a bemenetet az ellentétes logikai állapotba.
4. A fizikai számítástechnika „Hello world”-je
Amikor egy új programozási nyelvvel kezdünk ismerkedni, a szokásos első lépés a „hello world” szöveg kiíratása. A fizikai számítástechnikában ennek megfelelője egy LED-et villogtató program szokott lenni. Egy ilyen programot a kiválasztott tüske alacsony illetve magas szintre állításával tudunk előállítani. Ha a kiválasztott kimenet és a GPIO port egyik GND pontja közé egy LED-et kötünk, akkor az a program elindítása után egy másodperces időközzel villogni fog.
5. Összetettebb programozás
Összetettebb példaprogramok megvalósításához készítsük el a következő kapcsolást:
A kapcsolás a valóságban:
A kapcsolásban két LED-et kötöttünk a GPIO port 22-es illetve 23-as kivezetésére. Ezek a port 15. illetve 16. kivezetései.
Villogtassuk meg a két LED-et felváltva! A feladatot az előző program kibővítésével tudjuk megoldani:
A következőkben a két bemenetre kötött gomb programozását vizsgáljuk meg.