ShiftOut

Dışarı Kaydırma ve 595 yongası

Bazen, Arduino kartınızdaki pinleriniz bitebilir ve vardiya kayıtları ile genişletmeniz gerekebilir. Bu örnek 74HC595'e dayanmaktadır. Veri sayfası, 74HC595'e "8-bit seri giriş, seri veya paralel çıkış kaydırma yazmacı; 3 durumlu" olarak atıfta bulunur. Başka bir deyişle, mikrodenetleyicinizde yalnızca birkaç pimi kaparken aynı anda 8 çıkışı kontrol etmek için kullanabilirsiniz. Çıktınızı daha da genişletmek için birden fazla kaydı birbirine bağlayabilirsiniz. (Kullanıcılar ayrıca parça numaralarında "595" veya "596" olan diğer sürücü yongalarını aramak isteyebilirler, çok sayıda vardır. Örneğin STP16C596 , 16 LED'i çalıştıracak ve yerleşik sabit akım kaynaklarına sahip seri dirençleri ortadan kaldıracaktır.)

Tüm bunların nasıl çalıştığı, "senkron seri iletişim" adı verilen bir şeydir, yani bir pimi yukarı ve aşağı doğru darbeleyebilir, böylece veri baytını kayıt defterine yavaş yavaş iletebilirsiniz. İkinci pimi, saat pimini atmakla, bitler arasında tanımlayabilirsiniz. Bu, göndericiye ve alıcının belirlenen veri hızına göre bağımsız olarak ayarlanmasına dayanan Serial.begin () işlevinin "asenkron seri iletişimi" nin aksine. Tüm bayt yazmacıya iletildikten sonra, her bir bitte tutulan YÜKSEK veya DÜŞÜK mesajlar ayrı çıkış pimlerinin her birine gönderilir. Bu, tüm pimlerin hepsinin aynı anda yapmasını istediğiniz şeyi yapmasını sağlayan "paralel çıkış" kısmıdır.

Bu bileşenin "seri çıkış" kısmı, mikrodenetleyiciden alınan seri bilgileri tekrar değişmeden iletebilen ekstra pininden gelir. Bu, arka arkaya 16 bit (2 bayt) aktarabileceğiniz ve ilk 8'in ilk kayıttan ikinci kayıta akacağı ve orada ifade edileceği anlamına gelir. Bunu ikinci örnekten öğrenebilirsiniz.

"3 durum" çıkış pimlerini yüksek, düşük veya " yüksek empedans " olarak ayarlayabilmenizi ifade eder. YÜKSEK ve DÜŞÜK durumlardan farklı olarak, pinleri yüksek empedans durumlarına ayrı ayrı ayarlayamazsınız. Sadece tüm çipi birlikte ayarlayabilirsiniz. Bu oldukça özel bir şeydir - Kontrol edilmesi gerekebilecek bir LED dizisini düşünün Projenizde yerleşik olan belirli bir mod ayarına bağlı olarak tamamen farklı mikrodenetleyiciler tarafından.

İşte bu tablodan uyarlanan pin-out'ları açıklayan bir tablo PİM 1-7, 15 Q0 "Q7 Çıkış Pimleri PİM 8 GND Zemin, Vss PİM 9 Q7" Seri Çıkışı PİM 10 BAY Master Reclear, aktif düşük PİM 11 SH_CP Shift register saat pimi PİM 12 ST_CP Depolama kayıt saati pimi (mandal pimi) PIN 13 OE Çıkış etkin, aktif düşük PIN 14 DS Seri veri girişi PİM 16 Vcc Pozitif besleme gerilimi

Örnek 1: Bir Vardiya Kaydı

İlk adım Arduino'nuzu bir vardiya kaydı ile genişletmektir.

Devre

1. Açma

Aşağıdaki bağlantıları yapın:

  • GND (pin 8) toprağa,
  • Vcc (pin 16) ila 5V
  • OE (pin 13) toprağa
  • MR (pin 10) ila 5V

Bu kurulum tüm çıkış pimlerini her zaman aktif ve adreslenebilir yapar. Bu kurulumun tek kusuru, programın çalışmaya başlamadan önce her devreye girdiğinizde ışıkların son durumlarına veya keyfi bir şeye dönüşmesi ile sonuçlanır. Arduino kartınızdan MR ve OE pinlerini de kontrol ederek bunun üstesinden gelebilirsiniz, ancak bu şekilde çalışacak ve sizi daha açık pinlerle bırakacaksınız.

2. Arduino ya bağlanın

  • DS (pin 14) - Ardunio DigitalPin 11 (mavi tel)
  • SH_CP (pin 11) - Ardunio DigitalPin 12 (sarı kablo)
  • ST_CP (pin 12) - Ardunio DigitalPin 8 (yeşil kablo)

Bundan sonra bunlar sırasıyla dataPin, clockPin ve latchPin olarak anılacaktır. LatchPin üzerindeki 0,1 "f kapasitöre dikkat edin, mandal pimi attığında bir miktar titremeniz varsa bunu dengelemek için bir kondansatör kullanabilirsiniz.

3. 8 LED ekleyin.

Bu durumda, her bir LED'in katotunu (kısa pim) ortak bir toprağa ve her bir LED'in anotunu (uzun pim) ilgili kaydırma yazmacı çıkış pimine bağlamanız gerekir. Bu şekilde güç sağlamak için kaydırma yazmacının kullanımına kaynak akımı denir . Bazı vardiya kayıtları akımı kaynak yapamaz, sadece batma akımı denir . Bunlardan birine sahipseniz, LED'lerin yönünü çevirmeniz, anotları doğrudan güce ve katotları (toprak pimleri) kaydırma yazmacı çıkışlarına yerleştirmeniz gerektiği anlamına gelir. 595 serisi çip kullanmıyorsanız, özel veri sayfanızı kontrol etmelisiniz. LED'lerin aşırı yüklenmesini önlemek için seri olarak 470 ohm'luk bir direnç eklemeyi unutmayın.

Devre şeması

Kod

İşte üç kod örneği. Birincisi, sadece 0 ile 255 arasında bir bayt değeri veren sadece bir "merhaba dünya" kodudur. İkinci program bir seferde bir LED yanar. Üçüncü dizi bir dizi boyunca döner.

logic table
logic table

Kod, veri sayfasındaki iki bilgiye dayanmaktadır: zamanlama diyagramı ve mantık tablosu. Mantıksal tablo, temelde önemli olan her şeyin yukarı vuruşta olduğunu söyleyen şeydir. ClockPin düşükten yükseğe çıktığında, kaydırma yazmacı veri pininin durumunu okur. Veri kaydırıldıkça dahili bir bellek kaydına kaydedilir. LatchPin alçaktan yükseğe çıktığında, gönderilen veriler vardiya kayıtlarından yukarıda belirtilen bellek kaydından çıkış pimlerine taşınır ve LED'ler yanar.

Kod Örneği 1.1 Merhaba Dünya
Kod Örneği 1.2 Tek Tek
Kod Örneği 1.3 Dizi kullanma

ÖRNEK 2

Bu örnekte, Arduino'dan aynı sayıda pimi kullanırken sahip olduğunuz çıkış pimi sayısını iki katına çıkaran ikinci bir kaydırma yazmacı ekleyeceksiniz.

Devre

1. İkinci bir kaydırma yazmacı ekleyin.

Önceki örnekten başlayarak, tahtaya ikinci bir vardiya kaydı koymalısınız. Aynı güç ve toprağa yol açmalıdır.

2. 2 kaydı bağlayın.

Bu bağlantılardan ikisi, aynı saati ve mandal sinyalini Arduino'dan ikinci kaydırma kaydına (sarı ve yeşil teller) uzatır. Mavi tel, birinci kaydırma kaydının seri çıkış piminden (pim 9) ikinci kaydın seri veri girişine (pim 14) gider.

3. İkinci bir LED seti ekleyin.

Bu durumda yeşil olanları ekledim, böylece kodu okurken hangi baytın hangi LED setine gideceği açık

Devre şeması

Kod

İşte yine üç kod örneği. Merak ediyorsanız, sadece ne olduğunu görmek için bu devre ayarlı olarak ilk örnekteki örnekleri denemek isteyebilirsiniz.

Kod Örneği 2.1 Çift İkili Sayıcılar
Örnek 1'deki birinci kod örneğine kıyasla sadece bir ekstra kod satırı vardır. İkinci bir bayt gönderir. Bu, doğrudan Arduino'ya bağlı olan ilk kaydırma yazmacını, yeşil LED'leri aydınlatarak ikinci kayıtçıya gönderilen ilk baytı geçmeye zorlar. Ardından ikinci bayt kırmızı LED'lerde görünecektir.

Kod Örneği 2.2 2 Bayt Birer Birer
Bu kodu Örnek 1'deki benzer kodla karşılaştırdığınızda, biraz daha fazla değişmek zorunda kaldığınızı görürsünüz. BlinkAll () işlevi, şimdi kontrol edilecek 16 LED'in olduğunu yansıtmak için blinkAll_2Bytes () işlevine değiştirildi. Ayrıca, versiyon 1'de latchPin'in titreşimleri lightShiftPinA ve lightShiftPinB () alt fonksiyonlarının içine yerleştirildi. Burada, her bir alt fonksiyonun arka arkaya iki kez, bir kez yeşil LED'ler ve bir kez kırmızı olanlar için çalıştırılması ihtiyacını karşılamak için ana döngüye geri taşınmaları gerekir.

Kod Örneği 2.3 - Çift Tanımlı Diziler
Örnek 2.2 gibi, örnek 2.3 de yeni blinkAll_2bytes () işlevinden yararlanır. 2.3'ün örnek 1.3'ten büyük farkı, yalnızca "data" adlı tek bir değişken ve "dataArray" adlı tek bir dizi yerine, bir dataRED, bir dataGREEN, dataArrayRED, dataArrayGREEN'in önceden tanımlanmış olması gerektiğidir. Bu şu demek oluyor ki

data = dataArray[j];

olur

dataRED = dataArrayRED[j];
dataGREEN = dataArrayGREEN[j];

ve

shiftOut(dataPin, clockPin, data);

olur

shiftOut(dataPin, clockPin, dataGREEN);
shiftOut(dataPin, clockPin, dataRED);

Başlatan Carlyn Maw ve Tom Igoe Kas, 06