Gyakran felmerülő kérdés a Raspberry-s fórumokon a GPIO-port vezérlése python-ból, lehetőleg grafikus felületen keresztül. Hasonlóan gyakran merül fel az is, hogy mekkora a terhelhetősége a port kimeneteinek, illetve, hogy hogyan lehetne a kimenetről nagyobb áramú, feszültségű eszközt működtetni. Az alábbi tutoriálban megpróbálok ezekre a kérdésekre összefoglalóan válaszolni. Egy olyan mintaprogramot fogok bemutatni, amiben a Pi nyolc kimenetét használom úgy, hogy minden kimenet egy-egy ledet, illetve relét működtet, és a vezérlést a python beépített grafikus moduljával végzi.

Kimeneti terhelhetőség

A válasz nem annyira egyszerű, mint amilyennek a kérdésből elsőre tűnik. Több leírást illetve fórumot átnézve az a válasz tűnik hitelesnek, hogy a GPIO port tüskéit 3,3V magas logikai szinten max. 17mA-el szabad terhelni a biztonság érdekében. Ez azt jelenti, hogy a kimenetre nyugodtan ráköthetünk egy led diódát előtét ellenálláson keresztül. Ha ennél nagyobb áramú terhelést szeretnénk működtetni, akkor ahhoz már feltétlenül valamilyen illesztő megoldást kell használnunk.

GPIO port vezérlése grafikus felületen keresztül

A python lehetőséget ad arra, hogy a Raspberry Pi kimenetét grafikus felületen keresztül vezéreljük, ehhez két modult kell a programunk elején importálnunk, az RPi.GPIO hardver vezérlő, illetve a tkinter grafikus libary-t. Az importálás után ki kell választanunk, hogy melyik portot (pin-t) fogjuk használni a vezérléshez, majd figyelembe véve, hogy egy port lehet ki-, illetve bemenet, azt is meg kell határoznunk, hogy a kiválasztott port az aktuális programban kimenetként üzemeljen. Lássuk mindezt a gyakorlatban:

import RPi.GPIO as GPIO # GPIO vezérlő modul meghívása
from tkinter import * # python grafikus modul meghívása
GPIO.setmode(GPIO.BOARD) # GPIO port számozása - panel szerinti számozás 
GPIO.setup(11, GPIO.OUT) # GPIO port kiválasztása (11) és beállítása kimenetnek
GPIO.output(11, 0) # 11-es port kimeneti szintjének beállítása 0-ra

A programrészlet további két parancsot is tartalmaz, az egyik a „setmode” ami a tüskék számozási módját állítja be (ez a példában un. BOARD, azaz a pin-ek fizikai sorszámát jelenti), illetve az „output” aminek segítségével az utolsó sorban a kiválasztott pin logikai szintjét 0-ra állítjuk.

A következő feladat az importált gui modul segítségével létrehozni az ablakot, ahol majd a grafikus vezérlőket elhelyezzük:

ablak = Tk() # főablak objektum létrehozása 
ablak.title("GPIO kapcsoló") # ablak cimke megadása
ablak.geometry("250x80") # ablakméret beállítása
ablak.resizable(0, 0) # ablak átméretezési lehetőségének kikapcsolása

A programrészlet a főablak létrehozását, méretének beállítását, illetve a fejlécben megjelenő cím megadását teszi lehetővé. Itt állíthatjuk be azt is, hogy a felhasználó átméretezhesse-e az ablakot a futás során. Ez a jelenlegi beállítással le van tiltva.

A következő blokk két eljárás definiálása, amik tulajdonképpen olyan programmodulok, amik majd meghívásuk esetén futnak le. Ezt a grafikus felületről fogjuk végrehajtani, a megfelelő gomb „lenyomásával”.

def elsoGomb(): # ki/bkapcsoló gomb eljárás
    global on1
    if on1 == 0:
        on1 = 1
        elsoGombAllapot.set("felkapcsolva")
        GPIO.output(11, 1)
    else:
        on1 = 0
        elsoGombAllapot.set(" lekapcsolva")
        GPIO.output(11, 0)

def quit(): # kilépés eljárás
    ablak.destroy() # ablak lezárása
    GPIO.output(11, 0) # kimenet alacsony szintre állítása
    GPIO.cleanup() # csatorna hozzárendelés megszüntetése

Az ezt követő programrészlet pedig a tulajdonképpeni főprogram, ami tartalmazza a 11-es kimenet állapotát beállító gombot, az állapot visszajelzését megvalósító címkét, és a kilépés gombot.

# gomb létrehozása
Button(ablak, text="1. relé", command=elsoGomb).grid(column=0, row=0)
Button(ablak, text="Quit", command=quit).grid(column=2, row=10)

# cimke létrehozása 
Label(ablak, text="1. állapota:").grid(column=2, row=0)
Label(ablak, textvariable = elsoGombAllapot).grid(column=3, row=0)

Ezt a blokkot már csak az

ablak.mainloop()

utasítás követi, ami tulajdonképpen a grafikus rész lezárása.

A második program csak abban különbözik a példaprogramtól, hogy nem egy, hanem nyolc kimenetet használunk, illetve ennek megfelelően nyolc grafikus vezérlőt.

Hardveres tesztelés

A program kipróbálásához állítsuk össze az alábbi kapcsolást:

A felhasznált GPIO portok: 11,12,13,15,16,18,19,21

Az egy kimenetet kezelő program képernyőképe:

A teljes, nyolc kimenetet vezérlő program grafikus felülete:

Amennyiben minden rendben működött, áttérhetünk a relés vezérlésre. Ha a kimenetekkel nagyobb áramú/feszültségű eszközt szeretnénk működtetni, akkor ennek egyik lehetséges megoldása az ún. relé használata. A relé működtető tekercse nagyobb áramot, illetve feszültséget igényel, mint amit a Pi GPIO kimenete szolgáltatni képes. Ha megpróbáljuk a relét direktben a port-ról használni, az jó eséllyel a Pi tönkremeneteléhez vezethet. Ennek elkerülésére egy megfelelő kollektor-áramú, npn tranzisztort érdemes használni. Ennek bekötése az alábbi ábrán látható:

Fogyasztó kapcsolása Pi kimenetéről

A relé működtető feszültsége származhat a Pi 5V-os kimenetéről, azonban nagyobb feszültség, vagy több relé esetén célszerű külső tápfeszültség-forrást alkalmazni. A működtetett kör teljesen független tápfeszültségről működhet, ami lehet akár váltakozó feszültség is. Elvben ez a kapcsolás alkalmas 230V hálózati feszültségű fogyasztók működtetésére is, de ezt csak fokozott figyelemmel, az érintésvédelmi és életvédelmi előírások szigorú betartásával javaslom. Ebben az esetben, bár a tranzisztor és maga a megfelelő minőségű relé galvanikus leválasztást biztosít, a Pi kimenetét érdemes még egy optocsatolóval (is) védeni.

A kapcsolási rajzon látható 1kΩ-os ellenállás a tranzisztor bázis áramát korlátozza, míg a kollektor körben lévő dióda a relé tekercsének megszakításakor fellépő, ellenkező polaritású önindukciós áram elvezetéséről gondoskodik, megvédve ezzel a kapcsoló félvezetőt a tönkremeneteltől.

A kapcsolást a gyakorlatban egy ún. relés modullal oldottam meg, ami tartalmazza az összes említett áramköri elemet.

A modul alsó felén látható tűs csatlakozók jobbról balra a negatív táp, pozitív táp, illetve a vezérlés, a felső részen található sorkapocs a közös (common), az alaphelyzetben zárt (nc) illetve az alaphelyzetben nyitott (no) csatlakozási pontok. A modul bal oldalán találhatók a soros bázis ellenállás, a vezérlő tranzisztor és a védődióda.

A panelt a 11-es kimenetre kapcsolva párhuzamosan működik a megfelelő led diódával:

LED és relé kimenet együtt

Jelen leírásban szereplő példaprogramokat Bagdi M. Olivér és Feke Krisztián Pataky-s diákok készítették.

A két forráskód letölthető: