Rehberler · 8 dk okuma

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.

HC-SR04 ultrasonik mesafe sensörü
HC-SR04: biri ses gönderen, diğeri yankıyı dinleyen iki ultrasonik dönüştürücü; Arduino dünyasının en yaygın mesafe sensörü.

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.

PrensipSensörlerArtısıEksisi
Ses ile uçuş süresiHC-SR04, JSN-SR04TUcuz, renkten ve ışıktan etkilenmezGeniş ışın, yumuşak ve açılı yüzeylerde zayıf, sıcaklığa duyarlı
Işık ile uçuş süresiVL53L0X, VL53L1X, TF-LunaHızlı, dar ışın, iyi doğrulukGüneş ışığı ve cam yüzeyler sorun çıkarır
Kızılötesi üçgenlemeSharp GP2Y0A21Renkten az etkilenir, basit analog çıkışDoğrusal olmayan çıkış, dar menzil, 10 cm altında yanıltıcı
Yansıma şiddetiTCRT5000Ç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örMenzilDoğrulukIşın açısıArayüzBeslemeGöreli fiyat
HC-SR042–400 cmYaklaşık ±0,3–1 cmYaklaşık 15°Trig/Echo darbe5 V (HC-SR04P: 3,3–5 V)Çok ucuz
JSN-SR04TYaklaşık 25–450 cmYaklaşık ±1 cmGeniş (yaklaşık 45° ve üstü)Trig/Echo, bazı sürümlerde UART5 VUcuz
Sharp GP2Y0A2110–80 cmYakında iyi, uzakta zayıfDar (birkaç derece)Analog gerilim4,5–5,5 VOrta
VL53L0X3 cm – 2 m (varsayılan ~1,2 m)Yaklaşık ±%325°I2C (0x29)Modül 3,3–5 VUcuz
VL53L1X4 cm – 4 mYaklaşık ±%3, mm çözünürlük27° (15°'ye daraltılabilir)I2C (0x29)Modül 3,3–5 VOrta
TF-Luna0,2–8 m±6 cm (3 m'ye kadar), ±%2 (3–8 m)2°UART ya da I2C5 V, 3,3 V lojikPahalı
TCRT5000Yaklaşık 0,2–15 mm (en iyi 2,5 mm)Mesafe değil, var/yokDarDijital (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.

C++ (Arduino IDE)
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.

C++ (Arduino IDE)
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}
38
Depo içindeki merdiven, boru ya da şamandıra gibi engeller geniş ışından dolayı yankı verebilir; sensörü bu engellerden uzak, deponun ortasına yakın yerleştir. Yoğuşma damlaları dönüştürücünün üzerinde birikirse ölçüm bozulur; sensörü hafif eğik takmak damlaların akmasını sağlar. Su yüzeyi dalgalıysa birkaç ölçümün ortancasını kullan.

Sharp 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.

C++ (Arduino IDE)
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}
27

Sharp 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.

C++ (Arduino IDE)
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.

C++ (Arduino IDE)
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}
44

TCRT5000: yakınlık ve çizgi algılama

TCRT5000 kızılötesi yansıma sensörü
TCRT5000: yan yana bir kızılötesi LED ve fototransistör; modül kartında karşılaştırıcı, eşik ayar potu ve dijital ile analog çıkış bulunur.

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.

C++ (Arduino IDE)
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}
20

Yü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 / ortamUltrasonik (HC-SR04)Sharp IRLazer ToF (VL53, TF-Luna)TCRT5000
Sert, düz duvarÇok iyiİyiÇok iyiİyi (yalnız çok yakında)
Kumaş, sünger, perdeZayıf (ses emilir)İyiİyiOrta
Siyah mat yüzeyİyiOrtaMenzil 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üzeyZayıf (yankı sapar)OrtaİyiOrta
Güneş ışığı, dış mekânEtkilenmezEtkilenirMenzil belirgin şekilde kısalırEtkilenir
Su yüzeyiİyi (depo ölçümü)ZayıfDeğişkenUygun değil
Sıcaklık değişimiSes hızı değişir, düzeltme gerekirAz etkilenirAz etkilenirAz etkilenir

Bağlantı özeti: Uno, ESP32 ve Pico

SensörArduino UnoESP32Raspberry Pi PicoNot
HC-SR04 / JSN-SR04TTRIG D9, ECHO D10, 5VTRIG 5, ECHO 18 (bölücüyle), VIN 5VTRIG GP14, ECHO GP15 (bölücüyle), VBUSECHO 5 V verir
Sharp GP2Y0A21A0, 5VGPIO 34 (bölücüyle), VIN 5VGP26 (bölücüyle), VBUSÇıkış 3,1 V'a kadar çıkabilir
VL53L0X / VL53L1XSDA A4, SCL A5SDA 21, SCL 22SDA GP4, SCL GP5Adres 0x29
TF-LunaSoftwareSerial önerilmezTX → GPIO 16, RX → GPIO 17TX → GP1 (uart0 RX), RX → GP05 V besleme, 3,3 V lojik
TCRT5000 modülüDO D7, AO A1DO 27, AO 34DO GP16, AO GP273,3–5 V
5 V ile beslenen sensörlerin çıkışlarını (HC-SR04 ECHO, Sharp analog çıkış) ESP32 ya da Pico'ya bağlarken gerilim bölücü kullanmayı unutma; bu kartların pinleri 5 V'a dayanıklı değildir. Sharp'ın çıkışı 3,1 V'a kadar çıktığı için 3,3 V referanslı ADC'yi sınıra dayar; 10 kΩ + 20 kΩ gibi bir bölücüyle ölçüp sonucu 1,5 ile çarpmak daha güvenlidir.

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.

MicroPython
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)
23

Hangi projede hangi mesafe sensörü?

ProjeÖnerilen sensörNeden?
Engelden kaçan robotHC-SR04 (bütçe) ya da VL53L0XGeniş ışın engeli kaçırmaz; VL53L0X daha hızlı ve küçük
Su deposu, kuyu seviyesiJSN-SR04TSu geçirmez prob, su yüzeyini iyi görür
Araç park sensörüJSN-SR04T ya da HC-SR04Dış mekâna dayanıklılık, 2–3 m menzil yeter
Çizgi izleyen robotTCRT5000Siyah-beyaz ayrımı için yapılmıştır
Mini sumo, masaüstü hassas ölçümVL53L0X / VL53L1XMilimetre çözünürlük, dar ışın, küçük boyut
Arduino radar (servo ile tarama)HC-SR04 ya da TF-LunaHC-SR04 ucuz; TF-Luna'nın 2° ışını çok daha net harita çizer
Boy ölçer, kapı geçiş sayacıVL53L1X ya da TF-LunaUzun menzil ve kararlı ölçüm
Drone, uzun mesafeTF-Luna8 m menzil, 250 Hz'e kadar ölçüm
Temassız musluk, el algılamaSharp GP2Y0A2110–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

BelirtiOlası nedenÇözüm
HC-SR04 sürekli 0 ya da menzil dışıYankı gelmiyor, kablo ya da besleme sorunu5 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ğer10 cm altında eğri geri dönerHedefin 10 cm'den yaklaşmasını engelle
Sharp okumaları gürültülüAkım darbeleri beslemeyi bozuyorVCC-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çüyorGüneş ışığındaki kızılötesiGölgelik ekle, ölçüm bütçesini artır ya da ultrasonik kullan
TF-Luna verisi anlamsızBaud yanlış ya da SoftwareSerial yetişmiyor115200 baud ve donanım UART'ı kullan, sağlama toplamını kontrol et
Sensör seçmeden önce ölçeceğin hedefi düşün: büyük, sert ve yakın bir hedef için HC-SR04 çoğu zaman yeter. Dar bir alanı hassas ölçmen ya da yumuşak yüzeyleri görmen gerekiyorsa ToF'a, nemli ya da açık hava için JSN-SR04T'ye, birkaç metreden uzağa ya da çok hızlı ölçüme ihtiyacın varsa TF-Luna'ya geç.

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.

Tüm projeleri gör
HC-SR04 Mesafe Ölçme (Serial Ekran)
#27Başlangıç

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

4.6(46)
71
HC-SR04 ile Park Sensörü
#28Orta
Premium

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ı

4.8(64)
85
Boy Ölçüm Projesi
#33Orta
Premium

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

4.5(25)
34
Engelden Kaçan Robot
#81İleri
Premium

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

5.0(38)
49
ESP32 HC-SR04 Ultrasonik Mesafe Ölçer
#116Orta

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.

4.9(28)
45
ESP32 Park Sensörü (HC-SR04 + 5 LED Bar + Buzzer + OLED)
#142İleri
Premium

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

0.0(0)
14
TCRT5000 ile Yansıma (Yakınlık) Okuma
#77Orta
Premium

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

4.6(33)
43
LCD Ekran Kullanarak Mesafe Ölçme
#31İleri
Premium

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ı

4.6(45)
59