11. diel - Raspberry Pi - Membránová klávesnica 4x4
V predchádzajúcej lekcii, Raspberry Pri pripojení RFID čítačky , sme si zapojili a naprogramovali RFID čítačku.
Dnes k nášmu Raspberry Pi pripojíme numpad a budeme cez neho zadávať čísla. Napíšeme si k tomu jednoduchý kód ktorý ich bude vypisovať a vysvetlíme si, ako numpady/keypad/klávesnice vlastne fungujú.
Ako už mnohokrát predtým tu ukážem vlastné zapojenie a schému zapojenia vytvorené pomocou Fritzing.
Potrebné súčiastky
Na úspešné zapojenie budeme potrebovať:
- Raspberry Pi
- membránová klávesnica 4x4 (NUMPAD)
- pri najlepšom nepájivé pole a niekoľko drôtikov, prípadne iba drôtiky
Ako funguje numpad?
Jednoduchá klávesnica čiže numpad obsahuje niekoľko prepínačov usporiadaných do mriežky. Vnútorné vodiče spájajú jednotlivé rady a stĺpce prepínačov tak, že keď používateľ stlačí jeden z prepínačov, tento prepínač elektricky spojí jeden riadok so stĺpcom. Pokiaľ zariadenie Raspberry Pi chce detekovať stlačené klávesy, vyšle rýchly impulz do každej z čiar mriežky prepínača. Keď používateľ stlačí tlačidlo, toto tlačidlo spojí jeden riadok s jedným stĺpcom a Raspberry Pi tak dokáže detekovať zmenu.
Zapojenie numpadu
Ako už bolo povedané, každý riadok numpadu berieme ako vstup a každý stĺpec numpadu ako výstup. Raspberry Pi vysiela pulzy do liniek a načúva zmenám na stĺpikoch. Preto musíme prepojiť každý zo štyroch radov a stĺpcov numpadu s ľubovoľnými osami digitálnych I/O pinov na Raspberry Pi:
Programová časť
Máme teda numpad zapojený a vieme, ako funguje. Teraz si s jeho pomocou a prostredníctvom knižníc Pythonu vyskúšame vypísať vstup, ktorý zadávame.
Import knižníc
Dnes budeme používať predovšetkým dve knižnice. Prvá bude tradične
GPIO
knižnica. Druhá bude knižnica pre import času, ktorá sa
nazýva time
. Tieto knižnice samozrejme musíme mať
nainštalované pomocou pip.
Prvú knižnicu importujeme jednoducho:
import RPi.GPIO as GPIO
Pomocou as
uložíme knižnicu do premennej GPIO
,
aby sme neustále nemuseli písať jej názov. Potom importujeme celú knižnicu
time
:
import time
Uloženie do premenných
Vytvoríme si premenné L1-L4
a C1-C4
do ktorých uložíme čísla jednotlivých portov do ktorých sme zapojili
numpad. Piny na numpade berieme sprava, takže prvý pin napravo bude
A1
, posledný na ľavo je potom A8
. Piny
A1-A4
budú zapísané v premenných C1-C4
.
A5-A8
budú zapísané do L1-L2
. Zápis pinov je
dôležitý kvôli správnemu určeniu pozície čísla:
L1 = 26 L2 = 7 L3 = 18 L4 = 1 C1 = 12 C2 = 16 C3 = 20 C4 = 21
Nastavenie GPIO
Prvé nastavíme setwarnings
na False
na
deaktiváciu varovania. Varovanie nám hovorí, že GPIO port sa už používa,
pretože sme zastavili program a spustili ho znova.
Mode nastavíme na BCM
. Viac o nastavovaní GPIO nájdete v minulej
lekcii:
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
Popíšme si jednotlivé časti:
- GPIO setup, ako názov napovedá, nastavuje GPIO porty.
- OUT - output nastavenia portov, keď chceme v programe definovať, akú hodnotu budú porty mať
- IN - input, keď nechávame prístupom z vonku definovať hodnotu portov
- L1-L4 - nastavíme na OUT
- C1-C4 - nastavíme na IN
pull_up/down
:
GPIO.setup(L1, GPIO.OUT) GPIO.setup(L2, GPIO.OUT) GPIO.setup(L3, GPIO.OUT) GPIO.setup(L4, GPIO.OUT) GPIO.setup(C1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
Ako funguje rezistor pull_up/down
je vysvetlené v tejto minulej
lekcii Nastavíme na ňom hodnotu PUD_DOWN
. To znamená že
nám zakaždým, keď tlačidlo nebude stlačené, vyhodí
False
.
Funkcie readline
Vydefinujeme si funkciu readline
:
def readLine(line, characters): GPIO.output(line, GPIO.HIGH) if(GPIO.input(C1) == 1): print(characters[0]) if(GPIO.input(C2) == 1): print(characters[1]) if(GPIO.input(C3) == 1): print(characters[2]) if(GPIO.input(C4) == 1): print(characters[3]) GPIO.output(line, GPIO.LOW)
Do funkcie readLine()
vložíme premennú line
a
list characters
. Premenná line
definuje riadok alebo
port L1-L4
a characters
potom znak na riadku sa
nachádza. Tieto obe premenné si definujeme za chvíľu. Pomocou
GPIO.output()
nastavíme vždy port L1-L4
(podľa
premennej line
) na hodnotu HIGH
. Vytvoríme si
if
, ktorý bude čakať na GPIO input()
na portoch
C1-C4
, a podľa toho, na akom porte bude True
(čiže
1) vypíše znak. Nakoniec nastavíme GPIO.output()
portov
L1-L4
(podľa premennej line
) na hodnotu
LOW
.
Try
blok
Poďme si teraz pripraviť try
blok, do ktorého vložíme
while
cyklus:
try: while True: readLine(L1, ["1","2","3","A"]) readLine(L2, ["4","5","6","B"]) readLine(L3, ["7","8","9","C"]) readLine(L4, ["*","0","#","D"]) time.sleep(0.1) except KeyboardInterrupt: print("\nApplication stopped!")
Poslednou vecou, ktorú musíme nastaviť sú premennú line
a
list characters
. Vypíšeme si blok Try
, aby sme mohli
ošetriť prípadné výnimky (exceptions) v kóde a vložíme doň
nekonečný cyklus while
s hodnotou True
. Nekonečný
cyklus zaistí, že sa bude kód v ňom vložený neustále opakovať, a my
budeme môcť neustále zadávať nové kódy. Vo while
cykle si
potom definujeme našu funkciu readline()
, do nej dáme názov
portu a 4 znaky (characters) ktoré sa na riadku portu môžu
nachádzať. Napríklad teda L1 - ["1","2","3","A"]
definujeme ako
list, z ktorého potom budeme brať jednotlivé znaky.
Vysvetlenie
Try
blok nám teda vyskúša nekonečný cyklus (žiadny cyklus
by nemal byť nekonečný), v ktorej máme nadefinované jednotlivé riadky a
znaky na nich. Program skočí do funkcie readline()
, do ktorej
nám vloží číslo portu do premennej line
a list znakov do listu
characters
. Potom počká na stlačenie tlačidla.
While
opakovane volá funkciu readline()
pre každý
riadok klávesnice L1-L4
. Preto keď na numpade stlačíme
tlačidlo, priradí sa hodnota na jednom z portov C1-C2
. Funkcie
If
ktoré neustále dookola porovnávajú či má
C1-C4
hodnotu True
nájdu správny port a ten
vydefinuje pozíciu na riadku.
Celý kód potom vyzerá takto:
import RPi.GPIO as GPIO import time L1 = 26 L2 = 7 L3 = 18 L4 = 1 C1 = 12 C2 = 16 C3 = 20 C4 = 21 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(L1, GPIO.OUT) GPIO.setup(L2, GPIO.OUT) GPIO.setup(L3, GPIO.OUT) GPIO.setup(L4, GPIO.OUT) GPIO.setup(C1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) def readLine(line, characters): GPIO.output(line, GPIO.HIGH) if(GPIO.input(C1) == 1): print(characters[0]) if(GPIO.input(C2) == 1): print(characters[1]) if(GPIO.input(C3) == 1): print(characters[2]) if(GPIO.input(C4) == 1): print(characters[3]) GPIO.output(line, GPIO.LOW) try: while True: readLine(L1, ["1","2","3","A"]) readLine(L2, ["4","5","6","B"]) readLine(L3, ["7","8","9","C"]) readLine(L4, ["*","0","#","D"]) time.sleep(0.1) except KeyboardInterrupt: print("\nApplication stopped!")
Verím, že sa vám pripojenie a nakódovanie numpadu podarilo. Svoje dojmy a prípadné otázky môžete zanechať v diskusii pod článkom 🙂
V ďalšej lekcii, Raspberry pi - Senzor vlhkosti pôdy , si k Raspberry Pi pripojíme senzor vlhkosti pôdy.