Arduino ile Shift Register Kullanımı
Merhaba bugün Bit-Shifting yani Shift Register yöntemiyle LED sürmeyi inceleyeceğiz, bu projemizde alışılanın aksine 74HC595 entegresi yerine HEF4094 entegresi kullanıldı,fakat aynı kod ve şema ile 74HC595 entegresinide kullanabilirsiniz,çıkış ve giriş pinlerine dikkat ederek. Atölyemdeki LEDlerin ve 7-Segment LED lerin bittiğini görsemde elimde kalan diyotlar ile yapmaya çalıştım,bunun yanında önceki yazılarımızda gaz sensörü ve 7-segment 4 digit bir display ile örnekler yapmıştık, buradan ulaşabilirsiniz. Daha fazla uzatmadan yazımıza geçiyorum.
Shift Register Nedir?
Mantık devreleri alanında sıklıkla kullanılan bir devre tasarımı şeklidir. Alt yapı olarak flip-floplardan istifade eden tasarımda amaç girilen ikilik tabandaki bitlerin her saat darbesiyle bir-bir kaydırılmasıdır. Bunun yanında veriyi geçici olarak kaydettikleri için kaydediciler olarakta kullanılır. LED devrelerde kullanım amacı ise mikroişlemcinin I/O pinlerinden tasarruf etmektir örneğin; 8 LEDlik bir devrede, Shift Register devresi olmadan,kullanılan I/O pin sayısı GND ve VCC dahil 10 dur, fakat Shift Register devresi ile 3 + GND ve VCC kullanılır, bu sonuca bakarak Shift Register kullanmanın oldukça mantıklı olduğunu söyleyebiliriz.
HEF4094 Entegresi
HEF4094 3 pin girişli, 8-bit pin çıkışlı bir serial shift registerdir, voltaj olarak 3V ve 15V aralığında işlem yapabilmektedir.
Shift Register Çalışma Mantığı
74HC595 ‘den pek farklı olmasada, daha önce bahsedildiği gibi HEF4094 entegresi 3 girişle kontrol edilen 8-bit seri çıkışı olan bir shift register entegresidir. Burada bahsedilen 3 giriş:
- Seri Data Girişi
- 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.Bu animasyon ile shift-register metodunun temelleri oturmuş olucak.
Arduino ile Shift Register Kullanımı
Arduinonun kendi kütüphanesinde Shift-Register entegreleri 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. Ben normal led kullandım fakat 1 digit 7 segment ilede kullanabilirsiniz.
Arduino Kodu
int latchPin = 8; int clockPin = 12; int dataPin = 11; byte led = 0; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { led = 0; register_et(); delay(200); for (int i = 0; i < 8; i++) { bitSet(led, i); register_et(); delay(200); } for (int i = 8; i >= 0; i--) { bitClear(led, i); register_et(); delay(200); } } void register_et() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, led); digitalWrite(latchPin, HIGH); }
Kod Açıklaması
Kodumuzun ilk kısmında her zaman yaptığımız gibi çıkış pinlerimizi tanımladık. leds isiml 8 bitlik bir değişken tanımladık (byte tipindeki değişkenler 8 bit büyüklüğündedir). Bu baytın her bir biti, bizim shift register’ımızın çıkışına bağlı olan LED’leri temsil ediyor. register_eT fonksiyonumuz, shift register’ın çalışması için gerekli işlemleri yapıyor. loop fonksiyonumuzda bu fonksiyonu çağırarak led değişkeninde yaptığımız değişiklikleri LED’lerimize aktarmak için bu fonksiyonu çağırıyoruz. loop fonksiyonumuzda ise iki adet for döngüsü kullandık. İlk for döngüsü, leds değişkenimizdeki 8 bitten her birini sırayla 1 yaparak 00000001, 00000011, 00000111… şeklinde bir desen elde etmemizi sağlayacak. Her bir bit 1 olduktan sonra (11111111), ikinci for döngüsü başlayarak bu sefer bitleri 0’layarak 01111111, 00111111,00011111… desenini oluşturacak.
7-Segment 1 Digit İçin Şema
Arduino dan bağımsız bir sistem de 5 adet 74hc595 kullanılarak 5 adet 7segment display e değer yazdırılıyor . Sistem kendi içinde 3 adet kablo ile kontrol ediyor bunu bu kablolar clock latch ve data pinine gidiyor. Benim sorum ise biz bu 3 kabloyu arduinoya bağlayarak display de yazan yazıyı nasıl okuruz.
Merhaba, tek bir 74HC595 ile işlem yapma şansınız yoksa, 74HC595leri Arduino ile Multiplexing olara kullanmanız gerekiyor, ayrıca tek bir Arduino UNO ile 40’tan fazla shift registeri kontrol etmek mümkündür. Örnek olarak şimdilik bir devre şeması paylaşıyoruz. Çok yakın bir zamanda bu konu hakkında sizi bilgilendirmek için bir içerik oluşturmuş olacağız.
-Saygılarımızla.
12 Voltluk DC Motor Mosfetle kontrol edilecektir. Devreye enerji verilince Motor 30 saniye tam devirde , 30 saniye yarı devrinde çalıştırılacaktır. Bunun arduino devresi nasıl olur bana yardımcı olursanız çok sevinirim
Merhaba! Öncelikle projeniz için bizlere danışmanıza çok sevindik.
Öncelikle kullancağınız motorun “step” motor olmadığını varsayıyoruz. Kullanabileceğiniz parçalar;
MOSFET: IRF740A yada muadil bir mosfet, (IRF740A N-tip bir mosfettir, muadil olarak N-tip olmasına özen gösterin)
PWM ve Duty-Cycle mantığını anlamanız içinde sizleri bu yazıyı okumaya davet ediyoruz.
PWM çıkışı için Arduino’nun her hangi bir PWM pinini kullanabilirsiniz, bu pinleri bir tablo yardımı ile ya da, kartınızın üstündeki pinlerin yanında ki (~) işaretine bakarak anlayabilirsiniz. Biz sizin için 3. pini tercihe ettik.
Gerekli Malzemeler:
Arduino Uno
3.5 Volt DC Motor
12V Güç Kaynağı
10k Direnç
IRF740A Mosfet
Devre Şeması:
%22%20transform%3D%22translate(2%202)%20scale(3.8125)%22%20fill-opacity%3D%22.5%22%3E%3Cellipse%20fill%3D%22%23005053%22%20rx%3D%221%22%20ry%3D%221%22%20transform%3D%22matrix(-62.68653%202.20532%20-2.10685%20-59.88724%2065.3%2082)%22%2F%3E%3Cellipse%20fill%3D%22%23fff9f9%22%20cx%3D%22200%22%20cy%3D%22122%22%20rx%3D%2264%22%20ry%3D%22254%22%2F%3E%3Cellipse%20fill%3D%22%23034980%22%20cx%3D%2270%22%20cy%3D%2281%22%20rx%3D%2243%22%20ry%3D%2239%22%2F%3E%3Cellipse%20fill%3D%22%23b3a9a9%22%20cx%3D%22141%22%20cy%3D%2283%22%20rx%3D%2219%22%20ry%3D%2266%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E)
Açıklama:
Burada kullandığımız mosfet N tipinde bu yüzden güç kaynağımızın “+” kutbunu direkt olarak motora, “-” kutbunu mosfete bağlıyoruz.
Mosfetin üzerindeki sayılar size bakacak şekilde tuttuğunuzda;
İlk bacağı olan “Gate” Arduino’nun 3 nolu pinini bağlıyoruz.
İkinci bacağı olan “Drain”, motorun diğer bacağına bağlıyoruz.
Üçüncü bacağı olan “Source” ise ortak GND’ye (toprak) bağlıyoruz.
Önemli: GND’ye 10K’lık bir direnç bağlarsanız arduino’nun kararsız durumlarının önüne geçebilirsiniz. İsterseniz 10nF geçmeyek bir kapasitör ile de bunu sağlayabilirsiniz.
Önemli: Arduino ve kullandığınız adaptörün “-” ve GND’leri birbirine bağlı olması gerektiğidir. Eğer elinizde 12V’u geçmeyen yeterli bir güç kaynağı varsa Arduino’nun Vin bacağını da bununla besleyebilirsiniz çünkü Arduino kartınız üzerindeki voltaj çevirici(Genelde LM7805) onu zaten 5V’a düşürecektir ancak unutmamalısınız ki burada motorunuz belli bir seviye güç kaybedebilir.
Hız kontrolü yapmak istediğiniz için PWM pini kullanmak zorundasınız devamında analogWrite fonksiyonuyla 0–255 arasında bir değer göndermelisiniz 30 saniye tam devir istediğiniz için 30 saniye 255, 30 saniye yarı devir istediğiniz için 255/2 = 127 göndermeniz işinizi görecektir. Sizin için yazdığımız örnek kod üstünde oynamalar yaparak kendiniz de geliştirebilirisiniz.
Arduino Kodu:
void setup() {
pinMode(3, OUTPUT); //3. pini output olarak gösterdik
}
void loop()
{
analogWrite(3, 255); //tam devir
delay(30000);
analogWrite(3, 127); //yarı devir
delay(30000);
}
Devreniz bu kadar! Takıldığınız noktada mesaj atmaktan çekinmeyin,