Arduino ile Karaşimşek Uygulaması

Bu konuda, 8 çıkış pini kullanmak zorunda kalmadan sekiz adet büyük kırmızı LED’in Arduino’yla nasıl kullanılacağını öğreneceğiz.

karasimsek-1

Her birini bir Arduino pinine bir dirençle birlikte sekiz adet LED bağlayabilir, devremize uygun progamı yazıp çalıştırabilirdik ancak  Arduino’muzdaki pinler tükenmeye başlayacaktı. Eğer arduino’unuza bağlı pek çok şey yoksa, bunu yapmakta sorun yok – ama sıklıkla butonlar, sensörler, servolar, vb. ekipmalar kullanmak istiyoruz ve bu yöntemle birlikte kullanabileceğimiz pin kalmıyor. Bunu yapmak yerine, 74HC595 Serial to Parallel Converter adlı bir entegre kullanabiliriz. Bu entegrenin sekiz çıktışı ve entegreye bir seferde biraz veri gönderebilmek için kullandığımız üç giriş var.

Bu entegre, LED’leri sürmek için biraz yavaştır (yalnızca saniyede 8.000.000 yerine saniyede 500.000 kez LED’i değiştirebilirsiniz), ancak bu bile insanların algıladıklarından daha hızlıdır. Bu yüzden bu entegreyi kullanarak, daha az çıkış kullanmak için bu yöntemi kullanmaya değer.

Bu konuda anlatılan projeyi inşa etmek için aşağıdaki parçalara ihtiyacınız olacak.

karasimsek-2

 

Malzemelerimizi aşağıdaki gibi bağlıyoruz. Birçok bağlantı noktası olduğundan dolayı dikkat olmak konusunda sizi uyarmak isterim.

 

karasimsek-3

Muhtemelen 74HC595 çipini ilk önce yerleştirmek en kolay, çünkü hemen hemen her şey onunla bağlantılıdır. U şeklindeki küçük çentik, breadboard’un üstüne doğru gelecek şekilde yerleştirin. yani çentik yukarıya doğru ledlere doğru bakacak. Entegrenin 1 numaralı pini ise bu çentik yukarı gelecek şekilde karşıdan bakıldığında soldan başlayan 1. bacak.

hc595

Arduinomuza da aşağıdaki bağlantıları yaparız.

Arduino’dan gelen Digital 4, shift registerin 14 numaralı pinine gider
Arduino’dan gelen Digital 5, shift registerin 12 numaralı pinine gider
Arduino’dan gelen Digital 6, shift registerin 11 numaralı pinine gider

74HC595 çıkışlarının bir tanesi hariç, diğerlerinin hepsi çipin sol tarafında, dolayısıyla bağlantı kolaylığı açısından, LED’leri bu tarafa yerleştirmekte fayda var.

Entegreden sonra dirençleri yerine koyun. Dirençlerin hiçbirinin birbirine dokunmadığına dikkat etmeniz gerekir. Arduino’ya enerji vermeden önce bağlatıları tekrar kontrol etmelisiniz. Dirençlerin uçlarının birbirine dokunmadığından emin olmalısınız. Sonra, LED’leri breadboarda yerleştirin.

 

Tüm bağlantılar doğru yapıldıktan sonra, biraz aşağıda listelenen programı arduinonuza yükleyin ve deneyin. Her bir LED, tüm LED’ler yanıncaya kadar sıra ile yanmalıdır ve sonra hepsi sıra ile söner ve bu çevrim sürekli olarak tekrarlanır.

74HC595 Kaydırmalı Kaydedici (Shift Register)

Kod açıklamalarına geçmeden önce, kodun ne yapacağını anlayabilmemiz için entegrenin ne yaptığına hızlı bir şekilde göz atalım.
Entegre, kaydırmalı kaydedici (shit register) adı verilen bir türdendir. Arduino ile arasında veri alışverişi için sadece 3 pin kullanılır. Ayrıca entegreye bir de + ve – enerji beslemeleri bağlanır. Eğer entegre arduino yerine başka bir kaynaktan enerjilendirilecekse, kullanılan güç kaynağı ile arduinonun ground (-) uçlarının birbirlerine bağlanması gerekiyor. Bu işleme sıfırlama adı verilir.

karasimsek-4

Shift register, sekiz bellek yeri olarak düşünülebilir ve her bir yer, 1 veya 0 olabilir.

Bu değerlerin her birini 1 veya 0 olarak ayarlamak için, entegrenin Data (Veri) ve Clock (Saat) pinlerini kullanarak verileri besleriz.

Clock pini, veriler ile birlikte 8 pulse almalıdır. ğere daha pini o esnada 1 ise shift registere 1 itilir vey 0 ise shift regitere 0 itilir.

Tüm 8 bitlik veri alındıktan sonra, bu verilerin çıkış pinlerine yazdırılması için Latch (kapı kilidi) pini aktive edilmelidir. Latch pini, Latch registeri aktive eder ve registere kaydedilen değerler çıkış pinleri kapısına aktarılır. Yani önce çıkış pinlerinin durumunun nasıl olması isteniyorsa, o bilgi önce registere kaydedilir. Daha sonra da Latch pin aktive edilerek tüm çıkışlar aynı anda aynı değeri alır.

Entegrenin ayrıca bir OE (çıkış etkinleştirme) pini vardır, bu aynı anda çıkışları etkinleştirmek veya devre dışı bırakmak için kullanılır. Bunu PWM özellikli bir Arduino pinine bağlayabilir ve LED’lerin parlaklığını kontrol etmek için ‘analogWrite()’ ile birlikte kullanabilirsiniz. Bu pin aktif olarak düşük, bu yüzden GND’ye bağlanıyor ve çıkış pinleri sürekli olarak aktif tutuluyor.

Arduino Kod’u

Arduino, shift registere veri göndermek için özel olarak tasarlanmış ‘shiftOut()’ adlı özel bir fonksiyon içeriyor.

aşağıdaki programı kartımıza yükleyelim sonra, bu konularla ilgili açıklamalra geçelim.

/*
8 LED ve bir adet Shift Register
*/
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
byte leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
leds = 0;
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
updateShiftRegister();
delay(500);
}
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}

 

Yapacağımız ilk şey, kullanacağımız üç pini tanımlamak. Bunlar, 74HC595’in LATCH, CLOCK ve DATA pinlerine bağlanacak Arduino dijital çıkışlarıdır.

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

Ardından, ‘leds’ adı verilen bir değişken tanımlanır. Bu, hangi LED’lerin o anda açık (1) veya kapalı (0) olduğu desenini tutmak için kullanılacaktır. ‘Bayt’ türündeki veriler sekiz bit kullanan sayıyı temsil eder. Her bit açık (1) veya kapalı (0) olabilir, bu nedenle sekiz LED’imizin hangisinin açık (1) veya kapalı (0) olduğunu takip etmek için mükemmel bir seçenektir.

byte leds = 0;

setup() fonksiyonu, kullandığımız üç pini dijital çıkışlar olarak ayarlar.

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

loop() fonksiyonu, başlangıçta tüm LED’leri kapatır ve ‘leds’ değişkeninin değerini 0 olarak verir. Daha sonra ‘leds’ desenini kaydırma kaydına gönderir ve böylece tüm LED’ler sönük kalır ve  ‘updateShiftRegister’ fonksiyonu çağırılır. ‘UpdateShiftRegister’ fonksiyonunun nasıl işlediğiyle, daha sonra ilgileneceğiz.

loop() fonksiyonu, yarım saniyeliğine duraklatılır ve sonra ‘for’ döngüsü ve ‘i’ değişkeni kullanılarak 0’dan 7’ye saymaya başlar. Her defasında, Arduino  ‘bitSet()’ fonksiyonu kullanarak, ‘leds’ değişkenindeki LED’i kontrol eden biti ayarlar. Sonra da ‘updateShiftRegister’ çağırır, böylece ledler ‘leds’ değişkenini yansıtacak şekilde güncellenir.
Ardından, for döngüsü içinde delay(500); fonksiyonu ile yarım saniyelik bir gecikme olur ve for döngüsnün bir sonraki adımına geçilir, ‘i’ değişkeni içeriği bir artar ve bir sonraki LED yanar. for döngüsü içindeki koşul tamamlanana kadar bu şekilde devam eder.

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

delay(500);
}
}

‘UpdateShiftRegister’ fonksiyonu, digitalWrite() ile öncelikle latchPin’i düşük seviyeye ayarlar (1 yapar) ve böylelikle çıkış pinlerinin, şimdi yapacağımız değişiklikten etkilenmesini önler. Daha sonra Arduino fonksiyonu olan, ‘shiftOut’ ‘u çağırır. Bu fonksiyon dört parametre alır ve leds değişkeni içindeki verileri shift register içine yazar. İlk iki parametre, sırasıyla Data ve Clock için kullanılacak pinlerdir.

Üçüncü parametre, verileri yazmaya hangi uçtan başlatmak istediğinizi belirtir. Biz ‘En Az Önemli Bit’ (LSB) olarak anılan en sağdan başlayacağız. Bunun anlamı şudur; verileri seri olarak gireceğimizde, başlangıcın hangi taraftan olacağını belirtir. Yani veriler seri olarak 0. bitten başlayıp sona kadar sıra sıra mı girsin? yoksa 7. bitten başlayıp en başa kadar sırasıyla mı girsin?

diyelim ki değişkenimizin içeriği leds=10110001  olsun, LSB veya MSB tercihimize göre 74hc595 entegremizin çıkışındaki ledlerin durumu aşağıdaki gibi olur.

 

leds LSB olursa=     10110001 —————–>          1    0    0    0     1    1    0     1

LSB-MSB

 

leds MSB olursa=     10110001 —————–>         1    0    1    1      0    0    0     1

LSB-MSB

 

Son parametre olan ‘leds’ ise shift registere kaydırılacak gerçek verilerin olduğu değişken ismidir. Buraya yazacağımız değişkeni biz belirliyoruz.

Son olarak ise digitalWrite() ile  ‘latchPin’ i  yükseğe alarak (1 yaparak) çıkışlar için ayarladığımız yeni konfigürasyonu, pinlere aktarır.

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

Parlaklık Kontrol

74HC595’in henüz bahsetmediğim bir pini, ‘Çıkış Etkinleştirici (Output Enable)’ olarak adlandırılan (OE) pinidir. Bu pin numarası 13’tür ve devremizdeki breadboardda kalıcı olarak Ground’a bağlıdır. Bu pin, çıkışları etkinleştirebilen veya devre dışı bırakabilen bir anahtar görevi görür. Çıkış pinlerinin durumunu izlemek için gereken tek şey ‘aktif düşük’ olmasıdır (etkinleştirmek için Ground’a bağlanmasıdır). Yani, 5V’ye bağlıysa, tüm çıkışlar söner. Bu pin Ground’a bağlıysa 1 olması beklenen Çıkış pinleri 1’dir ve 0 olması gereken tüm çıkış pinleri 0’dır.

Bu pini ‘analogWrite()’ fonksiyonuyla birlikte kullanabilirsiniz. Bunu yapmak için, yapmanız gereken şey, 74HC595’in 13 numaralı pine olan bağlantısını değiştirmektir; böylece Ground’a bağlamak yerine, Arduino’nun 3 numaralı PWM pinine bağlayabilirsiniz.

Aşağıdaki programda, tüm LED’lerin parlaklıkları giderek artarak yanar ve azalarak söner.

/*
 LEDLER ve Shift Register – Parlaklık kontrollü
*/
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
int outputEnablePin = 3;
byte leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(outputEnablePin, OUTPUT);
}
void loop()
{
setBrightness(255);
leds = 0;
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);

updateShiftRegister();
delay(500);
}
for (byte b = 255; b > 0; b–)
{
setBrightness(b);
delay(50);
}
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
void setBrightness(byte brightness) // 0 to 255
{
analogWrite(outputEnablePin, 255-brightness);
}

 

 

Umarım burada yazılanlardan faydalanırsınız…

Arduino ile Karaşimşek Uygulaması” için 30 yorum

  1. 74HC595 entegresiyle kullanım için burada bir kütühane bulunuyor.
    https://github.com/Simsso/ShiftRegister-PWM-Library
    Kütüphane sahibine ait makale de burada
    https://timodenk.com/blog/shiftregister-pwm-library
    Ben buradaki şemaya göre bağlantıları yaptım. entegreye ardiuno’daki D1,D2 ve D9 pinini bağladım. verilen örnek kodu da kendime uyarladım.
    Ama bir türlü istediğim sonuçları alamadım. Sizin makalenizi de inceledim.
    Bu 74HC595 ile “pwm çıkışı” elde edilebiliyor mu?
    benim yapmak istediğim uno’ya ait pwm çıkışları yetersiz geldiğinden bunları çoğaltmak.
    yani entegre den “pwm” çıkışı almam gerekiyor ki “dc motor” sürücü kartında bulunan “enA” pinine bağlayabileyim.
    Bu konu da yardımcı olabilirmisiniz?

    Liked by 1 kişi

    1. timodenk.com/blog adresindeki aciklamayi okudum. D2 D3 ve D4 pinlerini kullanmak zorunda olduğunu söylüyor. Performans sebebiyle bu bağlantının değiştirilmesine izin vermiyor kütüphane. Şu anda deneme şansım yok ancak timodenkin şemasındaki bağlantıya sadik kalmanı öneririm. Önce bu şekilde bir bağlayıp devreni çalıştırmayı denermisin. Sonucunu da bana bildirirsen sevinirim. Çok faydalı bir konu bulmuşsun tebrik ederim bu arada.

      Liked by 1 kişi

      1. burada pinlerin değiştirilebilineceği yazıyor sanırım. ingilizce pek bilmiyorum. https://github.com/Simsso/ShiftRegister-PWM-Library/blob/master/examples/CustomPins/CustomPins.ino

        Bu kısmı eklemek gerekliliği var.
        #define ShiftRegisterPWM_LATCH_PORT PORTB
        #define ShiftRegisterPWM_LATCH_MASK 1

        ben kendime göre uyarladım ama olmadı.
        // dijital pin 2
        #define ShiftRegisterPWM_LATCH_PORT PORTD
        #define ShiftRegisterPWM_LATCH_MASK 0B11111011

        // pwm pin 9
        #define ShiftRegisterPWM_CLOCK_PORT PORTB
        #define ShiftRegisterPWM_CLOCK_MASK 0B11111101

        // dijital pin 1
        #define ShiftRegisterPWM_DATA_PORT PORTD
        #define ShiftRegisterPWM_DATA_MASK 0B11111101

        şimdi bağlantıları söküp, önerilen şekilde yeniden bağlayacağım. (pin 2,3,4)

        Beğen

      2. evet belirttiğin satırları eklemek gerekliliği var ancak #define ShiftRegisterPWM_LATCH_MASK 0B11111011 ile belirtilen kısımda atmega işlemci portları ile ilgili işlem yapıyorsun,
        mesela
        #define ShiftRegisterPWM_DATA_PORT PORTD
        #define ShiftRegisterPWM_DATA_MASK 0B11111101
        kısmında işlemcinin d portundaki 1 nolu pin hariç diğer hapsini kullanacağını belirtmişsin. sanırım buradaki kullanım ile ilgili bir yanlışlık yapıyorsun. hangi pini kullanacaksan o pin numarasına denk gelen ilgili biti 1 olarak bırakacaksın ve diğerlerini de 0 ile maskeleyeceksin. BLogda yazılanlardan benim anladığım bu yönde. ayrıca bu biraz da karışık bir işlem, atmega port pinlerini falan da iyi bilmek gerekiyor ( hangi port hangi pinleri ifade ediyor vb.).

        önce önerilen bağlantı ile yapıp çalıştırmak yol almanı kolaylaştırır.

        https://github.com/Simsso/ShiftRegister-PWM-Library/blob/master/examples/CustomPins/CustomPins.ino
        şu sayfadan da pin değişikliği nasıl yapılıyor bir örnek var. Daha sonra buradaki örnekten faydalanabilirsin..

        haberlerini bekliyorum 🙂 kolay gelsin.

        Liked by 1 kişi

      3. birkaç tane yorum yazdım ama “denetim için yorumunuz bekliyor” diyor.
        d2,d3,d4 pinine bağladım. oldu sanırım. lakin entegredeki pinlere bağladığım sırayı takip etmiyor.
        ben ilk 5 pini entegrede kullanıyorum. ilk 3nde 1 adet rgb ledin 3 ayağı var. 4 ve 5 de 2 tane dc motorun enA ayakları var. entegre de 8 çıkış var ama bana 5 tanesi lazım. sanırım sürekli bu pin çıkışları değişiyor. sabit değil gibi. neden bilmiyorum daha rgb led de istediğim rengi yakamadım.

        Beğen

      4. burada aklıma 2 şey takıldı,

        1- yazdığın programı görmeden pek bir şey diyemeyeceğim. eğer kütüphane içindeki sine örneğini kullandıysan kendi devrende, çıkışların sürekli olarak değişmesi normal çünkü program o amaç için yazılmış.

        2- rgb led ortak anot mu ortak katot mu? bunun için blogdaki rgb led uygulamasında açıklama yazmıştım. ortak anot ise yazdığın renk değerini 255 ten çıkarman gerekiyor.

        bir de shift registere yazdırdığın verileri arka arkaya aynı anda yollayıp çıkışı update ediyorsun bunu da hatırlatmak istedim.

        devre şemanı ve yazdığın programı yollarsan daha fazla yardımcı olabilirim sanırım.

        Liked by 1 kişi

  2. bende sizin gibi bitleri maskelemeyi biliyordum ve ardiuno ile ilgili resmi forumda falan bu şekildeydi.. ama başka bir forumda “maskeleme” olduğu için ters şekilde yapılması gerektiği belirtiliyordu. bana da mantıksız geldi ama yinede böyle deneyeyim dedim.
    birde :
    register.set(entegre pin no, 0 ile 255 arası değer);
    entegre de 8 adet sol tarafında pin var.
    3ncü pine 200 değeri girmek için;
    register.set(3, 200);
    bu şekilde kullanılıyor değil mi?

    Beğen

    1. register.set(3, 200); şeklinde yazarsan 4 nolu pine 200 değeri yollamış olursun. mikroişlemciler ve entegrtelerde 1 nolu pin 0 ile belirtilir. aynı şekilde 2 nolu 1 il, 3 nolu pin 1 ile ….. bu böyle en sonuncu pine kadar gider. genel mantık bu şekildedir. mesela 8 nolu pine 200 değeri göndermek için register.set(7, 200); yazmalısın.

      Liked by 1 kişi

  3. ardiuno dan entegreye 2,3,4 pinleri bağladım. oldu sanırım. ama ben entegrenin ilk 3 ayağına 1 adet rgb led bağlamıştım.(rgb led 4 ayaklı, 3 ayağını entegreye bağladım.) entegredeki 4 ve 5nci pinleri de birbirinden ayrı 2 dc motorun enA pinleri olarak bağladım.
    motorları hareket ettirip, durdurabiliyorum.
    rgb led’de ise henüz istediğim rengi yakamadım.
    şöyle bir sorun var ki benim entegreye bağlantı yaptığım sırayı takip etmiyorlar.
    sanırım bazen de pinlerin yeri değişiyor. ilginç ama led’e renk emri veriyorum bazen 2 motor birden hareket ediyor.
    yine bir yerde yanlışlık yapıyorum galiba ama ardiunodan entegreye 2,3,4ncü pinleri bağladım bunlarda sorun yok. sadece nasıl çalışıyor onu anlamaya çalışıyorum.

    Beğen

  4. biraz çok soru soruyorum ama burada 1 ve 16 ne oluyor?
    ShiftRegisterPWM sr(1, 16);
    ShiftRegisterPWM sr(numShiftRegisters, resolution);
    numShiftRegisters : entegrede kaç pin kullanacağımız mı?
    resolution : entegredeki toplam kullanılabilecek pin miktarı mı? (birden fazla 74HC595 birbirine bağlanılarak kullanılabildiği gösterilmiş. 2 x entegre = 16 pin yapıyor. aklıma buradan geldi de.)

    Beğen

    1. timodenk’in açıklamasına göre

      numShiftRegisters = kaç tane entegre kullanacağını belirtiyorsun. eğer 2 tane entegre kullanıyorsan buraya da 2 yazacaksın. bu da toplamda 16 bacak yapar.

      resolution = 0 ile 255 arası bir değer belirtiyorusun. bu da çıkış pinindeki etkinin kaç basamakta en üst ve en alt seviyeye gidip geleceğini belirliyor. yani buraya 2 yazarsan çıkış pinine bağlı olan ledde 2 seviyede değişikik görürsün. 16 yazarsan 16 farklı seviye görürsün veya 255 yazarsan da 255 farklı seviye görürsün. Dediğim gibi şu anda deneme yapma şansım yok, ancak blogdaki açıklamasından bunu anladım ben.

      Liked by 1 kişi

  5. pinlerin değişmesi için “sine örneğini” demişsin.
    devre şemasına göre bağlama fark etmiyor değil mi?
    bu dediğin sadece yazılımsal :
    https://github.com/Simsso/ShiftRegister-PWM-Library/tree/master/examples/sine

    eğer pin değişmesi yazılımsal olarak “sine” örneğindeki gibi ise;
    pinlerin değişmemesi için ne yapmak gerekiyor?
    diğer örneklere baktım aradaki tek fark aşağıdakilerin “loop” döngüsü içinde olup/olmaması.

    ShiftRegisterPWM sr(1, 255);
    sr.interrupt(ShiftRegisterPWM::UpdateFrequency::Fast);

    Beğen

    1. entegre’nin devreye bağlantı şeması aynısı.
      entegreyi ardiunoya bağlayış şeklim.

      bu da kütüphane de olan şema.

      Beğen

    2. evet, senin de dediğin gibi sadece yazılımsal olarak belirliyorsun. shift register ile arduino arasındaki bağlantıda bir değişiklik yok, herhangi bir devre için bile olsa bağlantı aynı olması gerekiyor zannımca. Ancak shift register çıkışlarını kontrol etmeyi yazılımsal olarak yapıyorsun, yani hangi çıkışı ne zaman hangi seviyede aktive edeceksen bunu yazılımsal olarak belirliyorsun. o yüzden sine.ino örneğini söylemiştim. sine örneğinde, hc595 çıkış pinlerine bağlanmış olan ledlerde sinüsoidal dalga efekti olarak ışık şiddetini ayarlıyorsun anladığım kadarıyla.
      void loop()
      {
      for (uint8_t i = 0; i < 8; i++) {
      uint8_t val = (uint8_t)(((float)sin(millis() / 150.0 + i / 8.0 * 2.0 * PI) + 1) * 128);
      sr.set(i, val);
      }
      }
      yukarıdaki kod ile yaptığı klasik karaşimşek devresinin pwm versiyonu, çıkıştaki 8 adet ledi bu yöntemle sürüyor. deneme şansım yok şu anda dediğim gibi ancak sanırım çok yumuşak ve hoş bir görsel ortaya çıkıyordur.

      senin devrende ise ilk 3 çıkışa bağlı olan rgb led için ve 4-5 nolu çıkışlara bağlı olan enA bağlantıları için değerleri kendin belirlemen gerekiyor. sine örneğinde ise i değişkeni ile sırası gelen çıkışa val değişkeninde belirlediği değerleri sırası ile yazdırıyor. zannımca sen de bunu bu şekilde anlaşmışsın zaten ancak ben yine de açıklama ihtiyacı hissettim.

      Liked by 1 kişi

      1. ShiftRegisterPWM sr(1, 255);
        sr.interrupt(ShiftRegisterPWM::UpdateFrequency::Fast);

        Bu kısmı “loop” döngüsü içerisinde kullanırsak entegredeki pinler sabit oluyor, değişmiyor.
        entegre de komutlara hızlı cevap veriyor. yani performansda da bir sorun yok.
        Sadece dc motorları 0 ile 255 aralığında değer vererek çalışmasını/hızlanmasını/durdurulması
        sağlanırken, 0 ile durdurup, 255 ile de en hızlı şekilde hareket etmesini sağlıyor. yani 0 ile 255 aralığında bir değer verirsek bunu 0 gibi algılayıp, motoru durduruyor. yani bir nevi “digital pinlerde” olduğu gibi “HIGH/LOW” şeklinde yorumluyor. oysa “pwm pinlerinin” özelliği hızında istenilen seviyede ayarlanabilmesi ama bu olmuyor. nedendir bilmiyorum. yoksa gerisi gayet güzel çalışıyor.

        Beğen

      2. programındaki denemeYap() fonksiyonu içerisinde aşağıdaki kısımları setup() fonksiyonu içerisine taşıyıp deneme yaparmısın? fonksiyonu her çağırdığında update frekansını yeniden tanımlıyorsun anladığım kadarıyla. Buna gerek varmı? eğer update frekansını ayrı ayrı tanımlamana gerek var ise, rgb led için ayrı bir fonksiyon tanımlayıp, motor kontrol için de ayrı bir fonksiyon tanımlamanı ve update frekanslarını burada yeniden belirlemeni ve loop içinde bu 2 fonksiyonu arka arkaya çağırmanı tavsiye ederim.

        ShiftRegisterPWM _register(1, 255);
        _register.interrupt(ShiftRegisterPWM::UpdateFrequency::SuperFast);

        birde, yazdığın programda denemeYap() fonksiyonu içerisinde aşağıdaki satırda _register eklemesi yapmamışsın, interrupt için hangi registeri kullanacağını belirtmen gerekiyor sanıırm. hatalı çalışmasının sebebi bu olabilir.

        interrupt(ShiftRegisterPWM::UpdateFrequency::SuperFast); // bu yanlış

        _register.interrupt(ShiftRegisterPWM::UpdateFrequency::SuperFast); // bu doğru

        kanaatimce..

        Liked by 1 kişi

  6. dediğiniz gibi bu setup() fonksiyonu içerisinde yapılması gerekiyor.
    ” register.interrupt(ShiftRegisterPWM::UpdateFrequency::SuperFast); ”
    Ardiuno IDE ile derlerken bende farkettim. 🙂
    Bunlardan ayrı olarak;
    ” register.interrupt(ShiftRegisterPWM::UpdateFrequency::SuperFast); ”
    bunu belirtirsek setup() fonksiyonu içerisinde sanırım her pine değer verilmesinin ardından update() fonksiyonu çalıştırılmasına gerek yok sanırım. çünkü emin değilim ama kütüphane kodlarında “interrupt” fonksiyonu bu update işlemini otomatik yapılması için gibi. (Sanırım sizin dediğinizde bu.)
    Bir arkadaşa danıştım :
    Ayrıca loop() döngüsü içerisinde “ShiftRegisterPWM” nesnesinin oluşturulmasının doğru olmadığını (sakıncalı) arkadaş söyledi. ama nedendir bilmiyorum belki işlemleri yavaşlatıp, performansı vs etkiler.
    yani “ShiftRegisterPWM” nesnesi global olarak oluşturulmalı. (herhangi bir fonksiyon içerisinde olmayacak.)
    arkadaşın kendisi yanımda değil. ama kendisi de 74HC595 entegresini denedi ve “pwm” olarak çalıştırmayı başardı.
    ama istenilen pine şu şekilde erişebildiğini belirttti :
    örneğin 3ncü pine erişim yapılmak istensin.
    o zaman ” register.set(7-3, deger); ” şeklinde olacak
    istenilen pin Qx -> register.set(7-x, deger);
    bunun 7nci pin istenildiği zaman bir şekilde entegrenin 0ncı pine komut geçtiği için olduğunu söyledi.
    kendisi led ve pot ile deneme yaptı ve pwm pin olarak entegre pinlerinden faydalandığını belirtti.
    yani 0 ve 255 aralığında değer vererek rgb led’den istenilen rengin ışıldamasını sağladı.
    haliyle dc motor enA gibi enable pinden hız ayarlaması da yapılabiliniyor böylece.
    Lakin kendi adıma söyleyeyim, ben daha deneme yapamadım.
    Bayram boyunca bile bu entegreyle uğraştım, ufak tefek yapmam gerekenler vardı onlarla ilgilendim.

    Beğen

    1. Arkadaş aynı kütüphane ve devre şemasını kullandı. herhangi bir farklılık yok. sadece dediğim gibi
      1- “ShiftRegisterPWM” nesnesi global olarak oluşturdu,
      2- register.interrupt(ShiftRegisterPWM::UpdateFrequency::SuperFast); “setup” fonksiyonu içinde çağırdı
      3- pine erişim sağlamayı ” register.set(7 – istenilenPin, deger); ” bu şekilde yaptı.
      rgb led ve pot ile denemesinde düzgün çalıştığını, pin değişmesi gibi herhangi bir sorun olmadığını belirtti.

      Beğen

    2. “Ayrıca loop() döngüsü içerisinde “ShiftRegisterPWM” nesnesinin oluşturulmasının doğru olmadığını (sakıncalı) arkadaş söyledi. ama nedendir bilmiyorum belki işlemleri yavaşlatıp, performansı vs etkiler.
      yani “ShiftRegisterPWM” nesnesi global olarak oluşturulmalı. (herhangi bir fonksiyon içerisinde olmayacak.)” kısmında yaptığın açıklama kesinlikle doğru.

      herhangi bir fonksiyon içerisinde ShiftRegisterPWM nesnesi oluşturusan eğer, bu fonksiyon her çalıştığında nesneyi yeniden tanımlamış oluyorsun. sanırım derleme sırasında da hata verebilir eğer setup() içerisinde bu nesne ile ilgili belirteçler kullandıysan. bu da işin diğer bir tarafı.

      “örneğin 3ncü pine erişim yapılmak istensin.
      o zaman ” register.set(7-3, deger); ” şeklinde olacak
      istenilen pin Qx -> register.set(7-x, deger);
      bunun 7nci pin istenildiği zaman bir şekilde entegrenin 0ncı pine komut geçtiği için olduğunu söyledi.” burada belirtilenin doğru olmadığını düşünüyorum.

      ShiftRegisterPWM.h kütüphane dosyasını açıp kodları incelediğimde, void set(pin_no, PWM değeri) fonsiyonu için açıklama kısmındaki ifadeye göre pin_no başlangıç değeri olarak 0(sıfır) giriliyor, kütüphanede ilgili kısımdaki açıklamada şöyle bir ifade kullanmış

      “@param pin The index of the pin (starting at 0). If multiple shift registers are chained, the first pin of the second shift register would be addressed with pin = 8.”

      dolayısı ile pin_no 0 = registerin 1 nolu çıkış pinini (Q1) ifade ediyor. yani hangi pine erişmek istiyorsan, pin_no olarak entegpin numarası-1 olarak hesaplayacağız. yani entegrenin 6. bacağı için 6-1=5 (pin_no=5) olacak. ben bu şekilde anladım

      Beğen

Yorum bırakın