Kapcsolók, nyomógomb kezelése

Szerzők: Makan Gergely, Somogyi Anikó, Dr. Mingesz Róbert és Mellár János
A tananyag elsősorban az Elektronikai alapok programozóknak és a Digitális architektúrák című kurzusokhoz készült, az elsajátításához szükséges idő: 45 perc.

Összefoglalás

A lecke megmutatja, hogyan kell egy nyomógombot vagy egy kapcsolót helyesen bekötni egy digitális bemenetre. A megértésben képek, videók és szimulációk segítenek. A lecke végén önellenőrző kérdések találhatók.

Tartalom

  • Kapcsoló és nyomógomb áramköri bekötése
  • Kapcsoló és nyomógomb állapotának beolvasása a programban
  • Pergésmentesítés
  • Szimulációk
  • Videó nyomógomb használatáról
  • Önellenőrző kérdések

Kapcsoló és nyomógomb áramköri bekötése

Egy mechanikus kapcsoló úgy működik, hogy abban az állásában, amelyikben nyitva van, szakadásként, a másik állásában, ahol zárva van, ott pedig rövidzárként viselkedik. Hasonlóan a nyomógomb is, ha nincs lenyomva, akkor nyitott az áramkör, nem folyik áram, ha lenyomjuk, akkor belül összekapcsolja a kivezetéseit és zárja az áramkört, folyik az áram.

Az alábbi ábrán a legegyszerűbb, de helytelen bekötést láthatjuk. Ha zárva van a kapcsoló, akkor a 2-es digitális bemeneten logikai magas állapotnak megfelelő feszültség jelenik meg, ha viszont nyitva van, akkor egy határozatlan feszültség jelenik meg a digitális bemeneten (a bemenet “lebeg”). Ez kiszámíthatatlan működést eredményez, nem tudjuk detektálni, hogy a gomb valóban le van-e nyomva, vagy csak ingadozik a feszültség a bemeneten a nyitott kapcsoló esetén.

A kapcsoló a legegyszerűbb bekötés esetén nem funkcionál megfelelően.

Az alábbi ábrán már egy megfelelően működő bekötést láthatunk kapcsoló és nyomógomb esetén.

A kapcsoló és a nyomógomb tipikus bekötési módja az Arduinóba. A 2-es jelű vezeték a kapcsoló kimenete, amit az ábrán az Arduino 2-es kivezetésére kapcsoltunk.
Forrás: http://dx.doi.org/10.6084/m9.figshare.11971794

Láthatjuk, hogy a nyomógomb alsó és felső két kivezetése oldalanként össze van kötve a nyomógombon belül. A két oldal egymással nincs összekötve, csak, ha lenyomjuk a gombot, ekkor a gombon belül záródik az áramkör. A működéshez szükség van még tápfeszültségre (5 V) és a föld potenciálra (GND, 0 V), amik az Arduino UNO esetén a digitális jelszinteknek megfelelő értékek. A 10 kOhm-os ellenállást felhúzó ellenállásnak szokták hívni (azért, mert magasabb feszültségre van kötve). Az a szerepe, hogy a használt digitális bemenet (2-es kivezetés) akkor is egy határozott potenciálon legyen, ha a nyomógomb nincs lenyomva. Ha nem lenne felhúzóellenállás, akkor nem lenne zárt az áramkör, a digitális bemenet nem egy határozott feszültséget kap és ez kiszámíthatatlan működést eredményezne. (A felhúzó ellenállás értéke nem lehet túl alacsony, mert az túlterhelheti az 5 V-os kimenetet.) Az 1 kOhm-os ellenállás egy védőellenállás, ami figyelmetlenség esetén jön jól. Ha a 2-es kivezetést véletlenül digitális kimenetre és logikai magas értékre állítanánk és megnyomnánk a gombot, akkor rövidre zárnánk az áramkört a védőellenállás ebben az esetben azonban megfelelő mértékűre korlátozná az áramerősséget.

Az Arduino UNO mikrovezérlőjében minden digitális kivezetés esetén be tudunk kapcsolni egy belső felhúzó ellenállást is a pinMode(2, INPUT_PULLUP); függvényhívással. Ebben az esetben nincs szükség külső felhúzó ellenállásra és egyszerűsödik a nyomógombos kapcsolás.

Belső felhúzóellenállással egyszerűsödik a kapcsolás. Forrás: http://dx.doi.org/10.6084/m9.figshare.11971794

Mindkét kapcsolás esetén észrevehetjük, hogy a működés fordított (negatív logika), azaz a digitális bemeneten akkor olvashatunk be logikai alacsony értéket, ha a gomb le van nyomva és akkor logikai magasat, ha fel van engedve. Ezt a viselkedést kódban egy egyszerű logikai negálással meg lehet fordítani. Egyenes logikai módban is be lehet kötni egy kapcsolót vagy nyomógombot, ha az 5 V és a GND csatlakozásának helyét felcseréljük a külső felhúzó ellenállást tartalmazó áramkörben.

Programozás

Ahhoz, hogy egy kivezetésen be tudjunk olvasni egy digitális jelet/állapotot először be kell állítanunk az adott kivezetést digitális bemenetre a pinMode(pin, mode) függvénnyel. Ezt a setup függvényben szokás megtenni. A függvény használatáról már korábban volt szó. Ahhoz, hogy digitális bemenet legyen egy adott kivezetés, a pin paraméternek a használni kívánt kivezetés számát, a mode paraméternek pedig az INPUT vagy esetleg azINPUT-PULLUP (lásd az alábbiakban) értéket kell adnunk. Például: pinMode(2, INPUT);.

A kivezetésre kötött külső digitális jel aktuális állapotát a digitalRead(pin) függvénnyel olvashatjuk be. A pin paraméter értelem szerűen a használni kívánt kivezetés száma. A függvény egy bool típusú változóval tér vissza, ami 0 vagy 1 lehet. Az Arduino környezetben definiálva vannak a HIGH (1) és LOW (0) konstansok is, ezeket is lehet használni például egy feltételvizsgálat során.
Például: x = digitalRead(2); if(x == HIGH){...}.

Ha elindítjuk a következő szimulációt, akkor azt láthatjuk, hogy az áramköri lapon lévő USER LED akkor világít, ha a gomb nincs lenyomva és akkor nem világít, ha le van nyomva.

A nyomógombhoz hasonlóan a kapcsolót is kipróbálhatjuk az alábbi szimulációban.

Pergésmentesítés

Ha a kódunkban a loop ciklus gyorsan fut, akkor egy olyan nem kívánatos jelenség is felléphet, hogy egy gombnyomást több gombnyomásnak detektál (túlszámol) a program, pedig csak egyet szeretnénk. Ez akkor is megtörténhet, ha egy ideális kapcsolónk lenne, mivel ha nincs késleltetés a loop függvényben, akkor többször beolvashatja a digitális bemenetet amíg le van nyomva a gomb. Egy valódi kapcsolónál ezen kívül egy másik jelenség is felléphet az ún. pergés vagy prellezés. A kapcsoló vagy nyomógomb belsejében található rugalmas mechanikai érintkezők az átkapcsolás során többször nekiütődhetnek és visszapattanhatnak a stabil kontaktus kialakulását megelőzően. Az pergés viszonylag gyorsan lezajlik általában 50 ms-on belül.

A következő szimulációban a túlszámlálás és a pergés jelenséget figyelhetjük meg. A szimulációt elindítva a Kód ablakban a kattintsunk a Soros Monitor gombra és felnyílik egy ablak. Ha lenyomjuk a gombot, akkor láthatjuk egymás alá kiírva a gombnyomások számát. Túlszámlálás esetén és a pergésmentesítés nélkül egy lenyomás többször van detektálva.

Lehetséges hardveresen és szoftveresen is pergésmentesíteni. Az utóbbira és a túlszámlálás elkerülésére látható egy példa a következő szimulációban. A pergésmentesítés rész lényege, hogy a gomb lenyomása után valamennyit késleltetni kell, hogy a pergés jelenség megszűnjön és csak utána végezzük el az adott feladatot. A túlszámlálás elkerülésére az egyik legegyszerűbb megoldás, hogy egy while ciklussal egészen addig feltartjuk a kód futását, amíg le van nyomva a gomb.

A következő videóban 1 perc 37 másodperctől valódi áramkör esetén láthatjuk a nyomógomb használatát.

Az önellenőrzéshez következzen egy rövid kvíz a legfontosabb résztémákból:

Results

#1. Melyik konfigurálást elvégző függvényhívás nem jó egy nyomógomb beolvasásához?

#2. Miért szükséges felhúzó ellenállás a nyomógomb használatához?

#3. Mi történik, ha nincs felhúzó ellenállás a nyomógombhoz?

#4. Mikor szükséges pergésmentesíteni a kódban?

#5. Mi a pergésmentesítés lényege?

#6. Feltéve, hogy a nyomógomb megfelelően van bekötve milyen logikai értéknek megfelelő feszültség jelenik meg a digitális bemeneten, ha a felhúzó ellenállás van bekötve az áramkörbe és lenyomjuk a gombot?

finish