Ahogy az előző fejezetben megbeszéltük, a Raspberry Pi GPIO portjának programozására több Python könyvtár is rendelkezésre áll. Az RPi.GPIO mellett a másik hivatalosnak tekinthető modul a GPIO Zero 1 . A könyvtár nagyon friss, legutóbbi, v1.5.0-ás verziójáról a raspberrypi.org oldalon, egy 2019. februárjában megjelent cikkben olvashatunk (GPIO Zero v1.5 is here! 13th Feb 2019 Ben Nuttall) https://www.raspberrypi.org/blog/gpio-zero-v1-5/

A könyvtár sok egyszerűsítést tartalmaz az RPi.GPIO modulhoz képest, ennek ellenére nem lehet rangsort felállítani az egyes library-k között, újra érdemes hangsúlyozni, hogy a könyvtár kiválasztást mindig az adott feladat határozza meg. A Zero modul kiváló segédlet abban az esetben, ha gyorsan szeretnénk tesztelni, kipróbálni, fejleszteni egy alkalmazást. Egy javaslat, a hardver illetve a szoftver alapos(abb) megismerésének érdekében érdemes a GPIO programozást az RPi.GPIO modullal kezdeni.

1. A GPIO Zero telepítése

A GPIO Zero alapértelmezetten telepítve van a Raspbian lemezképen, csakúgy, mint a Raspberry Pi Desktop PC / Mac lemezképen is, mindkettő elérhető a raspberrypi.org weboldalon. Amennyiben a Raspbian Lite változatot használjuk, akkor a telepítés az alábbiak szerint végezhető el:

Először frissítsük az adattárak listáját (repositories list):

pi@raspberrypi: ~ $ sudo apt update

Ezután telepítsük a Python 3 csomagot:

pi@raspberrypi: ~ $ sudo apt install python3-gpiozero

Ha esetleg másik operációs rendszert használunk a Raspberry Pi-n, akkor a GPIO Zero telepítéséhez a „pip” használatára lesz szükség. Telepítsük a „pip”-et a get-pip használatával, majd írjuk be:

pi@raspberrypi:~$ sudo pip3 install gpiozero

2. Alappéldák

Az alábbi egyszerű példák bemutatják a GPIO Zero könyvtár használatának néhány lehetőségét. Fontos: az összes „recept” a Python 3 verzióhoz készült! A példák a Python 2 alatt is működhetnek,de ez nem garantált!

2.1. GPIO Zero importálása

A Python környezetben a programokban használt könyvtárakat és funkciókat név szerint kell importálni a fájl elején, kivéve az alapértelmezés szerint beépített modulokat.

Például ha csak a Button eljárást szeretnénk használni a GPIO Zero könyvtárból, akkor az import parancsot a következőképpen használjuk:

from gpiozero import Button

Ezek után a Button elem közvetlenül elérhető a programban:

button = Button(2)

Természetesen, ha nincs okunk arra, hogy csak bizonyos elemeket importáljunk, (pl. szűkös memóriakeret) akkor célszerű a teljes modult importálni:

import gpiozero

Ebben az esetben a fenti Button hívás a következőképpen módosul:

button = gpiozero.Button(2)

2.2. Pin számozás

Ez a könyvtár a Broadcom (BCM) pin számozást használja a GPIO ki- illetve bemenetekre, szemben a fizikai (BOARD) számozással. Az RPi.GPIO könyvtárral ellentétben ez nem konfigurálható. A két számozás közötti átmenet egy kis trükkel megoldható!

Bármely, az alábbi ábrán „GPIO” jelzéssel ellátott csatlakozó használható PIN-sorszámmal. Például, ha egy LED-et csatlakoztatunk a “GPIO17” – kimenethez, akkor a PIN-kódot 17 helyett 11-re (BOARD számozás) állíthatjuk a következő paranccsal: BOARD11.

Hasonlóan használhatjuk azt a parancsot is, ami a Pi3, Pi4 verziók csatlakozósáv jelölésére hivatkozik, ahol a GPIO port a J8 (“header:number”). Tehát a „J8: 11” jelentése: a J8 csatlakozó 11. fizikai tüskéje.

A fentiek értelmében az alábbi parancsok egyenértékűen használhatóak:

>>> led = LED(17)
>>> led = LED("GPIO17")
>>> led = LED("BCM17")
>>> led = LED("BOARD11")
>>> led = LED("WPI0") # wiring pi szerinti számozás
>>> led = LED("J8:11")

Vegyük figyelembe, hogy ezek a hozzárendelések csak az adott programon belül érvényesek, így ha egy kimenet állapotát lekérdezzük a programunkon belül, az „eredmény” mindig a Broadcom (BCM) számozás szerinti érték lesz:

>>> led = LED("BOARD11")
>>> led
<gpiozero.LED object on pin GPIO17, active_high=True, is_active=False>

2.3. LED-villogtatás

Kezdjük a GPIO Zero könyvtár kipróbálását is a „kötelező” Hello World programmal, a led-villogtatással. Használjuk a 11-es tüskét (GPIO17)!

A fizikai elrendezés a következő:

A program:

 

from gpiozero import LED # a könyvtár importálása
from time import sleep # az időzítés importálása
red = LED(17) # az alkalmazott tüske beállítása
while True: # while ciklus fejléc
red.on() # led bekapcsolás
sleep(1) # várakoztatás
red.off() # led kikapcsolás
sleep(1) # várakoztatás

A könyvtár egyszerűsítési lehetőségeit kihasználva a programot az alábbi módon is megírhatjuk:

from gpiozero import LED
from signal import pause
red = LED(17)
red.blink()
pause()

2.4. Változó fényerősségű LED

Bármelyik hagyományos LED fényerejét PWM (impulzus-szélesség-moduláció) segítségével beállíthatjuk. A GPIO Zero könyvtárban ez a PWMLED parancs használatával érhető el 0 és 1 közötti értékek megadásával:

from gpiozero import PWMLED
from time import sleep
led = PWMLED(17)
while True:
led.value = 0 # ki
sleep(1)
led.value = 0.5 # fél fényerő
sleep(1)
led.value = 1 # teljes fényerő
sleep(1)

A folyamatos be- és kikapcsoláshoz hasonlóan a PWMLED paranccsal megoldható, hogy a fényerő folyamatosan nőjön, majd csökkenjen:

from gpiozero import PWMLED
from signal import pause

led = PWMLED(17)
led.pulse()
pause()

2.5. Gomb kezelése

A GPIO Zero könyvtár segítségével természetesen bemeneteket is tudunk kezelni, erre legegyszerűbb példa egy nyomógomb alkalmazása.

A gomb lenyomott állapotának lekérdezése:

 

from gpiozero import Button
button = Button(2)
while True:
if button.is_pressed:
print("Button is pressed")
else:
print("Button is not pressed")

Várakozás egy gomb megnyomására, mielőtt folytatnánk a programot:

from gpiozero import Button
button = Button(2)
button.wait_for_press()
print("Button was pressed")

A gomb minden megnyomásakor hívjon meg egy eljárást:

from gpiozero import Button
from signal import pause
def say_hello():
print("Hello!")
button = Button(2)
button.when_pressed = say_hello
pause()

Hasonlóképpen, az eljárás-hívását a gomb felengedéséhez is köthetjük:

from gpiozero import Button
from signal import pause
def say_hello():
print("Hello!")
def say_goodbye():
print("Goodbye!")
button = Button(2)
button.when_pressed = say_hello
button.when_released = say_goodbye
pause()

2.6. Gombbal vezérelt LED

Az alábbi példaprogram bekapcsolja a LED-et a gomb lenyomásakor, és kikapcsolja a gomb felengedésekor:

from gpiozero import LED, Button
from signal import pause
led = LED(17)
button = Button(2)
button.when_pressed = led.on
button.when_released = led.off
pause()

Alternatív lehetőség:

from gpiozero import LED, Button
from signal import pause
led = LED(17)
button = Button(2)
led.source = button
pause()

A példaprogramhoz használjuk az alábbi elrendezést:

Tesztkapcsolás BreadBoardon

Végül (de messze nem utolsónak!) egy érdekes alkalmazás, ami a könyvtár lehetőségeit kihasználva kikapcsoló gombot ad a Raspberry-nek!

2.7. Kikapcsoló gomb

A Button osztály lehetővé teszi egy speciális parancs futtatását is, ha a kijelölt gombot egy bizonyos ideig lenyomva tartjuk. Az alábbi példa leállítja a Raspberry Pi-t, ha a gombot 2 másodpercig lenyomva tartjuk:

from gpiozero import Button
from subprocess import check_call
from signal import pause
def shutdown():
check_call(['sudo', 'poweroff'])
shutdown_btn = Button(17, hold_time=2)
shutdown_btn.when_held = shutdown
pause()

A forráskódok letölthetőek: