Руководства · 8 мин чтения

Виды датчиков расстояния для Arduino: HC-SR04, ИК, VL53L0X и LiDAR

Сравнение датчиков расстояния для Arduino: HC-SR04, JSN-SR04T, Sharp IR, VL53L0X/VL53L1X, TF-Luna и TCRT5000. Дальность, точность, угол луча, поверхности и примеры кода.

Выбор среди видов датчиков расстояния для Arduino поначалу кажется вопросом «какой измеряет дальше», но на деле всё решают поверхность объекта, нужная точность, требуемая ширина луча и окружающие условия. Тот же HC-SR04, который измеряет расстояние до стены с точностью до сантиметра, может давать нестабильные показания на мягкой ткани дивана, а недорогой лазерный датчик с миллиметровой точностью — терять половину дальности на солнце. В этом руководстве мы сравним шесть датчиков, которые чаще всего используют в проектах на Arduino.

Мы сравним ультразвуковой HC-SR04 и его водостойкий аналог JSN-SR04T, инфракрасный триангуляционный датчик Sharp GP2Y0A21, лазерные датчики времени пролёта (ToF) VL53L0X и VL53L1X, компактный LiDAR TF-Luna и датчик приближения малого радиуса действия TCRT5000. Для каждого разберём принцип работы, дальность, точность, угол луча, реакцию на поверхности и интерфейс, а также приведём пример скетча, прошедшего компиляцию. В конце таблица поможет выбрать датчик для конкретного проекта.

Ультразвуковой датчик расстояния HC-SR04
HC-SR04: два ультразвуковых преобразователя — один излучает звук, другой принимает эхо; самый распространённый датчик расстояния в мире Arduino.

Как датчики измеряют расстояние? Три основных принципа

Почти все датчики расстояния для Arduino используют один из трёх методов. Время пролёта: датчик посылает звуковой или световой импульс и измеряет время возвращения отражённого сигнала; расстояние равно половине произведения времени на скорость. Ультразвуковые датчики делают это с помощью звука, а VL53L0X и TF-Luna — света. Свет примерно в миллион раз быстрее звука, поэтому ToF-датчики содержат специальные микросхемы, измеряющие время с пикосекундной точностью. Триангуляция: ИК-датчики Sharp направляют инфракрасный луч на объект и определяют, куда попадает отражённый свет на позиционно-чувствительном детекторе (PSD); для близких объектов пятно смещается к одному краю, для далёких — к другому. Интенсивность отражения: простые датчики вроде TCRT5000 измеряют только силу возвращающегося света; она сильно зависит от цвета поверхности, поэтому это обнаружение приближения, а не настоящее измерение расстояния.

ПринципДатчикиПлюсыМинусы
Время пролёта звукаHC-SR04, JSN-SR04TНедорого, цвет и свет не влияютШирокий луч, плохо работает с мягкими и наклонными поверхностями, чувствителен к температуре
Время пролёта светаVL53L0X, VL53L1X, TF-LunaБыстро, узкий луч, хорошая точностьСолнечный свет и стекло создают проблемы
Инфракрасная триангуляцияSharp GP2Y0A21Мало зависит от цвета, простой аналоговый выходНелинейный выход, узкий диапазон, неверные показания ближе 10 см
Интенсивность отраженияTCRT5000Очень дёшево, очень быстроТолько от нескольких мм до см, сильная зависимость от цвета

Большая сравнительная таблица

В таблице ниже собраны типичные характеристики модулей с каждым датчиком. Дальность указана по данным производителей; в реальном проекте она может быть меньше в зависимости от поверхности и окружающих условий. Цены различаются по странам, поэтому приведены в относительном виде.

ДатчикДальностьТочностьУгол лучаИнтерфейсПитаниеОтносительная цена
HC-SR042–400 смОколо ±0,3–1 смОколо 15°Импульс Trig/Echo5 V (HC-SR04P: 3,3–5 V)Очень низкая
JSN-SR04TОколо 25–450 смОколо ±1 смШирокий (около 45° и более)Trig/Echo, UART в некоторых версиях5 VНизкая
Sharp GP2Y0A2110–80 смХорошая вблизи, низкая вдалиУзкий (несколько градусов)Аналоговое напряжение4,5–5,5 VСредняя
VL53L0X3 см – 2 м (по умолчанию ~1,2 м)Около ±3%25°I2C (0x29)Модуль 3,3–5 VНизкая
VL53L1X4 см – 4 мОколо ±3%, разрешение в мм27° (можно сузить до 15°)I2C (0x29)Модуль 3,3–5 VСредняя
TF-Luna0,2–8 м±6 см (до 3 м), ±2% (3–8 м)2°UART или I2C5 V, логика 3,3 VВысокая
TCRT5000Около 0,2–15 мм (лучше всего на 2,5 мм)Не расстояние, а наличие/отсутствиеУзкийЦифровой (DO) + аналоговый (AO)3,3–5 VОчень низкая

HC-SR04: ультразвуковая классика

HC-SR04 посылает восемь звуковых импульсов частотой 40 kHz и удерживает на пине ECHO уровень HIGH до возвращения эха. Arduino измеряет длительность этого импульса в микросекундах с помощью pulseIn(). При 20 °C звук распространяется со скоростью около 343 метров в секунду, или 0,0343 см за микросекунду; поскольку он проходит путь до объекта и обратно, distance = time × 0.0343 / 2. Скорость звука меняется с температурой (примерно 331,3 + 0,606 × T м/с): между 0 °C и 35 °C разница составляет около 6%, что даёт погрешность до 12 см на расстоянии 2 метра. Код ниже учитывает эту поправку и берёт медиану пяти измерений, чтобы отсеять случайные ошибочные эхо-сигналы.

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
  • Выдерживай минимум 60 мс между измерениями: если повторить измерение, пока эхо предыдущего импульса ещё отражается по комнате, результат будет неверным.
  • Мягкие и наклонные поверхности: ткань, поролон и шторы поглощают звук; поверхности с наклоном более 45 градусов отражают эхо в сторону от датчика.
  • Широкий луч: конус примерно в 15 градусов на расстоянии 2 метра охватывает область шириной почти 50 см; в узком коридоре датчик может видеть и боковые стены.
  • Платы на 3,3 V: классическому HC-SR04 нужно 5 V, и его выход ECHO тоже выдаёт 5 V; для ESP32 и Pico установи делитель напряжения на ECHO или используй HC-SR04P, работающий от 3,3 V.
  • Несколько датчиков: два HC-SR04, запущенные одновременно, слышат эхо друг друга; запускай их по очереди.

Подключение HC-SR04 и его использование с монитором порта и LCD подробно разобраны в статье «Датчик расстояния HC-SR04»; здесь мы сосредоточимся на сравнении.

JSN-SR04T: водостойкий ультразвуковой датчик

JSN-SR04T использует ту же логику запуска и эха, что и HC-SR04, но его преобразователь находится в водонепроницаемой капсуле на кабеле, отдельно от электронной платы. Поэтому он подходит для влажных мест: баков с водой, колодцев, ёмкостей для дождевой воды и уличных парктроников. Есть два важных отличия: поскольку один преобразователь и излучает, и принимает сигнал, вблизи него есть слепая зона (около 20–25 см), а луч шире, чем у HC-SR04. Установи датчик на верхней крышке бака как минимум на 25 см выше максимального уровня воды. Код ниже преобразует расстояние в процент заполнения.

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
Из-за широкого луча лестницы, трубы или поплавки внутри бака могут отражать сигнал; располагай датчик подальше от них, ближе к центру бака. Капли конденсата на преобразователе искажают показания; небольшой наклон датчика позволяет каплям стекать. Если поверхность воды колеблется, используй медиану нескольких измерений.

Sharp GP2Y0A21: аналоговый инфракрасный датчик

Sharp GP2Y0A21YK0F — инфракрасный датчик, работающий на расстоянии от 10 до 80 см и выдающий аналоговое напряжение в зависимости от расстояния. Благодаря триангуляции он менее чувствителен к цвету объекта, чем датчики на основе интенсивности отражения. Выход нелинейный: около 2,3 V при 10 см и 0,4 V при 80 см, а между ними зависимость описывается степенной функцией с отрицательным показателем. Код преобразует эту кривую по приближённой формуле distance = 29.988 × V^-1.173. Главная ловушка — расстояние меньше 10 см: при дальнейшем приближении объекта выходное напряжение снова падает, и объект в 5 см может выглядеть так, будто находится в 20 см. Установи датчик так, чтобы объект никогда не мог приблизиться ближе 10 см.

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 потребляют короткие импульсы большого тока, создающие помехи на линии питания. Конденсатор примерно на 10 µF рядом с пинами VCC и GND датчика заметно стабилизирует показания. В семействе есть модели с другими диапазонами: GP2Y0A41SK0F работает от 4 до 30 см, GP2Y0A02YK0F — от 20 до 150 см; у каждой свои коэффициенты кривой.

VL53L0X и VL53L1X: лазерные ToF-датчики

VL53L0X и VL53L1X — крошечные лазерные датчики времени пролёта от STMicroelectronics. Они посылают невидимый лазерный импульс с длиной волны 940 нм, измеряют время возвращения отражения с помощью счётчиков фотонов и передают результат прямо в миллиметрах по I2C. Они почти не зависят от цвета, их луч уже, чем у ультразвуковых датчиков, а измерение занимает 20–50 мс. VL53L0X измеряет примерно до 1,2 метра в режиме по умолчанию и до 2 метров в режиме увеличенной дальности; VL53L1X достигает 4 метров, а его поле зрения (ROI) можно сузить программно. I2C-адрес по умолчанию у обоих — 0x29. Код ниже использует библиотеку VL53L0X от Pololu; найди «VL53L0X» в «Менеджере библиотек» (Library Manager) и установи версию Pololu.

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

Время, отведённое на измерение, определяет баланс точности и скорости: 20 мс — быстро, но с шумом, 200 мс — медленно, но стабильно. Солнечный свет и мощные инфракрасные источники заметно сокращают дальность; учитывай это при измерениях на улице. Чтобы подключить два VL53L0X к одной шине I2C, при одинаковом адресе 0x29 нужно удерживать один выключенным через пин XSHUT, а другому назначить новый адрес (setAddress); подробности I2C — в статье «Что такое I2C».

TF-Luna: 8 метров с компактным LiDAR

TF-Luna — компактный одноточечный LiDAR от Benewake: он измеряет время пролёта, модулируя инфракрасный свет с длиной волны 850 нм, работает от 0,2 до 8 метров с очень узким лучом всего 2 градуса и выполняет до 250 измерений в секунду. По умолчанию он передаёт каждое измерение по UART на скорости 115200 бод пакетом из 9 байт: два байта заголовка 0x59, расстояние (см), сила сигнала, внутренняя температура и контрольная сумма. Если сила сигнала ниже 100 или равна 65535 (засветка), измерение считается ненадёжным. Питание — 5 V, но логический уровень UART — 3,3 V, поэтому к ESP32 он подключается напрямую. Поскольку SoftwareSerial на Uno ненадёжно работает на скорости 115200 бод, выбирай плату с аппаратным UART, например ESP32 или Mega; логика разбора UART-пакетов описана в статье «Последовательная связь UART».

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: обнаружение приближения и линии

Инфракрасный отражательный датчик TCRT5000
TCRT5000: инфракрасный светодиод и фототранзистор рядом друг с другом; на плате модуля размещены компаратор, потенциометр порога, цифровой и аналоговый выходы.

TCRT5000 — не дальномер, а отражательный датчик: свет инфракрасного светодиода отражается от поверхности, а расположенный рядом фототранзистор измеряет, сколько света вернулось. Лучше всего он работает примерно на 2,5 мм, а дальше 1,5 см сигнал быстро ослабевает. Белые поверхности отражают много света, а чёрные — очень мало, поэтому даже на одинаковом расстоянии значения сильно зависят от цвета; именно поэтому датчик используют для различения чёрного и белого в роботах, следующих по линии, подсчёта отверстий в дисках энкодеров и обнаружения очень близких объектов. Компаратор модуля переключает цифровой выход при пересечении порога, заданного потенциометром. Подробности — в статье «Инфракрасный датчик TCRT5000».

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

Влияние поверхности и окружающих условий

Заявленная дальность датчика меняется при работе с конкретной поверхностью. Ультразвуковые датчики отлично справляются с твёрдыми поверхностями, отражающими звук, но испытывают трудности с поглощающей его тканью; оптическим датчикам важны цвет, блеск и солнечный свет. Таблица ниже поможет при проектировании понять, какой датчик сохраняет надёжность в разных условиях.

Поверхность / условияУльтразвуковой (HC-SR04)Sharp IRЛазерный ToF (VL53, TF-Luna)TCRT5000
Твёрдая плоская стенаОчень хорошоХорошоОчень хорошоХорошо (только совсем вблизи)
Ткань, поролон, шторыПлохо (звук поглощается)ХорошоХорошоСредне
Матовая чёрная поверхностьХорошоСреднеДальность сокращаетсяОчень плохо
Стекло, зеркало, блестящий металлХорошо (звук отражается)Неверные показанияНеверные показания (свет проходит насквозь или отклоняется)Неверные показания
Наклонная поверхностьПлохо (эхо уходит в сторону)СреднеХорошоСредне
Солнечный свет, улицаНе влияетВлияетДальность заметно падаетВлияет
Поверхность водыХорошо (измерение в баке)ПлохоНестабильноНе подходит
Изменения температурыСкорость звука меняется, нужна поправкаСлабое влияниеСлабое влияниеСлабое влияние

Сводка подключений: Uno, ESP32 и Pico

ДатчикArduino UnoESP32Raspberry Pi PicoПримечание
HC-SR04 / JSN-SR04TTRIG D9, ECHO D10, 5VTRIG 5, ECHO 18 (через делитель), VIN 5VTRIG GP14, ECHO GP15 (через делитель), VBUSECHO выдаёт 5 V
Sharp GP2Y0A21A0, 5VGPIO 34 (через делитель), VIN 5VGP26 (через делитель), VBUSВыход может достигать 3,1 V
VL53L0X / VL53L1XSDA A4, SCL A5SDA 21, SCL 22SDA GP4, SCL GP5Адрес 0x29
TF-LunaSoftwareSerial не рекомендуетсяTX → GPIO 16, RX → GPIO 17TX → GP1 (uart0 RX), RX → GP0Питание 5 V, логика 3,3 V
Модуль TCRT5000DO D7, AO A1DO 27, AO 34DO GP16, AO GP273,3–5 V
Подключая выходы датчиков с питанием 5 V (ECHO у HC-SR04, аналоговый выход Sharp) к ESP32 или Pico, не забудь делитель напряжения: пины этих плат не допускают 5 V. Выход Sharp может достигать 3,1 V, что подводит АЦП с опорным напряжением 3,3 V к пределу; безопаснее измерять через делитель, например 10 kΩ + 20 kΩ, и умножать результат на 1,5.

Ультразвуковые измерения с Raspberry Pi Pico

В MicroPython длительность импульса измеряется функцией machine.time_pulse_us(); она выполняет ту же задачу, что pulseIn() на Arduino, и при таймауте возвращает отрицательное значение. Подай питание на HC-SR04 с пина VBUS (USB 5 V) платы Pico и установи делитель 1 kΩ + 2 kΩ на линию ECHO либо используй HC-SR04P, который работает напрямую от 3,3 V. Для VL53L0X и TF-Luna тоже есть драйверы MicroPython; UART-пакет TF-Luna легко разобрать с помощью machine.UART по той же логике, что и в коде Arduino.

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

Какой датчик расстояния выбрать для проекта?

ПроектРекомендуемый датчикПочему?
Робот, объезжающий препятствияHC-SR04 (бюджетный) или VL53L0XШирокий луч не пропускает препятствия; VL53L0X быстрее и компактнее
Уровень воды в баке или колодцеJSN-SR04TВодонепроницаемый зонд, хорошо видит поверхность воды
Автомобильный парктроникJSN-SR04T или HC-SR04Устойчивость к уличным условиям, дальности 2–3 м достаточно
Робот, следующий по линииTCRT5000Предназначен для различения чёрного и белого
Мини-сумо, точные измерения на столеVL53L0X / VL53L1XМиллиметровое разрешение, узкий луч, малые размеры
Радар на Arduino (развёртка сервоприводом)HC-SR04 или TF-LunaHC-SR04 недорогой; луч TF-Luna в 2° даёт гораздо более чёткую карту
Ростомер, счётчик проходов в дверном проёмеVL53L1X или TF-LunaБольшая дальность и стабильные показания
Дрон, большое расстояниеTF-LunaДальность 8 м, до 250 Hz
Бесконтактный кран, обнаружение рукиSharp GP2Y0A21Диапазон 10–80 см и простой аналоговый выход

Ещё несколько идей: поворачивай HC-SR04 сервоприводом, чтобы создать дисплей радара на Arduino; поставь один HC-SR04 спереди и два VL53L0X по бокам робота, объезжающего препятствия; открывай крышку умного мусорного ведра при приближении руки; собери переносную цифровую рулетку с OLED-дисплеем или передавай уровень заполнения бака на телефон через ESP32 с JSN-SR04T.

Частые ошибки и их решения

СимптомВероятная причинаРешение
HC-SR04 всегда показывает 0 или выход за диапазонНет эха, проблема с подключением или питаниемПроверь питание 5 V и пины TRIG/ECHO, задай таймаут для pulseIn
Ультразвуковые показания иногда скачутЭхо предыдущего импульса или боковой стеныВыдерживай 60 мс между измерениями, используй медианный фильтр
JSN-SR04T не измеряет вблизиСлепая зона (20–25 см)Установи датчик минимум в 25 см от объекта
Sharp вблизи даёт большое неверное значениеБлиже 10 см кривая разворачиваетсяНе допускай приближения объекта ближе 10 см
Показания Sharp зашумленыИмпульсы тока создают помехи в питанииКонденсатор 10 µF между VCC и GND, усреднение показаний
VL53L0X не найденПодключение I2C или конфликт адресовПроверь SDA/SCL и адрес 0x29 сканером I2C
Лазерный датчик на улице показывает меньшее расстояниеИнфракрасная составляющая солнечного светаДобавь затенение, увеличь время измерения или используй ультразвуковой датчик
Некорректные данные TF-LunaНеверная скорость или SoftwareSerial не успеваетИспользуй 115200 бод и аппаратный UART, проверяй контрольную сумму
Прежде чем выбирать датчик, подумай об объекте: для крупного, твёрдого и близкого объекта обычно хватает HC-SR04. Если нужно точно измерять расстояние до узкого участка или обнаруживать мягкие поверхности, переходи на ToF; для влажных мест и улицы выбирай JSN-SR04T, а для расстояний больше нескольких метров или очень быстрых измерений — TF-Luna.

Датчики расстояния — самый простой способ дать проектам на Arduino возможность воспринимать окружение, а правильный выбор определяет, будет ли проект работать стабильно или постоянно раздражать. Таблицы и код в этом сравнении помогут найти баланс цены и характеристик под твои задачи. В приложении BlueGrays есть пошаговые проекты со схемами и кодом: измерение расстояния с HC-SR04, парктроник, ростомер, робот, объезжающий препятствия, парктроник на ESP32 и измерение расстояния с TCRT5000.

Частые вопросы

Какой датчик расстояния лучше всего подходит для Arduino?

Единственного лучшего датчика нет: выбор зависит от объекта и условий. HC-SR04 подходит для обычных недорогих проектов, VL53L0X или VL53L1X — для миллиметровой точности и узкого луча, JSN-SR04T — для влажных мест, а TF-Luna — для быстрых измерений на расстоянии больше нескольких метров.

На каком расстоянии может измерять HC-SR04?

Производитель указывает диапазон от 2 см до 4 метров, но на практике надёжные показания обычно удаётся получить до 2–3 метров. К пределу можно приблизиться, если объект крупный, твёрдый и расположен перпендикулярно датчику; для мягких, маленьких или наклонных объектов дальность заметно сокращается.

Чем отличаются ультразвуковые и инфракрасные датчики расстояния?

Ультразвуковой датчик измеряет время возвращения эха звукового импульса; цвет и свет на него не влияют, но луч широкий, а мягкие поверхности затрудняют измерения. Инфракрасные датчики используют свет, имеют более узкий луч и работают быстро, но солнце, стекло и некоторые тёмные поверхности могут искажать показания.

Чем отличаются VL53L0X и VL53L1X?

Оба — лазерные ToF-датчики с интерфейсом I2C. VL53L0X измеряет примерно до 2 метров, а VL53L1X достигает 4 метров, может измерять быстрее и позволяет программно сужать поле зрения. VL53L0X подходит небольшим роботам для близких расстояний, VL53L1X — для более дальних и точных измерений.

Какой датчик расстояния использовать для уровня воды в баке?

Чаще всего выбирают JSN-SR04T с водонепроницаемым зондом; его устанавливают на верхней крышке бака как минимум на 25 см выше максимального уровня воды. HC-SR04 тоже работает в сухих закрытых баках, но влажность и конденсат могут быстро его повредить.

Работают ли датчики расстояния с ESP32 и Raspberry Pi Pico?

Да, но нужен делитель напряжения, чтобы понизить выход ECHO датчиков HC-SR04 и JSN-SR04T с питанием 5 V, а также аналоговый выход Sharp до 3,3 V. Модули VL53L0X и TF-Luna уже используют логику, совместимую с 3,3 V, а HC-SR04P работает напрямую от 3,3 V.

Все проекты
Измерение расстояния HC-SR04 (вывод в порт)
#27Новичок

Измерение расстояния HC-SR04 (вывод в порт)

Датчик HC-SR04 работает совсем как летучая мышь, которая находит дорогу в темноте: он посылает звук, которого ты не слышишь, слушает эхо и измеряет, насколько далеко предмет перед ним. Arduino каждые

4.6(46)
71
Парктроник на HC-SR04
#28Средний
Premium

Парктроник на HC-SR04

Мини-версия автомобильного парктроника: чем ближе предмет, тем чаще сигнал. Датчик расстояния измеряет предмет перед собой; если он дальше 20 сантиметров, горит зелёный светодиод, а если ближе — мигае

4.8(64)
85
Измерение роста
#33Средний
Premium

Измерение роста

Ростомер, который вешается на дверную раму и сообщает в сантиметрах рост человека, стоящего под ним. Сначала, пока под ним никого нет, ты нажимаешь первую кнопку, и датчик расстояния измеряет расстоян

4.5(25)
34
Робот, объезжающий препятствия
#81Продвинутый
Premium

Робот, объезжающий препятствия

Как насчёт того, чтобы собрать умную машину, которая сама находит дорогу? Робот, объезжающий препятствия, постоянно осматривает всё вокруг благодаря ультразвуковому датчику спереди. Встретив препятств

5.0(38)
49
Ультразвуковой датчик расстояния HC-SR04 на ESP32
#116Средний

Ультразвуковой датчик расстояния HC-SR04 на ESP32

Ультразвуковой датчик HC-SR04 вычисляет расстояние по времени, за которое испущенная им звуковая волна отражается от предмета и возвращается (Time of Flight). В этом проекте ESP32 подаёт импульс 10 микросекунд на пин TRIG датчика, а длительность эха читает с пина ECHO через pulseIn(). Вычисленное расстояние в сантиметрах выводится на I2C LCD 16x2. HC-SR04 работает от 5V, поэтому на пине ECHO нужен делитель напряжения.

4.9(28)
45
Парктроник на ESP32 (HC-SR04 + шкала из 5 светодиодов + зуммер + OLED)
#142Продвинутый
Premium

Парктроник на ESP32 (HC-SR04 + шкала из 5 светодиодов + зуммер + OLED)

ESP32-версия автомобильного парктроника! Ультразвуковой датчик HC-SR04 измеряет расстояние до предмета перед ним. По мере уменьшения расстояния шкала из 5 светодиодов заполняется (зелёный → жёлтый → красный), а интервал сигналов зуммера сокращается. Когда предмет совсем близко (меньше 10 см), звучит непрерывная тревога и горят все светодиоды. OLED SSD1306 показывает расстояние в см крупным шрифтом и сообщение состояния (STOP / CAUTION / CLOSE / STOP! / DANGER).

0.0(0)
14
Чтение отражения (приближения) с TCRT5000
#77Средний
Premium

Чтение отражения (приближения) с TCRT5000

С маленьким датчиком, который посылает невидимый свет и измеряет, сколько его отражается обратно, можно определить поверхность перед ним. Чем ближе предмет или светлая поверхность, тем больше света во

4.6(33)
43
Измерение расстояния с выводом на LCD
#31Продвинутый
Premium

Измерение расстояния с выводом на LCD

Инструмент, который измеряет расстояние без линейки: двигай рукой перед датчиком туда-сюда и смотри, как меняется число. HC-SR04 посылает звуковую волну и слушает эхо, а Arduino вычисляет расстояние в

4.6(45)
59