HC-SR04 Ultrasonik Mesafe Sensörü Kullanımı

HC-SR04 ultrasonik mesafe sensörü, 2 ila 400 cm aralığındaki mesafeleri ölçebilir.Hc-sr04 ucuz ve kullanımı kolay bir ultrasonik mesafe sensörüdür. Engelden kaçan robotlarda ve otomasyon projelerinde yaygın olarak kullanılmaktadır. Bu yazımızda sensörün nasıl çalıştığını ve Arduino ile nasıl kullanılacağını öğreneceksiniz.

Sensörünüzü denemeye başlayabilmeniz için bir bağlantı şeması ve kod içeren 5 örnek ekledim. İlk önce Arduino kütüphanesi kullanmayan bir örneğe bakacağız. Daha sonra, daha kompakt bir kod oluşturmak için NewPing kütüphanesinin nasıl kullanabileceğinizi göstereceğim.

Gerekli Malzemeler

  • HC-SR04 Sensörü
  • Arduino Uno
  • Breadboard
  • Jumper Kablolar
  • 20×4 Karakter I2C LCD (isteğe bağlı)

Ultrasonik Mesafe Sensörü Nasıl Çalışır?

Ultrasonik sensörler, bir insanın duyamayacağı kadar yüksek frekanslı ses dalgaları yayarak çalışır. Bu ses dalgaları havada yaklaşık 343 m/s ses hızıyla hareket eder. Sensörün önünde bir cisim varsa ses dalgaları geri yansır ve ultrasonik sensörün alıcısı bunları algılar. Ses dalgalarının gönderilmesi ve alınması arasında ne kadar zaman geçtiği ölçülerek sensör ile nesne arasındaki mesafe hesaplanır.

Sesin Çalışma Prensibi

20°C’de sesin hızı kabaca 343 m/s veya 0.034 cm/µs’dir. Diyelim ki ses dalgalarının gönderilmesi ve alınması arasındaki süre 2000 mikrosaniye. Sesin hızını, ses dalgalarının yol aldığı zamanla çarparsanız, ses dalgalarının kat ettiği mesafeyi elde edersiniz.

Mesafe = Hız x Zaman

Ama aradığımız sonuç bu değil. Sensör ile nesne arasındaki mesafe aslında bu mesafenin sadece yarısı kadardır, çünkü ses dalgaları sensörden nesneye ve nesneden sensöre geri döner. Yani sonucu ikiye bölmeniz gerekir.

Mesafe (cm) = Ses hızı (cm/µs) × Zaman (µs) / 2

Örnek verecek olursak:

Mesafe (cm) = 0.0343 (cm/µs) × 2000 (µs) / 2 = 34,3 cm

Ses Hızının Sıcaklığa Bağımlılığı

Sesin hızı aslında büyük ölçüde sıcaklığa ve çok daha az derecede havanın nemine bağlıdır. Wikipedia, ses hızının santigrat derece başına kabaca 0,6 m/s arttığını belirtir. Çoğu durumda 20°C’de sadece 343 m/s kullanabilirsiniz, ancak daha doğru okumalar elde etmek istiyorsanız sesin hızını aşağıdaki formülle hesaplayabilirsiniz:

V (m/s) = 331.3 + (0.606 × T)

V = Ses hızı (m/s)
T = Hava Sıcaklığı (°C)

Bu formül, ses hızı üzerindeki etkisi çok küçük olduğu için nemi içermez.

HC-SR04 Nasıl Çalışır?

HC-SR04 sensörünün ön tarafında iki adet gümüş silindir (ultrasonik transdüser) bulabilirsiniz, biri ses dalgalarının vericisi, diğeri ise alıcıdır. Sensörün bir sonik patlama oluşturmasına izin vermek için, Trig pinini en az 10 µs için yüksek ayarlamanız gerekir. Sensör daha sonra 40 kHz’de 8 döngülü bir ultrason patlaması oluşturur.

Bu sonik patlama, ses hızında hareket eder ve geri döner ve sensörün alıcısı tarafından alınır. Yankı pini(Echo) daha sonra ses dalgalarının mikrosaniye cinsinden kat ettiği süreyi verir. Echo pininden puls uzunluğunu okumak için Arduino kodundaki pulseIn() işlevini kullanabilirsiniz. Bundan sonra, sensör ile nesne arasındaki mesafeyi hesaplamak için yukarıda belirtilen formülü kullanabilirsiniz.

HC-SR04 Teknik Özellikleri

Çalışma Voltajı5 V
Çalışma Akımı15 mA
Frekans40 kHz
Ölçüm Aralığı2 – 400 cm
Çözünürlük3 mm
Ölçüm Açısı15 derece
Tetik Giriş Sinyali10 µs yüksek darbe
HC-SR04 Teknik Özellikleri

Daha fazla bilgi için aşağıdaki datasheet’i inceleyebilirsiniz:

Arduino İle HC-SR04 Bağlantı Şeması

Aşağıdaki bağlantı şeması, HC-SR04 sensörünü Arduino’ya nasıl bağlayacağınızı göstermektedir.

Arduino ile HC-SR04 Bağlantı Şeması
Arduino İle HC-SR04 Bağlantı Şeması

Aşağıdaki kod örnekleri, tetik ve eko pimi için sırasıyla dijital pin 2 ve 3’ü kullanır, ancak elbette bunu istediğiniz herhangi bir dijital pine değiştirebilirsiniz.

HC-SR04 Arduino Bağlantı Pinleri

HC-SR04Arduino
VCC5 V
TrigPin 2
EchoPin 3
GNDGND
HC-SR04 Arduino Bağlantı Pinleri

Arduino ile HC-SR04 Kullanımı İçin Örnek Kod


// Bu kodda herhangi bir kütüphane kullanılmamıştır.
// Trig ve Echo pinini tanımlayın:
#define trigPin 2
#define echoPin 3
// Değişkenleri tanımlayın:
long duration;
int distance;
void setup() {
  // Girişleri ve çıktıları tanımlayın:
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  //9600 baud hızında Seri iletişime başlayın:
  Serial.begin(9600);
}
void loop() {
  // DÜŞÜK olarak ayarlayarak trigPin'i temizleyin:
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  // trigPin'i 10 mikrosaniye için yükseğe ayarlayarak sensörü tetikleyin:
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // echoPin'i okuyun, pulseIn() süreyi (darbenin uzunluğunu) mikrosaniye cinsinden döndürür:
  duration = pulseIn(echoPin, HIGH);
  // Mesafeyi hesaplayın:
  distance = duration * 0.034 / 2;
  // Mesafeyi Seri Monitörde yazdırın (Ctrl+Shift+M):
  Serial.print("Distance = ");
  Serial.print(distance);
  Serial.println(" cm");
  delay(50);
}

Arduino ve NewPing Kütüphanesi İle HC-SR04 Sensörü Örnek Kod

Tim Eckel tarafından yazılan NewPing kütüphanesi birçok ultrasonik mesafe sensörü ile kullanılabilir. Bu kitaplığın en son sürümü buradan bitbucket.org’dan indirilebilir. NewPing kitaplığını kullanan aşağıdaki kodun daha önce kullandığımız koddan çok daha kısa olduğunu fark edebilirsiniz. Bunun yanı sıra, NewPing kitaplığı başka güzel özellikler de içeriyor. Okumak için maksimum bir mesafe belirlemenizi sağlar, yankı alınmadığında tam bir saniye gecikmez ve yerleşik bir medyan filtresine sahiptir.

Arduino IDE’de Taslak > Library Ekle > .ZIP Kitaplığı Ekle yolunu izleyerek kütüphaneyi kurabilirsiniz.

Kitaplık, kullanabileceğiniz bazı örnekler içerir, ancak bunları donanım kurulumunuza uyacak şekilde değiştirmeniz gerekecektir. Daha önce olduğu gibi aynı kablolama kurulumuyla kullanılabilecek değiştirilmiş bir örnek kodu aşağıdakidir.


// Kütüphaneyi dahil et:
#include <NewPing.h>
// Pinleri ve maksimum mesafeyi tanımlayın:
#define trigPin  2
#define echoPin  3
#define MAX_DISTANCE 350 // Ping atmak istediğimiz maksimum mesafe (santimetre cinsinden). Maksimum sensör mesafesi 400-500cm olarak derecelendirilmiştir.
NewPing sonar(trigPin, echoPin, MAX_DISTANCE); // Pinlerin ve maksimum mesafenin NewPing kurulumu.
float duration, distance;
void setup() {
  Serial.begin(9600); // Ping sonuçlarını görmek için seri monitörü 9600 baud'da açın.
}
void loop() {
  delay(50); // Pingler arasında 50ms bekleyin (yaklaşık 20 ping/sn). Pingler arasındaki en kısa gecikme 29ms olmalıdır.
  
  duration = sonar.ping();
  distance = (duration / 2) * 0.0343;
  
  Serial.print("Distance = ");
  Serial.print(distance); // Ayarlanan maksimum aralığın dışındayken mesafe 0 olacaktır.
  Serial.println(" cm");
}

Ayrıca, ölçülen mesafeyi tam santimetre veya inç olarak döndüren Distance = sonar.ping_cm() veya Distance = sonar.ping_in() kullanabilirsiniz. Bu fonksiyon ile süre ölçümü yapmanıza ve mesafeyi hesaplamanıza gerek yoktur.

ping_median() Dijital Filtresi Nasıl Kullanılır

NewPing kitaplığı hakkında sevdiğim en önemli şey, yerleşik bir medyan filtresine sahip olmasıdır. Bu filtre, HC-SR04 okumalarınızın doğruluğunu büyük ölçüde artırabilir. ping_median() işlevi arka arkaya birçok süre ölçümü alır, aralık dışı okumaları atar ve ardından kalanların ortalamasını alır. Varsayılan olarak 5 okuma alacaktır, ancak kaç tane alacağını belirleyebilirsiniz. 18. satırı aşağıdaki satırlarla değiştirin.

int iterations = 5;
duration = sonar.ping_median(iterations);

HC-SR04 İle Mesafe Ölçme ve Ekrana Yazdırma

2004 veya 1602 I2C LCD’de ölçülen mesafeyi görüntülemek için tek yapmanız gereken aşağıdaki bağlantıları yapmak ve aşağıdaki kodu yüklemek. HC-SR04 sensörü öncekiyle aynı şekilde bağlanır.

HC-SR04,LCD Ekran ve Arduino Bağlantı Şeması

I2C LCD Bağlantısı

I2C LCDArduino
GNDGND
VCC5 V
SDAA4
SCLA5

Arduino Uno kullanmıyorsanız, SDA ve SCL pinleri farklı bir yerde olabilir. R3 düzenine (1.0 pin çıkışı) sahip bir Arduino UNO, ayrıca AREF pinine yakın SDA (veri hattı) ve SCL (saat hattı) pin başlıklarına sahiptir. Daha fazla ayrıntı için aşağıdaki tabloyu kontrol edin.

KartSDASCL
Arduino UnoA4A5
Arduino NanoA4A5
Arduino Micro23
Arduino Mega 25602021
Arduino Leonardo23
Arduino Due2021
Arduino Kartlarının SDA ve SCL Pinleri

Kod, GitHub’dan buradan indirebileceğiniz LiquidCrystal_I2C kitaplığını kullanır. Tam olarak bu kitaplığın kurulu olduğundan emin olun! Ayrıca I2C cihazlarıyla iletişim kurmanızı sağlayan Wire.h kitaplığını da içerir. Bu kütüphane Arduino IDE ile önceden yüklenmiş olarak gelmelidir.


// Kütüphaneleri dahil et:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Trig ve Echo pinini tanımlayın:
#define trigPin 2
#define echoPin 3
// LCD için SDA ve SCL pinini tanımlayın:
#define SDAPin A4 // Data pin
#define SCLPin A5 // Clock pin
// I2C aracılığıyla LCD'ye bağlanın, varsayılan adres 0x27 (A0-A2 atlanmaz):
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27,20,4); //1602 LCD için (0x27,16,2) olarak değiştirin
// Değişkenleri tanımlayın:
long duration;
int distance;
void setup() {
  // Girişleri ve çıktıları tanımlayın:
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  // LCD'yi başlatın:
  lcd.init();
  lcd.backlight();
}
void loop() {
  // DÜŞÜK olarak ayarlayarak trigPin'i temizleyin:
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  // trigPin'i 10 mikrosaniye için yükseğe ayarlayarak sensörü tetikleyin:
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // echoPin'i okuyun. Bu, süreyi (darbenin uzunluğunu) mikrosaniye cinsinden döndürür:
  duration = pulseIn(echoPin, HIGH);
  // Mesafeyi hesaplayın:
  distance = duration*0.034/2;
  // Mesafeyi LCD'de görüntüleyin:
  lcd.setCursor(0,0); // İmleci sütun 1, satır 1'e ayarlayın (sayım sıfırdan başlar)
  lcd.print("Distance = "); // LCD'de "Display = " dizesini yazdırır
  lcd.print(distance); // Ölçülen mesafeyi yazdırır
  lcd.print(" cm  "); // LCD'ye "cm" yazdırır, önceden görüntülenen karakterleri temizlemek için        fazladan boşluk gerekir
  
  delay(50);
}

20 x 4 LCD ekran kullandığımı unutmayın. Farklı boyutta bir LCD’niz varsa (16 x 2 de yaygındır) 19. satırı LiquidCrystal_I2C lcd(0x27,16,2); olarak değiştirmeniz gerekir.

HC-SR04 Boyutları

Aşağıda HC-SR04 ultrasonik sensörün boyutlarını bulabilirsiniz. Üreticiler arasında bazı küçük farklılıklar olduğunu fark ettim, bu yüzden kendi sensörünüzle iki kez kontrol etmenizi öneririm.

HC-SR04 Boyutları