Arduino Mesafe Sensörü Çeşitleri: HC-SR04, IR, VL53L0X ve LiDAR
Arduino mesafe sensörü çeşitleri karşılaştırması: HC-SR04, JSN-SR04T, Sharp IR, VL53L0X/VL53L1X, TF-Luna ve TCRT5000; menzil, doğruluk, açı, yüzey ve kod.
Arduino mesafe sensörü çeşitleri arasında seçim yapmak, ilk bakışta "hangisi en uzağı ölçüyor" sorusu gibi görünür, ama asıl belirleyici olan ölçeceğin yüzey, gereken doğruluk, ışının ne kadar dar olması gerektiği ve ortam koşullarıdır. Aynı HC-SR04, duvara olan mesafeyi santimetre doğrulukla ölçerken bir koltuğun yumuşak kumaşında kararsızlaşabilir; ucuz bir lazer sensör ise milimetre hassasiyet verirken güneş altında menzilinin yarısını kaybedebilir. Bu rehberde Arduino projelerinde en sık kullanılan altı sensörü yan yana koyuyoruz.
Karşılaştıracağımız sensörler: ultrasonik HC-SR04 ve su geçirmez kardeşi JSN-SR04T, kızılötesi üçgenleme yapan Sharp GP2Y0A21, lazer uçuş süresi (ToF) sensörleri VL53L0X ve VL53L1X, küçük bir LiDAR olan TF-Luna ve kısa mesafe yakınlık sensörü TCRT5000. Her biri için çalışma prensibini, menzilini, doğruluğunu, ışın açısını, yüzeylere tepkisini ve arayüzünü anlatıyor, derlenmiş birer örnek kod veriyoruz. Sonunda hangi projede hangisinin seçilmesi gerektiğini bir tabloyla özetliyoruz.

Mesafe sensörleri nasıl ölçer? Üç temel prensip
Arduino'da kullanılan mesafe sensörlerinin neredeyse hepsi üç yöntemden birini kullanır. Uçuş süresi (time of flight): sensör bir ses ya da ışık darbesi gönderir ve yansımanın geri dönme süresini ölçer; mesafe, süre ile hızın çarpımının yarısıdır. Ultrasonik sensörler sesle, VL53L0X ve TF-Luna ise ışıkla bu ölçümü yapar. Işık sesten yaklaşık bir milyon kat hızlı olduğu için ToF sensörleri pikosaniye düzeyinde zamanlama yapan özel yongalar içerir. Üçgenleme (triangulation): Sharp IR sensörleri kızılötesi ışını hedefe gönderir, yansıyan ışığın konuma duyarlı bir dedektörün (PSD) neresine düştüğüne bakar; yakın cisimlerde nokta bir uca, uzak cisimlerde diğer uca kayar. Yansıma şiddeti: TCRT5000 gibi basit sensörler yalnızca geri dönen ışığın ne kadar güçlü olduğunu ölçer; bu, yüzey renginden çok etkilendiği için gerçek bir mesafe ölçümü değil, yakınlık algılamasıdır.
| Prensip | Sensörler | Artısı | Eksisi |
|---|---|---|---|
| Ses ile uçuş süresi | HC-SR04, JSN-SR04T | Ucuz, renkten ve ışıktan etkilenmez | Geniş ışın, yumuşak ve açılı yüzeylerde zayıf, sıcaklığa duyarlı |
| Işık ile uçuş süresi | VL53L0X, VL53L1X, TF-Luna | Hızlı, dar ışın, iyi doğruluk | Güneş ışığı ve cam yüzeyler sorun çıkarır |
| Kızılötesi üçgenleme | Sharp GP2Y0A21 | Renkten az etkilenir, basit analog çıkış | Doğrusal olmayan çıkış, dar menzil, 10 cm altında yanıltıcı |
| Yansıma şiddeti | TCRT5000 | Çok ucuz, çok hızlı | Yalnızca birkaç mm–cm, renge çok bağımlı |
Büyük karşılaştırma tablosu
Aşağıdaki tablo, sensörlerin tipik modül değerlerini bir araya getiriyor. Menzil değerleri üreticilerin verdiği aralıklardır; gerçek projede yüzeye ve ortama bağlı olarak daha kısa olabilir. Fiyatlar ülkeden ülkeye değiştiği için göreli olarak verilmiştir.
| Sensör | Menzil | Doğruluk | Işın açısı | Arayüz | Besleme | Göreli fiyat |
|---|---|---|---|---|---|---|
| HC-SR04 | 2–400 cm | Yaklaşık ±0,3–1 cm | Yaklaşık 15° | Trig/Echo darbe | 5 V (HC-SR04P: 3,3–5 V) | Çok ucuz |
| JSN-SR04T | Yaklaşık 25–450 cm | Yaklaşık ±1 cm | Geniş (yaklaşık 45° ve üstü) | Trig/Echo, bazı sürümlerde UART | 5 V | Ucuz |
| Sharp GP2Y0A21 | 10–80 cm | Yakında iyi, uzakta zayıf | Dar (birkaç derece) | Analog gerilim | 4,5–5,5 V | Orta |
| VL53L0X | 3 cm – 2 m (varsayılan ~1,2 m) | Yaklaşık ±%3 | 25° | I2C (0x29) | Modül 3,3–5 V | Ucuz |
| VL53L1X | 4 cm – 4 m | Yaklaşık ±%3, mm çözünürlük | 27° (15°'ye daraltılabilir) | I2C (0x29) | Modül 3,3–5 V | Orta |
| TF-Luna | 0,2–8 m | ±6 cm (3 m'ye kadar), ±%2 (3–8 m) | 2° | UART ya da I2C | 5 V, 3,3 V lojik | Pahalı |
| TCRT5000 | Yaklaşık 0,2–15 mm (en iyi 2,5 mm) | Mesafe değil, var/yok | Dar | Dijital (DO) + analog (AO) | 3,3–5 V | Çok ucuz |
HC-SR04: ultrasonik klasik
HC-SR04, 40 kHz'lik sekiz ses darbesi gönderir ve yankı geri gelene kadar ECHO pinini HIGH tutar. Arduino bu darbenin süresini pulseIn() ile mikrosaniye cinsinden ölçer. Ses 20 °C'de saniyede yaklaşık 343 metre, yani mikrosaniyede 0,0343 cm yol alır; ses hedefe gidip geri döndüğü için mesafe = süre × 0,0343 / 2 olur. Ses hızı sıcaklıkla değişir (yaklaşık 331,3 + 0,606 × T m/s): 0 °C ile 35 °C arasında yaklaşık %6 fark vardır, yani 2 metrede 12 cm'ye varan hata demektir. Aşağıdaki kod bu düzeltmeyi yapar ve beş ölçümün ortancasını alarak ara sıra gelen hatalı yankıları ayıklar.
1const int TRIG_PIN = 9;
2const int ECHO_PIN = 10;
3const float SICAKLIK = 20.0; // ortam sıcaklığı, °C / ambient temperature, °C
4float sesHizi; // cm/µs
5
6float mesafeOlc() {
7 digitalWrite(TRIG_PIN, LOW);
8 delayMicroseconds(2);
9 digitalWrite(TRIG_PIN, HIGH); // 10 µs tetik darbesi / 10 µs trigger pulse
10 delayMicroseconds(10);
11 digitalWrite(TRIG_PIN, LOW);
12 unsigned long sure = pulseIn(ECHO_PIN, HIGH, 30000UL); // 30 ms ≈ 5 m sınırı / ~5 m limit
13 if (sure == 0) return -1; // yankı yok / no echo
14 return sure * sesHizi / 2.0; // gidiş-dönüş / round trip
15}
16
17void setup() {
18 Serial.begin(9600);
19 pinMode(TRIG_PIN, OUTPUT);
20 pinMode(ECHO_PIN, INPUT);
21 sesHizi = (331.3 + 0.606 * SICAKLIK) / 10000.0; // m/s -> cm/µs (20 °C: 0,0343)
22}
23
24void loop() {
25 float olcum[5];
26 for (int i = 0; i < 5; i++) { // 5 ölçüm, aralarında 60 ms / 5 readings, 60 ms apart
27 olcum[i] = mesafeOlc();
28 delay(60);
29 }
30 for (int i = 1; i < 5; i++) { // sırala / sort
31 float x = olcum[i];
32 int j = i - 1;
33 while (j >= 0 && olcum[j] > x) { olcum[j + 1] = olcum[j]; j--; }
34 olcum[j + 1] = x;
35 }
36 float d = olcum[2]; // ortanca / median
37 if (d < 0) Serial.println("Menzil disi / out of range");
38 else { Serial.print(d, 1); Serial.println(" cm"); }
39}
40- Ölçümler arasında en az 60 ms bekle: Önceki darbenin yankıları odada dolaşırken yeni ölçüm yaparsan yanlış sonuç alırsın.
- Yumuşak ve açılı yüzeyler: Kumaş, sünger ve perde sesi emer; 45 dereceden fazla eğik yüzeyler yankıyı sensöre değil başka yöne yansıtır.
- Geniş ışın: Yaklaşık 15 derecelik koni, 2 metrede 50 cm'ye yakın bir alanı kapsar; dar bir koridorda yan duvarları da görebilir.
- 3,3 V kartlar: Klasik HC-SR04 5 V ister ve ECHO çıkışı 5 V verir; ESP32 ve Pico'da ECHO'ya bir gerilim bölücü koy ya da 3,3 V ile çalışan HC-SR04P kullan.
- Birden fazla sensör: Aynı anda tetiklenen iki HC-SR04 birbirinin yankısını duyar; sırayla tetikle.
HC-SR04'ün bağlantısı, Seri Monitör ve LCD ile kullanımı HC-SR04 mesafe sensörü yazısında ayrıntılı anlatılıyor; bu yazıda karşılaştırmaya odaklanıyoruz.
JSN-SR04T: su geçirmez ultrasonik
JSN-SR04T, HC-SR04 ile aynı tetik ve yankı mantığıyla çalışır ama dönüştürücüsü kablolu, su geçirmez bir kapsülün içindedir; elektronik kart ise ayrı durur. Bu yüzden su deposu, kuyu, yağmur suyu tankı ve dış mekân park sensörü gibi nemli yerler için tercih edilir. İki önemli farkı vardır: tek bir dönüştürücü hem gönderip hem dinlediği için yakın mesafede bir ölü bölge (yaklaşık 20–25 cm) oluşur, ışın da HC-SR04'ten geniştir. Sensörü deponun üst kapağına, en yüksek su seviyesinin en az 25 cm yukarısına monte etmelisin. Aşağıdaki kod mesafeyi doluluk yüzdesine çevirir.
1// JSN-SR04T ile su deposu doluluğu / water tank level with a JSN-SR04T
2const int TRIG_PIN = 9;
3const int ECHO_PIN = 10;
4const float SENSOR_BOSLUK = 25.0; // sensörden en yüksek su seviyesine, cm (ölü bölge) / sensor to max level (blind zone)
5const float DEPO_DERINLIK = 120.0; // en yüksek seviyeden depo dibine, cm / max level to tank bottom
6
7float mesafeOlc() {
8 digitalWrite(TRIG_PIN, LOW);
9 delayMicroseconds(5);
10 digitalWrite(TRIG_PIN, HIGH);
11 delayMicroseconds(20); // JSN-SR04T 10 µs'den uzun darbeyi sever / likes a longer pulse
12 digitalWrite(TRIG_PIN, LOW);
13 unsigned long sure = pulseIn(ECHO_PIN, HIGH, 40000UL);
14 if (sure == 0) return -1;
15 return sure * 0.0343 / 2.0; // 20 °C ses hızı / speed of sound at 20 °C
16}
17
18void setup() {
19 Serial.begin(9600);
20 pinMode(TRIG_PIN, OUTPUT);
21 pinMode(ECHO_PIN, INPUT);
22}
23
24void loop() {
25 float d = mesafeOlc();
26 if (d < 0) {
27 Serial.println("Yanki yok / no echo");
28 } else {
29 float suYuksekligi = DEPO_DERINLIK - (d - SENSOR_BOSLUK); // dipten su yüksekliği / water height
30 float yuzde = constrain(suYuksekligi / DEPO_DERINLIK * 100.0, 0, 100);
31 Serial.print("Mesafe / distance: ");
32 Serial.print(d, 1);
33 Serial.print(" cm Doluluk / fill: %");
34 Serial.println(yuzde, 0);
35 }
36 delay(1000); // su yüzeyi dalgalanır, sık ölçme / water ripples, measure slowly
37}
38Sharp GP2Y0A21: analog kızılötesi
Sharp GP2Y0A21YK0F, 10–80 cm arasında çalışan ve mesafeye göre analog bir gerilim veren bir kızılötesi sensördür. Üçgenleme kullandığı için yansıma şiddetine göre çalışan sensörlerden farklı olarak hedefin rengine az duyarlıdır. Çıkışı doğrusal değildir: yaklaşık 10 cm'de 2,3 V, 80 cm'de 0,4 V verir ve ikisi arasında ters üstel bir eğri izler. Kod bu eğriyi mesafe = 29,988 × V^-1,173 yaklaşımıyla çevirir. En önemli tuzak 10 cm'nin altıdır: hedef yaklaştıkça çıkış yeniden düşer ve 5 cm'deki bir cisim 20 cm'deymiş gibi görünebilir. Sensörü, hedefin 10 cm'den fazla yaklaşamayacağı şekilde yerleştirmelisin.
1// Sharp GP2Y0A21YK0F (10–80 cm), analog / analog output
2const int SHARP_PIN = A0;
3
4float sharpCm() {
5 long toplam = 0;
6 for (int i = 0; i < 20; i++) { // 20 okumanın ortalaması / average of 20 readings
7 toplam += analogRead(SHARP_PIN);
8 delay(2);
9 }
10 float volt = toplam / 20.0 * 5.0 / 1023.0;
11 if (volt < 0.35) return -1; // 80 cm'den uzak / farther than 80 cm
12 float cm = 29.988 * pow(volt, -1.173); // ters güç eğrisi / inverse power curve
13 if (cm > 80) return -1;
14 return cm; // 10 cm altı yanıltıcı / misleading below 10 cm
15}
16
17void setup() {
18 Serial.begin(9600);
19}
20
21void loop() {
22 float cm = sharpCm();
23 if (cm < 0) Serial.println("Menzil disi / out of range");
24 else { Serial.print(cm, 1); Serial.println(" cm"); }
25 delay(100);
26}
27Sharp sensörler ölçüm sırasında kısa süreli yüksek akım darbeleri çeker ve bu darbeler besleme hattında gürültü yaratır. Sensörün VCC ve GND uçlarına yakın 10 µF civarında bir kondansatör koymak okumaları belirgin şekilde sakinleştirir. Ailenin farklı menzilli üyeleri de vardır: GP2Y0A41SK0F 4–30 cm, GP2Y0A02YK0F 20–150 cm aralığında çalışır; her birinin eğri katsayıları farklıdır.
VL53L0X ve VL53L1X: lazer ToF sensörleri
VL53L0X ve VL53L1X, STMicroelectronics'in küçücük lazer uçuş süresi sensörleridir. 940 nm'lik görünmez bir lazer darbesi gönderir, foton sayaçlarıyla yansımanın dönüş süresini ölçer ve sonucu doğrudan milimetre olarak I2C üzerinden verirler. Renkten neredeyse bağımsızdırlar, ışınları ultrasoniğe göre dardır ve ölçüm 20–50 ms içinde tamamlanır. VL53L0X varsayılan modda yaklaşık 1,2 metreye, uzun menzil modunda 2 metreye kadar ölçer; VL53L1X ise 4 metreye çıkar ve görüş alanı (ROI) yazılımla daraltılabilir. Her ikisinin de varsayılan I2C adresi 0x29'dur. Aşağıdaki kod Pololu'nun VL53L0X kütüphanesini kullanır; Kütüphane Yöneticisi'nde "VL53L0X" araması ile Pololu sürümünü kur.
1#include <Wire.h>
2#include <VL53L0X.h> // Pololu VL53L0X kütüphanesi / library
3
4VL53L0X sensor;
5
6void setup() {
7 Serial.begin(9600);
8 Wire.begin(); // Uno: SDA A4, SCL A5 / ESP32: SDA 21, SCL 22
9 sensor.setTimeout(500);
10 if (!sensor.init()) {
11 Serial.println("VL53L0X bulunamadi / not found");
12 while (true) {}
13 }
14 // Uzun menzil modu (2 m'ye kadar, daha gürültülü) / long range mode (up to 2 m, noisier):
15 // sensor.setSignalRateLimit(0.1);
16 // sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
17 // sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
18 sensor.setMeasurementTimingBudget(50000); // 50 ms: daha kararlı ölçüm / steadier reading
19 sensor.startContinuous();
20}
21
22void loop() {
23 uint16_t mm = sensor.readRangeContinuousMillimeters();
24 if (sensor.timeoutOccurred()) {
25 Serial.println("Zaman asimi / timeout");
26 } else if (mm >= 8190) { // 8190-8191: hedef yok / no target
27 Serial.println("Menzil disi / out of range");
28 } else {
29 Serial.print(mm);
30 Serial.println(" mm");
31 }
32}
33Ölçüm süresi bütçesi (timing budget) doğrulukla hız arasındaki dengeyi belirler: 20 ms hızlı ama gürültülü, 200 ms yavaş ama kararlıdır. Güneş ışığı ve güçlü kızılötesi kaynaklar menzili belirgin şekilde kısaltır; dış mekânda ölçüm yapacaksan bunu hesaba kat. Aynı I2C hattına iki VL53L0X bağlamak istersen ikisinin de adresi 0x29 olduğu için XSHUT pinleriyle birini kapatıp diğerine yeni adres verirsin (setAddress); I2C ayrıntıları I2C nedir yazısında.
TF-Luna: küçük LiDAR ile 8 metre
TF-Luna, Benewake'in tek noktalı küçük LiDAR sensörüdür: 850 nm'lik bir kızılötesi ışık modüle ederek uçuş süresini ölçer, 0,2–8 metre arasında, yalnızca 2 derecelik çok dar bir ışınla çalışır ve saniyede 250'ye kadar ölçüm yapabilir. Ölçümü varsayılan olarak 115200 baud'da UART üzerinden 9 baytlık paketler hâlinde gönderir: iki adet 0x59 başlık baytı, mesafe (cm), sinyal gücü, iç sıcaklık ve bir sağlama toplamı. Sinyal gücü 100'ün altındaysa ya da 65535 ise (aşırı yansıma) ölçüm güvenilmez kabul edilir. 5 V ile beslenir ama UART lojik seviyesi 3,3 V'tur; bu yüzden ESP32'ye doğrudan bağlanır. Uno'nun SoftwareSerial'ı 115200 baud'da güvenilir olmadığı için ESP32 ya da Mega gibi donanım UART'ı olan bir kart tercih et; UART paket çözümlemenin mantığı UART seri haberleşme yazısında.
1// TF-Luna LiDAR, UART (115200), ESP32 Serial2
2// TF-Luna TX -> GPIO 16, RX -> GPIO 17, VCC 5V, GND
3const int RXD2 = 16, TXD2 = 17;
4
5uint8_t kare[9]; // 0x59 0x59 DistL DistH AmpL AmpH TempL TempH Checksum
6int konum = 0;
7
8void setup() {
9 Serial.begin(115200);
10 Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
11}
12
13void loop() {
14 while (Serial2.available()) {
15 uint8_t b = Serial2.read();
16 if (konum < 2) { // iki 0x59 başlık baytını bekle / wait for two 0x59 header bytes
17 if (b == 0x59) kare[konum++] = b;
18 else konum = 0;
19 continue;
20 }
21 kare[konum++] = b;
22 if (konum < 9) continue;
23 konum = 0;
24
25 uint8_t toplam = 0;
26 for (int i = 0; i < 8; i++) toplam += kare[i];
27 if (toplam != kare[8]) continue; // sağlama toplamı hatalı / bad checksum
28
29 uint16_t mesafe = kare[2] | (kare[3] << 8); // cm
30 uint16_t guc = kare[4] | (kare[5] << 8); // sinyal gücü / signal strength
31 float derece = (kare[6] | (kare[7] << 8)) / 8.0 - 256.0;
32
33 if (guc < 100 || guc == 65535) { // zayıf ya da aşırı sinyal / weak or saturated
34 Serial.println("Guvenilmez / unreliable");
35 } else {
36 Serial.print(mesafe);
37 Serial.print(" cm guc / amp: ");
38 Serial.print(guc);
39 Serial.print(" ic sicaklik / chip temp: ");
40 Serial.println(derece, 1);
41 }
42 }
43}
44TCRT5000: yakınlık ve çizgi algılama

TCRT5000 bir mesafe ölçer değil, bir yansıma sensörüdür: kızılötesi LED'in ışığı yüzeyden geri döner ve yanındaki fototransistör ne kadar ışık geldiğini ölçer. En iyi çalıştığı mesafe yaklaşık 2,5 mm'dir ve 1,5 cm'den sonra sinyal hızla zayıflar. Beyaz yüzey çok, siyah yüzey çok az yansıttığı için aynı mesafede bile renge göre bambaşka değerler verir; bu yüzden çizgi izleyen robotlarda siyah-beyaz zemin ayrımı, enkoder disklerinde delik sayma ve çok yakın nesne algılamada kullanılır. Modüllerdeki karşılaştırıcı, potla ayarlanan eşiği aşınca dijital çıkışı değiştirir. Ayrıntılar TCRT5000 kızılötesi sensör yazısında.
1// TCRT5000 modülü: DO dijital, AO analog / TCRT5000 module: DO digital, AO analog
2const int DO_PIN = 7;
3const int AO_PIN = A1;
4const int LED_PIN = 13;
5
6void setup() {
7 Serial.begin(9600);
8 pinMode(DO_PIN, INPUT);
9 pinMode(LED_PIN, OUTPUT);
10}
11
12void loop() {
13 bool nesneVar = (digitalRead(DO_PIN) == LOW); // çoğu modülde LOW = yansıma var / LOW = reflection on most modules
14 int yansima = analogRead(AO_PIN); // düşük değer = güçlü yansıma / low value = strong reflection
15 digitalWrite(LED_PIN, nesneVar);
16 Serial.print(nesneVar ? "Nesne VAR / object " : "Nesne yok / none ");
17 Serial.println(yansima);
18 delay(100);
19}
20Yüzey ve ortam etkisi
Bir sensörün kâğıt üzerindeki menzili, ölçtüğün yüzeyle karşılaştığında değişir. Ultrasonik sensörler sesi yansıtan sert yüzeylerde mükemmeldir ama sesi emen kumaşta zorlanır; ışık kullanan sensörler ise rengi, parlaklığı ve güneş ışığını önemser. Aşağıdaki tablo, projeni tasarlarken hangi durumda hangi sensörün güvenilir kalacağını gösteriyor.
| Yüzey / ortam | Ultrasonik (HC-SR04) | Sharp IR | Lazer ToF (VL53, TF-Luna) | TCRT5000 |
|---|---|---|---|---|
| Sert, düz duvar | Çok iyi | İyi | Çok iyi | İyi (yalnız çok yakında) |
| Kumaş, sünger, perde | Zayıf (ses emilir) | İyi | İyi | Orta |
| Siyah mat yüzey | İyi | Orta | Menzil kısalır | Çok zayıf |
| Cam, ayna, parlak metal | İyi (ses yansır) | Yanıltıcı | Yanıltıcı (ışık geçer ya da sapar) | Yanıltıcı |
| Eğik yüzey | Zayıf (yankı sapar) | Orta | İyi | Orta |
| Güneş ışığı, dış mekân | Etkilenmez | Etkilenir | Menzil belirgin şekilde kısalır | Etkilenir |
| Su yüzeyi | İyi (depo ölçümü) | Zayıf | Değişken | Uygun değil |
| Sıcaklık değişimi | Ses hızı değişir, düzeltme gerekir | Az etkilenir | Az etkilenir | Az etkilenir |
Bağlantı özeti: Uno, ESP32 ve Pico
| Sensör | Arduino Uno | ESP32 | Raspberry Pi Pico | Not |
|---|---|---|---|---|
| HC-SR04 / JSN-SR04T | TRIG D9, ECHO D10, 5V | TRIG 5, ECHO 18 (bölücüyle), VIN 5V | TRIG GP14, ECHO GP15 (bölücüyle), VBUS | ECHO 5 V verir |
| Sharp GP2Y0A21 | A0, 5V | GPIO 34 (bölücüyle), VIN 5V | GP26 (bölücüyle), VBUS | Çıkış 3,1 V'a kadar çıkabilir |
| VL53L0X / VL53L1X | SDA A4, SCL A5 | SDA 21, SCL 22 | SDA GP4, SCL GP5 | Adres 0x29 |
| TF-Luna | SoftwareSerial önerilmez | TX → GPIO 16, RX → GPIO 17 | TX → GP1 (uart0 RX), RX → GP0 | 5 V besleme, 3,3 V lojik |
| TCRT5000 modülü | DO D7, AO A1 | DO 27, AO 34 | DO GP16, AO GP27 | 3,3–5 V |
Raspberry Pi Pico ile ultrasonik ölçüm
MicroPython'da darbe süresini ölçmek için machine.time_pulse_us() fonksiyonu kullanılır; Arduino'daki pulseIn() ile aynı işi yapar ve zaman aşımında eksi bir değer döndürür. HC-SR04'ü Pico'nun VBUS (USB 5 V) pininden besle, ECHO hattına 1 kΩ + 2 kΩ'luk bir bölücü koy ya da doğrudan 3,3 V ile çalışan HC-SR04P kullan. VL53L0X ve TF-Luna için de MicroPython sürücüleri vardır; TF-Luna'nın UART paketini Arduino kodundaki mantıkla machine.UART üzerinden kolayca çözebilirsin.
1from machine import Pin, time_pulse_us
2import time
3
4trig = Pin(14, Pin.OUT)
5echo = Pin(15, Pin.IN) # 5 V ECHO için gerilim bölücü şart / divider required for a 5 V ECHO
6SES_HIZI = 0.0343 # cm/µs, 20 °C
7
8def mesafe_olc():
9 trig.low()
10 time.sleep_us(2)
11 trig.high()
12 time.sleep_us(10) # 10 µs tetik / 10 µs trigger
13 trig.low()
14 sure = time_pulse_us(echo, 1, 30000) # zaman aşımında eksi döner / negative on timeout
15 if sure < 0:
16 return None
17 return sure * SES_HIZI / 2
18
19while True:
20 d = mesafe_olc()
21 print("Menzil disi" if d is None else "{:.1f} cm".format(d))
22 time.sleep_ms(100)
23Hangi projede hangi mesafe sensörü?
| Proje | Önerilen sensör | Neden? |
|---|---|---|
| Engelden kaçan robot | HC-SR04 (bütçe) ya da VL53L0X | Geniş ışın engeli kaçırmaz; VL53L0X daha hızlı ve küçük |
| Su deposu, kuyu seviyesi | JSN-SR04T | Su geçirmez prob, su yüzeyini iyi görür |
| Araç park sensörü | JSN-SR04T ya da HC-SR04 | Dış mekâna dayanıklılık, 2–3 m menzil yeter |
| Çizgi izleyen robot | TCRT5000 | Siyah-beyaz ayrımı için yapılmıştır |
| Mini sumo, masaüstü hassas ölçüm | VL53L0X / VL53L1X | Milimetre çözünürlük, dar ışın, küçük boyut |
| Arduino radar (servo ile tarama) | HC-SR04 ya da TF-Luna | HC-SR04 ucuz; TF-Luna'nın 2° ışını çok daha net harita çizer |
| Boy ölçer, kapı geçiş sayacı | VL53L1X ya da TF-Luna | Uzun menzil ve kararlı ölçüm |
| Drone, uzun mesafe | TF-Luna | 8 m menzil, 250 Hz'e kadar ölçüm |
| Temassız musluk, el algılama | Sharp GP2Y0A21 | 10–80 cm aralığı ve basit analog çıkış |
Proje fikirleri için de birkaç öneri: HC-SR04'ü bir servo üzerinde döndürerek Arduino radar ekranı yap; engelden kaçan robotunda önde bir HC-SR04, yanlarda iki VL53L0X kullan; akıllı çöp kutusunda kapağı el yaklaşınca aç; bir OLED ekranla taşınabilir dijital metre yap ya da JSN-SR04T ile su deposunun doluluğunu ESP32 üzerinden telefonuna gönder.
Sık yapılan hatalar ve çözümleri
| Belirti | Olası neden | Çözüm |
|---|---|---|
| HC-SR04 sürekli 0 ya da menzil dışı | Yankı gelmiyor, kablo ya da besleme sorunu | 5 V beslemeyi ve TRIG/ECHO pinlerini kontrol et, pulseIn'e zaman aşımı ver |
| Ultrasonik değerler arada bir sıçrıyor | Önceki darbenin yankısı ya da yan duvar | Ölçümler arasında 60 ms bekle, ortanca filtre kullan |
| JSN-SR04T yakını ölçemiyor | Ölü bölge (20–25 cm) | Sensörü hedeften en az 25 cm uzağa monte et |
| Sharp çok yakında yanlış ve büyük değer | 10 cm altında eğri geri döner | Hedefin 10 cm'den yaklaşmasını engelle |
| Sharp okumaları gürültülü | Akım darbeleri beslemeyi bozuyor | VCC-GND arasına 10 µF kondansatör, ortalama al |
| VL53L0X bulunamadı | I2C kablolaması ya da adres çakışması | SDA/SCL'yi ve 0x29 adresini I2C tarayıcıyla kontrol et |
| Lazer sensör dışarıda kısa ölçüyor | Güneş ışığındaki kızılötesi | Gölgelik ekle, ölçüm bütçesini artır ya da ultrasonik kullan |
| TF-Luna verisi anlamsız | Baud yanlış ya da SoftwareSerial yetişmiyor | 115200 baud ve donanım UART'ı kullan, sağlama toplamını kontrol et |
Mesafe sensörleri, Arduino projelerine çevresini algılama yeteneği kazandırmanın en kolay yoludur; doğru sensörü seçmek, aynı projenin kararlı ya da sinir bozucu çalışması arasındaki farktır. Bu karşılaştırmadaki tablolar ve kodlar, ihtiyacına göre bütçe ile performansı dengelemene yardım eder. BlueGrays uygulamasında HC-SR04 ile mesafe ölçme, park sensörü, boy ölçüm, engelden kaçan robot, ESP32 park sensörü ve TCRT5000 ile mesafe ölçme projelerini adım adım devre şemaları ve kodlarıyla bulabilirsin.
Sıkça sorulan sorular
Arduino için en iyi mesafe sensörü hangisi?
Tek bir en iyi sensör yoktur; seçim hedefe ve ortama bağlıdır. Genel amaçlı ve ucuz bir çözüm için HC-SR04, milimetre hassasiyet ve dar ışın için VL53L0X ya da VL53L1X, nemli yerler için JSN-SR04T, birkaç metreden uzağı hızlı ölçmek için TF-Luna uygundur.
HC-SR04 kaç metreye kadar ölçer?
Üretici değeri 2 cm ile 4 metre arasıdır, ancak pratikte güvenilir ölçüm genellikle 2–3 metreye kadardır. Hedef büyük, sert ve sensöre dik olduğunda bu sınıra yaklaşılır; yumuşak, küçük ya da eğik hedeflerde menzil belirgin şekilde kısalır.
Ultrasonik ve kızılötesi mesafe sensörü farkı nedir?
Ultrasonik sensör ses darbesinin yankı süresini ölçer; renkten ve ışıktan etkilenmez ama ışını geniştir ve yumuşak yüzeylerde zorlanır. Kızılötesi sensörler ışık kullanır, ışınları daha dardır ve hızlıdır, ancak güneş ışığı, cam ve bazı koyu yüzeyler ölçümü bozabilir.
VL53L0X ile VL53L1X arasındaki fark nedir?
İkisi de I2C ile çalışan lazer ToF sensörleridir. VL53L0X yaklaşık 2 metreye kadar ölçer, VL53L1X ise 4 metreye çıkar, daha hızlı ölçüm yapabilir ve görüş alanı yazılımla daraltılabilir. Kısa mesafeli küçük robotlar için VL53L0X, daha uzun ve hassas ölçüm için VL53L1X tercih edilir.
Su deposu seviyesi için hangi mesafe sensörü kullanılır?
Su geçirmez probu olan JSN-SR04T en yaygın tercihtir; deponun üst kapağına, en yüksek su seviyesinin en az 25 cm yukarısına monte edilir. HC-SR04 de kuru ve kapalı depolarda çalışır, ancak nem ve yoğuşma onu kısa sürede bozabilir.
Mesafe sensörü ESP32 ve Raspberry Pi Pico ile çalışır mı?
Evet, ancak 5 V ile çalışan HC-SR04 ve JSN-SR04T'nin ECHO çıkışını ve Sharp sensörün analog çıkışını gerilim bölücüyle 3,3 V'a düşürmen gerekir. VL53L0X modülleri ve TF-Luna'nın lojik seviyesi zaten 3,3 V'a uygundur; HC-SR04P ise doğrudan 3,3 V ile çalışır.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
HC-SR04 Mesafe Ölçme (Serial Ekran)
Yarasalar karanlıkta yollarını nasıl buluyorsa HC-SR04 sensörü de öyle çalışır: duyamadığın bir ses gönderir, yankısını dinler ve önündeki cismin ne kadar uzakta olduğunu ölçer. Arduino bu mesafeyi sa

HC-SR04 ile Park Sensörü
Arabalardaki park sensörünün küçük bir benzeri: bir şey yaklaştıkça bip sesleri hızlanır. Mesafe sensörü önündeki nesneyi ölçer; 20 santimetreden uzaktaysa yeşil LED yanar, daha yakına gelince kırmızı

Boy Ölçüm Projesi
Kapı kasasına asılan ve altında duranın boyunu santimetre olarak söyleyen bir boy ölçer. Önce altında kimse yokken birinci butona basarsın, mesafe sensörü yere olan uzaklığı ölçer; sonra biri altına g

Engelden Kaçan Robot
Kendi yolunu bulan akıllı bir araç yapmaya ne dersin? Engelden Kaçan Robot, önündeki ultrasonik sensör sayesinde çevresini sürekli tarar. Bir engelle karşılaştığında durur, servo motoruyla sağına ve s

ESP32 HC-SR04 Ultrasonik Mesafe Ölçer
HC-SR04 ultrasonik sensör, gönderdiği ses dalgasının nesneye çarpıp geri dönme süresini (Time of Flight) ölçerek mesafe hesaplar. Bu projede ESP32 ile TRIG pinine 10 mikrosaniyelik darbe gönderip, ECHO pininden gelen yankı süresini pulseIn() ile okuyacağız. Hesaplanan mesafeyi cm cinsinden 16x2 I2C LCD'de göstereceğiz. HC-SR04 5V çalıştığı için ECHO pinine gerilim bölücü zorunludur — aksi halde ESP32'nin 3.3V GPIO'su zarar görür.

ESP32 Park Sensörü (HC-SR04 + 5 LED Bar + Buzzer + OLED)
Otomobil park sensörünün ESP32 versiyonu! HC-SR04 ultrasonik sensör ile önündeki nesneye olan mesafeyi ölçüyoruz. Mesafe azaldıkça 5 LED'lik bar dolar (yeşil → sarı → kırmızı) ve buzzer bip aralığı kısalır. Çok yakınlaşınca (10 cm altında) sürekli alarm çalar ve tüm LED'ler yanar. SSD1306 OLED ekranda büyük fontla anlık cm değeri, durum metni (SAKIN / DIKKAT / YAKIN / DUR! / TEHLIKE) ve LED bar simülasyonu gösterilir. Klasik ve öğretici bir proje — HC-SR04 pulseIn, digital multi-output, buzzer P

TCRT5000 ile Yansıma (Yakınlık) Okuma
Görünmez ışık yollayıp yansımasını ölçen küçük bir sensörle önündeki yüzeyi algılarsın. Sensör bir cisme ya da açık renkli bir yüzeye yaklaştıkça daha çok ışık geri döner; Arduino bu değeri her yarım

LCD Ekran Kullanarak Mesafe Ölçme
Cetvelsiz mesafe ölçen bir alet: elini sensörün önünde ileri geri götür, sayı değişsin. HC-SR04 ses dalgası gönderip yankısını dinler, Arduino da aradaki uzaklığı santimetre olarak hesaplayıp iki satı
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 200'den fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

