Eğitim Şart

Taşı delen suyun şiddeti değil sürekliliğidir!…

Arduino ve 74HC595 ile 4X4 LED MATRİS

Bu projemizde örneklerine çok sık rastlanan 8×8 LED matrislerin çalışmalarına örnek olması açısından bir örneği inceledim. Ve board üzerinde bir 4×4 prototipi yaptım.

Bir göz atalım…

Youtube da bulabileceğimiz onlarca Türkçe ve yabancı kaynaklı video var!

Bunların en basiti “8×8 matrix” diye başlayor, “8×8 cube” olanlara kadar gidiyor.

Çalışma Mantığı-Bağlantılar:

Hatta Aliexpress’de kendin yap hazır setler bile var. Bizdeki sitelerde de satılıyor. Çoklu uygulamaları reklam tabelalarına kadar gidiyor.led_tabela

Bunlardan bir tanesini inceleyelim.

Öncelikle Arduino tek başına yetmiyor. Sadece Arduino kullanarak yapanlar da var. Ama Arduino LED’leri beslemek için kullanılabilecek bir GÜÇ KAYNAĞI DEĞİL! Belki 4×4 için yeterliydi ama 8×8 olsa en az 16 çıkışa, 8*8 küp olsa 64 çıkışa ihtiyaç vardı. Yapan arkadaşların bazıları çıkış sayıları için Arduino Mega kullanmışlar. Ama pratik uygulamada bu da pek mantıklı değil. Çünkü Arduino’dan bu kadar LED’i yakmak için gerekli akım çekilemez. Data sheet’te her bir çıkış için 40 mA değerinde akım çekilebileceği belirtilmiş.

 

nano_cikis

Onun için LED sürücüler kullanılmakta. Bu sürücülerin başında MAX7219 ya da MAZ7221 gibi sürücüler geliyor. Ama bunların fiyatı pahalı biraz. Bundan sonra daha büyük bir matris yaptığımızda kullanılabilir. 🙂

max72xx

Benim incelediğim devrede is 595 sayıcı entegresi kullanılmıştı. Fiyatı 2 TL’nin altında.  Ve daha önce mutfak saatinde kullanmıştım. oldukça kullanışlı. Basit Arduino projelerinde “Kara Şimşek- Yürüyen Işık” yaparken tanışmıştık. Aslında 7-segment display sürmek için kullanılıyor. Shift Register de deniliyor. Arduino’dan gelen SERİ girişleri (zaten 3 girişi var; 11, 12 ve 14. Clock da dahil!) 8 PARALEL çıkışa dönüştürüyor. Kullanımları çok kolay.

595

Gelelim bağlantı mantığına:

Sürücü olarak ne kullanılırsa kullanılsın matris yapısı, bağlantıları aynı, değişmiyor.baglanti

Öncelikle her bir satırdaki LED’lerin anotları birleştirilip birer hat(Satır) oluyor.

anotlar

Sonra her bir sütun’daki LED’lerin katotları birleştirilip birer hat(Sütun) oluyor.

katotlar

4×4 matris için elimizde şu an 4 satır ve 4 sütun var. 8×8 olsaydı, 8 satır ve 8 sütun olacaktı. (Eğer küp yapılacaksa her bir katman için satır ve sütun bağlantıları olacaktı)

Anotlar 1kΩ koruma dirençleriyle 74HC595’in A0-A3 çıkışlarına sırasıyla bağlanıyor.

anotlar_2

Katotlar da Arduino’nun dijital çıkışlarına (D2-D5) direk bağlanıyor.

katotlar_2

Yani devre şeması:

sema

 

Kod:

Kod başında yazılmak istenen karakter ikili sistem (binary) de belirtilmiş. İki boyutlu bir dizi-byte olarak-tanımlanmış, ve 8 karakterli elemanlar yerleştirilmiş. Bunlar Arduino’nun D2-D9 arası çıkışları.

D2-D9

Tabii ben 4 çıkış kullandığımdan beni ilgilendiren ilk 4 basamaktaki sayılardı. Önce ilk 4 basamak haricindeki sayıları sildim ve diziyi 4 elemanlı olarak kaydettim. Ama ilerleyen bölümlerde program hata verdi. Ben de bu sayıları 0 olarak yazdım, kullanılmadığını gördüm ve öylece bıraktım. Yani koddaki tanımlanan dizi 8 elemanlı olmasına rağmen ilk 4 eleman önemli. Diğerleri okunmuyor bile. Ona göre kendi dizinizi yazabilirsiniz.

Arduino’nun katotlara bağlandığı hatırlanırsa, bir LED’in yanması için ilgili çıkış 0 olmalı!

  • Örnek 1: Aşağıdaki durumda, tüm LED’ler yanıyor. Çünkü, hepsinin de katotu 0. (sadece ilk 4 satıra baktığımızı unutmuyoruz)

ornek_1.png

  • Örnek 2: Aşağıdaki durumda sadece gülen yüz görülecektir (Sadece ortada 4 LED yanacak).

ornek_2

Herkes istediği tasarımı gerçekleştirebilir arkadaşlar. Benim örnek tasarım kodum aşağıdaki gibidir.

Kolaylıklar diliyorum…

/* Özer Burucu
*08/12/2018 /  December/8/ 2018
* Sadece 4×4/Only 4×4 LED is running
* Siz bunu geliştirebilirsiniz/you can develope this
*/
const byte IMAGES[][8] = {

{ B00000000,
B00000000,
B00000000,
B00000000
},                                            //hepsi sönük
{
B11110000,
B11110000,
B11110000,
B11110000
},                                               //hepsi yanıyor
{
B00000000,
B01100000,
B01100000,
B00000000
},                                                 //O harfi
{
B00000000,
B11010000,
B10110000,
B00000000
},                                                  //Z harfi
{
B00000000,
B00000000,
B01110000,
B00000000
},                                                   //e harfi
{
B00010000,
B01110000,
B01110000,
B01110000
},                                                   //r harfi
{
B11110000,
B01100000,
B10010000,
B11110000
},                                                    //gülen yüz
{
B01100000,
B10010000,
B10000000,
B01100000
},                                                      //X harfi
{
B11110000,
B00000000,
B00000000,
B11110000
},                                                       // yatay çizgi
{
B01110000,
B10110000,
B11010000,
B11100000
},                                                        //   \ işareti
{
B10010000,
B10010000,
B10010000,
B10010000
},                                                        // dikey çizgi
{
B11100000,
B11010000,
B10110000,
B01110000
},                                                         //  / işareti
{
B11110000,
B00000000,
B00000000,
B11110000
}
};
const int IMAGES_LEN = sizeof(IMAGES) / 8;
uint8_t colPins[8] = { 2, 3, 4, 5};

#define SER_PIN 10
#define SCK_PIN 11
#define RCK_PIN 12

void setup() {
for (int i = 0; i < 4; i++) {
pinMode(colPins[i], OUTPUT);
}
pinMode(SER_PIN, OUTPUT);
pinMode(SCK_PIN, OUTPUT);
pinMode(RCK_PIN, OUTPUT);
}

void loop() {                                                      // sütunların yenilemek için…

for (int i = 0; i < IMAGES_LEN; i++) {
for (int j = 0; j < 100; j++) {                              //j programın çalışma hızını ayarlıyor
int rowbits = 0x80;                                           //rowbits 0x40 yapınca sadece alt 2 satır çalışıyor…
for (int row = 0; row < 4 ; row++) {
for (int k = 0; k < 4; k++)
digitalWrite(colPins[k], LOW);                        // Sütunlar siliniyor.
writeData(rowbits);                                           // Satırlar yazmaya hazırlanıyor.
for (int col = 0; col < 8; col++)
digitalWrite(colPins[7 – col], IMAGES[i][row] & 1 << col ? HIGH : LOW );
delay(1);
writeData(0);
rowbits >>= 1;
}
}
}
}

void writeData(byte data) {
digitalWrite(RCK_PIN, LOW);
shiftOut(SER_PIN, SCK_PIN, LSBFIRST, data);
digitalWrite(RCK_PIN, HIGH);
}

%d blogcu bunu beğendi: