Arduino ile 74HC595 Shift Register Kullanımı

Shift register kullanarak yaptığımız LED bar ile mesafe gösterme projemize buradan ulaşabilirsiniz.

Shift Register Nedir?

Shift register kaskat şekilde bağlanmış flip floplardan oluşan lojik bir devredir. Ortak bir clock ile çalışan bu devre aldığı bit değerlerini hafızasında tutarak sonrasında çıkışa verir. Yaygın olarak kullanılan 4 çeşidi vardır:

  1. Paralel giriş, seri çıkış.
  2. Seri giriş, paralel çıkış.
  3. Paralel giriş, paralel çıkış.
  4. Seri giriş, seri çıkış.

Mikro-denetleyicilerde çıkış pini sayısında sıkıntı olması durumunda seri giriş, paralel çıkış olarak çalışan, 74HC595 entegresi kullanılabilir. Bu entegre 3 girişle kontrol edilirken 8-bit paralel çıkış verir. Şimdi entegreyi inceleyelim. Devamında Arduino ile kullanımını anlatacağım.

Malzeme Listesi:

  • Arduino UNO
  • 1  x 74HC595 shift register entegresi.
  • 8 x LED.
  • 8 x 220Ω direnç.

74HC595: 

Buradan entegrenin datasheet’ine ulaşabilirsiniz. Öncelikle çalışma mantığını anlatalım.

Daha önce bahsedildiği gibi 47HC595 entegresi 3 girişle kontrol edilen 8-bit paralel çıkışı olan bir shift register entegresidir. Burada bahsedilen 3 giriş:

  • Seri data girişi.(1 veya 0)
  • 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. Entegrenin pin haritası aşağıda açıklamasıyla birlikte verilmiştir.

 

Shift-Register-LED-Driver

  • Q(0-7): 8 bitlik çıkış pinleri.
  • GND: Toprak
  • VCC: Pozitif besleme.(Max:7 V. Önerilen 5V.)
  • Q7′: Kaskat bağlama için seri çıkış.
  • MR: Reset(Aktif “0”)
  • DS:Seri data girişi.
  • ST_CP: Latch pini.
  • SH_CP: Clock pini.
  • OE: Çıkış etkin(Aktif “0”)

Bu yazıda 74HC595 entegresinin Arduino ile kullanımını göstereceğiz. Çıkışların az geldiği veya gereksiz yere çıkışın harcanmaması gereken durumlarda kullanılan bu entegre daha çok LED, transistör veya paralel girişle çalışan bir elemanı kontrol etmek için kullanılır. 100Mhz’e kadar uyum sağlayabilirken endüstriyel anlamda da kullanımı oldukça yaygındır.

NOT: Pin haritası dip16 kılıf içindir. Devrede de bu kılıf kullanılacaktır. Elinizde farklı bir kılıf varsa datasheet’e bakmanız gerekmektedir.

 

 

Shift Register’ın Arduino ile Kullanımı

Arduino kendi kütüphanesinde 74HC595 entegresi 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.

Devrenin Kurulumu:

shift_bb

Arduino Kodları 1:  Kodlar yanında açıklamalarla birlikte aşağıda verilmiştir.

(“shiftOut” kodu kullanılmadan yazılan kodlar)

  • Yukarıdaki kodlarla çalıştırdığınızda LED’lerin aşağıdaki gibi yanar. {1,0,0,1,0,0,1,1} dizisinde değişiklik yaparak kontrol edebilirsiniz. LED’ler bu sıraya göre yanacaktır.

IMG_20160107_230807

Arduino Kodları 2: Şimdi de “shiftOut” koduyla neler yapabileceğimizi görelim.

“shiftOut”:  “shiftOut” kodunun 75HC595 entgresi için Arduino’nun barındırdığı bir kod olduğunu söylemiştik. Kod yapısı ise şu şekildedir:

“shiftOut” fonksiyonu içerisindeki dataPin,clockPin,latchPin yazılımın başında atanır.(Arduino’nun register’a bağlı olan pinleri.) LSB first ise en küçük bitten okuması için kullanılır. En büyük bitten başlamak için MSB yazılmalıdır. “led” değişkeni ise byte değeridir, yani en fazla 255 olabilir. Örnek olarak 2 tabanında 0’dan 255’e kadar sayan bir kod yazabiliriz.

Bu kodları sadece deneme amacıyla kullandık. Arduino ile yapmış olduğumuz hafıza oyunu projesine buradan ulaşarak 7 segment LED kullanımının nasıl olduğunu görebilirsiniz. Bunun yanında çıkış pininizin yetersiz kaldığı zamanlarda gerçekten çok işe yarayan 47HC595 entegresinin kullanım alanı oldukça geniştir. Sizlerde projelerinizde kullanabilirsiniz.

NOT: 74HC595 entegresini elektronik malzeme satan yerlerde rahatlıkla bulabilirsiniz.

 

“Arduino ile 74HC595 Shift Register Kullanımı” Hakkında 6 Yorum

  1. 74HC595 entegresiyle kullanım için burada bir kütühane bulunuyor.
    https://github.com/Simsso/ShiftRegister-PWM-Library
    Kütüphane sahibine ait makale de burada
    https://timodenk.com/blog/shiftregister-pwm-library
    Ben buradaki şemaya göre bağlantıları yaptım. entegreye ardiuno’daki D1,D2 ve D9 pinini bağladım. verilen örnek kodu da kendime uyarladım.
    Ama bir türlü istediğim sonuçları alamadım. Sizin makalenizi de inceledim.
    Bu 74HC595 ile “pwm çıkışı” elde edilebiliyor mu?
    benim yapmak istediğim uno’ya ait pwm çıkışları yetersiz geldiğinden bunları çoğaltmak.
    yani entegre den “pwm” çıkışı almam gerekiyor ki “dc motor” sürücü kartında bulunan “enA” pinine bağlayabileyim.
    Bu konu da yardımcı olabilirmisiniz?

    1. Merhabalar. Bu kütüphane timer interrupt yardımı ile shift register çıkışlarının pwm olarak kullanılmasını sağlıyor. Arduino kodları ile bunu yapmanız mümkün değil maalesef. Timer interrupt için register seviye yazmanız gerekebilir.

      Eğer seri port kullanıyorsanız D1 sıkıntı çıkarıyor olabilir. D1 yerine başka bir pin kullanarak denemenizi tavsiye ederim. Sorunun devam etmesi durumunda instagram veya facebook hesabımızdan bize ulaşarak daha ayrıntılı konuşabiliriz.

  2. iyi günler. rahatsız ediyorum ama bir konu da yardımcı olabilirmisiniz?
    Ben 74HC595 ile “pwm” pinlerini çoğaltmak istiyorum. Bunun için şu kütühaneyi kullanıyorum:
    https://github.com/Simsso/ShiftRegister-PWM-Library
    Bu da bu kütüphaneye ait makale:
    https://timodenk.com/blog/shiftregister-pwm-library/
    Makaleye göre 74HC595 entegresinin “pwm” genişletme olarak kullanılması için şema:
    https://timodenk.com/blog/wp-content/uploads/2017/10/single-sr_schem_screenshot-768×500.png
    Bu da benim 2 dc motor enA pinleri ve 1 adet rgb led bağlantım.
    https://cdn.pbrd.co/images/HAN8m3y.png

    Bunlara göre yaptığım ardiuno da entegre komutlara hızlı cevap veriyor. yani performansda da bir sorun yok.
    Sadece dc motorları 0 ile 255 aralığında değer vererek çalışmasını/hızlanmasını/durdurulması
    sağlanırken, 0 ile durdurup, 255 ile de en hızlı şekilde hareket etmesini sağlıyor. yani 0 ile 255 aralığında bir değer verirsek bunu 0 gibi algılayıp, motoru durduruyor. yani bir nevi “digital pinlerde” olduğu gibi “HIGH/LOW” şeklinde yorumluyor. oysa “pwm pinlerinin” özelliği hızında istenilen seviyede ayarlanabilmesi ama bu olmuyor. nedendir bilmiyorum? yoksa gerisi gayet güzel çalışıyor.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.