Aralık 2017 Arduino Başlangıç (11) 0 Okunma Sayısı: 1319
Merhaba arkadaşlar. Bugünkü dersimizde sizlerle Arduino ve 74HC595 shift register entegresi kullanarak 8 adet LED’i az sayıda pin harcayarak yakmayı öğreneceğiz.Gerekli malzemelerimiz:
Hepimizin bildiği üzere Arduino UNO kartımızda 13 adet dijital giriş/çıkış pini bulunmakta. Fakat bu pinlerin hepsini LED sürmek için kullanmak istemeyebiliriz. Yada LED haricinde diğer pinlere sensör, switch, buton v.b. diğer girişler bağlamış olabiliriz. Burada kullanacağımız metot sayesinde Arduino’da sadece 3 adet dijital çıkış pini kullanarak 8 adet LED’i kontrol etmemiz mümkün olacak.
74HC595 Shift Register Entegresi
Shift register devresi, peş peşe bağlanmış flip-flop adındaki hafıza elemanı devrelerinden oluşur. Tiplerine göre paralel girişi seri çıkışa (parallel-in, serial-out, PISO) dönüştüren ya da bizim projemizde kullandığımız 74HC595 gibi seri girişi paralel çıkışa (serial-in, parallel-out, SIPO) dönüştüren işlevde olabilirler.
Kullandığımız entegrede Arduino’ya bağlayacağımız 3 adet bacağa sahiptir: Seri data girişi (DS, pin 14), latch (ST_CP, pin 12) ve clock pini (SH_CP, pin 11). Shift register şu şekilde çalışır: veri girişi yapılmak isteniyorsa latch pini lojik 0 seviyesine çekilir, data girişi yapılır (lojik 1 veya 0) ve saat darbesi (clock pulse) clock pinine uygulanır. Bu şekilde 8 bitlik veri tek bir seri giriş pininden girilir ve işlem sonucunda seri olarak girilen veri paralel çıkışlardan (Q0 – Q7 pinleri) alınmış olur.
Eğer shift register’ın çalışma mantığı size karmaşık geldiyse endişelenmenize gerek yok. Arduino yazılımında bulunan shiftOut fonksiyonu bu işlemlerin hepsini üstlenerek size sadece bağlantıda kullandığınız pinleri tanımlamayı bırakıyor.
Entegremizi LED’lerimize ve Arduino’muza şu şekilde bağlıyoruz:
Kodumuz şu şekilde:
int latchPin = 5; int clockPin = 6; int dataPin = 4; byte leds = 0; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { leds = 0; registeraYaz(); delay(500); for (int i = 0; i < 8; i++) { bitSet(leds, i); registeraYaz(); delay(500); } for (int i = 8; i >= 0; i--) { bitClear(leds, i); registeraYaz(); delay(500); } } void registeraYaz() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, leds); digitalWrite(latchPin, HIGH); }
Kodumuzun ilk kısmında her zaman yaptığımız gibi çıkış pinlerimizi tanımladık. leds isimli 8 bitlik bir değişken tanımladık (byte tipindeki değişkenler 8 bit büyüklüğündedir). Bu baytın her bir biti, bizim shift register’ımızın çıkışına bağlı olan LED’leri temsil ediyor. registeraYaz fonksiyonumuz, shift register’ın çalışması için gerekli işlemleri yapıyor. loop fonksiyonumuzda bu fonksiyonu çağırarak leds değişkeninde yaptığımız değişiklikleri LED’lerimize aktarmak için bu fonksiyonu çağırıyoruz. loop fonksiyonumuzda ise iki adet for döngüsü kullandık. İlk for döngüsü, leds değişkenimizdeki 8 bitten her birini sırayla 1 yaparak 00000001, 00000011, 00000111… şeklinde bir desen elde etmemizi sağlayacak. Her bir bit 1 olduktan sonra (11111111), ikinci for döngüsü başlayarak bu sefer bitleri 0’layarak 01111111, 00111111,00011111… desenini oluşturacak.
Sizler for döngüsü kullanmayıp, örneğin leds = B00000001, leds = B00000010, leds = B00000100, şeklinde sıralayarak kara şimşek ışıkları yapmayı deneyebilirsiniz. Her komuttan sonra registeraYaz fonksiyonunu çağırmayı unutmayın.
NOT: Eğer derslerimizi sırayla takip ediyorsanız bu dersimizde yaptığımız devreyi sökmeyin. Bir sonraki dersimizde seri haberleşme kullanarak LED yakmayı öğreneceğiz.