Skip to main content

Инфракрасные и ToF датчики — От аналоговой геометрии к цифровому времени

Инфракрасные датчики используют свет в диапазоне 850-940 нм для измерения расстояния. Два основных подхода — триангуляция и Time-of-Flight (ToF) — представляют собой эволюцию технологии от простых аналоговых измерений к высокоточным цифровым.

Физические принципы

1. Триангуляция (Sharp GP2Y серия)

Геометрический принцип: Подобие треугольников.

\[ \frac{d}{B} = \frac{f}{x} \quad \Rightarrow \quad d = \frac{B \cdot f}{x} \]

где:

  • \(d\) — расстояние до объекта (м)
  • \(B\) — база (расстояние между ИК-диодом и ПЗС-линейкой, м)
  • \(f\) — фокусное расстояние линзы (м)
  • \(x\) — смещение светового пятна на ПЗС-линейке (м)

Выходная характеристика (для GP2Y0A21YK0F): \[ V_{\text{out}} \approx \frac{k}{d} \quad \text{(гиперболическая зависимость)} \]

Дифференциальная чувствительность: \[ \frac{dV}{dd} = -\frac{k}{d^2} \] Чем ближе объект, тем выше чувствительность.

2. Time-of-Flight (ToF)

Принцип: Измерение времени пролета фотонов.

\[ d = \frac{c \cdot \Delta t}{2} \]

где:

  • \(c = 299792458\ \text{м/с}\) — скорость света
  • \(\Delta t\) — время пролета (с)

Для VL53L0X (максимальная дальность 2 м): \[ \Delta t_{\max} = \frac{2 \cdot 2}{3 \times 10^8} \approx 13.3\ \text{нс} \]

3. Интенсивностный метод (пороговые датчики)

Принцип: Закон обратных квадратов для освещенности.

\[ E = \frac{I \cdot \rho}{4\pi d^2} \cdot \cos\theta \]

где:

  • \(E\) — освещенность приемника (лк)
  • \(I\) — сила излучения ИК-диода (кд)
  • \(\rho\) — коэффициент отражения объекта
  • \(\theta\) — угол падения/отражения

Сравнительный анализ технологий

ПараметрТриангуляция (Sharp)ToF (VL53L0X)Пороговые (KY-032)Формула расчета
ПринципГеометрия треугольниковВремя пролетаИнтенсивность\(d = Bf/x\) vs \(d = c\Delta t/2\)
Диапазон0.1-0.8 м0.03-2.0 м0.02-0.3 м
Точность±5%±3%±20%
Зависимость от цветаСильная (\(V \propto \rho/d\))СлабаяОчень сильная\(\rho_{\text{white}}/\rho_{\text{black}} \approx 10\)
Выходной сигналАналоговое напряжениеI2C/цифровойЦифровой (0/1)
Частота обновления~35 Гц50 Гц~100 Гц

Практическая реализация

Схема подключения Sharp GP2Y0A21YK0F

Sharp → Arduino
  VCC  → 5V
  GND  → GND
  Vout → A0 (аналоговый вход)

Калибровка и чтение Sharp

class SharpIRSensor {
private:
    int pin_;
    // Калибровочные коэффициенты для GP2Y0A21YK0F
    const float a_ = 26.548;
    const float b_ = -1.209;
    
public:
    SharpIRSensor(int analog_pin) : pin_(analog_pin) {}
    
    float readDistance() {
        // Среднее 5 измерений для подавления шума
        float avg_voltage = 0;
        for (int i = 0; i < 5; i++) {
            avg_voltage += analogRead(pin_) * (5.0 / 1023.0);
            delay(2);
        }
        avg_voltage /= 5.0;
        
        // Гиперболическая калибровочная кривая: d = a * V^b
        if (avg_voltage < 0.5) return 0.8;  // За пределами диапазона
        return a_ * pow(avg_voltage, b_);  // Расстояние в см
    }
    
    // Альтернатива: Lookup Table для большей точности
    float readDistanceLUT() {
        static const float lut_voltage[] = {3.1, 2.2, 1.5, 1.0, 0.7, 0.5};
        static const float lut_distance[] = {10, 15, 25, 40, 60, 80}; // см
        
        float voltage = analogRead(pin_) * (5.0 / 1023.0);
        
        // Линейная интерполяция между точками LUT
        for (int i = 0; i < 5; i++) {
            if (voltage >= lut_voltage[i+1] && voltage <= lut_voltage[i]) {
                float t = (voltage - lut_voltage[i]) / 
                         (lut_voltage[i+1] - lut_voltage[i]);
                return lut_distance[i] + t * (lut_distance[i+1] - lut_distance[i]);
            }
        }
        return (voltage > lut_voltage[0]) ? lut_distance[0] : lut_distance[5];
    }
};

Схема подключения VL53L0X (I2C)

VL53L0X → ESP32/Arduino
  VIN   → 3.3V
  GND   → GND
  SDA   → SDA (или GPIO21 на ESP32)
  SCL   → SCL (или GPIO22 на ESP32)
  XSHUT → GPIO23 (опционально, для смены адреса I2C)

Код для VL53L0X с продвинутыми настройками

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

void setupVL53L0X() {
    Wire.begin();
    
    sensor.setTimeout(500);
    if (!sensor.init()) {
        Serial.println("Failed to detect VL53L0X");
        return;
    }
    
    // Настройка режимов измерения
    sensor.setSignalRateLimit(0.1);    // Минимальная скорость сигнала
    sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
    sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
    
    // Выбор режима дальности
    sensor.setMeasurementTimingBudget(20000);  // 20 ms для точности
    // или sensor.setMeasurementTimingBudget(33000); // 33 ms для максимальной дальности
    
    sensor.startContinuous();
}

float readDistanceFiltered() {
    static float filtered_dist = 0;
    const float alpha = 0.3;  // Коэффициент фильтра
    
    int dist_mm = sensor.readRangeContinuousMillimeters();
    
    if (!sensor.timeoutOccurred() && dist_mm < 2000) {
        // Экспоненциальное скользящее среднее
        filtered_dist = alpha * (dist_mm / 1000.0) + (1 - alpha) * filtered_dist;
        return filtered_dist;  // метры
    }
    return NAN;
}

Критические факторы точности

1. Влияние цвета поверхности

Коэффициент отражения \(\rho\) для разных материалов:

  • Белая бумага: \(\rho \approx 0.85-0.90\)
  • Серый бетон: \(\rho \approx 0.20-0.30\)
  • Черная ткань: \(\rho \approx 0.05-0.10\)

Ошибка для Sharp: \[ \frac{\Delta d}{d} \approx \frac{1}{2} \cdot \frac{\Delta \rho}{\rho} \]

2. Угол падения

Для триангуляции: \[ x_{\text{effective}} = x \cdot \cos^2(\theta) \] где \(\theta\) — угол между нормалью поверхности и лучом.

3. Температурный дрейф

Sharp: Положение ПЗС-линейки меняется с температурой: \[ \Delta x_{\text{temp}} = \alpha \cdot L \cdot \Delta T \] где \(\alpha \approx 2.6 \times 10^{-6}\ \text{K}^{-1}\) для кремния.


Практические применения

1. Ровер для следования по линии с контролем препятствий

class LineFollowerWithObstacle {
private:
    SharpIRSensor front_sensor_;
    float safe_distance_;
    
public:
    void update() {
        float dist = front_sensor_.readDistance() / 100.0; // метры
        
        if (dist < safe_distance_) {
            // Препятствие близко - поворот
            avoidObstacle();
        } else {
            // Следование по линии
            followLine();
        }
    }
};

2. Система контроля уровня в бункере

class LevelMonitor {
private:
    VL53L0X sensor_;
    float full_height_;  // Высота пустого бункера
    
public:
    float getFillPercentage() {
        float current_level = sensor_.readRangeContinuousMillimeters() / 1000.0;
        return (full_height_ - current_level) / full_height_ * 100.0;
    }
};

3. Бесконтактный выключатель для конвейера

class ProximitySwitch {
private:
    const int threshold_distance_ = 50; // мм
    
public:
    bool isObjectPresent() {
        float dist = readVL53L0X(); // мм
        return dist < threshold_distance_ && dist > 20; // Исключаем шумы
    }
};

Калибровочные процедуры

Калибровка Sharp по трем точкам

  1. Установить эталонные расстояния: \(d_1, d_2, d_3\)
  2. Измерить напряжения: \(V_1, V_2, V_3\)
  3. Решить систему: \[ \begin{cases} d_1 = a \cdot V_1^b \\ d_2 = a \cdot V_2^b \\ d_3 = a \cdot V_3^b \end{cases} \]
  4. Определить коэффициенты \(a, b\) методом наименьших квадратов.

Калибровка смещения нуля для ToF

\[ d_{\text{offset}} = \frac{1}{N} \sum_{i=1}^{N} (d_{\text{measured},i} - d_{\text{reference}}) \] где измерения проводятся на точно известном расстоянии.


Ошибки и устранение

Ошибка 1: “Sharp показывает разное расстояние для одного объекта”

Причина: Изменение освещенности ИК-фоном. Решение: Модуляция с синхронным детектированием.

// Псевдокод синхронного детектирования
float syncDetection() {
    digitalWrite(IR_LED, HIGH);
    delayMicroseconds(100);
    int reading_on = analogRead(SENSOR_PIN);
    
    digitalWrite(IR_LED, LOW);
    delayMicroseconds(100);
    int reading_off = analogRead(SENSOR_PIN);
    
    return reading_on - reading_off; // Вычитаем фон
}

Ошибка 2: “ToF датчик не видит черные объекты”

Причина: Низкий SNR (Signal-to-Noise Ratio).

Решение: Увеличение времени интегрирования: \[ t_{\text{int}} \propto \frac{1}{\text{SNR}^2} \]

Ошибка 3: “Датчики мешают друг другу”

Решение: Временное или частотное разделение: \[ f_{\text{mod},i} = f_0 + i \cdot \Delta f \] где \(\Delta f\) больше полосы приемника.


Будущие направления

1. Многоспектральные ИК датчики

Идея: Использование нескольких длин волн для определения материала.

Принцип: Спектральная отражательная способность: \[ R(\lambda) = \frac{I_{\text{reflected}}(\lambda)}{I_{\text{incident}}(\lambda)} \]

2. ToF с SPAD массивами

Принцип: Single Photon Avalanche Diode массивы.

Преимущество: Работа при очень низкой освещенности.

3. ИИ-коррекция показаний

Подход: Использование легких нейросетей (TinyML) для компенсации нелинейностей и внешних шумов в реальном времени:

\[ d_{\text{corrected}} = \text{NN}(V_{\text{raw}}, \text{temp}, \text{ambient\_light}) \]

Разъяснение параметров:

  • \(d_{\text{corrected}}\): Отфильтрованное расстояние после обработки.
  • \(V_{\text{raw}}\): Нелинейный сигнал с датчика (напряжение/код).
  • \(\text{temp}\): Компенсация температурного дрейфа электроники.
  • \(\text{ambient\_light}\): Учет фоновой засветки (солнце, лампы), которая «ослепляет» сенсор.

Суть: Алгоритмы TinyML заменяют сложные калибровочные таблицы, обеспечивая сантиметровую точность даже на бюджетном железе.


Что дальше?

Освоив ИК-дальнометрию, вы готовы к более сложным задачам:

  1. Лидарные системы — от точечных измерений к 3D сканированию
  2. Сенсорная fusion — объединение ИК с ультразвуком и камерами
  3. SLAM с глубиной — использование ToF для построения карт
  4. Калибровка систем — методы повышения точности измерений

Вывод: Инфракрасные датчики — это мост между простыми аналоговыми системами и современными цифровыми технологиями. Sharp-подобные датчики учат понимать физику измерений (геометрию, нелинейности, влияние среды), а ToF-сенсоры показывают, как цифровая обработка может преодолеть ограничения аналоговых методов. Выбор между ними — это всегда компромисс между стоимостью, точностью и сложностью реализации.