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);

      }

}


________________________________________________________________________________________________________________________________________________________


0 comments:

Yorum Gönder

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