ARDUINO DERS 7

LDR VE IŞIK


BU DERSTE NELER ÖĞRENECEĞİZ?

Bu derste,

  • LDR sensörünün ne olduğunu ve nasıl çalıştığını,
  • LDR’la ışık şiddetini ölçerken kullandığımız devreyi,
  • Arduino’nun analog portlarını kullanmayı
  • Analog veri okumayı ve
  • if-else koşullu ifadelerini
öğreneceğiz.

Bu derste, Arduino kullanarak, karanlık olduğunda bir LED’i yakan ve aydınlık olduğunda ise söndüren bir devre yapıyoruz. İlk olarak, LDR’ın ne olduğu ile başlıyoruz. Daha sonra ise, LDR ile kuracağımız devreyi inceliyoruz. Son olarak da, Arduino içerisine atacağımız programın kodlarını oluşturuyoruz.

 

GEREKLİ MALZEMELER

Öncelikle, bu derste hangi malzemeleri kullanacağımızı görelim.

 
 
Arduino Uno R3 1 Adet 10mm LDR 1 Adet Kırmızı LED 1 Adet 150Ω Direnç 1 Adet 10kΩ Direnç Bağlantı Kabloları (Jumper) Devre Tahtası (Breadboard)
Arduino Uno 10mm LDR Kırmızı LED 150Ohm Direnç 10kOhm Direnç Jumper Breadboard
 

LDR NEDİR?

LDR, İngilizce “Light Dependent Resistor” (yani, ışığa bağlı direnç) isminin kısaltmasıdır. LDR için Fotodirenç (photoresistor) ismi de kullanılır. LDR’nin en önemli özelliği, ortamdaki ışığın şiddetine göre direncinin değişmesidir. Bu sayede, ortam ışığını ölçmeye veya tespit etmeye yarayan bir sensör olarak kullanılabilir.

5mm-10mm LDR

Piyasada 5mm ve 10mm boylarında LDR’larla karşılaşabilirsiniz. Her ikisinin de fiyatı oldukça uygun. Farklı boyutlardaki bu LDR’lerin aynı ışık altındaki dirençleri birbirlerinden farklı. Devrenizde daha düşük direnç değerleri ile çalışmak istiyorsanız 10mm LDR’lerden kullanabilirsiniz.

Bu iki LDR türü için yaptığımız kaba ölçümlerde aşağıdaki direnç değerlerini elde ediyoruz.

 
5mm LDR 10mm LDR
Güneş altında 100Ω 50Ω
Gölgede 1kΩ 500Ω
Loş ışıkta 12kΩ 10kΩ

Tablo 1-LDR direnci

 

Görüldüğü gibi, ortamdaki ışık seviyesi azaldıkça LDR’nin direnci artıyor. Karanlıkta ise bu direnç MegaOhm’lar düzeyine çıkıyor.

Loş ışık, karanlık gibi kavramlar öznel olduğundan, kendi ölçümleriniz bizimkilerden biraz farklı olabilir.

LDR Devresi

Yukarıdaki tablolarda ortamdaki ışık miktarına göre LDR direncinin nasıl değiştiğini gördük. Eğer, Arduino’da direk olarak direnç ölçebileceğimiz bir port veya özellik olsaydı, LDR’ı bu porta bağlar, ölçümü yapar ve ortamdaki ışık şiddetini tahmin edebilirdik. Fakat, maalesef Arduino’da böyle bir port veya özellik yok. Ama neyseki, voltaj değerlerini okuyabilen analog portlar mevcut. Analog bir porttan LDR direncini tahmin edebilmemiz için, LDR’ın direncine bağlı olarak çıkış voltajı değişen bir devre kurmamız gerekiyor. Bunun en kolay yolu ise, LDR’a seri bir sabit direnç (R) bağlayarak, aşağıdaki gibi bir voltaj bölücü oluşturmaktır.

Voltaj bölücü

Bu devrede, LDR ve R aynı tel üzerinde olduğundan, üzerlerinden eşit miktarda akım geçer. Eğer LDR’nin direncine ... dersek, bu akımı

...

olarak buluruz. Bu durumda, ... ile gösterilen noktadaki voltaj

...

olur. Ortamdaki ışık şiddeti arttıkça, LDR direnci düşer ve yukarıdaki formüle göre ...’nin düşmesi ...’nin artması anlamına gelir. Yani, ışık şiddeti artınca ... artar, ortam karanlıklaşınca ise ( ... artacağından) ... düşer. Aşağıdaki grafikte ... için ... değerindeki değişimleri görebiliriz.

I-V grafiği

Şimdi, yukarıda kurduğumuz devrenin Arduino ile bağlantısını yapalım. 5V ve toprak için Arduino üzerindeki çıkışları kullanıyoruz. ... voltajını ölçebilmek için ise, dirençlerin birleşme noktasını A0 portuna bağlıyoruz. Aslında, böyle bir bağlantı yaparak (A0’a doğru da bir akım oluşacağından) ilk devrenin voltaj bölücü özelliğini ortadan kaldırmış oluyoruz. Fakat, bir port giriş durumundayken iç direnci çok yüksektir. Bu da, A0’a doğru olan akımın çok küçük olacağı anlamına geldiğinden, devrenin halen voltaj bölücü gibi hareket ettiğini düşünebiliriz.

LDR devresi

Son olarak, R için bir değer seçmemiz gerekiyor. Bu değer tamamen LED’in ne düzeyde karanlık olan bir ortamda yanmasını istediğimizle ilintili. Eğer, LED’in tam yanıp yanmama sınırında olduğunu düşündüğünüz bir ışık seviyesinde, kullanacağımız LDR’ın direncini ölçersek işlerimiz oldukça kolaylaşacaktır. Biz, 10mm LDR’nin yaklaşık 10kOhm dirence sahip olduğu ışık şiddetini sınır olarak belirliyoruz.

Eğer yukarıdaki formülde bu değeri yerine koyarsak, A0’daki voltaj

...

olur. Yani, ... için seçtiğimiz değere göre sınır noktamızdaki voltaj da değişecektir. Eğer ... için ... değerini seçersek, yukarıdaki formüle göre LED’in yanıp yanmama sınırında ... oluyor.

Seçtiğimiz değerlere göre, Arduino ile ... direncini ölçüp, belirlediğimiz ... sınırından düşük olduğu durumlarda LED’i yakıp, ...’tan yüksek değerlerde söndürmemiz gerekiyor.

LED’i yakıp söndürmek için, 2 numaralı dijital portu kullanıyoruz ve üzerinden ... akım geçmesini istediğimizden, önceki derslerde olduğu gibi ...’luk bir direnci LED’e seri olarak bağlıyoruz.

Aşağıda, kurulmuş gerçek devreyi görebilirsiniz.

LDR gerçek devre

Analog Portlar

LDR devresinden gelen voltajı ölçebilmek için, Arduino’nun analog portlarını kullanıyoruz.

Arduino analog port

Analog portlar sol tarafta, yanında A0, A1, A2, A3, A4 ve A5 yazan portlar. Sağ taraftakiler ise hatırlayacağınız gibi dijital olan portlar.

Dijital portlar için belli bir eşik voltaj değerimiz var. Eğer gelen voltaj eşik değerini geçiyorsa Arduino bunu 1, eğer eşik değerinin altındaysa 0 olarak algılar. Bu nedenle, 0V ile 5V arasında gelen voltaj değerini dijital bir port ile algılayamayız.

Analog portlar 0V ile 5V arasını 1024 eşit aralığa böler ve gelen voltajın bu aralıklardan hangisinde olduğunu anlayabilir. Bu sayede, yaklaşık da olsa, gelen voltajın değerini ölçebiliyoruz.

Arduino’nun mikrodenetleyicisinde ADC (Analog to Digital Converter) isminde bir ünite bulunmakta. ADC ünitesi 0V ile 5V arasını 1024 eşit parçaya bölüyor. En düşüğü 0’a ve en yükseği 1023’e karşılık gelecek şekilde her bir parçaya bir numara veriyor. Gelen voltajın kaç numaralı aralıkta olduğunu bulup, hafızaya çıkış olarak bu sayıyı gönderiyor. Örneğin, ADC’den 0 gelmesi, gelen analog voltajın 0V olduğunu, 512 gelmesi analog voltajımızın 2.5V olduğunu ve 1023 gelmesi analog voltajın 5V olduğunu gösteriyor. Biz de, ADC’nin hafızada oluşturduğu sayıya bakarak ölçülen voltajın ne olduğunu tahmin edebiliyoruz.

Analog to digital converter

Kısacası, analog porttan voltaj ölçtüğümüzde karşımıza direk olarak 2.34V, 3.82V gibi değerler çıkmıyor. Bunun yerine 0 ile 1023 arasında bir sayı elde ediyoruz.

Ama basit bir oranlamayla, ADC’den gelen sayıya göre voltaj değerini tahmin edebiliriz. Bu tahminde, aşağıdaki formülü kullanabiliriz.

Analog voltaj =(ADC sayısı)×4.88mV

Örneğin, ADC’den 100 sayısı geliyorsa, bu analog voltajımızın yaklaşık olarak 100×4,88mV=488mV=0.488V olduğunu gösteriyor. 500 sayısı ise 500×4.88mV= 2.44V analog girişimizin olduğunu gösteriyor.

ADC’den gelen 0-1023 arasındaki sayıyı okumak ise oldukça kolay. Arduino yazılımdaki analogRead() komutu tam olarak bu işe yarıyor.

analogRead komutu

analogRead komutu sadece 1 adet parametre alıyor, o da, analog port numarası. Komutların parametreleri önceki derslerden hatırlayacağınız gibi parantez içerisinde yazılıyor. Örneğin, analogRead(1) komutu A1’deki, analogRead(5) ise A5’teki voltajı okuyor. Bu okumanın sonunda 0 ile 1023 arasında bir tamsayı veriyor.

PROGRAM

Bu derste son olarak, Arduino’ya yükleyeceğimiz programı yazıyoruz. Bu uygulamanın kodları oldukça kısa.

int led=2;

// LED'in bağlı olduğu portu tanımla

void setup() {

pinMode(led, OUTPUT);//LED’in bağlı olduğu portu çıkış yap

}

 

void loop() {

if(analogRead(0)<512){//Eğer A0’a gelen voltaj 2.5V’tan küçükse

digitalWrite(led, HIGH); // LED'i yak

}

else{//A0’a gelen voltaj 2.5V’tan büyükse

digitalWrite(led, LOW); // LED'i söndür

}

}

LED’i 2 numaralı dijital porta bağladığımız ve daha sonraki satırlarda 2 yerine daha anlamlı bir isim kullanalım diye, ilk satırda 2 sayısına led ismini veriyoruz.

setup

setup fonksiyonu içerisinde LED’in bağlı olduğu dijital portu çıkış haline getiriyoruz.

loop

loop fonksiyonu içerisinde daha önceki derslerde görmediğimiz bir yapıyla karşılaşıyoruz.

if(analogRead(0)<512){

 

}

else{

 

}

Bu yapıya, koşullu ifade ismini veriyoruz. Bu koşullu ifade içerisinde iki anahtar kelimemiz var: if (Türkçesi: eğer) ve else (Türkçesi: değilse)

İlk satırda gördüğümüz if anahtar kelimesi, kendisinden hemen sonra gelen paranteze yazılmış ifadenin doğru olup olmadığını kontrol ediyor. Eğer parantez içindeki ifade doğruysa, if’in altına küme işaretleri arasına yazılan komut dizisi işleniyor. Eğer ifade yanlışsa, bu komutlar işlenmiyor, göz ardı ediliyor. Bu programda if’in yanındaki parantezin içerisinde analogRead(0)<512 ifadesini görüyoruz. analogRead(0), A0 analog portundan okunan voltaj değerine göre 0 ile 1023 arasında bir sayı veriyor. Eğer bu sayı 512’den küçükse bu, gelen voltajın 2.5V’tan küçük olduğunu gösteriyor. if’in yanındaki parantezin içerisindeki ifadenin doğru olması, A0’dan gelen voltajın 2.5V’tan küçük olması anlamına geliyor. Bu ifade doğruysa if’in küme işaretleri arasında kalan

digitalWrite(led, HIGH); // LED'i yak

komutu işleniyor. Bu komut ise, 2 numaralı porta bağladığımız LED’in yanmasını sağlıyor. Kısacası, eğer A0’a gelen voltaj 2.5V’un altındaysa, LED yakılıyor.

if’den sonraki anahtar kelimemiz ise else. else’in küme işaretleri ile ayrılmış komutları, yalnızca if’in yanında yazan ifadenin yanlış olduğu zaman işleniyor. Yani yukarıdaki yapı için iki seçeneğimiz var. Eğer if’in yanında yazılan ifade doğruysa if’in, değilse else’nin altınaki küme işaretleri ile ayrılmış komutlar işleniyor.

if’in yanında yazan ifade analogRead(0)<512 olduğu için, else içerisine yalnızca analogRead(0)>=512 durumunda giriyor. Bu ise, A0’a gelen voltajın 2.5V’tan büyük olduğu zaman doğru oluyor. Bu durumda else içerisinde yazan,

digitalWrite(led, LOW); // LED'i söndür

komutu işleniyor. Bu komut ise LED’i sönmesini sağlıyor.

Kısacası, loop içerisindeki koşullu ifade bloğumuz, eğer A0’dan gelen voltaj 2.5V’un altındaysa (yani ortam karanlıksa) LED’i yakıyor, tersi durumda ise (aydınlıkta) LED’i söndürüyor.

Aşağıdaki fotoğrafta, LDR’a ışık gelmediği zaman LED’in yandığını görüyoruz.

LDR-Led yakma

LED’in yanması ile yanmaması arasındaki sınırı isteğimize göre değiştirebiliriz. Bunu yapmak için if’in parantezindeki 512 sayısını değiştirmemiz yeterli. Eğer 512 yerine daha büyük bir sayı yazarsak, LED daha aydınlık ortamlarda da yanmaya başlar. Eğer daha karanlıkta yanmaya başlamasını istiyorsak, sayıyı küçültmemiz gerekir.

SİZ DE DENEYİN-ALIŞTIRMA

1- Yalnızca, iyice karanlık olunca LED’in yanmasını sağlayan bir program yazın.

2- Bu derstekinin tersine, aydınlık olunca LED’i yakan, karanlık olunca söndüren bir program yazın.

3- Aydınlık olunca mavi bir LED’i, karanlık olunca kırmızı bir LED’i yakan bir program yazın.


Copyright © 2016 DEVRE OKULUTüm Hakları Saklıdır.