Fórum témák

» Több friss téma
Cikkek » MSGEQ7 equalizer IC használata Arduino-val
MSGEQ7 equalizer IC használata Arduino-val
Szerző: Fizikus, idő: Szept 23, 2013, Olvasva: 17402, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   4 / 5

LED mátrix kijelzőt meghajtó kapcsolás shift regiszterekkel

A 8x8-as LED mátrix esetén a sorok és oszlopok vezérlését shift regiszterekkel valósítottam meg. Ezáltal a mikrovezérlőn nem 16 db I/O lábat használok fel, hanem csak 3-t (ADAT, LATCH és CLOCK). A shift regiszter működéséről már részletesen írtam az AVR SPI-ről szóló cikkemben (LINK). 

Az általam használt HC595-ös shift regisztert nem LED-ek meghajtására tervezték. Lábanként csak maximálisan 35 mA-t tud leadni és 20 mA-t tud elnyelni. Az IC a lábain, összesen, egyszerre maximálisan 70 mA-t képes leadni. A 330 Ω-os előtétellenállásokkal a piros LED-eken max. 9 mA áram folyik, ami jóval kisebb mint 35 mA. Ha egy soron belül mind a nyolc LED be van kapcsolva, akkor összesen 72 mA (8x9 mA) áram folyik a shift regiszteren keresztül, ami még nem probléma. Gond csak akkor van, ha pl. egy sorban mind a nyolc LED be van kapcsolva, akkor az oszlopokra kötött shift regiszter, adott oszlophoz tartozó lábának kb. 70 mA-t kellene elnyelnie, ami túl sok az adatlapban megadott 20 mA-es maximális limithez viszonyítva és tönkreteheti a shift regisztert. Ezért az oszlopok áramának az elnyeletésére egy shift regiszterrel vezérelt ULN2803-as Darlington tranzisztormezőt használok, mert az lábankent akár 500 mA-t is képes elnyelni.

A LED mátrix kijelzőt meghajtó kapcsolás az alábbi ábrán látható:

matrixsch580.jpg

(a nagyobb mérethez kattints a képre)

A cikkben használt LED mátrix kijelző sorainak és oszlopainak lábkiosztását az alábbi ábra mutatja:

ledm88sm.jpg

 

Az ábráról látható, hogy a sorokhoz és oszlopok tartozó kivezetések nem sorban egymást követően, hanem eléggé össze-vissza helyezkednek el. A kapcsolási rajzot felhasználva végigkövethető, hogy pl. a 1-es shift regiszter 15-ös lábát (első oszlop) egy 330 Ω-os ellenálláson keresztül a kijelző 13-as lábára kell kötni. A fentiekhez hasonlóan kikövetkeztethető, hogy az egyes sorokhoz és oszlopokhoz tartozó shift regiszter lábak a LED mátrix kijelző melyik lábához kell csatlakozzanak.

A LED mátrix kijelzőt és az azt meghajtó áramkört is egy próbanyákra forrasztottam össze. (Csak tanulságként jegyzem meg - a rutinosabbak úgyis rögtön észreveszik - hogy az oszlopokat vezérlő 2-es számú shift regiszter lábait véletlenül fordított sorrendben forrasztottam az ULN2803-hez, nem pedig úgy ahogyan a kapcsolási rajzon szerepel. Ezt a hibát szerencsére nagyon könnyű volt szoftveresen, a mikrovezérlő programjában kijavítani.)

ledmatrixpanel.jpg

 

A LED mátrix kijelzőt meghajtó panel tesztelése

A LED mátrix kijelzőt tesztelő Arduino kód az előző részben szereplő Smiley figurát és annak negatívját jeleníti meg a kijelzőn másodpercenként felváltva:

  1. // 8x8-as LED matrix kijelzo tesztprogram
  2. #include < TimerOne.h > // Timer konyvtar
  3. int dataPin = 11; //74HC595 Data az Arduino Pin11-re kotve
  4. int clockPin = 12; //74HC595 Clock az Arduino Pin12-re kotve
  5. int latchPin = 13; //74HC595 Latch az Arduino Pin13-ra kotve
  6. byte led[8]; // a megjelenitendo kepet tarolo tomb
  7. void setup()
  8. {
  9. pinMode(dataPin, OUTPUT); // Data lab kimenet
  10. pinMode(clockPin, OUTPUT); // Clock lab kimenet
  11. pinMode(latchPin, OUTPUT); // Latch lab kimenet
  12. led[0] = B00111100; // a kep megadasa binaris formaban - elso sor
  13. led[1] = B01000010; // masodik sor
  14. led[2] = B10101001; // harmadik sor
  15. led[3] = B10101001; // ...
  16. led[4] = B10000101;
  17. led[5] = B10111001;
  18. led[6] = B01000010;
  19. led[7] = B00111100; // utolso sor
  20. // 10000 microszekundum (1/100-ad masodperc) hosszusagu Timer interrupt
  21. Timer1.initialize(10000);
  22. // interrupt eseten a kijelzo frissito fuggveny meghivasa
  23. Timer1.attachInterrupt(kijelzoFrissites);
  24. }
  25. void loop()
  26. {
  27. for (int i=0; i < 8; i++)
  28. led[i]= ~led[i]; // a binaris kep soranak invertalasa
  29. }
  30. delay(1000);
  31. }
  32. void kijelzoFrissites()
  33. {
  34. byte row = B00000001; // kezdes az elso sorral
  35. for (byte k = 0; k < 9; k++)
  36. {
  37. digitalWrite(latchPin, LOW);
  38. shiftIt(led[k] ); // oszlopokra meno jel kikuldese
  39. shiftIt(row ); // sorokra meno jel kikuldese
  40. digitalWrite(latchPin, HIGH); // latch jel kikuldese
  41. row = row << 1; // kovetkezo sorra ugras
  42. }
  43. }
  44. //szoftveres SPI (8 bit kuldese, LSB eloszor)
  45. void shiftIt(byte dataOut)
  46. {
  47. boolean pinState;
  48. digitalWrite(dataPin, LOW);
  49. for (int i=0; i < 8; i++)
  50. {
  51. digitalWrite(clockPin, LOW);
  52. if ( dataOut & (1 << i) )
  53. {
  54. pinState = HIGH;
  55. }
  56. else
  57. {
  58. pinState = LOW;
  59. }
  60. digitalWrite(dataPin, pinState);
  61. digitalWrite(clockPin, HIGH);
  62. digitalWrite(dataPin, LOW);
  63. }
  64. digitalWrite(clockPin, LOW);
  65. }

 

A Timer interrupt másodpercenként százszor meghívja a kijelzoFrissites() függvényt, ami egymás után megjeleníti a képsorokat. A fenti kód működéséhez szükséges a TimerOne.h Arduino könyvtár (LINK), ami innen letölthető: (LINK)

 

smiley580.jpg


A cikk még nem ért véget, lapozz!
Következő: »»   4 / 5
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem