Başa dön

Arduino ile 74HC595 Entegre Kullanımı

Merhaba arkadaşlar, bu yazımız da arduino ile 74hc595 entegre kullanımı konusuna değineceğiz.

Kendinizi daha önce birçok LED’i kontrol etmek isterken buldunuz mu? Veya sadece düğmeleri, sensörleri, servoları tek seferde kontrol etmek için daha fazla G/Ç pinine mi ihtiyacınız var? Arduino pinlerine birkaç sensör bağlayabilirsiniz, ancak hızlı bir şekilde Arduino’nuzdaki pinler dolmaya başlayacaktır.

Bunun çözümü bir ‘Shift Register‘ kullanmaktır. Bir shift register, Arduino’nuzda (veya bu konuda herhangi bir mikrodenetleyici de) kullanabileceğiniz I/O pinlerinin sayısını arttırmanıza izin verir. 74HC595 Entegre, bu alanda en çok tercih edilenidir.

74hc595 entegre, esasen yalnızca üç giriş pini kullanarak sekiz ayrı çıkış pinini kontrol eder. Ayrıca, 8’den fazla ilave G/Ç pininie ihtiyacınız varsa, bu yöntem ile binlerce G/Ç hattı oluşturabilirsiniz. Bütün bunlar, bit kaydırma yöntemi ile gerçekleştirilir. Bit kaydırma hakkında daha fazla bilgi edinmek istiyorsanız, Wikipedia‘daki bu kaynağa göz atabilirsiniz.

74HC595 Entegre ne zaman kullanılır?

Her mikrodenetleyicide sınırlı sayıda G/Ç pini (GPIO) bulunduğundan bit kaydırma kayıtları, mikrodenetleyicideki pinleri kaydetmek amacıyla kullanılır.

Projenizin 16 ayrı LED’i kontrol etmesi gerekiyorsa, normalde 16 pin gerekmektedir. Kullanılabilir 16 G/Ç pininiz yoksa, entegrenin işe yaradığı yer burasıdır. Seri bağlanmış iki 74hc595, 16 LED’i yalnızca 3 G/Ç pini kullanarak kontrol etme görevini yerine getirebilir. Ve daha fazla vardiya kaydına daha fazla pin kaydedebilirsiniz.

SIPO Vs PISO Vites Kayıtları:

Vardiya kayıtları, SIPO (Seri-Paralel-Seri) veya PISO (Seri-Paralel-Seri-Çıkış) olmak üzere iki temel tipte gelir. Popüler SIPO çipi 74HC595 DIP Entegre’dir.

İlk tip olan SIPO, LED’ler gibi çok sayıda çıkışı kontrol etmek için kullanışlıdır. İkinci tip olan PISO, butonlar gibi çok sayıda giriş verisi toplamak içinidealdir.

74HC595 Shift Register Nasıl Çalışır?

74HC595, her biri yalnızca 8 bit veri içeren iki kayıt cihazına (“bellek kapları” olarak düşünülebilir) sahiptir. İlki Shift Register olarak adlandırılır. Shift Register, IC devrelerinde arka planda giriş verilerini kabul eder.

NOT: Arduino kartların kullandığı Atmel mikrodenetleyicilerde donanımsal CAN biriminin olmamasından dolayı bu denetleyicilerle CAN-BUS iletişimi yapılamamaktadır. Bu nedenle, RS485/CAN Shield Arduino ile birlikte kullanılması halinde iletişim sadece RS485 üzerinden yapılabilir, CAN-BUS iletişimi İÇİN CAN-BUS Shield kullanmalısınız.

74hc595’e uygulanan Clock Pulse ile iki şey olur:

  1. Shift Register’daki bitler bir adım sola gider. Örneğin, Bit 7, daha önce bit 6’da bulunan değeri kabul eder; bit 6, bit 5 vb. değerini alır.
  2. Shift Register’daki Bit, sıfır“0” DATA pinindeki geçerli değeri kabul eder. Darbenin yükselen ucunda, eğer veri pini yüksek ise 1 kaydırılır, aksi takdirde “0” olur.

Latch pini etkinleştirildiğinde, Shift Register’ın içeriği, Storage / Latch Register adı verilen ikinci sicile kopyalanır. Storage Register‘in her biti, IC’nin QA–QH çıkış pinlerinden birine bağlanır. Böylece, genel olarak IC, depolama Kayıt değeri değiştirdiğinde çıkışlar da değişir.

Bunu, aşağıda gösterilen çizim ile daha iyi anlayabilirsiniz.

74HC595 Shift Register Pinout

74hc595, çeşitli marka ve modellerde gelir. Veri sayfasını dikkatlice OKUYUN.

Pinout’a bir bakalım. Adının üzerinde çizgi olan pinlere odaklanın; bu pinlerin, “negatif logic” çalıştıkları anlamına gelir. İleride detaylıca öğreneceksiniz.

GND Arduino toprak pini.

VCC Arduino’daki 5V pinini bağladığımız 74HC595 güç kaynağıdır.

SER (Seri Giriş) pini, 74HC595’e veri iletmek için kullanılır.

SRCLK (Shift Register Clock), Storage Register saatidir. 595 yükselen kenarda clock ile sürülür. Bu, bitlerin Storage Register için HIGH olması gerektiği anlamına gelir.

RCLK (Register Clock / Latch) çok önemli bir pintir . HIGH sürüldüğünde, Shift Register’ın içeriği Storage / Latch Register’a kopyalanır ve istenilen sonuç gözlenebilir.

SRCLR (Shift Register Clear) pini, negatif bir logic pinidir. Shift Register’ın tamamını sıfırlamamızı sağlar. Sıfırlamayı gerçekleştirmek için; SRCLR pinini LOW olarak ayarlamamız gerekir. Sıfırlama gerekli olmadığında, bu pin HIGH olmalıdır.

OE (Output Enable) de negatif logic’dir: Üzerindeki voltaj HIGH olduğunda, çıkış pinleri devre dışı bırakılır / yüksek empedans durumuna ayarlanır. Bu noktada akım verilmemelidir. OE düşük voltaj aldığında, çıkış pinleri normal şekilde çalışır.

QA – QH (Enable Output) çıkış pinleridir ve LED’ler, 7 Segment vb. Gibi bazı çıkış tiplerine bağlanmalıdır.

QH Pin, ShiftRegister’ın bit 7’sini verir. 595’lerin papatya zincirini bağlayabilmemiz için oradadır: eğer bu QH’yi başka bir 595’in SER pinine bağlarsanız ve her iki IC’ye de aynı saat sinyalini verirseniz, 16 çıkışlı tek bir IC gibi davranırlar. Elbette, bu teknik iki IC ile sınırlı değildir – hepsi için yeterli güce sahipseniz, istediğiniz kadar çok zincir oluşturabilirsiniz.

 

Kablolama – 74HC595 Shift Register’ın Arduino UNO’ya Bağlanması

Şimdi 74HC595’in nasıl çalıştığının temel bir anlayışına sahip olduğumuza göre, Arduino’muza takmaya başlayabiliriz!

IC’nin her iki tarafının breadboard’un ayrı bir tarafında olmasını sağlayarak, shift register’ı breadboard’unuza yerleştirerek başlayın. U şeklindeki küçük çentik yukarı bakacak şekilde, pinler aşağıdaki resimde görüldüğü gibi sol taraftan yukarıdan aşağıya doğru 1-8, yukarıdan aşağıya doğru sağdan aşağı 16 – 9 şeklindedir.

Başlamak için, 16 (VCC) ve 10 (SRCLR) pinlerini Arduino’daki 5v pinine ve 8 (GND) ve 13 (OE) pinlerini Arduino’daki Gnd pinine bağlayalım. Bu işlem, IC’yi normal çalışma modunda tutmalıdır.

Ardından, vardiya kaydını kontrol edeceğimiz üç pini bağlamamız gerekir:

  • Arduino’daki pin 6’ya (kaydırma tuşu) 11 (SRCLK)
  • Arduino’daki pin 5’e kayma kaydının Pin 12’si (RCLK)
  • Kaydırma tuşunun 14 numaralı pini (SER) Arduino’daki 4 numaralı pine bağlanmalıdır.

Şimdi, tüm çıkış pinlerini LED’lere bağlamak zorundayız, akımı azaltacak şekilde LED’lerin önüne 220Ω direnç yerleştirilmesini ve LED’lerin katotlarının toprağa geri dönmesini sağlamak zorundayız.

LED’leri yerleştirirken sırayla bağlı olduklarından emin olun, böylece QA ilk LED’e ve QH son LED’e bağlanmalıdır, aksi halde kodumuz LED’leri doğru sırayla yakmaz!

İşiniz bittiğinde, aşağıdaki resme benzeyen bir şeye sahip olmalısınız.

Arduino Kodu

Şimdi kodlamaya hazırız!

int latchPin = 5;  // Latch pin of 74HC595 is connected to Digital pin 5
int clockPin = 6; // Clock pin of 74HC595 is connected to Digital pin 6
int dataPin = 4;  // Data pin of 74HC595 is connected to Digital pin 4

byte leds = 0;    // Variable to hold the pattern of which LEDs are currently turned on or off

/*
 * setup() - this function runs once when you turn your Arduino on
 * We initialize the serial connection with the computer
 */
void setup() 
{
  // Set all the pins of 74HC595 as OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}

/*
 * loop() - this function runs over and over again
 */
void loop() 
{
  leds = 0; // Initially turns all the LEDs off, by giving the variable 'leds' the value 0
  updateShiftRegister();
  delay(500);
  for (int i = 0; i < 8; i++) // Turn all the LEDs ON one by one.
  {
    bitSet(leds, i);    // Set the bit that controls that LED in the variable 'leds'
    updateShiftRegister();
    delay(500);
  }
}

/*
 * updateShiftRegister() - This function sets the latchPin to low, then calls the Arduino function 'shiftOut' to shift out contents of variable 'leds' in the shift register before putting the 'latchPin' high again.
 */
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

Kodu Arduino’ya yükledikten sonra, aşağıdaki gibi bir görüntü elde etmelisiniz:

LED’lerden birini açmak yerine kapatmak istiyorsanız , ‘led’ değişkeninde benzer bir Arduino işlevi bitClear () ekleriz. Bu, belirli bir ‘led’ bitini sıfır olarak ayarlayacaktır. Güncellemek için <a class="fasc-button fasc-size-medium fasc-type-flat" style="background-color: #f2f2f2; color: #ff0000;">updateShiftRegister()</a> kodu yeterli olacaktır. 

Kod Açıklaması:

İlk yaptığımız şey 3 kontrol pinini viz olarak tanımlamak. 74HC595’in mandal, saat ve veri pinleri, sırasıyla Arduino’nun # 5 # 6 ve # 4 numaralı dijital pinlerine bağlanmalıdır.

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

Daha sonra ‘led’ adı verilen bir değişken tanımlanır. Bu, LED’lerin halihazırda açık veya kapalı olduğunu belirlemek için kullanılacaktır. ‘Byte‘ türündeki veriler, sekiz bit kullanan sayıları temsil eder. Her bit açık veya kapalı olabilir, bu yüzden sekiz LED’imizin hangisinin açık veya kapalı olduğunu izlemek için mükemmeldir.

// Variable to hold the pattern of which LEDs are currently turned on or off
byte leds = 0;

‘ Setup ‘ işlevinde: basitçe üç dijital çıkış olacak şekilde başlatıyoruz.

void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}

Loop fonksiyonu: başlangıçta tüm LED’leri kapatır, ‘led‘ değişkeninin tüm bitlerini 0 olarak ayarlar. Daha sonra ‘led‘ kodunu vardiya kaydına gönderecek olan updateShiftRegister () adlı özel işlevi çağırır. LED’ler söner.

Program yarım saniye durur ve ‘for‘ döngüsü ve ‘i‘ değişkenini kullanarak 0‘dan 7‘ye kadar saymaya başlar. Her seferinde, ‘led’ değişkenindeki belirli LED’i kontrol eden biti ayarlamak için Arduino bitSet () işlevini kullanır. Ardından updateShiftRegister (), LED’lerin durumunun ‘led’ değişkenine göre değişmesi için çağırır.

Ardından, ‘i‘ artırılmadan ve bir sonraki LED yanmadan önce yarım saniye gecikme olur.

void loop() 
{
  leds = 0;
  updateShiftRegister();
  delay(500);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    updateShiftRegister();
    delay(500);
  }
}

İşlev updateShiftRegister (), her şeyden önce mandal Pinini LOW olarak ayarlar ve ardından ShiftOut () latch Pinini HIGH konumuna getirmeden önce Arduino işlevini çağırır.

Neyse ki Arduino, özellikle çağrılan ShiftOut ()bitleri tek bir kod ile değiştirmemize izin veren yardımcı işlev sunar. Arduino’nun resmi web sitesinde kütüphane hakkında daha fazla bilgi edinebilirsiniz .

ShiftOut () Fonksiyon dört parametre alır; ilk ikisi sırasıyla Veri ve Saat için kullanılacak pinlerdir. Üçüncü parametre, başlatmak istediğiniz verinin hangi ucunda olduğunu belirtir. ‘En Az Önemli Bit’ (LSB) olarak adlandırılan en doğru bit ile başlayacağız.

void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

PWM Kullanarak Parlaklığı Kontrol Etme

Ek olarak, burada aynı düzene dayanan ancak küçük bir farkla, IC‘deki başka bir kontrol pinini, yani OE‘yi manipüle ettiğimiz başka bir proje var – bunu yaparak çıkış LED’lerinin parlaklığını kontrol edebiliriz!

OE (Output Enable) pininin bir anahtar olarak hareket ettiğini zaten öğrendik. Bu pin HIGH olarak ayarlandığında, çıkış pinleri devre dışı bırakılır (negatif logic olarak çalışır). Ve OE düşük voltaj LOW aldığında, çıkış pinleri normal çalışır.

Önceki örneğimizde, bu pini kalıcı olarak Ground‘a bağladık. Bu pini Arduino’nun dijital pinlerinden birine bağlar ve durumunu değiştirmek üzere programlarsak, aşağıda gösterildiği gibi bir şey elde edebiliriz.

Ancak, bunu yapmak yerine, bu pini <a class="fasc-button fasc-size-medium fasc-type-flat" style="background-color: #f2f2f2; color: #ff0000;">analogWrite()</a>fonksiyonla birlikte kullanabiliriz , PWM kullanarak LED’lerin parlaklığını kontrol edebiliriz. Böylece, aşağıda gösterildiği gibi sonuç alabiliriz.

Aslında PWM sinyalinin <a class="fasc-button fasc-size-medium fasc-type-flat" style="background-color: #f2f2f2; color: #ff0000;">HIGH</a> kısımları OE pininin tüm IC çıkışlarını geçici olarak devre dışı bırakmasına neden olacaktır. Ancak bu, elbette gözlerimizin doğrudan algıladığından daha hızlı gerçekleşecek, ancak genel parlaklıktaki bir değişimi kesinlikle hissedeceğiz.

Bunu yapmak için tek yapmanız gereken, 74HC595’in 13 numaralı pinine olan bağlantıyı değiştirmek. Toprağa bağlamak yerine, Arduino’nun 3. pinine bağlayınız.

PWM Parlaklık Kontrolü – Arduino UNO ile 74HC595 Shift Register’ın Kablolaması

Aşağıdaki kodlar, tüm LED’lerin kademeli olarak yanmasıyla tekrar söner.

int latchPin = 5;    // Latch pin of 74HC595 is connected to Digital pin 5
int clockPin = 6;   // Clock pin of 74HC595 is connected to Digital pin 6
int dataPin = 4;    // Data pin of 74HC595 is connected to Digital pin 4
int outputEnablePin = 3;  // OE pin of 74HC595 is connected to PWM pin 3

byte leds = 0;    // Variable to hold the pattern of which LEDs are currently turned on or off

/*
 * setup() - this function runs once when you turn your Arduino on
 * We initialize the serial connection with the computer
 */
void setup() 
{
  // Set all the pins of 74HC595 as OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  pinMode(outputEnablePin, OUTPUT); 
}

/*
 * loop() - this function runs over and over again
 */
void loop() 
{
  setBrightness(255);
  leds = 0;   // Initially turns all the LEDs off, by giving the variable 'leds' the value 0
  updateShiftRegister();
  delay(500);
  for (int i = 0; i < 8; i++) // Turn all the LEDs ON one by one.
  {
    bitSet(leds, i);    // Set the bit that controls that LED in the variable 'leds'
    updateShiftRegister();
    delay(500);
  }
  for (byte b = 255; b > 0; b--)  // Gradually fade all the LEDs back to off
  {
    setBrightness(b);
    delay(50);
  }
}

/*
 * updateShiftRegister() - This function sets the latchPin to low, then calls the Arduino function 'shiftOut' to shift out contents of variable 'leds' in the shift register before putting the 'latchPin' high again.
 */
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

/*
 * setBrightness() - Generates PWM signal and writes it to OE pin.
 */
void setBrightness(byte brightness) // 0 to 255
{
  analogWrite(