Arduino ile Analog sinyal okuma ve PWM sinyal gönderme

Güncelleme 20/03/2020

Arduino ile LED yakmak için veya LED söndürmek için digitalWrite komutunu kullanabiliriz, butondan gelen bilgiyi okumak için veya dijital sensörden gelen bilgiyi okumak için digitalRead komutunu kullanabiliriz. Bütün bu uygulamalar dijital sinyallerle yapılmaktadır.

Digital sinyaller Evet ya da Hayır gibi sadece kesin sonuç verir. Dijital sinyalleri kullanarak bir LED’i yakıp – söndürebiliriz, bir motoru çalıştırıp – durdurabiliriz. Ama bir LED’in parlaklığını arttırıp azaltamayız, ya da bir motorun hızını arttırıp azaltamayız. Bunu yapabilmek için Analog sinyaller kullanılır.

dijital analog

Arduino ile Analog sinyaller gönderemeyiz ama Analog sinyalleri taklit eden Dijital sinyaller gönderebiliriz. Bu yönteme PWM (Pulse-Width Modulation) yöntemi denir. PWM sinyaller kare dalga sinyallerdir. Arduinonun çalışma gerilimi olan 5 Voltu belirli aralıklarla gönderip – keserek 5 Volttan daha küçük gerilimlerin elde edilmesi sağlanır. Bu yöntemle dijital sinyaller kullanılarak analog sinyaller taklit edilmiş olur.

PWM sinyalleri Arduinonun belirli pinlerinden gönderilebilir. Bu pinler Arduino Leonardo modelinde 3-5-6-9-10-11-13 nolu pinlerdir. Diğer modellerde de kartın üzerinde PWM sinyal gönderilebilen pinler belirtilmiştir.

Bu pinlerden analogWrite komutunu kullanarak Analog sinyalleri taklit eden PWM sinyaller gönderilebilir. analogWrite komutunu yazdıktan sonra parantez içinde PWM sinyalin gönderileceği pin numarası yazılır, virgülden sonra gönderilecek PWM sinyal değeri yazılır. PWM sinyal değeri 0 ile 255 arasında bir değer olmalıdır.

  • analogWrite(3,255) yazılırsa: Arduino 3.pininden tam güç verir (%100) yani 5Volt verir.
  • analogWrite(5,127) yazılırsa: Arduino 5.pininden yarım güç verir (%50) yani 2,5Volt verir.
  • analogWrite(6,63) yazılırsa: Arduino 6.pininden çeyrek güç verir (%25) yani 1,25Volt verir.

 

pwm

Bu yöntem sayesinde elektronik bileşenlere farklı değerlerde güç verilebilir.

analogRead komutu ise potansiyometre ve sensörler gibi elektronik bileşenlerden gelen analog sinyal değerlerini okumayı sağlar. Örneğin LDR (foto direnç) ortamdaki ışığı algılar ve analog değerlerde raporlar. Bizde analogRead komutuyla bu değerleri okuyabiliriz. Potansiyometre ayarlı bir dirençtir. Potansiyometreyi çevirdikçe geçmesine izin verdiği akım miktarı değişir. Potansiyometre üç bacaklı bir elemandır. En baştaki bacağı (+) ya, sondaki bacağı (-) ye, ortadaki bacağı ise Arduinonun ANALOG IN girişlerinden birine bağlanır. Bu uygulamada Arduinonun A0 girişini kullandık.

pot

PWM sinyal gönderebileceğimiz 3 nolu pine LED bağladık. 5 nolu pine BUZZER’in (+)ucunu bağladık. BUZZER sesli geri bildirim alınmak istenen projelerde kullanılır. Arduinodan gönderilen analog sinyal değerine göre ses şiddeti artıp azalan elektronik bir elemandır. İki ucu vardır. (-) ucu Arduinonun GND pinine, (+) ucu ise PWM sinyal göndereceğimiz pinine bağlanır.

buzzer

Arduino ile birlikte kullanılan birçok elektronik bileşen analog değerler raporlar. (potansiyometre, ısı sensörü, ışık sensörü, ses sensörü, basınç sensörü, analog çıkış veren mesafe sensörü gibi). Potansiyometrenin ürettiği analog değeri okumak için kullanılan yöntemi analog çıkış veren diğer bileşenler içinde kullanabilirsiniz. Örneğin sıcaklığı ölçerek alınan değerlere göre Arduinoya istenilen bir şey yaptırılabilir. Işık sensöründen faydalanarak ışığı takip eden bir robot yapılabilir.

Devre Şeması:

pot led buzzer

Arduino Programı:

/* "Analog sinyal okuma ve PWM sinyal gönderme" 
    Potansiyometreyi çevirdikçe LED’in parlaklığını 
    ve BUZZER’in ses şiddetini arttırıp azaltan program.
    diyot.net */
    
const int LED=3;  //3 nolu pini LED olarak isimlendir.
const int BUZZER=5; //5nolu pini BUZZER olarak isimlendir.
const int POT=A0; //A0 etiketli pini POT olarak isimlendir.

int konum;  //konum adında bir değişken tanımla.
int yenikonum;  //yenikonum adında bir değişken tanımla.

void setup() {
  pinMode(LED,OUTPUT);
  pinMode(BUZZER,OUTPUT);
  pinMode(POT,INPUT);
  
  Serial.begin(9600);
}

void loop() {
  konum = analogRead(A0);
  Serial.print("konum degeri=");
  Serial.println(konum);
  //potu çevirdikçe 0-1023 arasında değerler görüntülenir.
  yenikonum = map(konum,0,1023,0,255); 
  // 0-1023 aralığını 0-255 arasına daraltma işlemi yapılır.
  Serial.print("yeni konum degeri=");
  Serial.println(yenikonum);
  //potu çevirdikçe 0-255 arasında değerler görüntülenir.
  analogWrite(LED,yenikonum);
  //daraltılan konum değeri ile LED'e enerji verilir.
  analogWrite(BUZZER,yenikonum);
  //daraltılan konum değeri ile BUZZER'e enerji verilir.
  delay(50);
  }

Arduino programında 3 nolu pine LED bağlandığı için bu pini LED olarak isimlendirdik. 5 nolu pine buzzer bağlandığı için bu pini BUZZER olarak isimlendirdik. A0 pinine potansiyometre bağlandığı için bu pini de POT olarak isimlendirdik. Bu pinlerin yerlerini değiştirmeyi düşünmediğimiz için const int veri tipinde tanımladık.

analogRead komutuyla Arduinonun A0 girişine bağlanan potansiyometreden gelen analog sinyal okunur ve int veri tipinde tanımlanan “konum” değişkenine kaydedilir. analogRead komutuyla potansiyometreden 0 ile 1023 arasında bir sayı okunur. Bu sayı bize potansiyometrenin ne kadar çevrildiğini söyler. Bu analog değerler konum değişkenine kaydedilir. Eğer analog değer 1023 ise; potansiyometre bir yöne doğru tamamen çevrilmiş demektir. Analog değer 0 ise; tersi yöne tamamen çevrilmiş demektir. Bu değerleri daha net gözlemleyebilmek için Arduinonun seri port özelliğini kullandık. Bu özellik sayesinde potansiyometreden elde edilen analog değerler eş zamanlı olarak bilgisayardan takip edilebilir. Programı Arduinoya yükledikten sonra seri port ekranına tıklayarak değişen analog değerleri gözlemleyebilirsiniz.

void setup() kısmında pinMode komutlarıyla LED ve BUZZER’in bağlı olduğu pinler çıkış, potansiyometrenin bağlı olduğu pin giriş olarak ayarlanır. Serial.begin(9600) yazarak seri haberleşme başlatılır. Ardından void loop() kısmında Serial.println(…)yazarak raporlanmasını istediğimiz şey parantez içine yazılır. Serial.println(konum) yazılırsa potansiyometrenin ne kadar çevrildiğini gösteren konum değişkenine kaydedilen değerler bilgisayarda seri port ekranından eş zamanlı olarak görüntülenir. Raporlanan her değer için yeni satıra geçilir. delay(50) yazıldığı için pencere her 50msn de bir güncellenir. serial.println(…) komutu yerine serial.print(…) yazılırsa raporlanan değerler serial monitörde yan yana ve anlaşılamayacak şekilde görüntülenir. Ve delay(50) komutu yazılmazsa değerler takip edilemeyecek kadar çok hızlı akar.

PWM sinyal göndermek için analogWrite komutu kullanılır. Analog sinyal değeri olarak konum değişkenini kullandık. Analog sinyal değeri 0 ile 255 arasında olmak zorundadır. Konum değişkeninin sayısal aralığı ise 0 ile 1023 arasındadır. Konum değişkeninin sayısal aralığını 0 ile 255’e çekmek için map komutu kullanılır.

map komutu herhangi bir sayısal aralığı sizin istediğiniz sayısal aralığa dönüştürür. Daraltılan bu değerleri kaydetmek için int veri tipinde “yenikonum” isimli bir değişken tanımladık.
map komutunun kullanım şekli şöyledir:

Değişken = map(değişken,1,2,3,4)

1 yazan yere dönüştürülmek istenen değerin minimum değeri,
2 yerine dönüştürülmek istenen değerin maksimum değeri,
3 yerine dönüştürülecek değerin minimum değeri,
4 yerine dönüştürülecek değerin maksimum değeri yazılır.

yenikonum = map(konum,0,1023,0,255); yazılırsa 0’dan 1023’e kadar olan sayı aralığını 0’dan 255’e çevirme – daraltma işlemi yapılır. Serial.println(yenikonum); komutuyla bu yeni sayısal değerler seri port ekranından izlenebilir. map komutunu yazdıktan sonra potansiyometreyi sonuna kadar çevirdiğimizde seri port ekranında yenikonum değeri 255, başa getirdiğimizde 0 olarak raporlandığı gözlemlenir.

Bu yeni sayısal değerlere göre LED’e ve BUZZER’a enerji verebilir, Potansiyometreyi çevirdikçe LED’in parlaklığını ve BUZZER’in ses şiddetini arttırıp azaltabiliriz.

analogWrite(LED,yenikonum); yazarak 3.pine bağlanan LED’in parlaklığını,
analogWrite(BUZZER,yenikonum); yazarak 5.pine bağlanan BUZZER’in ses şiddetini potansiyometre ile kontrol ettik.

Yazar: Ali Celal

5f59ca35fd9ac7f00cde62f0b0cd0d07?s=90&d=blank&r=g- Elektronik Mühendisi
- E.Ü. Tıp Fakültesi Kalibrasyon Sorumlusu Test kontrol ve kalibrasyon sorumlu müdürü (Sağ.Bak. ÜTS)
- X-Işınlı Görüntüleme Sistemleri Test Kontrol ve Kalibrasyon Uzmanı (Sağ.Bak.)
- Usta Öğretici (MEB)
- Hatalı veya kaldırılmasını istediğiniz sayfaları diyot.net@gmail.com bildirin