Arduino ile Shift Register Kullanımı
Shift register’lar, sınırlı sayıda pin kullanarak birden fazla çıkış cihazını kontrol etmeyi sağlayan entegre devrelerdir. Arduino ile Shift Register kullanarak LED’leri kontrol etmek, 7 segment display sürmek veya genişletilmiş GPIO pinleri sağlamak mümkündür. Shift Register yöntemiyle LED sürmeyi inceleyeceğiz, bu projemizde alışılanın aksine 74HC595 entegresi yerine HEF4094 entegresi kullanıldı, fakat aynı kod ve şema ile 74HC595 entegresinide çıkış ve giriş pinlerine dikkat ederek kullanabilirsiniz.
Önceki yazılarımızda gaz sensörü ve 7-segment 4 digit bir display ile örnekler yapmıştık, buradan ulaşabilirsiniz.
Shift Register Nedir?
Shift register, paralel veri girişlerini bir sıraya dönüştüren veya seri verileri paralel çıkışa dönüştüren bir entegredir. Çalışma prensibi, girişe gelen bit verileri sırayla kaydırarak çıkış pinlerinde göstermek üzerine kuruludur.
Temel Özellikler:
Genişletilebilirlik: Birden fazla shift register bağlanarak çıkışlar genişletilebilir.
Seri Giriş ve Paralel Çıkış (SIPO): Veriler seri olarak alınır, paralel olarak çıkış verilir.
Paralel Giriş ve Seri Çıkış (PISO): Veriler paralel alınır, seri olarak çıkış verilir.
HEF4094 Entegresi
HEF4094 3 pin girişli, 8-bit pin çıkışlı bir serial shift registerdir, voltaj olarak 3V ve 15V aralığında işlem yapabilmektedir.

Shift Register Çalışma Mantığı
Shift Register’ın temel çalışma prensibi, girişine seri olarak gelen veriyi her clock darbesinde bir adım ileri kaydırmak ve bu veriyi çıkış pinlerinde paralel olarak göstermek şeklindedir.
Bu prensip, D Flip-Flop’ların bir zincir halinde bağlanmasıyla gerçekleşir.
Shift Register Yapısı:
- D Flip-Flop’lar:
- Shift Register, her biri bir bit veri tutan D Flip-Flop’lar içerir.
- Clock darbesi geldiğinde, Flip-Flop’taki veri bir sonraki Flip-Flop’a kaydırılır.
- Saat Darbesi (Clock):
- Saat sinyali her değiştiğinde (yükselen veya düşen kenar), girişteki veri kaydırılarak bir sonraki Flip-Flop’a aktarılır.
- Giriş ve Çıkış:
- Seri Giriş (DS): Veriler sırayla bu pin üzerinden entegreye gönderilir.
- Paralel Çıkış (Q0-Qn): Tüm Flip-Flop’lardaki veriler aynı anda paralel çıkış pinlerinde görünür.
Shift Register Türleri
Shift Register’lar, veri giriş ve çıkış yönüne göre farklı türlere ayrılır:
1. Seri Giriş – Paralel Çıkış (SIPO):
- Özellik: Seri olarak alınan veri, paralel olarak çıkışa verilir.
- Kullanım Alanı: LED matris, röle kontrolü gibi uygulamalar.
- Örnek: 74HC595
2. Paralel Giriş – Seri Çıkış (PISO):
- Özellik: Paralel olarak alınan veri, seri olarak çıkışa verilir.
- Kullanım Alanı: Veri aktarımı için kullanılabilir.
- Örnek: CD4021
3. Seri Giriş – Seri Çıkış (SISO):
- Özellik: Seri veri alır ve kaydırarak seri veri çıkışı verir.
- Kullanım Alanı: Veri işleme veya kaydırma işlemleri.
4. Paralel Giriş – Paralel Çıkış (PIPO):
- Özellik: Paralel veri alır ve paralel olarak çıkış verir.
- Kullanım Alanı: Hızlı veri transferleri.
74HC595 ‘den pek farklı olmasada, daha önce bahsedildiği gibi HEF4094 entegresi 3 girişle kontrol edilen 8-bit seri çıkışı olan bir shift register entegresidir. Burada bahsedilen 3 giriş:
- Seri Data Girişi
- Clock Girişi
- Latch Girişi
Öncelikle latch girişini “0” yapıyoruz. Böylece sistem data okumaya hazır hale geliyor. Data pinine hafızaya alınmasını istediğimiz değeri veriyoruz. Clock pinine saat darbesi (Clock Pulse) gönderdiğimiz zaman bu data en küçük bite yazılıyor.
Yazım işleminin yanında geriye kalan bitler kendisinden büyük olan pine kaydırılırken en büyük bit siliniyor. 8 adet saat darbesi yapıldığında ise eski 8 bitlik değerler giderken, yeni verilen 8 bitlik data hafızaya alınmış oluyor.
Devamında latch pini “1” yaptığımızda ise bu 8 bitlik değer çıkışa veriliyor. Bu animasyon ile shift-register metodunun temelleri oturmuş olucak.

Arduino ile Shift Register Kullanımı
Arduinonun kendi kütüphanesinde Shift-Register entegreleri için “shiftOut” kodunu barındırır. Fakat çalışma mantığının anlaşılması için önce bu kodu kullanmadan nasıl kontrol edildiğine bakalım.

Arduino Kodu
int latchPin = 8; int clockPin = 12; int dataPin = 11; byte led = 0; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { led = 0; register_et(); delay(200); for (int i = 0; i < 8; i++) { bitSet(led, i); register_et(); delay(200); } for (int i = 8; i >= 0; i--) { bitClear(led, i); register_et(); delay(200); } } void register_et() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, led); digitalWrite(latchPin, HIGH); }
Kod Açıklaması
Kodumuzun ilk kısmında her zaman yaptığımız gibi çıkış pinlerimizi tanımladık. leds isiml 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.
register_et fonksiyonumuz, shift register’ın çalışması için gerekli işlemleri yapıyor.
loop fonksiyonumuzda bu fonksiyonu çağırarak led 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şturacaktır.
Arduino ile Shift Register Kullanımı için Devre Şeması


Arduino ile Shift Register Uygulama Alanları:
- Röle Kontrolü: Birden fazla röleyi kontrol etmek.
- LED Kontrolü: LED matrisleri veya şeritleri kontrol etmek.
- 7 Segment Display: Sayı göstergelerini sürmek.
- GPIO Genişletme: Arduino’nun sınırlı pinlerini genişletmek.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.