Bir robotun çevresini algılaması, çoğu zaman tek bir soruya indirgenir: “önümdeki şey ne kadar uzakta?” Bu soruyu cevaplayan sensörler ise birbirinden çok farklı fizik prensipleriyle çalışıyor ve her birinin kendine özgü kör noktaları var.
Bu rehberde dört sensör ailesini karşılaştırıyorum: ultrasonik, kızılötesi üçgenleme, uçuş süresi (ToF) ve LiDAR. Amaç, katalog rakamlarının ötesine geçip her birinin nerede güvenilir, nerede yanıltıcı olduğunu göstermek.
Hızlı karşılaştırma
| Sensör | Prensip | Menzil | Yanıt | Yaklaşık maliyet |
|---|---|---|---|---|
| HC-SR04 | Ultrasonik yankı | 2–400 cm | ~60 ms | Çok düşük |
| Sharp GP2Y0A21 | IR üçgenleme | 10–80 cm | ~38 ms | Düşük |
| Sharp GP2Y0A02 | IR üçgenleme | 20–150 cm | ~38 ms | Orta |
| VL53L0X | Lazer ToF | 3–200 cm | ~20 ms | Orta |
| VL53L1X | Lazer ToF | 4–400 cm | ~20 ms | Orta-yüksek |
| TFmini-S | Lazer ToF | 10–1200 cm | ~10 ms | Yüksek |
Tablodaki rakamlar bir başlangıç, ama asıl soru “hangisi en iyi?” değil, “benim koşullarımda hangisi yanılmaz?” Aşağıdaki seçiciyle kendi durumunuzu işaretleyip karşılaştırabilirsiniz.
Ultrasonik sensörler (HC-SR04)
Çalışma prensibi bir yarasanınkiyle aynı: sensör 40 kHz’lik kısa bir ses darbesi gönderir, yankının dönmesini bekler ve geçen süreden mesafeyi hesaplar.
float mesafeOlc() {
digitalWrite(TRIG, LOW); delayMicroseconds(2);
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long sure = pulseIn(ECHO, HIGH, 30000UL); // 30 ms zaman aşımı
if (sure == 0) return -1; // yankı gelmedi
return sure * 0.0343 / 2.0; // cm — sesin hızı 343 m/s
}
Güçlü yanları
- Yüzey rengi fark etmez. Siyah bir robot da beyaz duvar kadar iyi algılanır.
- Ortam ışığından etkilenmez. Karanlıkta da güneşte de aynı çalışır.
- Çok ucuz ve her yerde bulunur.
Zayıf yanları
- Yavaş. Sesin gidip gelmesi zaman alır. 4 metrelik ölçüm tek başına 23 ms sürer.
- Geniş koni. Yaklaşık 15–30 derecelik bir alanı tarar; nesnenin tam olarak nerede olduğunu söylemez.
- Eğik yüzeylerde kör. Ses ışık gibi yansır; yüzey 45 dereceden fazla eğikse yankı başka yöne gider ve sensör “boşluk” görür.
- Yumuşak malzemeleri göremez. Kumaş, sünger ve halı sesi yutar.
- Birbirini karıştırır. Yan yana iki HC-SR04 aynı anda tetiklenirse birinin sesi diğerine yankı gibi görünür.
Birden fazla ultrasonik sensör kullanıyorsanız hepsini aynı anda tetiklemeyin; sırayla okuyun ve her ölçümden sonra en az 60 ms bekleyin. Aksi halde sensörler birbirinin yankısını okur ve tamamen anlamsız değerler üretir.
Kızılötesi üçgenleme (Sharp)
Sharp sensörler mesafeyi süreyle değil açıyla ölçer. Bir IR LED dar bir ışık huzmesi gönderir; nesneden yansıyan ışık, sensörün içindeki küçük bir çizgisel dizinin farklı bir noktasına düşer. Nesne yaklaştıkça düşme noktası kayar.
Bu prensibin doğrudan sonucu: çıkış doğrusal değildir. Gerilim–mesafe eğrisi hiperbolik bir şekle sahiptir.
// GP2Y0A21 için yaklaşık dönüşüm (10–80 cm aralığında)
float sharpMesafe() {
int ham = analogRead(SHARP_PIN);
float volt = ham * (5.0 / 1023.0);
if (volt < 0.4) return 80; // menzil dışı
return 27.86 * pow(volt, -1.15); // cm
}
On santimetre tuzağı
Sharp sensörlerin en tehlikeli özelliği bu: minimum menzilin altında eğri tersine döner. 5 cm mesafedeki bir nesne, 25 cm mesafedeki nesneyle neredeyse aynı gerilimi üretir.
Robot bu durumda “nesne uzakta” diye düşünüp tam gaz ilerler ve çarpar. Çözüm koddan çok mekaniktir: sensörü, hiçbir nesnenin minimum menzilden yakın olamayacağı bir konuma yerleştirin (örneğin robotun ön yüzeyinden 10 cm içeri).
Değerlendirme
- Artı: Ultrasoniğe göre hızlı, dar ışın, eğik yüzeylerde daha iyi.
- Eksi: Doğrusal olmayan çıkış, siyah yüzeylerde menzil düşüşü, güneş ışığında bozulma, gürültülü analog sinyal.
Analog gürültü için basit bir hareketli ortalama neredeyse zorunludur:
#define ORNEK 5
int gecmis[ORNEK];
int idx = 0;
int filtreliOku() {
gecmis[idx] = analogRead(SHARP_PIN);
idx = (idx + 1) % ORNEK;
long toplam = 0;
for (int i = 0; i < ORNEK; i++) toplam += gecmis[i];
return toplam / ORNEK;
}
Uçuş süresi sensörleri (ToF)
ToF sensörler bir lazer darbesi gönderir ve fotonların geri dönme süresini ölçer. Ses yerine ışık kullandıkları için çok hızlıdırlar ve ışın son derece dardır (yaklaşık 25 derece, VL53L1X’te ayarlanabilir).
#include <VL53L0X.h>
VL53L0X sensor;
void setup() {
Wire.begin();
sensor.init();
sensor.setTimeout(500);
sensor.startContinuous(); // sürekli ölçüm modu
}
void loop() {
uint16_t mm = sensor.readRangeContinuousMillimeters();
if (sensor.timeoutOccurred()) { /* hata */ }
}
Güçlü yanları
- Hızlı. 20 ms ve altı ölçüm süresi, hareketli hedef takibinde belirleyici.
- Dar ışın. Nesnenin konumunu daha net verir; yan yana birden fazla sensörle açısal tarama yapılabilir.
- I2C. Analog gürültü sorunu yok, dijital veri geliyor.
- Küçük. Bir pul büyüklüğünde.
Zayıf yanları
- Yüzeye duyarlı. Mat siyah bir yüzeyde menzil yarıya inebilir; cam ve parlak metal ışığı yanlış yöne yansıtır.
- Güneş ışığında zayıflar. Doğrudan güneşte menzil ciddi biçimde düşer.
- I2C adres çakışması. Aynı model birden fazla sensör kullanacaksanız her birini XSHUT pininden sırayla açıp adres atamanız gerekir.
Birden fazla VL53L0X kullanmak
// Tüm sensörleri kapat, sonra tek tek açıp adres ver
void sensorleriBaslat() {
for (int i = 0; i < SENSOR_SAYISI; i++) pinMode(xshut[i], OUTPUT);
for (int i = 0; i < SENSOR_SAYISI; i++) digitalWrite(xshut[i], LOW);
delay(10);
for (int i = 0; i < SENSOR_SAYISI; i++) {
pinMode(xshut[i], INPUT); // yüksek empedans = sensör açılır
delay(10);
sensor[i].init();
sensor[i].setAddress(0x30 + i);
sensor[i].startContinuous();
}
}
LiDAR sensörler
TFmini gibi tek ışınlı LiDAR’lar, ToF prensibini daha güçlü bir lazer ve daha iyi optikle uygular. 12 metreye kadar ölçüm ve 100 Hz’e varan hız sunarlar.
Robotik yarışmalarında genelde aşırıdır ama otonom araç projelerinde, özellikle açık alanda çalışacak sistemlerde anlamlıdır. Dönen (2D tarayıcı) LiDAR’lar ise haritalama yapan robotlar için ayrı bir kategori.
Hangi projede hangisi
| Uygulama | Önerilen | Sebep |
|---|---|---|
| Engelden kaçan robot (öğrenme) | HC-SR04 | Ucuz, affedici, yeterli |
| Mini sumo rakip takibi | VL53L0X | Hız ve dar ışın kritik |
| Park sensörü | HC-SR04 | Geniş koni burada avantaj |
| Duvar takibi | Sharp / ToF | Dar ışın, sabit mesafe kontrolü |
| Otonom araç, açık alan | TFmini / LiDAR | Menzil ve hız |
| Su seviyesi ölçümü | HC-SR04 | Su yüzeyi ışığı yansıtır, sesi yansıtır |
| Sıra/kuyruk sayacı | ToF | Dar ışın, yanlış tetikleme az |
Sensörünüzü doğrulamak
Katalog değerleri laboratuvar koşullarında ölçülür; sizin ortamınız laboratuvar değil. Sensörü kullanmadan önce yarım saat ayırıp gerçek davranışını çıkarın.
Doğrulama masası
Bir metre şerit metre, birkaç farklı yüzey (beyaz karton, siyah mat karton, alüminyum folyo, kumaş) ve bir defter yeterli. Sensörü sabitleyin, hedefi bilinen mesafelere koyun ve okumaları not edin:
| Gerçek mesafe | Beyaz karton | Siyah mat | Kumaş | Metal |
|---|---|---|---|---|
| 5 cm | — | — | — | — |
| 10 cm | — | — | — | — |
| 25 cm | — | — | — | — |
| 50 cm | — | — | — | — |
| 80 cm | — | — | — | — |
Bu tabloyu doldurduğunuzda üç şeyi öğrenirsiniz: sensörün gerçek menzili, hangi yüzeyde yanıldığı ve okumanın ne kadar dağıldığı. Bunlar olmadan kodunuzdaki eşik değerleri tahminden ibaret kalır.
Tekrarlanabilirlik testi
Hedefi sabit tutup 100 ölçüm alın ve dağılıma bakın. Standart sapma büyükse ya filtreleme gerekir ya da sensör o mesafede güvenilir değildir.
void dagilimOlc() {
const int N = 100;
long toplam = 0; int enKucuk = 9999, enBuyuk = 0;
for (int i = 0; i < N; i++) {
int d = mesafeOlc();
toplam += d;
enKucuk = min(enKucuk, d);
enBuyuk = max(enBuyuk, d);
delay(60);
}
Serial.print("Ortalama: "); Serial.print(toplam / N);
Serial.print(" Aralik: "); Serial.print(enKucuk);
Serial.print(" - "); Serial.println(enBuyuk);
}
Sensör füzyonu: iki sensörü birleştirmek
Tek sensörün kör noktası varsa, ikinci bir sensör tipiyle kapatabilirsiniz. Basit ve etkili bir birleştirme kuralı şöyle çalışır:
float birlesikMesafe() {
float tof = tofOku(); // hızlı, hassas, siyahta zayıf
float sonik = ultrasonikOku(); // yavaş, kaba, yüzey rengi umursamaz
bool tofGecerli = (tof > 3 && tof < 190);
bool sonikGecerli = (sonik > 3 && sonik < 380);
if (tofGecerli && sonikGecerli) {
// İkisi de görüyor: birbirini doğruluyorsa ToF'a güven
if (fabs(tof - sonik) < 15) return tof;
return min(tof, sonik); // uyuşmuyorsa temkinli davran
}
if (tofGecerli) return tof;
if (sonikGecerli) return sonik;
return -1; // ikisi de göremiyor
}
Son satırdaki min() tercihi bilinçli: iki sensör farklı şey söylüyorsa, robotun daha yakın olanı varsayması güvenlidir. Çarpmaktansa erken yavaşlamak yeğdir.
Ne zaman gereksiz
Füzyon, karmaşıklık ve gecikme ekler. Tek bir sensör ortamınızda güvenilir çalışıyorsa ikincisini eklemeyin. Füzyonu, doğrulama masasında somut bir kör nokta bulduğunuzda düşünün.
Ölçümü güvenilir kılan üç alışkanlık
1. Aykırı değerleri atın
Tek bir hatalı okuma robotu yanlış karara sürükleyebilir. Ortanca (median) filtre, ani sıçramaları hareketli ortalamadan çok daha iyi temizler:
int ortancaOku() {
int a = tekOlcum(), b = tekOlcum(), c = tekOlcum();
if ((a <= b && b <= c) || (c <= b && b <= a)) return b;
if ((b <= a && a <= c) || (c <= a && a <= b)) return a;
return c;
}
2. Menzil dışını ayrı bir durum olarak ele alın
“Ölçüm yok” ile “çok uzak” aynı şey değildir. Ultrasonik sensörde yankı gelmemesi, nesnenin uzak olduğu kadar sesi yutan bir yüzey olduğu anlamına da gelebilir. Kodunuzda bu durumu -1 gibi ayrı bir değerle işaretleyin ve robotun buna nasıl tepki vereceğine bilinçli karar verin.
3. Sensörleri karıştırarak kullanın
Farklı prensiplerin kör noktaları farklıdır. Ultrasonik + ToF kombinasyonu, tek başına ikisinden de güvenilirdir: ToF hızlı ve hassas ölçer, ultrasonik ise ToF’un göremediği mat siyah yüzeyi yakalar.
Sonuç
Mesafe sensörü seçerken sorulacak doğru soru “hangisi en iyi?” değil, “benim ortamımda hangisi en az yanılır?” Yüzeyler siyahsa ultrasonik, hız gerekiyorsa ToF, bütçe kritikse HC-SR04, açık alan söz konusuysa LiDAR.
Sensörlerden gelen veriyi bir kontrol döngüsüne bağlamak isterseniz PID kontrol rehberi doğal devam noktası; sensörleri bir karta bağlarken pin ve gerilim uyumu için ESP32 mi Arduino mu yazısındaki 3,3 V uyarılarına göz atın.
Frequently asked questions
HC-SR04 ile VL53L0X arasındaki fark nedir?
HC-SR04 ses dalgası kullanır: ucuzdur, yüzey rengi önemli değildir ama yavaştır (~60 ms) ve ölçüm konisi geniştir. VL53L0X lazer ışığının uçuş süresini ölçer: çok hızlıdır (~20 ms), ışını dardır, ancak siyah ve parlak yüzeylerde menzili düşer.
Ultrasonik sensör neden yanlış ölçüyor?
En yaygın sebepler: yüzeyin sensöre eğik olması (ses yansıyıp geri gelmez), yumuşak/gözenekli malzemenin sesi yutması, iki sensörün birbirini duyması ve ölçümler arası yeterli bekleme koymamak. İki ölçüm arasında en az 60 ms bırakın.
Sharp mesafe sensörü neden yakın mesafede saçmalıyor?
Sharp GP2Y0A21 üçgenleme prensibiyle çalışır ve çıkışı doğrusal değildir. Yaklaşık 10 cm’in altında gerilim eğrisi tersine döner: 5 cm ile 25 cm neredeyse aynı değeri verir. Bu yüzden sensörü fiziksel olarak, en yakın nesnenin 10 cm’den uzak kalacağı şekilde konumlandırın.
Robot için kaç mesafe sensörü gerekir?
Engelden kaçan basit bir robotta öne bakan tek sensör yeterli olabilir. Mini sumo gibi rakip takibi gereken robotlarda en az üç (sol-orta-sağ), tercihen beş sensör kullanın. Otonom araçlarda 6–8 sensörlü diziler yaygındır.
Güneş ışığı sensörleri etkiler mi?
Kızılötesi ve ToF sensörlerini belirgin şekilde etkiler; doğrudan güneş ışığında menzil ciddi düşer, hatta ölçüm imkânsızlaşır. Ultrasonik sensörler ışıktan hiç etkilenmez. Açık havada çalışacak projelerde bu tek başına belirleyici olabilir.
Comments
0No comments yet. Be the first to comment!