Új hozzászólás Aktív témák

  • 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 ]

    Hello IT! Have you tried turning it off and on again?

Új hozzászólás Aktív témák