NI myRIO in matrična tipkovnica

Matrična tipkovnica 3x4 ima 12 tipk, razporejenih v 3 stolpce in 4 vrstice. Taka tipkovnica potrebuje vsega 7 priključkov, 3 za stolpce in 4 za vrstice. Če pritisnemo npr. tipko 5, staknemo vodnika drugega stolpca in druge vrstice.

Slika 1: Matrična tipkovnica 3x4

Za uporabljeno matrično tipkovnico moramo najprej ugotoviti, kateri priključki predstavljajo posamezne vrstice in posamezne stolpce. To najlažje ugotovimo z ohmmetrom. Priključimo ga na posamezne priključke matrične tipkovnice ter pritiskamo na tipke, dokler ohmmeter ne reagira. Za našo matrično tipkovnico velja:

Priključek 1 predstavlja stolpec 1 (v tem stolpcu so tipke 1, 4, 7 in *).

Priključek 2 predstavlja stolpec 2 (v tem stolpcu so tipke 2, 5, 8 in 0).

Priključek 3 predstavlja stolpec 3 (v tem stolpcu so tipke 3, 6, 9 in #).

Priključek 4 predstavlja vrstico 1 (v tej vrstici so tipke 1, 2 in 3).

Priključek 5 predstavlja vrstico 2 (v tej vrstici so tipke 4, 5 in 6).

Priključek 6 predstavlja vrstico 3 (v tej vrstici so tipke 7, 8 in 9).

Priključek 7 predstavlja vrstico 4 (v tej vrstici so tipke *, 0 in #).

Slika 2: Priključki (pini) posameznih stolpcev in vrstic matrične tipkovnice.

Matrično tipkovnico bomo priključili na konektor B modula myRIO (slika 3).

Slika 3: Priključitev matrične tipkovnice na konektor B modula myRIO.

Konektor B vsebuje 16 vhodno/izhodnih digitalnih priključkov (pinov) od DIO0 do DIO15. Posamezne pine lahko uporabimo kot vhodne ali pa kot izhodne pine. Priključki od DIO0 do DIO13 so prek pull up upora vrednosti 40 kΩ povezani na napetost 3,3 V, priključka DIO14 in DIO15 pa prek upora vrednosti 2,1 kΩ povezana na napetost 3,3 V. Enako velja za konektor A. Posamezni digitalni izhod lahko obremenimo s tokom 4 mA.

Slika 4: Priključki konektorja B modula myRIO (vir: National Instruments).

Nekateri priključki konektorja B imajo še dodatne funkcije kot so SPI vodilo, I2C, pulzno širinsko modulacijo (PWM) in druge funkcije. 

Slika 5: Digitalne vhodno/izhodne linije na konektorju B modula myRIO.

Poglejmo sedaj programsko kodo za branje matrične tipkovnice 3x4:

Slika 6: Branje matrične tipkovnice 3x4, Blok diagram.

Slika 7: Branje matrične tipkovnice 3x4, Čelna plošča.

Opis programske kode:

Posamezne stolpce matrične tipkovnice prek 470 Ω uporov priključimo na digitalne priključke konektorja B modula myRIO in sicer:

Te pine uporabimo kot izhodne pine. Na posamezni stolpec periodično pošiljamo logično 0 (0 V), najprej samo na prvi stolpec, nato samo na drugi stolpec in nato še na tretji stolpec. To dosežemo z uporabo zanke For. Poglejmo kako deluje zanka For.

Zanka For:

Zanko For kreiramo z orodjem For Loop, ki se nahaja na paleti Function > Programminf > Structures > For Loop. Zanko For lahko kreiramo v praznem delu Blok diagrama, lahko pa z orodjem For Loop zajamemo (objamemo) del izdelane kode v Blok diagramu, za katerega želimo, da se bi nahajal v notranjosti zanke.

Zanka For vsebuje dva priključka in sicer mejo štetja (Loop Count) in števec iteracij (Loop iteration).

Slika 8: Primer uporabe zanke For

Zanka For ponavljajoče izvaja kodo, ki se nahaja znotraj območja zanke. Zanka kodo izvede N-krat, pri čemer je N celoštevilčna vrednost, pripeljana na priključek N zanke. Števec iteracij se po vsaki izvedbi zanke poveča za vrednost 1 in se povečuje v območju od 0 do N-1. V primeru, ki ga prikazuje slika 8 se zanka ponovi 5-krat, števec iteracij pa ima na koncu izvajanja zanke vrednost 4.

Prenos podatkov preko roba zanke For:

Podobno kot pri zanki While, se tudi pri tej zanki ob prenosu podatkov preko roba zanke na robu kreira tunel (Tunnel). Izgled in delovanje tunela je v tem primeru nekoliko drugačno. Tunel ima črno obrobo in belo ozadje, v notranjosti pa se nahajata oglata oklepaja v barvi podatkovnega tipa podatka. Z oglatima oklepajema LabVIEW ponazori, da bo v tem tunelu kreiral polje podatkov. Podatki, ki so med izvajanjem zanke posredovani v tunel se v njem ne prepišejo, temveč se dodajo k že shranjenim. Na izhodu takšnega tunela dobimo polje podatkov, ki vsebuje toliko vrednosti, kot je bilo ponovitev zanke (Slika 9).

Slika 9: Tunel zanke For

V zanki For so nameščene funkcije Read.vi za vsak stolpec matrične tipkovnice. S tem dosežemo postopno preverjanje posameznega stolpca. Zanki For smo določili mejo štetja 3, ker vsak stolpec matrične tipkovnice posebej, periodično, postavimo na logično 0, napetost 0 V. Najprej prvi stolpec, nato drugi in ob tretji ponovitvi zanke For tretji stolpec matrične tipkovnice. Na logični nivo 0 jih postavimo (zapišemo) z Booleanovo konstanto False. Vsak stolpec posebej postavimo na logični nivo 0 v strukturi Case. Na izbirni priključek strukture Case pripeljemo števec iteracij zanke For. Ta se povečuje od 0 do 2 (meja štetja je 3). Ker smo pripeljali na izbirni priključek strukture Case numerični podatek, moramo v selektor strukture vnesti numerično vrednost. Izvede se tisti okvir, ki v selektorju vsebuje enako numerično vrednost, kot je vhodna vrednost na izbirnem priključku.

Slika 10: Vrednosti selektorja strukture Case

V posameznih okvirjih strukture Case zapišemo s funkcijo Write.vi na posamezni digitalni pin (DIO0, DIO1 in DIO2), kamor so priključeni stolpci matrične tipkovnice logično 0.

Vsakokrat, ko je na posameznem stolpcu logični nivo 0, preverjamo (beremo) stanje vrstic matrične tipkovnice. Ko je na primer prvi stolpec (pin DIO0) na nivoju 0 V, z branjem vrstic preverjamo ali je katera od tipk 1, 4, 7 in * sklenjena. Če je katera od teh tipk sklenjena, bo v vrstici sklenjene tipke (digitalnem pinu, kamor je vrstica priključena) napetost 0 V. Če nobena od teh tipk ni sklenjena, bo napetost na vseh vrsticah (DIO17, DIO19, DIO21 in DIO23) 3,3 V.

Slika 11 prikazuje sklenjeno tipko 4, ki je v prvem stolpcu in drugi vrstici. Na digitalnem pinu DIO4 (pin 19), ki je povezan z drugo vrstico matrične tipkovnice je napetost 0 V, na ostalih vrsticah pa je napetost 3,3 V.

Slika 11: Sklenjena tipka 4 matrične tipkovnice

Za branje vrstic (pinov DIO17, DIO19, DIO21 in DIO23) smo uporabili Express VI Digital input (1 sample), ki ga najdemo Functions > myRIO > Digital Input. Ko ga postavimo v Blok diagram, se odpre okno Configure Digital Input, v katerem izberemo kanale, ki jih bomo uporabili (slika 12).

Slika 12: Izbira digitalnih vhodov Express VI Digital input (1 sample).

Na izhodu funkcije Build Array smo uporabili negator zato, ker želimo da se ustrezna tipka (simulacijska LED dioda) na vmesniku (Čelna plošča) vklopi in ne izklopi, ko pritisnemo tipko na matrični tipkovnici.

Na robu zanke For se kreira tunel, kamor se v dvo dimenzionalno polje shranjujejo podatki, ki se med izvajanje zanke pošiljajo v tunel. S funkcijo Transpose 2D Array (Functions > Array > Transpose 2D Array) preuredimo elemente 2D matrike iz [i,j] v [j,i] zato, da ima 2D polje na Čelni plošči enako obliko (razporeditev) kot matrična tipkovnica. Eno dimenzionalno polje Array prikazuje pritiske na matrično tipkovnico po stolpcih, od prvega naprej. Prikaz v eno dimenzionalnem polju smo dosegli tako, da smo tunelu v priročnem meniju izbrali Concatenating (z miško se postavimo nad tunel > pritisnemo na desno tipko miške > Tunnel Mode > izberemo Concatenating).

Krmiljenje LED diod z matrično tipkovnico:

Program dopolnimo, da bomo s pritiski na posamezne tipke matrične tipkovnice vklapljali oziroma izklapljali posamezne LED diode po naslednjih zahtevah:

Konektor C modula myRIO:

Slika 13: Priključki konektorja C modula myRIO (vir: National Instruments).

Konektor C vsebuje 8 digitalnih vhodno/izhodnih priključkov (pinov) od DIO0 do DIO7. Posamezne pine lahko uporabimo kot vhodne ali pa kot izhodne pine. Vsak priključek je prek pull down upora vrednosti 40 kΩ povezan na maso. Za maso imajo skupni priključek DGND (pin 19). Logični nivo 1 da na izhodnem priključku napetost 3,3 V, obremenimo ga lahko s tokom 4 mA.

Programska koda:

Slika 14: Krmiljenje LED diod z matrično tipkovnico, Blok diagram.

Slika 15: Krmiljenje LED diod z matrično tipkovnico, Čelna plošča.

Opis programske kode:

Eno dimenzionalno polje Array (Tipke na matrični tipkovnici) prikazuje pritiske na matrično tipkovnico po stolpcih, od prvega naprej. Na vhod tega eno dimenzionalnega polja smo priključili funkcijo Index Array.

Slika 16: Funkcija Index Array.

Vsak element 1D polja je indeksiran s pozitivnim celim številom. Indeks polja si lahko predstavljamo kot zaporedno številko določenega elementa. Prvi element polja ima indeks enak 0.

Slika 17: Eno dimenzionalno polje in indeksi polja.

Funkcija Index Array (Functions > Array > Index Array) vrne element polja, ki smo ga indeksirali na vhodu funkcije Index Array. Če želimo da nam vrne več elementov polja, funkcijo Index Array razširimo. S celo številčnimi konstantami določimo, katere elemente polja naj nam funkcija Index Array vrne na izhodu. V našem primeru smo s čeloštevilčnimi konstantami določili, naj nam vrne šesti (indeks 5), drugi (indeks 1), peti (indeks 4), deveti (indeks 8) in prvi (indeks 0) element 1D polja. Ti elementi polja nam predstavljajo tipke 5, 4, 2, 3 in tipko 1 na matrični tipkovnici. Na izhodih funkcije Index Array smo kreirali Booleanove indikatorje (simulacijske LED diode), ki nam na Čelni plošči prikazujejo pritiske na izbrane tipke matrične tipkovnice.

LED diode bomo priključili na pine konektorja C modula myRIO. Zato funkciji myRIO DIO Open.vi kreiramo konstanto, kjer določimo pine, ki jih bomo uporabili. Ti pini so C/DIO0, C/DIO1, C/DIO2, C/DIO3 in C/DIO4. V zanki While smo kreirali funkcijo Write.vi, saj so vsi izbrani pini izhodni. Na te pine bomo "pošiljali" stanje logične 0 oziroma stanje logične 1. Indikatorjem, ki smo jih kreirali na izhodih funkcije Index Array, kreiramo lokalne spremenljivke in jih povežemo s kreirano funkcijo Build Array.

Slika 18: Lokalne spremenljivke, povezane s funkcijo Build Array.

Funkcija Build Array omogoča programsko kreiranje polja, spojitev več vhodnih polj ali dodajanje elementov n-dimenzionalnemu polju. Ob namestitvi funkcije v Blok diagram ima funkcija samo en vhod in en izhod. Funkciji dodamo vhod tako, da v priročnem meniju funkcije izberemo opcijo Add Input ali pa jo z miško preprosto razširimo na toliko vhodov, kot jih potrebujemo. Z lokalno spremenljivko Tipka 5, ki je priključena na prvi vhod funkcije Build Array krmilimo prvi izhod, v našem primeru izhod C/DIO0, z lokalno spremenljivko Tipka 4, ki je priključena na drugi vhod funkcije Build Array krmilimo drugi izhod, C/DIO1 itd. Vrstni red vhodov funkcije Build Array ustreza vrstnemu redu kreiranih izhodov, v našem primeru izhodov na konektorju C, saj je izhod funkcije Build Array povezan s terminalom Values funkcije Write.vi.

Štetje števila pritiskov na tipko:

Na vmesniku Čelne plošče se mora prikazovati podatek o številu pritiskov na tipko 5 matrične tipkovnice.

Slika 19: Koda za štetje pritiskov na tipko 5 matrične tipkovnice.

V kodi smo uporabili funkcijo Feedback Node (Functions > Structures > Feedback Node). Ko funkcijo vstavimo v Blok diagram, v njenem priročnem meniju izberemo Change Direction, pod Appearance pa Z-Transform Delay Node. Funkcija shrani podatek iz prejšnje iteracije zanke While do naslednje iteracije. Po vsakem pritisku na tipko 5 matrične tipkovnice se na vhodu (terminalu) s funkcije Select pojavi logična 1. Zato se na izhod funkcije Select vrne logično stanje, ki je pripravljeno na vhodu t funkcije Select. Hkrati se prek Feedback Node, ki je na izhodu funkcije Select in funkcije Increment na vhod t pripravi vrednost, ki je za 1 večja od prejšnje vrednosti. Vrednost na indikatorju Število pritiskov na tipko 5 se zato po vsakem pritisku na tipko 5 matrične tipkovnice poveča za 1.

Sprememba stanja LED diode po vsakem pritisku na tipko:

Z vsakim pritiskom na tipko 1 na matrični tipkovnici, spremenimo stanje LED diode, priključene na pin DIO4 konektorja C (C/DIO4 => pin 15). S prvim pritiskom na tipko 1, LED diodo vklopimo, z drugim pritiskom na tipko 1 jo izklopimo, s tretjim pritiskom na tipko 1 jo ponovno vklopimo itd. Ko izklopimo vitrualni instrument, mora tako LED dioda, priključena na pin C/DIO4 kot simulacijska LED dioda na vmesniku izklopiti.

Slika 20: Okvirja False in True programske strukture Case.

Pomikalni registri (Shift Register) na robu zanke While omogočajo dostop do podatkov iz prejšnjih iteracij zanke While. Pomikalni register deluje tako, da se vrednost, ki je pripeljana na desno stran pomikalnega registra, v naslednji iteraciji zanke While prenese na levo stran pomikalnega registra. Če se na levi strani nahaja več elementov, se ob prehodu v novo iteracijo, vrednosti elementov premaknejo za en element navzdol oziroma v elemente, ki se nahajajo pod njim.

Preko logičnega vezja in vrednosti pomikanih registrov na levi strani zanke While, se izvede okvir True oziroma okvir False programske strukture Case. Vrednosti pomikalnih registrov se namreč spremenijo ob vsakokratnem pritisku na tipko 1 matrične tipkovnice. S tem smo dosegli, da se po vsakem pritisku na tipko 1 matrične tipkovnice spremeni stanje LED diode, priključene na pin C/DIO4 modula myRIO in simulacijske LED diode (ON/OFF LED [C/DIO4]) na vmesniku (Čelna plošča). V obeh okvirjih strukture Case je nameščena lokalna spremenljivka indikatorja ON/OFF LED [C/DIO4], kateri smo v priročnem meniju spremenili delovanje iz Change To Write v Change To Read.

V desnem okvirju sekvence Flat smo še enkrat kreirali funkcijo Write.vi, na vhodni terminal Values pa smo ji dodelili Booleanovo konstanto False za vseh pet izhodov, saj se morajo vsi izhodi po izklopu virtualnega instrumenta postaviti na nivo logične 0 (0 V) oziroma izklopiti vse LED diode, ki so priključene na te izhode. Izklopiti se mora tudi simulacijska LED dioda na vmesniku (ON/OFF LED [C/DIO4]). Zato smo ji kreirali Property Node => Value ji spremenili delovanje na Change All To Write in ji dodelili vrednost Booleanove konstante False.

Ne smemo pozabiti resetirati mudula myRIO (Reset myRIO.vi).