A Raspberry Pi-t több tulajdonsága miatt is kiemelkedő képességű eszköznek tarthatjuk, a kis méret, az alacsony ár, a kiváló támogatottság mind-mind szuper tulajdonságok. Az ún. „maker”, „DIY”, illetve az otthoni vagy akár hivatásos fejlesztő szempontból az egyik legfontosabb tulajdonság az ún. GPIO (általános célú bemenet / kimenet) tüskék sora a panel felső széle mentén. A 40 tűs GPIO csatlakozó megtalálható az összes jelenlegi Raspberry Pi verzión. (A Pi 1 B + (2014) modell előtt a panelek rövidebb, 26 tűs csatlakozót tartalmaztak.)
A tüskék között 17 olyan van, amiket különböző programozási környezetekből (Scratch, Python, C/C++) könnyen tudunk programozni. A többi tüske ún. dedikált kimenet, azaz konkrét funkciót rendeltek hozzájuk a Pi tervezői.
Dedikált tüskék:
PWM (pulse-width modulation – impulzus szélességmoduláció)
Szoftveres PWM az összes tüskén
Hardveres PWM: GPIO12, GPIO13, GPIO18, GPIO19
SPI
SPI0: MOSI (GPIO10); MISO (GPIO9); SCLK (GPIO11); CE0 (GPIO8), CE1 (GPIO7)
SPI1: MOSI (GPIO20); MISO (GPIO19); SCLK (GPIO21); CE0 (GPIO18); CE1 (GPIO17); CE2 (GPIO16)
I2C
Data: (GPIO2); Clock (GPIO3)
EEPROM Data: (GPIO0); EEPROM Clock (GPIO1)
Soros port
TX (GPIO14); RX (GPIO15)
A Raspberry GPIO portjának programozása Python nyelven
A port programozására jelenleg három ún. library segítségével van mód. Az első, a Gordon Henderson által fejlesztett Wiring Pi könyvtár (http://wiringpi.com), illetve két, többé-kevésbé hivatalosnak tekinthető modul, az RPi.GPIO illetve a legutóbbi kiadású GPIO Zero.
Amikor választunk a három elérhető modul közül, akkor a konkrét feladatot kell figyelembe vennünk, illetve azt, hogy a két hivatalos könyvtár fejlesztése folyamatosabb, jobban illeszkedik az éppen aktuális verzió hardver tulajdonságaihoz. Feltétlenül érdemes megemlíteni azonban, hogy a WiringPi tartalmaz egy gpio parancssori segédprogramot, ami felhasználható a GPIO tüskék direkt programozására és beállítására. Ezt használhatjuk a tüskék olvasására és írására, és akár parancsfájlokból történő vezérlésére is.
A következőkben a két, Raspberry Pi alapítvány által támogatott, illetve fejlesztett library használatát mutatjuk be.
1. Az RPi.GPIO modul használata
Importálás
A library használatát importálásával kezdjük, ezt a műveletet célszerű összevonni egy ún. alias név adásával:
import RPi.GPIO as GPIO
Ilyen módon csak a „GPIO” névrekell hivatkoznunk a program további részében. A modul importálása egybevonva egy ellenőrzéssel a következőképpen történhet:
try: import RPi.GPIO as GPIO except RuntimeError: print("Error importing RPi.GPIO!)
Kimenet számozás
Az RPi.GPIO használatakor kétféle módon lehet számozni az IO-tüskéket. Az első az ún. BOARD számozási rendszer használata. Ez a Raspberry Pi panel P1 csatlakozóján található fizikai PIN-sorszámokra utal. Ennek a számozási rendszernek az az előnye, hogy nem kell ismernünk az RPiprocesszorának lábkiosztását, illetve nem kell változtatnunk a bekötésen ha esetleges hardveres fejlesztés történik.
A második számozási rendszer a BCM számozás. Ez egy alacsonyabb szintű működési mód – a Broadcom SOC (systemon chip, egylapkás rendszer) lábkiosztására utal. Ez annyival bonyolultabb, mint a BOARD számozás, hogy itt ismernünk kell az alkalmazott lapka lábkiosztását, és a sorszámok nem növekvő sorrendben következnek.
Annak beállítása, hogy programunkban melyik megoldást használjuk az a következő két paranccsal oldható meg:
GPIO.setmode(GPIO.BOARD) vagy: GPIO.setmode(GPIO.BCM)
A beállított mód értéke le is kérdezhető:
mode = GPIO.getmode()
A „mode”értéke: GPIO.BOARD, GPIO.BCM vagy None
Figyelmeztetések
Lehetséges, hogy egynél több programot futtatunk a Pi-n, illetve többször újra indíthatjuk ugyan azt a programunkat. Ennek eredményeként, ha az RPi.GPIO azt észleli, hogy egy csatornát korábban használtunk, és az esetleg nincs „felszabadítva”, vagy, hogy ha egy kimenetet az alapértelmezetthez képest eltérő módon konfiguráltunk, akkor figyelmeztető jelzést kapunk. A figyelmeztetések letilthatók a következő paranccsal:
GPIO.setwarnings(False)
Tüske (pin) beállítása:
Minden egyes tüskéthasználata előtt be kell állítanunk, hogy kimenetként, vagy bemenetként szeretnénk alkalmazni az aktuális programban.
Beállítás bemenetként:
GPIO.setup (ch, GPIO.IN)
(ahol a „ch” a csatorna száma a megadott számozási rendszer alapján (BOARD vagy BCM)).
Csatorna beállítása kimenetként:
GPIO.setup (ch, GPIO.OUT)
(ahol a „ch” a csatorna száma a megadott számozási rendszer alapján (BOARD vagy BCM)).
Megadható a kimeneti csatorna kezdeti értéke is:
GPIO.setup (ch, GPIO.OUT, initial = GPIO.HIGH)
Több csatorna beállítása
Egyszerre több csatorna beállítására is lehetőség van, ha alkalmazzuk a Python lista (list) parancsát. Például:
Például:
chan_list = [11,12] # a listához tetszőleges számú további csatorna hozzáadható! GPIO.setup (chan_list, GPIO.OUT)
Bemenet
A GPIO tüske értékének beolvasása:
GPIO.input (ch)
(ahol a ch a csatorna száma a megadott számozási rendszer alapján (BOARD vagy BCM)). Ez a parancs a 0 / GPIO.LOW / False vagy az 1 / GPIO.HIGH / True értéket adja vissza.
Kimenet
A GPIO tüske kimeneti állapotának (logikai szintjének) beállítása:
GPIO.kimenet (ch, szint)
(ahol a ch a csatorna száma a megadott számozási rendszer alapján (BOARD vagy BCM)).
A szint lehet 0 / GPIO.LOW / False vagy 1 / GPIO.HIGH / True.
Az egyes szintekhez a kimeneten 0 illetve 3,3V tartozik.
Több csatorna beállítása egy paranccsal
Lehetőségünk van több csatorna alapértékének egy paranccsal történő beállítására. Például:
chan_list = [11,12] # kimenetek beállítása a list paranccsal GPIO.output (chan_list, GPIO.LOW) # az összes kimenetet alapértelmezetten alacsony szintre állítja GPIO.output (chan_list, (GPIO.HIGH, GPIO.LOW)) # az első csatorna magas a második alacsony szint
Erőforrások felszabadítása
Bármely program végén jó gyakorlat az esetlegesen használt erőforrások felszabadítása, a csatornák elengedése, azaz a programban meghatározott hozzárendelések megszüntetése. Ez így van az RPi.GPIO modul használatánál is. Ezzel a módszerrel elkerülhetjük, hogy a kimenetek a program leállítása után magas szinten maradjanak, és egyben megvédhetjük a Pi kimeneteit is. Fontos, hogy a parancs csak azokra a kimenetekre van hatással, amiket használtunk a futtatás során, viszont kiadásával töröljük a számozás (BOARD / BCM) beállítást is!
A parancsot több formában is használhatjuk:
GPIO.cleanup () # a program által használt összes csatorna felszabadítása GPIO.cleanup(channel) # adott számú csatorna felszabadítása GPIO.cleanup( [channel1, channel2] ) # a listában megadott számú csatornák felszabadítása
Alaplap és GPIO információk
Az alábbi parancsokkal lekérdezhető a Raspberry Pi panel, illetve a az RPi.GPIO verziója:
Az RPi-vel kapcsolatos információk felfedezése:
GPIO.RPI_INFO GPIO.RPI_INFO['P1_REVISION']
GPIO Hello World
Végül nézzük meg a fentieket egy egyszerű példában összefoglalva, amit nevezhetünk a GPIO Hello World programjának!
A programhoz készítsük el az alábbi egyszerű kapcsolást, ami a BOARD számozás szerinti 8-as kimenetet használja egy LED villogtatására!
A kapcsolást breadboard-on készítsük el!
Az alkalmazott ellenállás 100 – 330 ohm közötti értékű legyen, a LED negatív kivezetését pedig a 6-os lábra kössük!
A működtetésre használható program:
– WHILE ciklussal:
import RPi.GPIO as GPIO # az RPi.GPIO könyvtár importálása, és az alias létrehozása from time import sleep # az időzítéshez szükséges time library importálása GPIO.setwarnings(False) # figyelmeztetések kikapcsolása (nem javasolt) GPIO.setmode(GPIO.BOARD) # számozási mód beállítása GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW) # 8-as láb beállítása kimenetnek, kezdeti alacsony szint while True: # végtelen ciklus indítása GPIO.output(8, GPIO.HIGH) # 8-as kimenet magas logikai szintre állítása sleep(1) # 1 másodperc várakozás GPIO.output(8, GPIO.LOW) # 8-as kimenet alacsony logikai szintre állítása sleep(1) # 1 másodperc várakozás
– FOR ciklussal:
import RPi.GPIO as GPIO # az RPi.GPIO könyvtár importálása, és az alias létrehozása from time import sleep # az időzítéshez szükséges time library importálása GPIO.setwarnings(False) # figyelmeztetések kikapcsolása (nem javasolt) GPIO.setmode(GPIO.BOARD) # számozási mód beállítása GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW) # 8-as láb beállítása kimenetnek, kezdeti alacsony szint for i in range (10): # for ciklus indítása GPIO.output(8, GPIO.HIGH) # 8-as kimenet magas logikai szintre állítása sleep(1) # 1 másodperc várakozás GPIO.output(8, GPIO.LOW) # 8-as kimenet alacsony logikai szintre állítása sleep(1) # 1 másodperc várakozás
A forráskódok letölthetőek: