Így építsd a billentyűzeted! - Beviteli eszközök fórum

üzenetek

hozzászólások


nyunyu
(félisten)

Buheraljunk billzetmatrixot fejezetunkhoz erkeztunk:

Hozzavalok:
- 1 db Arduino klon (6-24$ tipustol fuggoen, ez egy 8$-os Micro)
- 1 db 74HC238 demultiplexer (~75Ft)
- 1 db 74HC151 multiplexer (~75Ft)
- 4 db nyomogomb (? elfelejtettem eltenni a blokkot)
- 4 db dioda (5 Ft)
- 4 db LED (16 Ft)
- 4+2 db 330ohm ellenallas (5 Ft)

Fenti 74HC238 demultiplexer intezi a sorok cimzeset: kap egy 3 bites szamot, azzal kivalasztom, hogy a nyolc kimenete kozul melyikre keruljon tapfeszultseg. (2 vizszintes feher drot a kapcsolok kozott a ket sor)
Kapcsolok 1-1 diodaval vannak rakotve a megfelelo oszlopok vezetekeire (sarga es zold)

Az oszlop drotok a lenti 74HC151 multiplexerbe vannak kotve, ez az IC pont a forditottjat vegzi, mint az elozo: 8 bemenetbol valaszt ki egyet, es teszi ki a kimenetere.

Amire figyelni kell: 74HC151 nem szereti ha barmelyik bemenete a levegoben log: minden bemenetet le kell foldelni! (azert van a ket ellenallas az oszlop drotok felso vegen)
Ha valamelyik nincs foldelve, akkor fixen tapfesz van a kimeneten, amit az Arduino HIGH allapotnak olvas, fuggetlenul attol, hogy eppen nem azt szeretned latni.

Egyelore jobb otlet hijan 4 LEDet hajtok meg, attol fuggoen melyik gombok vannak nyomva:
void setup() {
pinMode(A0, OUTPUT); //r0
pinMode(A1, OUTPUT); //r1
pinMode(A2, OUTPUT); //r2
pinMode(A3, OUTPUT); //row enable
pinMode(2, OUTPUT); //c0
pinMode(3, OUTPUT); //c1
pinMode(4, OUTPUT); //c2
//pinMode(5, OUTPUT); //c3
//pinMode(6, OUTPUT); //c4
pinMode(6, OUTPUT); //led1
pinMode(7, OUTPUT); //led2
pinMode(8, OUTPUT); //led3
pinMode(9, OUTPUT); //led4
pinMode(10, INPUT); //input
}

void rowAddress(int a)
{
digitalWrite(A3, LOW); //demux disable
if (a & 1) digitalWrite(A0, HIGH); else digitalWrite(A0, LOW);
if (a & 2) digitalWrite(A1, HIGH); else digitalWrite(A1, LOW);
if (a & 4) digitalWrite(A2, HIGH); else digitalWrite(A2, LOW);
digitalWrite(A3, HIGH); //demux enable
}

void columnAddress(int a)
{
if (a & 1) digitalWrite(2, HIGH); else digitalWrite(2, LOW);
if (a & 2) digitalWrite(3, HIGH); else digitalWrite(3, LOW);
if (a & 4) digitalWrite(4, HIGH); else digitalWrite(4, LOW);
// if (a & 8) digitalWrite(5, HIGH); else digitalWrite(5, LOW);
// if (a & 16) digitalWrite(6, HIGH); else digitalWrite(6, LOW);
}

void loop() {
for (int i=0;i<=1;i++)
{
for (int j=0;j<=1;j++)
{
rowAddress(i);
columnAddress(j);
if (digitalRead(10)==HIGH) {
digitalWrite(6+i*2+j, HIGH);
} else {
digitalWrite(6+i*2+j, LOW);
}
}
}
}

Gyakorlatilag a demo keszen van, johet a vegleges matrix megepitese, belapatolni a kinai Cseresznyebol az MX Brownokat az Ergo4000 hazaba.
Persze ahhoz kene valami nyakot tervezni...

Aztan lehet szorakozni a firmware irasaval is.

Vegleges billzetemhez 4db 74HC151 fog kelleni, mivel 21 oszlopot kell olvasnom.
Elso 3 kepes 3*8 oszlopot kezelni, negyedikkel meg kivalasztom, hogy a harombol melyik legyen aktiv.

Ugyan bonyolultnak tunhet ez a multiplexer/demultiplexer, de ezzel a megoldassal eleg 5 cimlab+1 bemenet az osszes oszlop kezelesehez.
Klasszikusan annyi lab kellene a kontrollerre, ahany sorod plusz oszlopod van, esetemben 7+21=28, amennyi szabad laba max a meregdraga Teensy++-nak van.
Ehelyett ezekkel a filleres ICkkel leredukalom a labigenyt 3+1+5+1=10-re.

[ Szerkesztve ]

üzenetek