PWM Çıkışı ile LED Kontrolü

Blink ve Blink Pattern uygulamaları ile LED’in yanmasını veya sönmesini sağladık. Bunun için dijital çıkış kullandık. Dijital işlemlerde 0 ve 1 değerleri söz konusudur. Yani LED ya açıktır ya da kapalıdır. Aradaki değerler yok sayılır. Peki LED’in yavaş yavaş yanması veya yavaş yavaş sönmesini istiyorsak ne yapmamız gerekiyor? Bu gibi durumlarda analog çıkış üretmemiz gerekiyor. Analog çıkış ile LED’in yanması ve sönmesi yavaş yavaş gerçekleşir. Bu duruma Fade LED denir. Fade LED uygulaması için PWM tekniğini kullanacağız.

Bu uygulamada PWM çıkışını kullanarak LED’e analog değer göndermeyi sağlayacağız. Öncelikle PWM’den bahsetmekte fayda var. Pulse Width Modulation (Darbe Genişliği Modülasyonu) veya PWM, dijital yollarla analog sonuçlar elde etmek için kullanılan bir tekniktir. Dijital kontrol, açık ve kapalı değerler arasında kare dalga oluşturmak için kullanılır. Bu açma-kapama modeli, sinyalin harcadığı süreye karşılık sinyalin harcadığı zamanın kısmını değiştirerek açık (5 Volt) ve kapalı (0 Volt) arasında gerilimleri simüle etmeyi sağlar. Böyle bir yapıda analog değer üretmek için darbe genişliğini değiştirmek yeterlidir.

Aşağıda verilen grafikte PWM ile analog sonuçların nasıl elde edildiğini görebilirsiniz.

Grafikte gösterilen yeşil çizgiler zamanı temsil etmektedir. Arduino’nun PWM frekansı yaklaşık 500Hz’dir. Yeşil çizgilerin her biri 2 milisaniyeyi temsil etmektedir. Ayrıca analogWrite() ile PWM pinlerine 0 ile 255 arasında değer gönderilmektedir. Örneğin analogWrite(255) ifadesi LED’in tam parlaklığını sağlarken, analogWrite(127) ifadesi LED’in yarı parlaklığını sağlar. 0 ile 255 arasındaki değerleri kullanarak LED’in yavaş yavaş parlayıp sönmesini sağlayabiliriz. Tabi PWM ile sadece LED’leri değil aynı zamanda servo motorları da kontrol edebiliriz. Yani özetle dijital yollarla analog sonuçlar üretmenin en iyi yolu PWM’dir.

Bu uygulama için ihtiyacımız olan devre elemanları şunlardır:

  • LED x 1
  • Direnç (330 Ohm) x 1

Bu bileşenleri temin ettikten sonra devremizi aşağıdaki gibi oluşturalım.

Yukarıda görülen devrede bağlantı işlemi aşağıdaki gibi yapılmıştır.

  • LED’in Anot yani (+) bacağı 9 nolu (PWM çıkışı olarak kullanılır) dijital pine bağlandı.

Arduino UNO’da 14 adet dijital giriş/çıkış pini bulunmaktadır. Bunlardan 6 tanesi PWM çıkışı olarak kullanılmaktadır. PWM pinleri ~ simgesi ile belirtilmiştir. Bunlar; 3, 5, 6, 9, 10 ve 11 nolu pinlerdir.

Devremizin kodu aşağıdaki gibidir.


int ledPin = 9;
int brightnessLed = 0;
int fade = 5;

void setup() {

}

void loop() {

analogWrite(ledPin, brightnessLed);
brightnessLed = brightnessLed + fade;

if (brightnessLed <= 0 || brightnessLed >= 255) {
       fade = -fade;
       delay(30);
}

Kodların açıklaması aşağıdaki gibidir.


int ledPin = 9;
int brightnessLed = 0;
int fade = 5;

ledPin değişkenine LED’in bağlı olduğu PWM pininin sayısal değerini atadık. LED, 9 nolu pine bağlı olduğundan buraya 9 değerini verdik.

brightnessLed değişkeni, LED’in parlaklığını temsil etmektedir. Kod yüklendikten sonra başlangıçta LED’in sönük olmasını istediğimizden buraya sıfır değerini verdik.

fade değişkeni, LED’in parlaklığının zaman içinde ne kadar değişeceğini tanımlar. Burada 5 değerini verdik.


analogWrite(ledPin, brightnessLed);

analogWrite() komutu pine analog değer (PWM dalgası) yazmayı sağlar. Değişen aralıklarda bir LED’i yakmak veya çeşitli hızlarda bir motoru döndürmek için bu komut kullanılır. Bu komut iki parametre almaktadır:

  • Pin, analog değerin yazılacağı pin bilgisi,
  • Value, görev döngüsü olarak ifade edilen bu parametre 0 (kapalı) ile 255 (açık) arasında değer alır. 0 değeri 0V’u, 255 değeri ise 5V’u temsil etmektedir.

0 – 255 ve 0V – 5V arasındaki ilişki aşağıdaki gibidir:

 

Yukarıda görüleceği üzere her bir PWM değerine karşılık üretilen bir Volt değeri bulunmaktadır.


brightnessLed = brightnessLed + fade; 

LED’in parlaklığı (brightnessLed) başlangıçta 0 olarak belirlenmiştir. Parlaklığı arttırmak için fade değişkeninde bulunan değeri kullanıyoruz. Burada amacımız sıfırdan başlayan parlaklık değerini beşer beşer arttırarak LED’in parlaklığını 255 değerine çıkarmaktır.


if (brightnessLed <= 0 || brightnessLed >= 255) {
   fade = -fade;
}

Yukarıda LED’in parlaklığı kontrol edilmektedir. Eğer parlaklık değeri 255’ten büyük veya 0’dan küçük ise fade değişkeninin içinde bulunan değerin işareti değiştirilir. Bu kodun amacı LED tamamen parlak ise yavaş yavaş söndürmek, LED tamamen sönük ise yavaş yavaş parlatmayı sağlamaktır.


delay(30);

delay komutu ile LED’e gönderilen analog değerden sonra 30 milisaniye kadar programın beklemesi sağlanır.

Bu uygulama için yukarıdaki kodu kullanarak LED’in parlaklığını ayarlayabilirsiniz. Ancak aynı işlemi aşağıda verilen kodlar ile de yapabilirsiniz. Aynı işlemi yapan iki kodu vermemin sebebi bakış açınızı değiştirmek ve ezbere kaçmanızı engellemektir. Aşağıda verilen kodları Arduino IDE ortamındaki örneklerden edinebilirsiniz.

int ledPin = 9;
void setup() {

}

void loop() { 

for (int fade = 0 ; fade <= 255; fade += 5) { 
   analogWrite(ledPin, fade);
   delay(30);
}

for (int fade = 255 ; fade >= 0; fade -= 5) {
   analogWrite(ledPin, fade);
   delay(30);
}

}

Burada iki adet for döngüsü bulunmaktadır. Bu döngüleri sırasıyla açıklayalım.


for (int fade = 0 ; fade <= 255; fade += 5) {
   analogWrite(ledPin, fade);
   delay(30);
}

Yukarıda verilen for döngüsünde LED’in yavaş yavaş parlaması sağlanır. Bunun için fade isimli bir değişken tanımladık ve sıfır değerini başlangıç olarak atadık. Değişken değeri her döngüde beşer arttırılarak 255 değerine ulaşılması sağlanır. 255 değeri ile birlikte LED maksimum parlaklığa ulaşır.


for (int fade = 255 ; fade >= 0; fade -= 5) {
   analogWrite(ledPin, fade);
   delay(30);
}

Yukarıda verilen for döngüsünde LED’in yavaş yavaş sönmesi sağlanır. Bunun için fade isimli bir değişken tanımladık ve 255 değerini başlangıç olarak atadık. Değişken değeri her döngüde beşer azaltılarak sıfır değerine ulaşılması sağlanır. 0 değeri ile birlikte LED’in tamamen sönmesi sağlanır.

NOT: Her iki uygulamada dikkat edilirse setup metodunda herhangi bir işlem yapmadık. Ayrıca setup içinde 9 nolu pini OUTPUT yani çıkış olarak yapılandırmadık. Çünkü PWM pinleri çıkış pinleri olarak önceden yapılandırılmıştır.

Bu uygulama hakkında ayrıntılı bilgiler edinmek için kanalımda yayınladığım şu videoyu izlemenizi tavsiye ediyorum.