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.)

GPIO interfész lábkiosztása

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!

Egyszerű LED villogtató áramkör breadboardon

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:

Folytatása következik…