HC-SR04, robotik ve elektronik projelerde sıkça kullanılan, uygun maliyetli ve kolay kullanımlı bir ultrasonik mesafe sensörüdür. İnsan kulağının duyamayacağı yüksek frekansta (genellikle 40 kHz) ses dalgaları yayarak nesnelere olan uzaklığı ölçer.




Sensörün 4 pini vardır. VCC ve GND besleme ve toprak pinidir. Arduino'daki 5V ve GND pinlerine bağlanabilir. Trig pinini kullanarak sensörden ultrasonic sinyali gönderilir. Echo piniyle yansıyan sinyal alınır. Sensör 40kHz düzeyinde bir ses sinyali yayar.




Çalışması:

Ses sinyali üretmek için Trig pini 10µs boyunca HIGH durumuna getirilir ve sonra LOW yapılır. Bunun üzerine sensör 8 cycle’ lık bir ses sinyali gönderir. Bu sinyalin hemen ardından Echo pini HIGH olur ve sinyalin geri dönmesini bekler. Sinyal geri döndüğünde ise Echo pini LOW konumuna düşer. Echo pininin HIGH olarak kaldığı süre hesaplanarak, ses dalgasının kat ettiği mesafe, dolayısıyla sensörden nesneye olan mesafe belirlenir.




Echo pini 38ms bekledikten sonra yansıyıp dönen herhangi bir sinyal algılamazsa zaman aşımına uğrayacak ve LOW duruma geri dönecektir.

Mesafeyi hesaplamak için aşağıdaki temel formül kullanılır:
Mesafe = (Ses sinyali hızı x sinyalin nesneye çarpıp geri dönme süresi) / 2

Sinyalin hem giderken hem de dönerken kat ettiği mesafeyi 2 ye bölerek sensör ile nesne arasındaki mesafe bulunur.

Sinyalin nesneye gidiş ve dönüş süresi ise Echo pininin HIGH kalma süresi tespit edilerek bulunur. Bunun için pulseIn() komutu kullanılır. 

Örneğin;
sure = pulseIn(2 , HIGH); Bu komut 2 nolu pini takibe alır. 2 nolu pinin durumu HIGH olduğu zaman arka planda saymaya başlar. Pin LOW konumuna düştüğünde saymayı bırakır ve hesapladığı süreyi mikrosaniye cinsinden sure değişkenine atar.


Örnek:
Ses hızı: 340 m/s ve sinyalin çarpıp geri dönme süresi: 1500 µs olsun. Sonucu da cm cinsinden bulalım. O zaman;

                            Mesafe = (Hız x Süre) / 2

340 (m x 100)/(s x 1000) = 34 cm/ms       1500 µs = 1,5 ms

Mesafe = (34cm/ms x 1,5ms) / 2 = 25,5 cm olarak bulunur.


Burada ses sinyalinin ilerleme hızını 340m/s aldık ama ortamın sıcaklığına göre bu değer değişir. Ortamın sıcaklığına göre ses hızı aşağıdaki formülle hesaplanır:



Örnek Uygulama - 1

Bu uygulamada herhangi bir cismin sensöre olan uzaklığı cm cinsinden ölçülerek seri port ekranına yazdırılır.


Devre Şeması:



Program Kodları:

#define trig 8

#define echo 9

float sure;

int mesafe;

void setup()

{

      Serial.begin(9600);

      pinMode(trig, OUTPUT);

      pinMode(echo, INPUT);

}


void loop()

{

      //trig pinini temizle.

      digitalWrite(trig, LOW);

      delayMicroseconds(2);

  

      //trig pinini 10 mikrosaniye HIGH yap.

      digitalWrite(trig, HIGH);

      delayMicroseconds(10);

      digitalWrite(trig, LOW);


      sure = pulseIn(echo, HIGH);     //Bu komut 9 nolu pini takibe alır. 9 nolu pinin durumu HIGH olduğu zaman arka planda saymaya başlar. Pin LOW konumuna düştüğünde saymayı bırakır ve hesapladığı süreyi mikrosaniye cinsinden sure değişkenine atar.

      sure = sure / 1000;         //sure değişkeni milisaniye cinsine çevrildi.

      mesafe = (34.2 * sure) / 2;     //sesin havadaki hızı 34.2 cm/ms olarak kabul edildi(sıcaklığa göre değişir) ve sure ms dir.

      Serial.print("Mesafe = "); Serial.print(mesafe); Serial.println(" cm");

      delay(1000);


//NOT: Burada trig pini Loop içerisinde her seferinde 10 mikrosaniye HIGH ve ardından LOW yapılır. Eğer trig pinini sürekli HIGH yaparsak bu seferde echo pini LOW durumunu göremeyeceği için sure hesabı yapamayacak ve varsayılan süre olan 38ms bekledikten sonra kendisini LOW durumuna düşürecektir.

}



Örnek Uygulama - 2

Bu uygulama, yukarıdaki uygulamaya ek olarak, herhangi bir nesne sensöre 15 cm'den daha az yaklaşırsa buzzer ses vermeye başlar ve seri port ekranına uyarı yazıları yazılır.


Devre Şeması:



Program Kodları:

#define trig 8

#define echo 9

#define buzzer 7

float sure;

int mesafe;


void setup()

{

      Serial.begin(9600);

      pinMode(buzzer, OUTPUT);

      pinMode(trig, OUTPUT);

      pinMode(echo, INPUT);

}


void loop()

{

      //trig pinini temizle

      digitalWrite(trig, LOW);

      delayMicroseconds(2);


      //trig pinini 10 mikrosaniye HIGH yap.

      digitalWrite(trig, HIGH);

      delayMicroseconds(10);

      digitalWrite(trig, LOW);


      sure = pulseIn(echo, HIGH);

      sure = sure / 1000;

      mesafe = (34.2 * sure) / 2;    //sesin havadaki hızı 34.2 cm/ms olarak kabul edildi(sıcaklığa göre değişir) ve sure ms dir.

      if (mesafe < 15)

      {

            digitalWrite(buzzer, HIGH);

            Serial.print("DİKKAT!!! Çok yaklaştın= "); Serial.print(mesafe);       Serial.println(" cm");

            delay(50);

      }

      else

      {

            digitalWrite(buzzer, LOW);

            Serial.print("Mesafe Normal = "); Serial.print(mesafe); Serial.println(" cm");

            delay(100);

      }

}


________________________________________________________________________________________________________________________________________________________


 

LDR Çalışma Prensibi:

LDR (Light Dependent Resistor), Türkçede “Işığa Bağımlı Direnç” anlamına gelmektedir. Bir diğer adı da foto dirençtir. LDR, ışık şiddeti ile direnç değerinin ters olduğu bir devre elemanıdır. Üzerine düşen ışık miktarı arttıkça direnci azalan bir tür foto dirençtir.

Yani üzerine düşen ışık şiddeti arttıkça sahip olduğu direnç değeri azalır, ışık şiddeti azaldıkça sahip olduğu direnç değeri artar. Direnç değerinin artıp-azalması lineer olarak gerçekleşmez.




Bu uygulamada:
LDR üzerine düşen ışık şiddetine göre Led'in yanmasını ya da sönmesini sağlayacağız. Aşağıdaki devre şemasında LDR ve direnci seri bağladık. Direncin üzerinden voltajı A0 pinine verdik. LDR üzerine ışık düşmediği zaman direnci yüksek olacağı için voltajın çoğunluğu LDR üzerine düşecek. Bundan dolayı A0 pinindeki voltaj düşük olacak. LDR üzerindeki ışık şiddetini artırdığımızda, LDR'nin direnci düşeceği ve üzerindeki voltaj da azalacağı için direncin üzerindeki voltaj artacak. Böylece A0 pinindeki voltaj da artacak. Direnç üzerindeki bu voltaj değeri dijital değere dönüştürülecek ve bu dijital değer belirlediğimiz bir değerin üzerine çıkınca Led ışık verecek.


Devre Şeması:





Program Kodları:

#define LED 3
#define LDR A0
void setup()
{
      Serial.begin(9600);
      pinMode(LED, OUTPUT);
      pinMode(LDR, INPUT);
}

void loop()
{
      Serial.print("LDR Değeri= "); Serial.println(analogRead(LDR));
      delay(100);
      if (analogRead(LDR) > 160)
      {
            digitalWrite(LED, 1);
      }
      else
      {
            digitalWrite(LED, 0);
      }
}



_________________________________________________________________________________________________________________________________________________________

 

Bu uygulamada:

A0 pinine bağlı Potansiyometre ile 3 nolu pine bağlı led parlaklığı kontrol edilecek. Potansiyometre ile A0 pininden verilen voltaj değiştirilerek led parlaklığı değiştirilir.


Devre Şeması:



Program Kodları:

#define Led 3

#define Pot A0

int pot_deger = 0;

int pot_deger_yeni = 0;

void setup()

{

      Serial.begin(9600);

      pinMode(Led, OUTPUT);

      pinMode(Pot, INPUT);

}


void loop()

{

      pot_deger = analogRead(Pot);     // analogRead() komutu ile okunan voltaj değeri Arduino içerisindeki ADC tarafından 0-1023 arasındaki değerler çevrilir.

      pot_deger_yeni = map(pot_deger, 0, 1023, 0, 255);      //A0 pininden okunan analog değer 0-1023  aralığındadır. Bu aralıktaki değerler map komutu ile 0-255 arasındaki değerlere çevrilir. Çünkü analogWrite(Led,0-255) komutunda gönderilen değer 0-255 aralığındadır.

      Serial.print("Pot Değer= ");     Serial.print(pot_deger);

      Serial.print("   Pot Değer Yeni= ");     Serial.println(pot_deger_yeni);

      analogWrite(Led, pot_deger_yeni);

}



_________________________________________________________________________________________________________________________________________________________


 


Bu uygulamada:

- 1. butona basınca kırmızı led yanacak, butonu bırakınca sönecek.

- 2. butona 1. kez basıp-çekince sarı led yanacak, 2. kez basıp-çekince sarı led sönecek.


Devre Şeması:



Program Kodları:

#define buton1    4

#define buton2   6

#define led_red    8

#define led_yellow    10

int durum = 0;

void setup()

{

      pinMode(4, INPUT);

      pinMode(6, INPUT);

      pinMode(8, OUTPUT);

      pinMode(10, OUTPUT);

}


void loop()

{

      //______1. uygulama_______

      if (digitalRead(buton1) == 1)

      {

            digitalWrite(led_red, HIGH);

      }

      else if (digitalRead(buton1) == 0)

      {

            digitalWrite(led_red, LOW);

      }


  //______2. uygulama________

      if (digitalRead(buton2) == 1)

      {

            durum = !(durum);

            while (digitalRead(buton2) == 1)

            {

                  digitalWrite(led_yellow, durum);

                  delay(100);

            }

      }

}



___________________________________________________________________________________________________________________________________________________________



Bu uygulamada bir sayaç uygulaması yapacağız. 4 numaralı pine bağlı butona basınca sayaç artacak. 8 numaralı pine bağlı butona basınca sayaç azalacak. Sayaç durumu seri port ekranına yazdırılacak.


Devre Şeması:


Program Kodları:

#define artir 4

#define azalt 8

int sayici = 0;

void setup()

{

      pinMode(artir, INPUT);

      pinMode(azalt, INPUT);

      Serial.begin(9600);

}


void loop()

{


      if (digitalRead(artir) == 1)

      {

            sayici++;

            Serial.print("Sayıcı= "); Serial.println(sayici);

            while (digitalRead(artir) == 1)   //while döngüsü koyulmasının sebebi; butona basıldığında parazit yada mekaniksel nedenlerle programın butona birden fazla basılmış gibi tepki vermesini ve sayici değişkenini fazladan artırmasını önlemektir. while döngüsü ile butona bir kez basıldığında 100 ms lik bir bekleme süresi olur.

            {

                  delay(100);

            }

        }

        else if (digitalRead(azalt) == 1)

        {

                sayici--;

                Serial.print("Sayıcı= "); Serial.println(sayici);

                while (digitalRead(azalt) == 1)

                {

                      delay(100);

                }

         }

}



__________________________________________________________________________________________________________________________________________________________


 


Arduino'da analog girişlerle çalışırken daha hassas veya farklı voltaj aralıklarında okuma yapmak istediğinizde devreye giren önemli bir fonksiyondur.

Arduino'nun Analog-Dijital Dönüştürücüsü (ADC), gelen analog voltajı dijital bir değere dönüştürürken bir referans voltajına ihtiyaç duyar. Bu referans voltajı, ADC'nin ölçebileceği maksimum voltajı belirler. Varsayılan olarak, çoğu Arduino kartı için bu referans voltajı 5V'tur (eğer USB'den veya regüle edilmiş bir kaynaktan besleniyorsa). Yani, 0V ile 5V arasındaki analog sinyalleri 0 ile 1023 arasındaki dijital değerlere dönüştürür.

Ancak, bazen sensörleriniz 5V'tan daha düşük bir voltaj aralığında çalışabilir (örneğin, 3.3V) veya daha yüksek bir hassasiyete ihtiyacınız olabilir. İşte tam bu noktada analogReference() komutu devreye girer. Bu komut, Arduino'nun ADC'sinin kullanacağı referans voltajını değiştirmenize olanak tanır.


Neden analogReference() Kullanmalıyız?

Daha Yüksek Hassasiyet: Eğer sensörünüzden gelen voltaj 0V-1V gibi küçük bir aralıkta değişiyorsa ve referans voltajı 5V olarak ayarlıysa, ADC'nin 1024 adımı bu 5V aralığına yayılır. Bu durumda, 1V'lık bir sinyal sadece 0-204 arasında bir değere dönüşür. Referans voltajını daha küçük bir değere ayarlayarak (örneğin, dahili 1.1V referans), aynı 1V'luk sinyal 0-1023 arasında bir değere dönüşerek ölçüm hassasiyetini artırır.

Voltaj Uyumluğu: Bazı sensörler 5V yerine 3.3V'ta çalışır ve çıkışları da 3.3V'a kadar çıkar. Eğer bu sensörü doğrudan 5V referanslı bir Arduino'ya bağlarsanız, 3.3V'luk maksimum çıkışınız sadece 1023 yerine yaklaşık 675 değerine karşılık gelir. Referansı 3.3V'a ayarlayarak, sensörün tam aralığını (0-1023) kullanabilirsiniz.



analogReference() Komutunun Kullanımı


1. analogReference(DEFAULT): Bu, Arduino kartının varsayılan referans voltajını kullanır.

5V Arduino'lar (Uno, Mega): 5V.

3.3V Arduino'lar (Due, Zero): 3.3V.

Bu, analogReference() komutunu hiç kullanmadığınızdaki varsayılan ayardır.

2. analogReference(INTERNAL): ATmega tabanlı kartlarda (Uno, Mega gibi), bu seçenek dahili, yerleşik bir referans voltajı kullanır.

Uno, Nano, Mini: 1.1V.

Mega2560: 1.1V veya 2.56V (kart tipine göre değişebilir, datasheet'e bakmak iyi olur).

Bu referans, harici voltaj dalgalanmalarından daha az etkilenen, nispeten kararlı bir kaynaktır ve daha yüksek hassasiyet gerektiğinde kullanışlıdır.

3. analogReference(INTERNAL1V1): Sadece Arduino Mega'da kullanılır: ATmega2560 tabanlı kartlarda 1.1V dahili referans.

4. analogReference(INTERNAL2V56): Sadece Arduino Mega'da kullanılır ATmega2560 tabanlı kartlarda 2.56V dahili referans.

5. analogReference(EXTERNAL): Bu seçenek, Arduino'nun AREF pinine dışarıdan sağladığınız bir voltajı referans olarak kullanır. Bu voltaj 0V ile 5V (veya Arduino'nun besleme voltajı) arasında olmalıdır.

ÖNEMLİ UYARILAR: 

EXTERNAL referansı kullanırken AREF pinine bağladığınız voltajı ASLA 0V'tan düşük veya 5V'tan yüksek yapmayın (veya kartınızın çalışma voltajından yüksek). Aksi takdirde, Arduino'nuza kalıcı hasar verebilirsiniz.

AREF pininde harici bir referans kullanıyorsanız, analogRead() çağırmadan önce analog referansı EXTERNAL olarak ayarlamanız gerekir. Aksi takdirde, aktif referans voltajını (dahili olarak üretilen) ve AREF pinini kısa devre yaparak Arduino kartınızdaki mikro denetleyiciye zarar verebilirsiniz.

AREF pinine bağladığınız voltaj kararlı olmalı ve bir direnç aracılığıyla bağlanmalıdır (genellikle 2.2k ile 4.7k ohm arası bir direnç). Direncin referans olarak kullanılan voltajı değiştireceğine dikkat edilmelidir. Çünkü AREF pininde dahili bir 32K direnç vardır. AREF pininden toprağa gider. İki direnç bir voltaj bölücü görevi görür. 

Örneğin; 2,5 voltluk harici referans voltajını, AREF pinine, 5K direnç üzerinden bağlayacak olursak, bizim harici referans voltajımız şöyle olur:

Analog Referans Voltajı = 2.5 * 32 / (32 + 5) = ~ 2.2V olur.


Ya da aşağıdaki resimdeki gibi R1 ve R2 dirençleriyle bir gerilim bölücü yapılarak da AREF pininden referans voltajı verilebilir.




Örnek Program Kodları:

void setup()

{

  analogReference(EXTERNAL);     //Analog giriş işlemleri için referans voltaj değeri olarak AREF pininden verilen voltaj kullanıldı.

  DDRD = B11111111;     //D portu çıkış yapıldı.

}


void loop()

{

  PORTD = analogRead(A0);     //A0 pininden okunan analog voltaj digital değere dönüştürülerek portD'ye gönderildi.

}



________________________________________________________________________________________________________________________________________________________



 

Arduino'da Analog Çıkış İşlemleri ve PWM

Arduino ile fiziksel dünyayı kontrol ederken genellikle dijital sinyallerden bahsederiz: yüksek veya düşük, açık veya kapalı gibi. Ancak bazı durumlarda, bir LED'in parlaklığını ayarlamak veya bir motorun hızını kontrol etmek gibi analog değerler üzerinde hassas kontrol sağlamamız gerekir. İşte bu noktada Analog Çıkış İşlemleri ve PWM (Pulse Width Modulation) devreye girer.


Analog Çıkış Nedir?

Dijital çıkışlar sadece iki durum (0V veya 5V gibi) sunarken, analog çıkışlar bu iki değer arasında sürekli bir voltaj aralığı sağlar. Bu sayede bir cihazın çalışma seviyesini kademeli olarak değiştirebiliriz. Örneğin, bir LED'i tamamen kapalıdan tam parlaklığa kadar farklı seviyelerde aydınlatabiliriz.

Ancak burada önemli bir nokta var: Çoğu Arduino kartında (Uno, Nano gibi) gerçek bir dijital-analog dönüştürücü (DAC) bulunmaz. Yani, Arduino doğrudan 0V ile 5V arasında sürekli bir voltaj üretemez. Bunun yerine, analog çıkış işlevini taklit etmek için PWM (Darbe Genişlik Modülasyonu) tekniğini kullanır.


PWM (Pulse Width Modulation) Nedir?

PWM, dijital sinyaller kullanarak analog davranışı taklit etmenin zekice bir yoludur. Temel prensibi şudur: Bir dijital pini çok hızlı bir şekilde açıp kapatarak ortalama voltaj seviyesini değiştirmek.

Bir PWM sinyali, belirli bir frekansta tekrar eden kare dalgalardan oluşur. Bu kare dalgaların iki temel özelliği vardır:

Periyot (Period): Bir döngünün tamamlanması için geçen süre.

Görev Döngüsü (Duty Cycle): Bir periyot içinde sinyalin "açık" (HIGH) kaldığı sürenin, periyodun tamamına oranıdır. Genellikle yüzde olarak ifade edilir.




Arduino Uno’da PWM çıkış pinleri 3, 5, 6, 9, 10, 11 nolu pinlerdir. Bu pinlerden 5 ve 6 pinlerindeki PWM sinyalinin frekansı yaklaşık 980Hz, diğer pinlerde ise 490Hz olacaktır. PWM pinleri ~ işareti ile gösterilmektedir.

Dijital kontrol, açık ve kapalı arasında geçiş yapan bir sinyal olan kare dalga oluşturmak için kullanılır. Örneğin bir LED ile bu açık-kapalı düzeni yeterince hızlı tekrarlarsanız, sonuç, sinyalin 0 ile Vcc arasında sabit bir voltaj olması ve LED'in parlaklığını kontrol etmesi gibi olur.


Örnek:

%0 Görev Döngüsü: Sinyal her zaman kapalıdır (LOW). Ortalama voltaj 0V'dır.

%50 Görev Döngüsü: Sinyal periyodun yarısı boyunca açık (HIGH), yarısı boyunca kapalıdır (LOW). Ortalama voltaj 2.5V'dır (5V'un yarısı).

%100 Görev Döngüsü: Sinyal her zaman açıktır (HIGH). Ortalama voltaj 5V'dır.


PWM çıkışı için kullanılan ana fonksiyon analogWrite() fonksiyonudur. Şu şekilde kullanılır:

analogWrite(pin, value);

pin: PWM çıkışı olarak kullanmak istediğiniz pin numarası.

value: Ayarlamak istediğiniz görev döngüsü değeri. Bu değer 0 ile 255 arasında olmalıdır.


Aşağıdaki resimde analogWrite() komutunun value değerine göre oluşan PWM sinyaller gösterilmiştir.

analogWrite (pin, value) komutunda "value" 0 - 255 arasında bir değer alır.

analogWrite(3, 255)    :  %100 görev döngüsü.

analogWrite(3, 127)      : %50 görev döngüsü.





PWM'in Kullanım Alanları

LED Parlaklık Kontrolü: Ortam ışığına duyarlı aydınlatma sistemleri veya dekoratif ışıklandırmalar.

DC Motor Hız Kontrolü: Robotlarda veya diğer motorlu sistemlerde motorun hızını hassas bir şekilde ayarlama.

Servo Motor Kontrolü: Servo motorlar, belirli açılara konumlanmak için PWM sinyallerini kullanır.

Ses Üretimi: Basit tonlar veya müzik çalmak için.

Isıtıcı Kontrolü: Isıtma elemanlarının gücünü ayarlamak.



___________________________________________________________________________________________________________________________________________________________

 



Analog Giriş Nedir?

Analog sinyaller, belirli bir aralıktaki sürekli değerleri temsil eder. Dijital sinyallerin (0 veya 1 gibi) aksine, analog sinyaller sonsuz sayıda ara değere sahip olabilir. Örneğin, bir sıcaklık sensöründen gelen voltaj değeri 0V ile 5V arasında sürekli olarak değişebilir. Bu sürekli değişimi okuyabilmek için Arduino'nun analog giriş pinlerini kullanırız.

Arduino Uno'da 6 adet analog giriş pini bulunur. Bunlar A0, A1, A2, A3, A4 ve A5 pinleridir. 


Analog-Dijital Dönüştürücü (ADC)

Arduino, analog sinyalleri doğrudan anlayamaz. Bu yüzden, analog sinyalleri dijital sinyallere dönüştürmek için bir Analog-Dijital Dönüştürücü (ADC) kullanır. Yani 0V ile 5V arasında gelen herhangi bir voltaj değerini dijital bir değere dönüştürür. 

Arduino'daki ADC, varsayılan olarak 10-bit çözünürlüğe sahiptir. Bu ne anlama geliyor?

10-bit çözünürlük demek, analog sinyali 2^10 = 1024 farklı değere dönüştürebiliriz demektir. Arduino'nun çalışma voltajı genellikle 0V ile 5V arasındadır. Bu durumda, 0V değeri 0'a, 5V değeri ise 1023'e karşılık gelecektir. Yani, her bir adım (çözünürlük) yaklaşık olarak 5V/1024≈0.00488V veya 4.88mV'a karşılık gelir. 0V = 0,  4,88mV = 1,  9,76mV = 2,  14,64 = 3  vb. olur. 

Örneğin; herhangi bir sensörden Arduino'nun analog pinine 2,4 volt geldiğini düşünelim. Yukarıda yaptığımız hesaba göre her adım 4,88mV olduğuna göre 2,4V /  4,88mV = 500 dijital değerini elde ederiz.

Bu sayede, bir sensörden gelen voltajdaki küçük değişimleri bile yakalayabilir ve bu değerlere göre kodumuzda işlemler yapabiliriz.

Arduino'da analog bir pinden veri okumak için analogRead() fonksiyonunu kullanırız. Şöyle:

sensor_degeri = analogRead(pin);

pin: Okunacak analog pin numarası (örneğin A0, A1 vb.).

sensor_degeri: Okunan 0 ile 1023 arasındaki değeri depolayacak bir tamsayı değişkenidir.


Neden Analog Giriş Kullanırız?

Analog girişler, dünyadaki birçok sensörle etkileşim kurmamızı sağlar. Arduino'ya dış dünyadan gelen sürekli ve değişken bilgileri okuma yeteneği kazandırır. ADC sayesinde bu analog sinyaller dijital verilere dönüştürülür ve bu verileri kullanarak projelerinizde daha karmaşık ve duyarlı kontroller yapabilirsiniz. Bazı örnekler:

- Sıcaklık Sensörleri (LM35, NTC termistörler): Çevresel sıcaklıktaki sürekli değişiklikleri okumak için.

- Işık Sensörleri (LDR): Ortamdaki ışık şiddetini ölçmek için.

- Potansiyometreler: Elle ayarlanan bir değer (örn. parlaklık, ses seviyesi) sağlamak için.

- Nem Sensörleri: Havadaki veya topraktaki nem seviyesini belirlemek için.

- Basınç Sensörleri: Basınçtaki değişimleri algılamak için.


Örnek Program Kodları:

int pot = 0;

float voltaj = 0;


void setup()

{

      Serial.begin(9600);

}


void loop()

{

      pot = analogRead(A0);

      Serial.print("POT= ");

      Serial.print(pot);

      voltaj = (5.0 / 1023) * pot;

      Serial.print("   voltaj=");

      Serial.print(voltaj);

      Serial.println("volt");

      delay(500);

}


_____________________________________________________________________________________________________________________________________________________


 



Dijital Pinleri Giriş Olarak Belirlemek

Arduino'da dijital pinleri giriş olarak kullanmak, buton okumaktan sensör verisi almaya kadar birçok etkileşimli projenin temelidir. Arduino'da bir dijital pini giriş olarak kullanmak için öncelikle o pinin giriş (INPUT) modunda olduğunu belirtmemiz gerekir. Bunu setup() fonksiyonu içinde, yani Arduino kartınız her başladığında bir kez çalışan bölümde yaparız.

0 ve 1 pinleri Rx ve Tx iletişim pinleridir. Arduino USB üzerinden iletişim için bu pinleri kullanır. Ayrıca bu pinleri kullanabilmemiz için dışarıya da çıkarılmıştır. Bu pinleri dijital giriş/çıkış için kullanabiliriz ama bu pinler usb iletişim için de kullanıldığı için Arduino'ya program yüklerken yada seri monitör kullanırken bu pinlerin boş olması gerekir. Yoksa usb iletişiminde yada bu pinlere bağlanan komponentlerin çalışmasında sorunlar çıkabilir. 

Dijital pinler üzerinden maximum 40mA'i geçmelidir.

Dijital pinleri giriş olarak kullanmak için 2 yol vardır:

- pinMode() Fonksiyonu İle

- Yön Kayıtçısına Erişim İle


1. pinMode() Fonksiyonu İle Pinleri Giriş Olarak Belirlemek

Bir pini giriş olarak ayarlamak için pinMode() fonksiyonunu kullanırız. Şu şekilde: 

pinMode(pinNumarası, MOD);

pinNumarası    : Ayarlamak istediğiniz dijital pinin numarasıdır (örneğin 2, 3, 13 vb.).

MOD                   Pin'in çalışma modunu belirtir. Giriş için INPUT (büyük harflerle) kullanırız.

Örnek:

void setup() 

{

      pinMode(7, INPUT);     // Pin 7'yi giriş olarak ayarla

}


void loop() 

{

      // Buraya kodunuzu yazacaksınız

}


2. Yön Kayıtçısına Erişim İle Pinleri Giriş Olarak Belirlemek

Arduino'da pinlerin giriş olarak belirlenmesi için "yön kayıtçısı" nı kullanabiliriz. Bunlar:

DDRB    : Port B yön kayıtçısı 

DDRC    : Port C yön kayıtçısı

DDRD    : Port D yön kayıtçısı

Bu kayıtçılara yükleyeceğimiz değerler ile Arduino portlarını giriş olarak belirleyebiliriz. Aşağıdaki örnekteki gibi:

DDRD = B00000000;        : Arduino D portunun tüm pinleri giriş yapıldı. Binary sayı kullanıldı.

DDRD = 0b00000000;     : Arduino D portunun tüm pinleri giriş yapıldı. Binary sayı kullanıldı.

DDRD = 0x00;                    Arduino D portunun tüm pinleri giriş yapıldı. 16 lık yani hexedecimal sayı kullanıldı.



Dijital Pinlerden Değer Okumak

Pini giriş olarak ayarladıktan sonra, o pinden yüksek (HIGH) veya düşük (LOW) bir voltaj değeri okuyabiliriz. Bunun için 2 yol vardır:

- digitalRead() Fonksiyonu İle

- Port Kayıtçısına Erişim İle


1. digitalRead() Fonksiyonu

Dijital bir pinden değer okumak için digitalRead() fonksiyonunu kullanırız. Şu şekilde:

okunan_deger = digitalRead(pinNumarası);

pinNumarası         : Değer okumak istediğiniz dijital pinin numarası.

okunan_deger     : Pinden okunan değerin atandığı değişken. Okunan değer ya "HIGH - 1" yada "LOW - 0" olur.


Örnek: Pin 2'den gelen değeri okuyup seri monitöre yazdırmak:

void setup() 

{

      Serial.begin(9600);     // Seri iletişimi başlat

      pinMode(2, INPUT);      // Pin 2'yi giriş olarak ayarla

}


void loop() 

{

      int butonDurumu = digitalRead(2);     // Pin 2'den değeri oku

      Serial.println(butonDurumu);               // Okunan değeri seri monitöre yazdır

      delay(100);              // Kısa bir bekleme

}



2. Port Kayıtçısına Erişim İle Pinlerden Değer Okuma

Arduino'da pinlerden değer okumak için "port kayıtçısı" nı kullanabiliriz. Bunlar:

PINB    : Port B kayıtçısı 

PINC    : Port C kayıtçısı

PIND    : Port D kayıtçısı

Bu kayıtçılardan okuyacağımız değerler ile Arduino pinlerindeki değerleri okuyabiliriz. Aşağıdaki örnekteki gibi:

port_oku = PINB;                            : PortB'ye ait tüm pinlerin değeri decimal olarak port_oku değişkenine atandı.

port_deger = (PINB & bit (3));    : PortB'ye ait 3. pinin decimal değeri port_deger değişkenine atandı.



1. Örnek Program Kodları

int buton = 0;

void setup()

{

      pinMode(2, INPUT);

      pinMode(12, OUTPUT);

}


void loop()

{

      buton = digitalRead(2);


      if(buton==1)

      {

            digitalWrite(12,HIGH);

      }

      else if(buton==0)

      {

            digitalWrite(12,LOW);

      }

}


1. Örnek Program Devre Şeması




2. Örnek Program Kodları

int port = 0;

void setup()

{

      Serial.begin(9600);

      DDRB = B00000000;     //Arduino B portu giriş yapıldı.

      DDRD = B11111111;             //Arduino D portu çıkış yapıldı.

}


void loop()

{

      port = PINB;          //PortB'ye ait pinlerin değeri port değişkenine atandı.

      Serial.print("PortB = "); 

      Serial.println(port);           //PORTB'nin decimal değeri ekrana yazdırıldı.

      Serial.print("PortB'nin 4. pin değeri=  "); 

      Serial.println(port & bit(4));      //PORTB'nin 4. bitinin decimal değeri ekrana yazdırıldı. 

      delay(1000);

}


2. Örnek Program Devre Şeması




Arduino Giriş Pinlerinde Pull-up ve Pull-down Durumları

Pull-up ve pull-down dirençleri, elektronik devrelerde, özellikle mikrodenetleyicilerle çalışırken dijital giriş pinlerinin kararlı bir durumda olmasını sağlamak için kullanılan temel bileşenlerdir. Pinlerin "havada kalmasını" (floating state) ve belirsiz değerler okumasını engellerler.


Havada Kalma (Floating State) Nedir?

Bir dijital giriş pini ne HIGH (yüksek voltaj, mantıksal 1) ne de LOW (düşük voltaj, mantıksal 0) seviyesine aktif olarak bağlanmadığında "havada kalır". Bu durumda, pin çevreden gelen elektriksel gürültüden etkilenebilir ve rastgele, tutarsız değerler okuyabilir. Bu da devrenizin beklenmedik şekilde çalışmasına neden olabilir. İşte pull-up ve pull-down dirençleri bu sorunu çözmek için kullanılır.


1. Pull-Up Bağlantısı

Pull-up direnci, bir dijital giriş pinini varsayılan olarak yüksek mantıksal seviyede (HIGH) tutmak için kullanılır. Direncin bir ucu genellikle VCC'ye (devrenin pozitif güç kaynağına, örneğin 5V veya 3.3V) bağlanırken, diğer ucu dijital giriş pinine bağlanır.


Nasıl Çalışır?

Normal Durum (Butona Basılmadığında): Pull-up direnci sayesinde dijital giriş pini sürekli olarak VCC'ye bağlı kalır ve HIGH (mantıksal 1) değerini okur. Direnç, VCC'den pine akan akımı sınırlar.

Aktif Durum (Butona Basıldığında): Genellikle bir buton veya anahtar, bu pini doğrudan veya dolaylı olarak GND'ye (toprak, 0V) bağlar. Butona basıldığında, pin VCC yerine GND'ye çekilir ve mikrodenetleyici bu pini LOW (mantıksal 0) olarak okur. Akımın çoğu GND'ye yönlendirilir ve direnç sayesinde VCC'den GND'ye doğrudan bir kısa devre oluşumu engellenir.


2. Pull-Down Bağlantısı

Pull-down direnci, bir dijital giriş pinini varsayılan olarak düşük mantıksal seviyede (LOW) tutmak için kullanılır. Direncin bir ucu genellikle GND'ye (toprak, 0V) bağlanırken, diğer ucu dijital giriş pinine bağlanır.


Nasıl Çalışır?

Normal Durum (Butona Basılmadığında): Pull-down direnci sayesinde dijital giriş pini sürekli olarak GND'ye bağlı kalır ve LOW (mantıksal 0) değerini okur. Direnç, pinin GND'ye bağlanmasını sağlar.

Aktif Durum (Butona Basıldığında): Genellikle bir buton veya anahtar, bu pini doğrudan veya dolaylı olarak VCC'ye (pozitif güç kaynağı) bağlar. Butona basıldığında, pin GND yerine VCC'ye çekilir ve mikrodenetleyici bu pini HIGH (mantıksal 1) olarak okur.



Pull-up ve Pull-down Direnç Değerleri

Pull-up ve pull-down dirençleri için genellikle 1kΩ ile 10kΩ arasında değerler kullanılır. Bu değerler, devrenin ihtiyaçlarına, akım tüketimine ve elektriksel gürültüye karşı hassasiyetine göre seçilir.

Çok düşük bir direnç değeri, gereksiz yere daha fazla akım çekilmesine neden olabilir.

Çok yüksek bir direnç değeri ise, pini gürültüye karşı daha hassas hale getirebilir ve pinin durumunu net bir şekilde belirleyememesine yol açabilir.


Arduino Dahili Pull-up

Arduino'da INPUT_PULLUP kullanımı, dijital giriş pinlerini daha basit ve etkili bir şekilde kontrol etmenizi sağlayan çok önemli bir özelliktir. Temel olarak, harici bir direnç bağlama ihtiyacını ortadan kaldırır.

Arduino'nun çoğu mikrodenetleyicisi (örn. ATmega328P gibi), dahili olarak yapılandırılabilen çekme (pull-up) dirençlerine sahiptir. Bu dirençler, dijital bir pini giriş olarak ayırdığınızda etkinleştirilebilir ve pinin varsayılan olarak HIGH (yüksek) mantık seviyesinde olmasını sağlar. Şu şekilde kullanılır:

pinMode(buton, INPUT_PULLUP);


Örnek Programlama Kodları

Dahili pull-up ile 2 nolu pine sürekli 1 gelir. Pin toprağa götürüldüğünde ekrana "butona basıldı" yazısı yazdırılır.


#define buton 2

void setup()

{

      Serial.begin(9600);

      pinMode(buton, INPUT_PULLUP);     //porta sürekli 1 geldiği durum.

}


void loop()

{

      if (digitalRead(buton) == 0)

      {

            while(digitalRead(buton) == 0)

            {

                  Serial.println("butona basıldı.");

                  delay(500);

            }

      }

}


Devre Şeması




______________________________________________________________________________________________________________________________________________________


Toplam Sayfa Görüntüleme Sayısı

Seri İletişim Protokolleri

Sensörlerin Arduino İle Kullanımı

Popular Posts

Yararlanılan Kaynaklar

İletişim

gokdag17@gmail.com