Hiç kendinizi çok sayıda LED'i kontrol etmek isterken buldunuz mu? Ya da düğmeleri, sensörleri, servoları aynı anda kontrol etmek için daha fazla I / O pinine mi ihtiyacınız vardı? Pekala, Arduino pinlerine birkaç sensör bağlayabilirsiniz, ancak Arduino'nuzdaki pinleriniz hızla tükenmeye başlar.
Bunun çözümü, bir 'Vardiya Kaydı' kullanmaktır. Bir vardiya kaydı, Arduino'nuzdan (veya bu konuda herhangi bir mikrodenetleyiciden) kullanabileceğiniz I / O pinlerinin sayısını artırmanıza izin verir. Ve 74HC595 kaydıran yazmaç ('595' lakaplı) en ünlüsüdür.
595, esasen yalnızca üç giriş pini kullanarak sekiz ayrı çıkış pimini kontrol eder. Ve 8'den fazla ek I / O hattına ihtiyacınız varsa, istediğiniz kadar çok vardiya kaydını kolayca papatya dizimi yapabilir ve tonlarca I / O hattı oluşturabilirsiniz. Tüm bunlar, bit kaydırma olarak bilinen yöntemle gerçekleştirilir. Bit değiştirme hakkında daha fazla bilgi edinmek istiyorsanız, Wikipedia'daki bu kaynak paha biçilmezdir.
Vardiya Kaydı ne zaman kullanılır?
Her mikro denetleyicide sınırlı sayıda I / O pinine (GPIO) sahip olduğundan, kaydırma yazmaçları genellikle mikro denetleyicideki pinleri kaydetmek amacıyla kullanılır.
Projenizin 16 ayrı LED'i kontrol etmesi gerekiyorsa, bu normalde bir Arduino'nun 16 pini gerektirir. 16 I / O pininiz yoksa, kaydıran yazmacı burada işe yarar. Seri bağlanmış iki vardiya yazmaç ile, sadece 3 I / O pini kullanarak 16 LED'i kontrol etme görevini gerçekleştirebiliriz. Ve sadece bu değil; Birbirine zincirlediğiniz daha fazla vardiya kaydı arttıkça daha fazla pin kaydedebilirsiniz.
Bir gerçek dünya örnek kullanımları kayıt değiştirmektedir 'dir Orjinal Nintendo Kontrolörü '. Nintendo Eğlence Sisteminin ana denetleyicisinin tüm düğme basışlarını seri olarak alması gerekiyordu ve bu görevi yerine getirmek için bir basış kaydı kullanıyordu.
SIPO Vs PISO Kaydırma Kayıtları
Kaydırma kayıtları, SIPO (Serial-In-Parallel-Out) veya PISO (Parallel-In-Serial-Out) olmak üzere iki temel tipte gelir. Popüler SIPO yongası 74HC595 ve PISO yongası 74HC165'tir .
İlk tür olan SIPO, LED'ler gibi çok sayıda çıkışı kontrol etmek için kullanışlıdır. İkinci tip olan PISO, düğmeler gibi çok sayıda girişi toplamak için iyidir; Yukarıda tartışıldığı gibi Orijinal Nintendo Controller'da kullanılan gibi.
74HC595 Shift Register nasıl çalışır?
595, her biri sadece 8 bit veri içeren iki yazmaç (“bellek kapsayıcıları” olarak düşünülebilir) içerir. İlki Shift Register olarak adlandırılır. Kaydırma Kaydı, sessizce girişi kabul ederek, IC devrelerinin derinliklerinde bulunur.
595'e saat darbesi uyguladığımızda iki şey olur:
- Shift Register'daki bitler bir adım sola hareket eder. Örneğin Bit 7, daha önce bit 6'da olan değeri kabul eder, bit 6, bit 5'in değerini alır vb.
- Shift Register'daki Bit 0, DATA pinindeki mevcut değeri kabul eder. Darbenin yükselen kenarında, veri pini yüksekse, kaydıran yazmacıya bir 1 itilir. Aksi takdirde, 0'dır.
Mandal pimi etkinleştirildiğinde, Vardiya Kaydının içeriği Depolama / Mandal Kaydı adı verilen ikinci kayda kopyalanır. Depolama Kaydının her biti , IC'nin Q A – Q H çıkış pinlerinden birine bağlanır , dolayısıyla genel olarak, Depolama Kaydındaki değer değiştiğinde, çıkışlar da değişir.
Bunu aşağıda gösterilen resimle daha iyi anlayabilirsiniz.
74HC595 Shift Register Pinout
595, çeşitli marka ve modellerde gelir; burada her yerde bulunan Texas Instruments SN74HC595N hakkında konuşacağız . Farklı bir tane alırsanız, veri sayfasını dikkatlice okuyun ve farklılıkları not edin.
Pinout'a bir göz atalım. İki iğnenin adlarının üzerinde bir çizgi olduğuna dikkat edin; bu onların "negatif mantık" içinde çalıştıkları anlamına gelir. Bunu biraz sonra öğreneceksin.
GND Arduino'nun zeminine bağlanmalıdır.
VCC Arduino'daki 5V pinini bağladığımız 74HC595 shift register için güç kaynağıdır.
SER (Seri Giriş) pin, verileri kaydıran yazmacıya her seferinde biraz beslemek için kullanılır.
SRCLK (Kaydırmalı Kayıt Saati)kaydıran yazmacı için saattir. 595 yükselen kenarda saat tahriklidir. Bu, bitleri kaydıran yazmacıya kaydırmak için saatin YÜKSEK olması gerektiği anlamına gelir. Ve bitler, saatin yükselen kenarında aktarılır.
RCLK (Saati / Mandalı Kaydedin)çok önemli bir pin. YÜKSEK sürüldüğünde, Vardiya Kaydının içeriği Depolama / Mandal Kaydına kopyalanır; sonuçta çıktıda ortaya çıkıyor. Bu nedenle, mandal pimi, sonuçlarımızı çıkışta görme sürecindeki son adım olarak görülebilir, bu durumda bu LED'ler.
SRCLR (Shift Register Clear)pin, bir kerede tüm bitlerini 0 yaparak tüm Shift Register'ı sıfırlamamıza izin verir. Bu bir negatif mantık pinidir, bu yüzden bu sıfırlamayı gerçekleştirmek için; SRCLR pinini DÜŞÜK olarak ayarlamamız gerekir. Sıfırlama gerekmediğinde, bu pin YÜKSEK olmalıdır.
OE (Çıktı Etkinleştir)negatif mantıktır: Üzerindeki voltaj YÜKSEK olduğunda, çıkış pinleri devre dışı bırakılır / yüksek empedans durumuna ayarlanır ve akımın akmasına izin vermez. OE düşük voltaj aldığında, çıkış pinleri normal şekilde çalışır.
QA – QH (Çıkışı Etkinleştir) çıkış pinleridir ve LED'ler, 7 Segmentler vb. gibi bazı çıkış türlerine bağlanmalıdır.
QH 'Pin, ShiftRegister'ın 7. bitini çıkarır. 595'leri papatya zinciri şeklinde zincirleyebilmemiz için orada: 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 davranacaklardır. Tabii ki, bu teknik iki IC ile sınırlı değildir - eğer hepsi için yeterli güce sahipseniz, istediğiniz kadar çok sayıda IC zincirleme yapabilirsiniz.
2 adet chip için Prensip bağlantı aşağıdaki gibidir.Arduino pin girişleri programlamada çok farklı olabilir.
Kablolama - 74HC595 Shift Register'ın Arduino UNO'ya Bağlanması
Artık 74HC595'in nasıl çalıştığına dair temel bir anlayışa sahip olduğumuza göre, onu Arduino'muza bağlamaya başlayabiliriz!
Kaydırma kaydını devre tahtanıza yerleştirerek başlayın ve IC'nin her iki tarafının devre tahtasının ayrı bir tarafında olmasını sağlayın. U şeklindeki küçük çentik yukarı bakarken, pimler aşağıdaki şekilde görüldüğü gibi yukarıdan aşağıya sol tarafta 1-8 ve sağ tarafta yukarıdan aşağıya 16 - 9 aşağıdadır.
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, IC'yi normal çalışma modunda tutmalıdır.
Daha sonra, kaydıran yazmacını kontrol edeceğimiz üç pini bağlamamız gerekir:
- Kaydırma yazmacının pin 11'i (SRCLK) Arduino'daki pin 6'ya
- Kaydırma yazmacının 12 numaralı pini (RCLK) Arduino'daki 5 numaralı pime
- Kaydırma yazmacının 14 numaralı pini (SER) Arduino'daki pim 4'e
Şimdi, tüm çıkış pinlerini LED'lerimize bağlamalıyız, akımı azaltmak için LED'lerin önüne 220Ω'luk bir direnç yerleştirilmesini ve LED'lerin katotlarının tekrar toprağa dönmesini sağlamalıyız.
LED'leri yerleştirirken sırayla bağlandıklarından emin olun, böylece QA ilk LED'e bağlanır ve QH son LED'e bağlanır, aksi takdirde kodumuz LED'leri doğru sırada yakmayacaktır!
İşiniz bittiğinde, aşağıda gösterilen resme benzer bir şeye sahip olmalısınız.
Arduino Kodu
Şimdi arkasına biraz kod koymaya hazırız! Arduino'nuzu bilgisayarınıza takın ve çizimi deneyin; ve sonra onu biraz ayrıntılı olarak inceleyeceğiz.
Kodu Arduino'ya yükledikten sonra, çıktının aşağıdaki gibi göründüğünü görmelisiniz:
Burada programa göre ledlerin yanış sırası gönderilen veriye göre farklı olabilir.
LED'lerden birini açmak yerine kapatmak isterseniz , ' led'ler ' değişkeninde benzer bir Arduino işlevi bitClear () çağırırsınız . Bu, belirli 'led'lerin' bitini 0 olarak ayarlayacaktır ve daha sonra updateShiftRegister()
gerçek LED'leri güncellemek için aramanız gerekecektir .
Kod Açıklaması:
Yaptığımız ilk şey, yani 3 kontrol pimini tanımlamaktır. 74HC595'in mandal, saat ve veri pinlerini, Arduino'nun sırasıyla # 5, # 6 ve # 4 dijital pinlerine bağlayacağız.
Daha sonra 'led' adlı bir değişken tanımlanır. Bu, LED'lerin o anda açık veya kapalı olduğu modeli tutmak için kullanılacaktır. 'Bayt' türündeki veriler, sekiz bit kullanan sayıları temsil eder. Her bit açık veya kapalı olabilir, bu nedenle bu, sekiz LED'imizden hangisinin açık veya kapalı olduğunu izlemek için mükemmeldir.
' Kurulum ' işlevinde: basitçe üç pini dijital çıkışlar olacak şekilde başlatıyoruz.
Döngü fonksiyonu: başlangıçta Daha sonra denilen özel işlevini çağırır 0'a değişkenin 'led' tüm bitleri ayarlayarak, tüm LED'leri kapanır updateShiftRegister()
hepsi LED'ler kapatmak böylece kayıt vardiyasına LED'leri 'desen gönderecek . Nasıl updateShiftRegister()
çalıştığını daha sonra ele alacağız .
Program yarım saniye durur ve ardından 'for' döngüsünü ve 'i' değişkenini kullanarak 0'dan 7'ye kadar saymaya başlar. Her seferinde, değişken ' led'lerdeki belirli LED'i kontrol eden biti ayarlamak için Arduino işlevi bitSet () ' i kullanır. Daha sonra updateShiftRegister()
LED'lerin durumunun değişken 'led'lerdeki şeye göre değişmesi için çağırır .
Ardından, 'i' artırılmadan önce yarım saniyelik bir gecikme olur ve sonraki LED yanar.
İşlev updateShiftRegister()
, ilk olarak mandal Pinini LOW olarak ayarlar ve ardından shiftOut()
mandalı tekrar HIGH konumuna getirmeden önce Arduino işlevini çağırır .
Neyse ki Arduino shiftOut()
, tek bir aramada bitleri kolayca kaydırmamıza olanak tanıyan özellikle adı verilen kaydırmalı yazmaçlar için yardımcı bir işlev sağlar. 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, verilerin hangi ucundan başlamak istediğinizi belirtir. 'Least Significant Bit' (LSB) olarak adlandırılan en doğru bit ile başlayacağız.
Son parametre, kaydıran yazmacıya kaydırılacak gerçek verilerdir, bu durumda bu 'led'ler'dir.
PWM Kullanarak Parlaklığı Kontrol Etme
Ek olarak, burada aynı kuruluma dayalı, ancak küçük bir farkla, IC üzerinde başka bir kontrol pinini yani OE'yi manipüle ettiğimiz başka bir proje var - ve bunu yaparak, çıkış LED'lerinin parlaklığını kontrol edebiliriz!
OE (Output Enable) pininin bir anahtar görevi gördüğünü zaten öğrendik. Bu pin HIGH olarak ayarlandığında, çıkış pinleri devre dışı bırakılır (negatif mantıkla çalışır, hatırladınız mı?). Ve OE düşük voltaj aldığında, çıkış pinleri normal şekilde çalışır.
Önceki örneğimizde, bu pimi kalıcı olarak Ground'a bağlayarak çıkışları her zaman etkinleştirmiştik. Bu pimi Arduino'nun dijital pinlerinden herhangi birine bağlarsak ve durumunu değiştirecek şekilde programlanırsak, aşağıda gösterildiği gibi bir şey elde edebiliriz.
Ancak bunu yapmak yerine, analogWrite()
PWM kullanarak LED'lerin parlaklığını kontrol etmek için bu pini fonksiyonla birlikte kullanabiliriz . Böylece aşağıdaki gibi sonuç alabiliriz.
Gerçekte, PWM sinyalinin YÜKSEK kısımları yine de 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ılayabileceğinden daha hızlı gerçekleşecek, ancak genel parlaklıkta kesinlikle bir değişiklik hissedeceğiz.
Bunu yapmak için tek yapmanız gereken bağlantıyı 74HC595'in 13 numaralı pinine değiştirmek. Böylece onu Ground'a bağlamak yerine Arduino'nun 3. pinine bağlarsınız.
Aşağıdaki çizim, tüm LED'ler yandığında yavaş yavaş onları tekrar sönük hale getirecektir.