Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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
.<> Raspberry Pi

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:

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
Pri C1-C4 potom musíme nastaviť 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.


 

Predchádzajúci článok
Raspberry Pri pripojení RFID čítačky
Všetky články v sekcii
Raspberry Pi
Preskočiť článok
(neodporúčame)
Raspberry pi - Senzor vlhkosti pôdy
Článok pre vás napísal Aleš Hlavín
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Raspberry
Aktivity