Eğitim Şart

Taşı delen suyun şiddeti değil sürekliliğidir!…

Arduino İle Kum Saati… Kendimiz yaptık!

Bundan önceki projede Çin’den aldığım bir hazır devre yapmıştık: Elektronik Kum Saati. Bu devre 5 Volt ile beslenen, açma/kapama anahtarı, hız belirleyen bir buton ve besleme için bir dişi soket dışında sadece bir mikro denetleyici ve LED’lerden (57 adet)oluşuyordu. İlk defa bir hazır devre montajı gerçekleştirdik. Aslında “kendin yap” diyenlerdeniz! Devrenin nasıl çalıştığını inceleyip “neden kendimiz yamıyoruz?”dedim. Bu arada devre yapıldığının ertesi günü saçmalamaya başladı 🙂

IMG_20190419_163636
Çin’den aldığım Hazır Kit’in montajlanmış hali

Neyse devreye şöyle bir göz atalım. Mikrodenetleyicinin yanında bulunan 3 sıra LED’in altında ve ve üstünde üçgen şeklinde sıralanmış LED’ler var. Ortadaki tek sıra olan üç LED yukarıdan aşağıya yanıp sönerek bir akışı andırıyor. Bunun dışında olan olay da, yukarıdaki LED’lerin en üst sıradan başlamak kaydı ile birer birer sönmesi, ve yukardan sönen her LED için aşağıda en alt sıradan başlamak kaydı ile birer birer yanması. Bu senaryo Arduino ile kolayca yapılabilir diye düşündüm. Tek sıkıntım, LED sayısının artması Arduino’nun giriş/çıkış bacaklarının sayısı için bir problem teşkil edip etmeyeceği idi. İlginç bir çözüm aklıma geldi. Tek bir çıkış pini ile hem yanan, hem de sönene LED’i kontrol edebilecektim!

LED’lerin çalışma gerilimi 2 volt civarında. Bizim dijital çıkışlarımız ise yaklaşık 5 volt. O zaman ortada alınan bir referans ile bir pin hem HIGH iken, hem de LOW iken bir LED’i yakabilirdi. Bunun için pwm çıkışlardan birini (10) tam HIGH ile LOW arasında bir gerilime ayarladım, yani yaklaşık 2.5 volt. Bunun için kod:

analogWrite (10, 127);

oldu. Arduino çıkış pinleri 8 bit olduğundan çıkış değeri 0-255 arasında olabiliyor(2^^8=256). analogWrite konutu ile 10 numaralı çıkışı 127’ye yani tam orta değere ayarladım. Ve bu fikir çalıştı da. Sonra LED’leri birbirleriyle ters yönde paralel bağlayıp, bir ucu kontrol ettiğim pine, diğer ucu da bu pwm pinine(10) bağladım. Hatta araya 220Ω direnç ekleyerek.

pwm-1
LED’lerin Arduino Bağlantıları

Yukarıdaki resimde karışıklık olmasın diye sadece 5 ve 6 numaralı pinlere olan bağlantı gösterilmiştir. Bu prototipte ben 7 ve 8 numaralı bacaklara da aynı bağlantıyı yaptım. Buna göre 5 numaralı bacak HIGH iken ikilinin sağındaki LED yanarken, bacak LOW olduğunda ise ikilinin solunda LED yanıyor. Aynı durum 6, 7 ve 8 numaralı çıkışlar için de geçerli. Böylelikle bir çıkışla LED’ söndürmek demek aslında başka bir LED’i yakmak demek.(Anlıyorsunuz; üstten sönen her bir LED için aşağıda bir LED yanıyor).

Ortada bulunan ve aşağı akış hissi veren 3 adet LED’i de 2,3 ve 4. çıkışlara bağladım. Bunların yanmasını sağlamak için:

for (int l=2; l<5; l++)
{
digitalWrite (l,HIGH);
delay (time);
digitalWrite (l,LOW);
}

Bu kadar kod yeterli oldu. Bu arada akış hızını belirlemek için ‘time’ isimli bir değişken atandı. Bu değişkenin değeri de bir potansiyometre(10k) ile ayarlanabiliyor. Potansiyometre A0 bacağına bağlandı(diğer uçları da GND ve 5V pinlerine bağlandı). Manuel yaptığım denemelerde time değeri 50-500 (ms) arasında iken güzel görüntü elde ettiğim için, potansiyometre bu sınırlar arasında çalışıyor.

int okunan =analogRead (A0);
time = map (okunan, 0, 1023, 50, 500);

map komutu ile 0-5 volt arası (0-1023 olarak) “okunan” değer 50-500 arasında bir değere dönüştürülüyor.

Programın genel algoritması ise; İlk başta üst gruptaki tüm LED’ler yanıyor. Ortadaki LED’lerin her bir akışından sonra, yukarıdan bir LED sönüyor ve aşağıda bir LED yanıyor. Tüm LED’lerin sönmesinden sonra sonra ise tekrar başa dönerek aynı işlem tekrar ediyor. Bu devreyi daha çok LED ile delikli pertinak üzerinde gerçekleştirdiğimde yine yayınlarım. Kod çok kısa!…

int time;
void setup() {
for (int i=2; i<10; i++)
     {
     pinMode (i, OUTPUT);
     }
analogWrite (10, 127);
}
void loop()
{
int okunan =analogRead (A0);
time = map (okunan, 0, 1023, 50, 500);

for (int i=5; i<10; i++)
      {
      digitalWrite (i,HIGH);
      }
for (int k=5; k<10; k++)
      {
          for (int l=2; l<5; l++)
          {
          digitalWrite (l,HIGH);
          delay (time);
          digitalWrite (l,LOW);
          }
        digitalWrite (k,LOW);
        delay (time);
       }
  }

Bu arada devre şemasının tamamı aşağıda verilmiştir. LED numaraları her bir sönen LED’e (A uzantılı) karşılık gelen yanan LED (B uzantılı) aynı numara ile gösterilmiştir. Kablo renkleri de sönen/yanan LED’leri ayırt etmeye yardımcı olacaktır.

devre şeması
Kum Saati Devre Şeması

Sıradaki projede görüşmek dileklerimle…

%d blogcu bunu beğendi: