Arduino 74HC595 Shift Register kullanımı

0
104

74HC595, seri girilen veriyi 8 bit paralel çıkışa çeviren Shift Register (Kaydırmalı Kaydedici) entegresidir. Arduino ile kullanımına geçmeden önce 74HC595 hakkında biraz bilgi verelim

Besleme gerilimi 2 V ile 6V arası olduğu için hem 3.3V hem de 5V ile çalışan devreler için kullanılabilir. Birden fazla entegre ardarda (kaskat) bağlanarak paralel çıkış sayısı artırılabilir.

74HC595 pin bağlantıları

74hc595 pin bağlantıları
74HC595 pin bağlantıları
  • Vcc pozitif besleme ucudur. (min 2V, max 7V)
  • GND besleme şase (negatif) ucudur.
  • QAQH paralel çıkış uçlarıdır.
  • RESET sıfırlama ucudur. (Lojik 0 seviyesinde sıfırlama aktif olur.)
  • A seri data girişidir.
  • OUTPUT ENABLE çıkış uçlarını etkinleştirmek için kullanılır.
  • LATCH CLOCK kilitleme pinidir.
  • SHIFT CLOCK kaydırma pinidir.
  • SQH seri data çıkış ucudur (Kaskat bağlantılar için)

Arduino ile kullanımı

Arduino Uno gibi sınırlı sayıda I/O pinleri olan kartları shift register kullanarak daha kullanışlı hale getirmek mümkündür. Arduino ile 74HC595 arası birkaç pin ile veri aktarımı yapılırken buna karşın 8 ve daha fazla pinden çıkış ucu elde edilebilir.

74HC595 Arduino Uno bağlantısı
74HC595 Arduino Uno bağlantısı

Yukarıdaki şemada görüldüğü gibi 8 ledi kontrol etmek için Arduino Uno’nun 3 pini yeterli olmaktadır. 74HC595 entegresine seri data gönderimi için en büyük görev Arduino kütüphanesinde önceden tanımlı olan shiftOut fonksiyonuna düşüyor. shiftOut fonksiyonu için dört parametre gereklidir.

shiftOut(dataPin, clockPin, bitOrder, value); 

dataPin seri veri gönderimi yapılacak pin burada tanımlanır.

clockPin saat palsi gönderilecek pin burada tanımlanır.

bitOrder başlangıç biti burada tanımlanır.

İki parametreden biri kullanılabilir. MSBFIRST seri veri gönderimi için (Most Significant Bit First) en büyük dereceli bitten başlanacağını belirtir. Binary verinin en solundaki bitten sağa doğru gönderme yapılır. LSBFIRST ise seri veri gönderimi için (Least Significant Bit First) en küçük dereceli bitten başlanacağını belirtir. Yani binary verinin en sağındaki bitten sola doğru gönderme yapılır.

value seri gönderilecek veri burada tanımlanır.

Şimdi 74HC595 entegresinin çıkış uçlarına bağladığımız 8 ledi sırayla yakacak program yazalım.

int latchPin = 5;                                                                               // Arduino Uno 5 nolu digital pin latchPin olarak etiketlendi.
int clockPin = 6;                                                                               // Arduino Uno 6 nolu digital pin clockPin olarak etiketlendi.
int dataPin = 4;                                                                                // Arduino Uno 4 nolu digital pin dataPin olarak etiketlendi.

int sayac = 0;                                                                                  // sayac adlı değişken tanımlandı ve değişkene sıfır değeri atandı.

byte dataArray595[] = {                                                                         // dataArray595 adında veri dizisi tanımlandı.    
B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000          //dataArray595 veri dizisine 8 adet binary veri girildi.
};

void setup() {

pinMode(latchPin, OUTPUT);       //latchPin çıkış olarak atandı.
pinMode(dataPin, OUTPUT);        //dataPin çıkış olarak atandı.
pinMode(clockPin, OUTPUT);       //clockPin çıkış olarak atandı.

}

void loop() {

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST,dataArray595[sayac]);                                      // Veri 74hc595 entegresine gönderiliyor.
digitalWrite(latchPin, HIGH);

delay(1000);                                                                                    // 1 sn bekle

sayac++;                                                                                        // sayacı 1 artır.

if (sayac == 7) {                                                                               // sayac değeri 7 olursa sayacı sıfırla
sayac = 0;
}

}                                    

Yukarıdaki kodda arduino kartın çıkış pinlerine değişken atadıktan sonra sayac adlı bir değişken daha oluşturup değerini 0 olarak atadık. dataArray595 adında oluşturduğumuz veri dizisine 8 adet binary sayı tanımladık. Bu veri dizisindeki her sayı 8 bitten oluşmakta ve bu sayının her biti 74HC595 entegresinin bir çıkış ucunu temsil etmektedir.

Programın çalışma mantığına gelecek olursak;

İlk başta sayac değişkeninin değeri 0 olduğundan dolayı dataArray[sayac] değişkenine aktarılan değer dataArray[0] = 00000001 dir. shiftOut ile veri gönderildiğinde 74HC595 entegresinin Q0 çıkış ucu 1, diğer uçları 0 olur.

sayac++ ; sayaç değişkeninin yukarı artmasını sağlar. Yani 0 olan sayaç değişkeni 1 değerini alır.

İkinci döngüde dataArray[sayac] değişkenine aktarılan değer dataArray[1] = 00000010 dir. shiftOut ile veri gönderildiğinde 74HC595 entegresinin Q1 çıkış ucu 1, diğer uçları 0 olur.

Sekizinci döngüde dataArray[7] = 10000000 olacaktır. Bu durumda 74HC595 entegresinin Q7 çıkış ucu 1 diğer uçları 0 olur. sayac değişkeni 7 olduğundan dolayı sayac değişkenine 0 atamak için gerekli koşul yerine gelmiş olur ve döngü tekrar başa döner.

74HC595 entegresi kaskat kullanımı

74HC595 kaskat kullanımı
74HC595 kaskat kullanımı

İki veya daha fazla 74HC595 entegresini kaskat (ard arda) bağlamak için entegrenin 9. pini olan SQH (seri data out) ucundan yararlanılır. Kaskat bağlantıda bu pin bir sonraki 74HC595 entegresinin DS ucuna bağlanır. Tüm SH_CP ucları kendi arasında paralel, tüm ST_CP uçları da kendi arasında paralel bağlanır.

Şimdi örnek kodumuza geçelim.

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;

byte son595veri = 0;
byte ilk595veri = 0; 

void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}
 
void loop() 
{
 son595veri = B10000000;                       // Son 74HC595 verisi
 ilk595veri = B00000001;                       // İlk 74HC595 verisi
 registerYaz();                                // RegisterYaz fonksiyonunu çalıştır.
 
 delay(500);                                   // 500ms bekle
 
 son595veri = B01000000;                       // Son 74HC595 verisi
 ilk595veri = B00000010;                       // İlk 74HC595 verisi
 registerYaz();                                // RegisterYaz fonksiyonunu çalıştır.
 
 delay(500);                                   // 500ms bekle
 
 son595veri = B00100000;                       // Son 74HC595 verisi
 ilk595veri = B00000100;                       // İlk 74HC595 verisi
 registerYaz();                                // RegisterYaz fonksiyonunu çalıştır.
 
 delay(500);                                   // 500ms bekle

 son595veri = B00010000;                       // Son 74HC595 verisi
 ilk595veri = B00001000;                       // İlk 74HC595 verisi
 registerYaz();                                // RegisterYaz fonksiyonunu çalıştır.
 
 delay(500);                                   // 500ms bekle
 }
 
void registerYaz()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, son595veri);       // Son 74HC595 entegre için veri gönder.
   shiftOut(dataPin, clockPin, LSBFIRST, ilk595veri);       // İlk 74HC595 entegre için veri gönder.
   digitalWrite(latchPin, HIGH);
}

İki 74HC595 entegre ile yapılan kaskat bağlantıda tüm entegre çıkışlarını kontrol edebilmek için shiftOut fonksiyonu ile iki defa veri göndermek gereklidir. İlk gönderilen 8 bitlik veri ikinci entegrenin çıkışlarını kontrol ederken son gönderilen 8 bitlik veri ise ilk entegrenin çıkışlarını kontrol eder. Böylece toplam 16 çıkışa karşılık 16 bitlik veri gönderilmiş olur.

registerYaz() komutuyla çağrılan registerYaz fonksiyonu; son595veri ve ilk595veri değişkenindeki toplam 16 bitlik veriyi entegre çıkışlarına iletir.

İkiden fazla 74HC595 kaskat bağlanacaksa aynı şekilde entegrenin 9. pini bir sonraki entegrenin SQH (seri data out) ucuna bağlanarak devam edilir. Tüm çıkışları kontrol edebilmek için ise entegre sayısı kadar shiftOut fonksiyonu kullanmak yine entegre sayısı kadar 8 bitlik veri göndermek yeterli olacaktır.

Şimdilik bu kadar..

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz