Arduino ile Shift Register Kullanımı
Merhaba bugün Bit-Shifting yani 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 kullanabilirsiniz,çıkış ve giriş pinlerine dikkat ederek. Atölyemdeki LEDlerin ve 7-Segment LED lerin bittiğini görsemde elimde kalan diyotlar ile yapmaya çalıştım,bunun yanında önceki yazılarımızda gaz sensörü ve 7-segment 4 digit bir display ile örnekler yapmıştık, buradan ulaşabilirsiniz. Daha fazla uzatmadan yazımıza geçiyorum.
Shift Register Nedir?
Mantık devreleri alanında sıklıkla kullanılan bir devre tasarımı şeklidir. Alt yapı olarak flip-floplardan istifade eden tasarımda amaç girilen ikilik tabandaki bitlerin her saat darbesiyle bir-bir kaydırılmasıdır. Bunun yanında veriyi geçici olarak kaydettikleri için kaydediciler olarakta kullanılır. LED devrelerde kullanım amacı ise mikroişlemcinin I/O pinlerinden tasarruf etmektir örneğin; 8 LEDlik bir devrede, Shift Register devresi olmadan,kullanılan I/O pin sayısı GND ve VCC dahil 10 dur, fakat Shift Register devresi ile 3 + GND ve VCC kullanılır, bu sonuca bakarak Shift Register kullanmanın oldukça mantıklı olduğunu söyleyebiliriz.
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ığı
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
Çalışma mantığı ise oldukça basit. Ö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. Ben normal led kullandım fakat 1 digit 7 segment ilede kullanabilirsiniz.
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şturacak.
7-Segment 1 Digit İçin Şema
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.