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.

Nyomógomb és LED összekötése a Raspberryvel

Az alkalmazott nyomógomb bekötése:

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:

A felhúzó és lehúzó ellenállások bekötése

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ő:

A cikkben használt nyomógomb megvásárolható a MálnaPC Webshopjában!