Bu aralar gömülü sistemlerle yine kafa patlatıyorum, malumunuz. Elektronik işleri bazen insanın kafasını dağıtıyor ama bir yandan da böyle ince ince detayları halletmek keyifli oluyor, ne yalan söyleyeyim. Geçenlerde bir projede LED’lerin parlaklığını ayarlamam gerekti. Hani böyle tam karanlık bir ortamda göz alan bir ışık değil de, daha yumuşak, ortama uygun bir aydınlatma lazım ya, işte tam da o hesap. İlk aklıma gelen şey tabi ki PWM oldu. PWM’in ne olduğunu az çok bilenler için ne kadar işe yarar bir şey olduğunu tahmin ediyordur. Eğer bilmiyorsanız da merak etmeyin, birazdan detaylarına gireceğiz zaten.
PWM, yani Pulse Width Modulation, Türkçesiyle Darbe Genişlik Modülasyonu. Basitçe anlatmak gerekirse, bir sinyalin açık ve kapalı kalma sürelerini ayarlayarak ortalama gücü kontrol etme yöntemi. Elektrik devrelerinde, özellikle de motorların hızını veya LED’lerin parlaklığını ayarlamak için çok sık kullanılır. Mesela bir LED’i düşünün. Sürekli tam parlaklıkta yanmak yerine, çok kısa aralıklarla yanıp sönüyor ama bu o kadar hızlı oluyor ki gözümüz bunu algılayamıyor. İşte bu yanıp sönme süresini ayarlayarak LED’in ne kadar parlak göründüğünü kontrol edebiliyoruz. Ne güzel değil mi?
Peki bu işi nasıl yapacağız? Genellikle mikrokontrolcülerle, yani Arduino gibi kartlarla bu işi yapmak çok kolay. Mikrokontrolcülerde PWM çıkışı veren pinler bulunur ve bu pinlere belirli komutlar göndererek istediğimiz parlaklık seviyesini ayarlayabiliriz. Mesela Arduino UNO’da 3, 5, 6, 9, 10, 11 numaralı pinler PWM çıkışı verebilir. Bu pinleri kullanarak LED’in parlaklığını 0 ile 255 arasında bir değerle kontrol edebilirsiniz. 0 demek tamamen kapalı, 255 demek de tam parlaklık demek oluyor.
Bu arada, bu parlaklık ayarını yaparken dikkat edilmesi gereken birkaç şey var tabi. Birincisi, kullandığınız LED’in maksimum akım değerini aşmamak. Eğer fazla akım verirseniz LED yanabilir, ki bu hiç hoş olmaz. Genelde LED’lerin önüne bir direnç koyarak akımı sınırlarız. Bu direncin değerini hesaplarken LED’in çalışma voltajını, akımını ve mikrokontrolcünün PWM çıkış voltajını göz önünde bulundurmak gerekiyor. İnternette bunun için hazır hesaplayıcılar da bulabilirsiniz, ben de genelde oradan bakıyorum. Mesela şöyle bir arama yapabilirsiniz: LED direnç hesaplama. Bu tür basit hesaplarla devreye zarar vermemiş olursunuz.
İkinci dikkat etmeniz gereken nokta ise, PWM sinyalinin frekansı. Yüksek frekanslarda LED daha sürekli yanıyormuş gibi görünürken, düşük frekanslarda titreme daha belirgin olabilir. Genelde Arduino’nun varsayılan PWM frekansı çoğu uygulama için yeterlidir ama bazı hassas işler için bu frekansı değiştirmek gerekebilir. Gerçi çoğu zaman default ayarlarla da işimizi görüyoruz, öyle çok detayına girmeye gerek kalmıyor bana göre.
Şimdi gelelim işin kod kısmına. Basit bir Arduino koduyla bu işi nasıl yaparız ona bakalım. Diyelim ki LED’i 9. pine bağladık ve parlaklığını kontrol etmek istiyoruz. İşte kodumuz şöyle bir şey oluyor;
// YANLIŞ KOD ÖRNEĞİ: Sadece tek bir parlaklık seviyesi ayarlıyor. // Bu kodda parlaklık ayarlanamaz, LED hep aynı yasar. const int ledPin = 9; // LED'in bağlı olduğu pinvoid setup() { pinMode(ledPin, OUTPUT); // LED pinini çıkış olarak ayarla }
void loop() { // LED'i tam parlaklıkta yak analogWrite(ledPin, 255); delay(1000); // 1 saniye bekle // LED'i kapat analogWrite(ledPin, 0); delay(1000); // 1 saniye bekle }
Yukarıdaki kodda gördüğünüz gibi, LED’i sadece açıp kapatıyoruz. Parlaklık ayarı yok. Bu işe yaramaz tabi bizim istediğimiz gibi. Şimdi gelelim doğru, yani bizim istediğimiz gibi çalışan koda. Burada bir döngü kurup parlaklığı adım adım artırıp sonra azaltacağız. Böylece LED’in yanıp söndüğünü daha net görebiliriz, hatta bu titremeyi de izleyebiliriz 🙂
İşte daha işlevsel olan, parlaklığı ayarlayabildiğimiz kodumuz:
// DOĞRU KOD ÖRNEĞİ: Parlaklık adım adım ayarlanıyor. const int ledPin = 9; // LED'in bağlı olduğu pinvoid setup() { pinMode(ledPin, OUTPUT); // LED pinini çıkış olarak ayarla }
void loop() { // Parlaklığı 0'dan 255'e kadar artır for (int parlaklik = 0; parlaklik <= 255; parlaklik += 5) { analogWrite(ledPin, parlaklik); // LED'in parlaklığını ayarla delay(30); // Küçük bir gecikme ile daha akıcı bir geçiş sağla }
// Parlaklığı 255'ten 0'a kadar azalt for (int parlaklik = 255; parlaklik >= 0; parlaklik -= 5) { analogWrite(ledPin, parlaklik); // LED'in parlaklığını ayarla delay(30); // Küçük bir gecikme ile daha akıcı bir geçiş sağla } // Döngüyü tekrar etmeden önce kısa bir bekleme delay(500); }
Bu kodla LED’in parlaklığı yavaş yavaş artacak, tam parlaklığa ulaşıp sonra tekrar yavaş yavaş azalacak. Bu döngü sürekli devam edecek. Böylece LED’in farklı parlaklık seviyelerindeki görünümünü deneyebilirsiniz. Deneyin bakalım, hoşunuza gidecek mi? 🙂 Bu arada, bu tarz kodları daha da geliştirebilirsiniz. Mesela bir potansiyometre (ayar düğmesi) bağlayıp parlaklığı elle ayarlayabilirsiniz. Veya bir seri haberleşme ile bilgisayardan komut göndererek parlaklığı kontrol edebilirsiniz. O zaman işler daha da eğlenceli hale geliyor tabi.
Neticede, PWM ile LED parlaklık kontrolü hem çok kolay hem de çok işe yarar bir teknik. Elektronik projelerinizde farklı efektler yaratmak veya sadece daha hoş bir aydınlatma elde etmek için bu yöntemi rahatlıkla kullanabilirsiniz. Önemli olan doğru bağlantıları yapmak ve kodunuza dikkat etmek. Zaten en basit devresi bile oldukça tatmin edici sonuçlar verebiliyor. İnternette bu konuyla ilgili çok sayıda kaynak bulabilirsiniz, Arduino PWM LED parlaklık diye aratırsanız bolca video ve makale çıkar karşınıza.
Bu arada, geçenlerde bir arkadaşımın projesinde bu tekniği kullanmıştım, gerçekten de ortamın havasını değiştirdi. Küçük bir detay ama büyük fark yaratıyor. İnanın ki, bazen en basit çözümler en etkili olanlarıdır. Neyse efendim, siz de deneyin, görün bakalım nasıl olacak.
Sonuç olarak, PWM gerçekten de gömülü sistemlerin temel taşlarından biri. Sadece LED parlaklığı değil, motor kontrolünden ses üretimine kadar pek çok alanda karşımıza çıkıyor. Bu yüzden bu konuya biraz hakim olmak, ileride yapacağınız projelerde size büyük kolaylık sağlayacaktır. Unutmayın, her büyük proje küçük adımlarla başlar.
Şimdi bu kodları bir deneyin bakalım. Belki bir masanın üzerine küçük bir gece lambası yaparsınız, kim bilir? Ya da bir hobi projesinde kullanırsınız. Ben şahsen böyle küçük ama etkili şeyleri seviyorum. Hem pratik hem de öğretici oluyor. Bu arada, bu yazıyı yazarken aklıma geldi, bir ara da motor hız kontrolüyle ilgili bir şeyler yazabilirim sanırım. PWM motorlarda da aynı mantıkla çalışıyor çünkü.
Umarım bu yazı size faydalı olmuştur. Eğer sorularınız olursa çekinmeden sorun, elimden geldiğince yardımcı olmaya çalışırım. Teknik detaylarda bazen kafalar karışabilir, bu çok normal. Önemli olan denemeye devam etmek. Hadi bakalım, kolay gelsin!