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.
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 |
Frekans | 40 kHz |
Ölçüm Aralığı | 2 – 400 cm |
Çözünürlük | 3 mm |
Ölçüm Açısı | 15 derece |
Tetik Giriş Sinyali | 10 µs yüksek darbe |
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.
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-SR04 | Arduino |
VCC | 5 V |
Trig | Pin 2 |
Echo | Pin 3 |
GND | GND |
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.
I2C LCD Bağlantısı
I2C LCD | Arduino |
GND | GND |
VCC | 5 V |
SDA | A4 |
SCL | A5 |
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.
Kart | SDA | SCL |
Arduino Uno | A4 | A5 |
Arduino Nano | A4 | A5 |
Arduino Micro | 2 | 3 |
Arduino Mega 2560 | 20 | 21 |
Arduino Leonardo | 2 | 3 |
Arduino Due | 20 | 21 |
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.