Arduino ile HC-SR04 Ultrasonik Mesafe Sensörü Nasıl Kullanılır?
İçindekiler
- HC-SR04 Ultrasonik Sensör Nedir?
- HC-SR04 Teknik Özellikleri Nelerdir?
- HC-SR04 Nasıl Çalışır?
- Mesafe Hesaplama Formülü Nedir?
- HC-SR04 Arduino Bağlantısı Nasıl Yapılır?
- Temel HC-SR04 Arduino Kodu
- pulseIn Zaman Aşımı Neden Önemlidir?
- Ölçümler Neden Zıplıyor? Medyan Filtre ile Kararlı Okuma
- Sıcaklık Mesafe Ölçümünü Nasıl Etkiler?
- Örnek Proje: Arduino Park Sensörü
- HC-SR04 Kullanırken Sık Görülen Sorunlar ve Çözümleri
- Sahadan Pratik İpuçları
Arduino ile HC-SR04 ultrasonik mesafe sensörünü kullanmak için sensörün VCC pinini 5V, GND pinini GND, Trig ve Echo pinlerini ise iki dijital pine bağlamanız yeterlidir. Arduino, Trig pinine kısa bir darbe gönderir, Echo pininin HIGH kaldığı süreyi pulseIn() ile ölçer ve bu süreyi ses hızıyla çarparak mesafeyi hesaplar. Tüm işlem birkaç satır kodla yapılır.
Bu yazıda sensörün çalışma prensibini, bağlantı şemasını, temel ve filtreli kod örneklerini, sıcaklık düzeltmesini, basit bir park sensörü projesini ve sahada sık karşılaşılan ölçüm hatalarının çözümlerini ele alacağız.
HC-SR04 Ultrasonik Sensör Nedir?
HC-SR04, insan kulağının duyamayacağı yüksek frekanslı ses dalgaları kullanarak cisimlere olan mesafeyi ölçen düşük maliyetli bir sensör modülüdür. Üzerinde biri verici, diğeri alıcı olmak üzere iki silindirik dönüştürücü bulunur. Bu görünüm nedeniyle hobi projelerinde robotların gözü olarak da bilinir.
Sensör; engelden kaçan robotlar, park sensörleri, su deposu seviye ölçümü, kapı önü algılama ve kişi sayma gibi temassız mesafe ölçümü gereken pek çok projede kullanılır.
HC-SR04 Teknik Özellikleri Nelerdir?
| Özellik | Değer |
|---|---|
| Çalışma gerilimi | 5V DC |
| Ölçüm aralığı (üretici değeri) | Yaklaşık 2 cm ile 400 cm arası |
| Ses dalgası frekansı | 40 kHz |
| Ölçüm açısı | Yaklaşık 15 derece |
| Tetik darbesi | En az 10 mikrosaniye HIGH |
| Pin sayısı | 4 (VCC, Trig, Echo, GND) |
Katalogdaki 400 cm değeri ideal koşullar içindir. Pratikte düz ve sert bir yüzeye karşı güvenilir ölçüm aralığı genellikle daha kısadır. Uzak mesafede ve eğimli yüzeylerde okumalar kararsızlaşır.
HC-SR04 Nasıl Çalışır?
Sensörün çalışma prensibi yarasaların ve denizaltı sonarlarının kullandığı yankı yöntemine dayanır. Ölçüm dört adımda gerçekleşir:
- Arduino, Trig pinine en az 10 mikrosaniye süren bir HIGH darbesi gönderir.
- Sensör, 40 kHz frekansında sekiz darbelik bir ses dalgası paketi yayar.
- Ses dalgası karşıdaki cisme çarpıp geri döner ve alıcı tarafından algılanır.
- Echo pini, dalganın gönderildiği andan geri geldiği ana kadar HIGH konumunda kalır.
Echo pininin HIGH kaldığı süre, sesin cisme gidip geri gelmesi için geçen toplam süredir. Mesafe bu süreden hesaplanır.
Mesafe Hesaplama Formülü Nedir?
Ses, yaklaşık 20 derece oda sıcaklığında havada saniyede 343 metre yol alır. Bu değer mikrosaniye başına 0.0343 santimetreye karşılık gelir. Ölçülen süre gidiş ve dönüşü kapsadığı için sonuç ikiye bölünür:
Mesafe (cm) = Süre (mikrosaniye) x 0.0343 / 2
Örneğin Echo pini 1166 mikrosaniye HIGH kaldıysa hesaplama şöyle olur: 1166 x 0.0343 / 2 ≈ 20 cm. Birçok kaynakta görülen süre / 58 formülü de aynı hesabın sadeleştirilmiş halidir.
HC-SR04 Arduino Bağlantısı Nasıl Yapılır?
Bağlantı için Arduino Uno veya Nano, HC-SR04 modülü ve dört adet jumper kablo yeterlidir.
| HC-SR04 Pini | Arduino Pini | Açıklama |
|---|---|---|
| VCC | 5V | Besleme |
| Trig | D9 | Tetik sinyali (çıkış) |
| Echo | D10 | Yankı sinyali (giriş) |
| GND | GND | Toprak |
Trig ve Echo için herhangi iki dijital pin kullanılabilir. Kodda pin numaralarını değiştirmeniz yeterlidir.
Temel HC-SR04 Arduino Kodu
Aşağıdaki kod her yarım saniyede bir mesafeyi ölçer ve seri monitöre yazdırır. Herhangi bir kütüphane gerektirmez.
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// Trig pinini temizle
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
// 10 mikrosaniyelik tetik darbesi
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Echo süresini ölç, 30 ms zaman aşımı
unsigned long sure = pulseIn(ECHO_PIN, HIGH, 30000UL);
if (sure == 0) {
Serial.println("Menzil disi veya yankı alinamadi");
} else {
float mesafe = sure * 0.0343 / 2.0;
Serial.print("Mesafe: ");
Serial.print(mesafe);
Serial.println(" cm");
}
delay(500);
}
Kodu yükledikten sonra Arduino IDE üzerinden seri monitörü 9600 baud hızında açın. Elinizi sensörün önünde ileri geri hareket ettirdiğinizde değerlerin değiştiğini görürsünüz.
pulseIn Zaman Aşımı Neden Önemlidir?
pulseIn() fonksiyonu zaman aşımı verilmezse varsayılan olarak bir saniyeye kadar bekler. Sensör yankı alamadığında program bu süre boyunca kilitlenir. 30000 mikrosaniyelik zaman aşımı yaklaşık 5 metrelik gidiş dönüş süresini kapsar ve menzil dışı durumda programın hızla devam etmesini sağlar. Zaman aşımı dolduğunda fonksiyon 0 döndürür.
Ölçümler Neden Zıplıyor? Medyan Filtre ile Kararlı Okuma
Ultrasonik sensörlerde arada bir alakasız bir değer okunması normaldir. Yansıma açısı, yumuşak yüzeyler veya ortamdaki başka ses kaynakları tek seferlik hatalı okumalara neden olur. Bu sıçramaları ortalama almak yerine medyan filtre ile temizlemek daha etkilidir. Ortalama, tek bir hatalı değerden etkilenirken medyan onu tamamen dışarıda bırakır.
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
const int ORNEK_SAYISI = 5;
float tekOlcum() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsigned long sure = pulseIn(ECHO_PIN, HIGH, 30000UL);
if (sure == 0) return -1;
return sure * 0.0343 / 2.0;
}
float medyanOlcum() {
float degerler[ORNEK_SAYISI];
int adet = 0;
for (int i = 0; i < ORNEK_SAYISI; i++) {
float m = tekOlcum();
if (m > 0) degerler[adet++] = m;
delay(30); // yankıların karışmaması için bekleme
}
if (adet == 0) return -1;
// Ekleme sıralaması
for (int i = 1; i < adet; i++) {
float anahtar = degerler[i];
int j = i - 1;
while (j >= 0 && degerler[j] > anahtar) {
degerler[j + 1] = degerler[j];
j--;
}
degerler[j + 1] = anahtar;
}
return degerler[adet / 2];
}
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
float mesafe = medyanOlcum();
if (mesafe < 0) {
Serial.println("Olcum yok");
} else {
Serial.print("Filtreli mesafe: ");
Serial.print(mesafe, 1);
Serial.println(" cm");
}
delay(200);
}
Ölçümler arasındaki 30 milisaniyelik bekleme önemlidir. Önceki darbenin yankısı hâlâ ortamda dolaşırken yeni ölçüm başlatılırsa sensör eski yankıyı yeni sanabilir.
Sıcaklık Mesafe Ölçümünü Nasıl Etkiler?
Sesin havadaki hızı sıcaklığa bağlıdır. Yaklaşık hesap için şu formül kullanılır:
Ses hızı (m/s) = 331.3 + 0.606 x Sıcaklık (°C)
Bu formüle göre 0 derecede ses hızı yaklaşık 331 m/s, 35 derecede ise yaklaşık 352 m/s olur. Aradaki fark, soğuk bir depoda ve sıcak bir yaz gününde aynı mesafenin birkaç yüzde farklı ölçülmesine yol açar. Hobi projelerinde bu fark genellikle önemsizdir, ancak su deposu seviyesi gibi hassas ölçümlerde düzeltme yapmak gerekir.
Sitemizde anlattığımız DHT11 sıcaklık ve nem sensörü ile ortam sıcaklığını okuyup ses hızını dinamik olarak hesaplayabilirsiniz:
float sicaklik = 24.0; // DHT11 ile okunan değer
float sesHiziCmUs = (331.3 + 0.606 * sicaklik) / 10000.0;
float mesafe = sure * sesHiziCmUs / 2.0;
Örnek Proje: Arduino Park Sensörü
HC-SR04 ile yapılabilecek en öğretici projelerden biri, araçlardaki park sensörünü taklit eden bir devredir. Cisim yaklaştıkça buzzer daha sık öter, çok yakında ise sürekli öter.
Önceki bağlantıya ek olarak aktif bir buzzerın artı ucunu D8 pinine, eksi ucunu GND pinine bağlayın.
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
const int BUZZER_PIN = 8;
float mesafeOku() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsigned long sure = pulseIn(ECHO_PIN, HIGH, 30000UL);
if (sure == 0) return 999;
return sure * 0.0343 / 2.0;
}
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
float d = mesafeOku();
if (d < 10) {
digitalWrite(BUZZER_PIN, HIGH); // çok yakın: sürekli ses
delay(100);
} else if (d < 100) {
int aralik = map((int)d, 10, 100, 80, 600);
digitalWrite(BUZZER_PIN, HIGH);
delay(60);
digitalWrite(BUZZER_PIN, LOW);
delay(aralik);
} else {
digitalWrite(BUZZER_PIN, LOW); // güvenli mesafe
delay(200);
}
}
map() fonksiyonu 10 ile 100 cm arasındaki mesafeyi 80 ile 600 milisaniye arasındaki bekleme süresine dönüştürür. Eşik değerlerini kendi kullanımınıza göre değiştirebilirsiniz.
HC-SR04 Kullanırken Sık Görülen Sorunlar ve Çözümleri
| Sorun | Olası Sebep | Çözüm |
|---|---|---|
| Sürekli 0 okunuyor | Trig ve Echo kabloları ters veya gevşek | Bağlantıları ve pin numaralarını kontrol edin |
| Rastgele büyük değerler | Yankı alınamıyor veya yansıma sapıyor | Zaman aşımı ve medyan filtre kullanın |
| Kumaş veya süngere karşı ölçüm yok | Yumuşak yüzey sesi emiyor | Sert ve düz yüzeylerde kullanın |
| Eğik duvarda hatalı ölçüm | Ses dalgası sensöre geri dönmüyor | Sensörü yüzeye dik konumlandırın |
| İki sensör birbirini bozuyor | Aynı anda ölçüm yapılıyor | Sensörleri sırayla ve aralıklı tetikleyin |
| ESP32 veya 3.3V kartta sorun | Echo çıkışı 5V seviyesinde | Echo hattına gerilim bölücü ekleyin |
Sahadan Pratik İpuçları
Masa üzerinde kusursuz çalışan HC-SR04 devreleri, gerçek ortama taşındığında farklı davranabilir. Denemelerimizde öne çıkan birkaç gözlem şunlardır:
- Uzun kablo sorun çıkarır: Sensör ile Arduino arasındaki kablo uzadıkça Echo sinyali bozulabilir. Mümkünse kısa ve düzgün kablo kullanın.
- Kasa içine gömmeyin: Sensörün önüne yakın duran kasa kenarları yankı yapar ve sabit yanlış değerler üretir. Dönüştürücüler kasadan hafifçe dışarı taşmalıdır.
- Nem ve toz: HC-SR04 su geçirmez değildir. Dış ortamda veya su deposu gibi nemli yerlerde su geçirmez muadil modüller tercih edilmelidir.
- Güç kaynağı: Motorların da çalıştığı robot projelerinde besleme dalgalanmaları okumaları bozar. Sensör beslemesine yakın bir kondansatör eklemek kararlılığı artırır.
Kütüphane kullanmak isterseniz Arduino IDE kütüphane yöneticisindeki NewPing kütüphanesi zaman aşımı, birden fazla sensör yönetimi ve medyan ölçüm gibi özellikleri hazır sunar. Ancak sensörün mantığını öğrenmek için yukarıdaki kütüphanesiz kodla başlamak daha faydalıdır.

0 Yorum