A Raspberry Pi GPIO portja 17 darab úgynevezett „nem dedikált” I/O tüskét tartalmaz, amiket különböző programozási környezetekből könnyen lehet működtetni. Erre a feladatra leggyakrabban a Scratch illetve a Python programozást alkalmazhatod. A következőkben egy egyszerű kapcsolás és néhány rövid Python kód segítségével bemutatom a LEDek és nyomógombok kezelésének módját.
Mire lesz szükség:
- 1 db LED
- 1 db breadboard-ba csatlakoztatható nyomógomb
- 1 db 330 Ω-os előtét ellenállás a LED-hez
- 1 db 10 kΩ-os ellenállás a nyomógombhoz
- 1 db breadboard
- jumperkábelek
Az alkalmazott áramkör:
A tesztelésre használt áramkörben a GPIO port 37-es (bemenet) illetve 33-as (kimenet) csatlakozási pontjait használtam, ezeket természetesen tetszőlegesen megváltoztathatod, csak akkor ezt a változtatást a programban is meg kell, hogy tedd.
Az alkalmazott nyomógomb bekötése:
A LED bekötése:
Tekintettel arra, hogy a GPIO port tüskéinek terhelhetősége amikor kimenetként használod őket 3,3V / 50mA, a LED elé egy 330 ohm-os ellenállást célszerű bekötni. Az ellenállás elhagyása a GPIO kimenet túlterhelését, illetve a Rapberry Pi tönkremenetelét okozhatja!
A nyomógomb bekötése:
Ebben az esetben azt kell figyelembe venned, hogy a GPIO port tüskéinek bemenetként való használatakor a nagyon nagy ellenállású bemenet a tüske feszültségszintjét figyeli. Amennyiben a bemenet nincs egyértelműen valamelyik (alacsony = 0V, magas = 3,3V) feszültségszintre kapcsolva, akkor un. bizonytalan, „lebegő” állapotba kerül, ez azt jelenti, hogy véletlenszerűen billeghet az alacsony és a magas logikai szint között. Ebben az esetben a vezérelt áramkör véletlenszerűen ki-illetve bekapcsol, ami természetesen nem engedhető meg.
Ezt a bizonytalan állapotot úgy tudod a legegyszerűbben elkerülni, hogy a bemenetet egy ellenállás segítségével állandóan vagy alacsony, vagy magas potenciálra (GND, vagy +Ut) kapcsolod, amiből a gomb lenyomása az ellenkező logikai szintre billenti a bemenetet.
Az első esetben, amikor az ellenállás magas szintre állítja a bemenetet, felhúzó, az ellenkező esetben lehúzó ellenállásról beszélünk.
A két alkalmazás bekötési vázlatát itt láthatod:
Mintaprogramok:
Az első program egy, a 33-as tüskére kapcsolt LED villogtatását eredményezi 1 másodperces időközzel.
import time ## Az idözítéshez szükséges library importálása import RPi.GPIO as GPIO ## A GPIO portot kezelő library importálása GPIO.setmode(GPIO.BOARD) ## Tüske számozási mód beállítása GPIO.setup(33, GPIO.OUT) ## A 33-as tüske beállítása kimenetnek while True: ## ciklus indítása GPIO.output(33,True) ## Led bekapcsolása time.sleep(1) ## 1 másodperc várakozás GPIO.output(33,False) ## Led kikapcsolása time.sleep(1) ## 1 másodperc várakozás
A második program egy, a 37-es tüskére kötött nyomógombot figyel, a bemenet alaphelyzetben egy 10 kohm-os ellenállással GND szintre van lehúzva, azaz a bemenet logikai alacsony szinten van. A gomb lenyomásával a bemenet magas szintre billen, ilyenkor a terminál ablakban a „Gomb lenyomva” felirat látható. A felirat folyamatosan megjelenik a gomb lenyomott állapotában.
import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(37,GPIO.IN) ## 37-es tüske beállítása bemenetnek input = GPIO.input(37) ## a 37-es tüske értékének betöltése az input nevű változásba while True: ## ciklus indítása if (GPIO.input(37)): print("Gomb lenyomva")
A harmadik program az előző változat továbbfejlesztése, a nyomógomb lenyomása csak egy kiírást eredményez a terminál ablakban, és ezzel párhuzamosan kigyullad a LED is, a time.sleep(0.5)parancs hatására fél másodpercig.
import time import RPi.GPIO as GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) GPIO.setup(37, GPIO.IN) # gomb bemenet GPIO.setup(33, GPIO.OUT) # led kimenet prev_input = 0 while True: input = GPIO.input(37) if ((not prev_input) and input): print ("Gomb lenyomva") GPIO.output(33, GPIO.HIGH) time.sleep(0.5) else: GPIO.output(33, GPIO.LOW) prev_input = input time.sleep(0.05)
A negyedik program a nyomógomb segítségével egy on/off működésű kapcsolót valósít meg, a gomb első lenyomásával be, a második lenyomással kikapcsolja a LED-et.
import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(37,GPIO.IN) GPIO.setup(33,GPIO.OUT) led = 0 prev_input = 0 while True: input = GPIO.input(37) if ((not prev_input) and input): print("Gomb lenyomva") led = (led+1)%2 if (led == 1): GPIO.output(33, 1) else: GPIO.output(33, 0) prev_input = input time.sleep(0.05)
A program működése:
A négy forráskód letölthető:
- 1. program – villogó LED
- 2. program – “Gomb lenyomva”
- 3. program – “Gomb lenyomva” + LED
- 4. program – LED kapcsolás gombnyomásra
A cikkben használt nyomógomb megvásárolható a MálnaPC Webshopjában!