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 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:
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:
- 1. program
- 2. program
- 3. program
- 4. program
- 5. program
- 6. program
- 7. program
- 8. program
- 9. program
- 10. program