Skip to main content

PIR-датчики движения — пассивное тепловое зрение для обнаружения активности

PIR (Passive Infrared) датчики — это “тепловые глаза” робота, которые видят мир в инфракрасном спектре. В отличие от активных датчиков (УЗ, ИК), они ничего не излучают, а только принимают тепловое излучение объектов.

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

1. Закон Стефана-Больцмана

Все тела с температурой выше абсолютного нуля излучают ИК: \[ P = \varepsilon \sigma A T^4 \] где:

  • \(P\) — мощность излучения (Вт)

  • \(\varepsilon\) — коэффициент излучения (человеческая кожа: ~0.98)

  • \(\sigma = 5.67 \times 10^{-8}\ \frac{\text{Вт}}{\text{м}^2 \cdot \text{К}^4}\) - постоянная Стефана-Больцмана. Эта константа связывает мощность теплового излучения с температурой тела.

  • \(A\) — площадь поверхности (м²)

  • \(T\) — абсолютная температура (К)

Для человека (\(T \approx 310\ \text{К}\), \(A \approx 1.7\ \text{м}^2\)): \[ P \approx 0.98 \cdot 5.67\times10^{-8} \cdot 1.7 \cdot 310^4 \approx 850\ \text{Вт} \]

2. Пироэлектрический эффект

Кристалл в PIR датчике генерирует заряд при изменении температуры: \[ Q = p \cdot \Delta T \cdot A_{\text{crystal}} \] где:

  • \(Q\) — генерируемый заряд (Кл)
  • \(p\) — пироэлектрический коэффициент (для PZT: ~3×10⁻⁴ Кл/м²К)
  • \(\Delta T\) — изменение температуры
  • \(A_{\text{crystal}}\) — площадь кристалла

3. Спектральная чувствительность

PIR-датчики чувствительны в диапазоне 8-14 мкм — это соответствует максимуму теплового излучения человеческого тела по закону Вина:

\[ \lambda_{\max} = \frac{b}{T} \approx \frac{2898}{310} \approx 9.35 \text{ мкм} \]

Где:

  • \(b \approx 2898 \text{ мкм} \cdot \text{К}\) — постоянная Вина.
  • \(T \approx 310 \text{ К}\) — средняя температура поверхности тела человека.

Вывод: Благодаря такой настройке датчик «видит» живые объекты даже в полной темноте, игнорируя видимый свет.


Конструкция и оптическая система

Линза Френеля

Принцип: Преобразование точечного источника в полосовую диаграмму направленности.

Количество секторов: \[ N = \frac{\theta_{\text{FOV}}}{\Delta\theta} \approx \frac{110^\circ}{2^\circ} \approx 55\ \text{секторов} \] где \(\Delta\theta \approx 2^\circ\) — угловая ширина одного сектора.

Двухсекционный сенсор

     [ A | B ]  ← Два независимых элемента
   Линза Френеля

Детектирование движения:

  1. Объект входит в сектор A → сигнал +ΔV
  2. Объект переходит в сектор B → сигнал -ΔV
  3. Разностный усилитель: \(V_{\text{out}} = G \cdot (V_A - V_B)\)

Дальность обнаружения

\[ R_{\max} = \sqrt{\frac{P \cdot \tau \cdot A_{\text{lens}}}{4\pi \cdot \text{NEP}}} \] где:

  • \(P\) — мощность излучения объекта
  • \(\tau\) — пропускание атмосферы (~0.8 для 8-14 мкм)
  • \(A_{\text{lens}}\) — площадь линзы
  • \(\text{NEP}\) — эквивалентная мощность шума датчика (~10⁻¹⁰ В/√Гц)

Для HC-SR501: \(R_{\max} \approx 7\ \text{м}\) для человека


Сравнение моделей

ПараметрHC-SR501AM312/Mini PIRPanasonic AMNФормула/Принцип
Чувствительность0.3-6 м (регулир.)3 м (фиксир.)5 м\(V_{\text{sig}} \propto 1/R^2\)
Угол обзора110°100°120°\(\theta = 2\arctan(D/(2f))\)
Время задержки5-300 с2 с1-30 сRC-цепь: \(\tau = R \cdot C\)
РежимыSingle/RepeatRepeatRepeat
Потребление65 мА8 мА50 мА\(I = V/R_{\text{bias}}\)
Цена$$$$$$

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

Схема подключения HC-SR501

HC-SR501 → Arduino/ESP
  VCC    → 5V
  OUT    → D2 (цифровой вход)
  GND    → GND
  
Регулировки:
  Time Delay:  5-300 секунд
  Sensitivity: Дальность 0.3-6 м
  Mode:        H (Repeat) / L (Single)

Базовый код

class PIRSensor {
private:
    int pin_;
    unsigned long last_trigger_;
    unsigned long debounce_time_;
    
public:
    PIRSensor(int digital_pin, unsigned long debounce_ms = 2000)
        : pin_(digital_pin), debounce_time_(debounce_ms) {
        pinMode(pin_, INPUT);
        last_trigger_ = millis();
    }
    
    // Проверка с защитой от "дребезга"
    bool motionDetected() {
        if (digitalRead(pin_) == HIGH) {
            unsigned long now = millis();
            if (now - last_trigger_ > debounce_time_) {
                last_trigger_ = now;
                return true;
            }
        }
        return false;
    }
    
    // Время с последнего обнаружения
    unsigned long timeSinceLastMotion() {
        return millis() - last_trigger_;
    }
};

Продвинутая реализация с анализом паттернов

class SmartPIR {
private:
    struct MotionEvent {
        unsigned long timestamp;
        int signal_strength; // Условная "сила" сигнала
    };
    
    std::vector<MotionEvent> events_;
    const int HISTORY_SIZE = 10;
    
public:
    // Анализ паттернов движения
    MotionPattern analyzePattern() {
        if (events_.size() < 3) return UNKNOWN;
        
        // Вычисление интервалов между событиями
        std::vector<float> intervals;
        for (size_t i = 1; i < events_.size(); i++) {
            intervals.push_back(
                (events_[i].timestamp - events_[i-1].timestamp) / 1000.0
            );
        }
        
        // Статистический анализ
        float mean_interval = std::accumulate(
            intervals.begin(), intervals.end(), 0.0
        ) / intervals.size();
        
        float variance = 0;
        for (float interval : intervals) {
            variance += pow(interval - mean_interval, 2);
        }
        variance /= intervals.size();
        
        // Классификация
        if (mean_interval < 2.0 && variance < 1.0) {
            return HUMAN_WALKING; // Регулярное движение
        } else if (mean_interval > 10.0) {
            return OCCASIONAL;    // Редкие движения
        } else {
            return ANIMAL;        // Нерегулярное
        }
    }
    
    enum MotionPattern {
        UNKNOWN, HUMAN_WALKING, ANIMAL, OCCASIONAL
    };
};

Калибровка и настройка

Калибровка чувствительности

void calibratePIR() {
    Serial.println("Calibrating PIR (30 seconds)...");
    delay(30000); // Датчику нужно 30-60 сек для стабилизации
    Serial.println("Calibration complete");
}

Настройка временных параметров

Время задержки (Time Delay): \[ t_{\text{delay}} = R \cdot C \cdot \ln\left(\frac{V_{\text{cc}}}{V_{\text{th}}}\right) \] где:

  • \(R\) — резистор настройки (1 МОм для HC-SR501)
  • \(C\) — конденсатор (~10 мкФ)
  • \(V_{\text{th}}\) — пороговое напряжение компаратора

Практические значения HC-SR501:

  • Минимальная задержка: \(t_{\min} \approx 5\ \text{с}\)
  • Максимальная задержка: \(t_{\max} \approx 300\ \text{с}\)

Настройка чувствительности

Регулировка усиления: \[ G = \frac{R_f}{R_{\text{in}}} \] где \(R_f\) — регулируемый резистор (от 1 кОм до 1 МОм).


Применение в робототехнике

1. Режим сторожа

class GuardMode {
private:
    PIRSensor pir_;
    bool is_active_;
    
public:
    void guardLoop() {
        if (pir_.motionDetected()) {
            activateAlarm();
            sendNotification("Motion detected!");
            recordEvent();
        }
        
        // Автоматическое выключение через 5 минут без движения
        if (pir_.timeSinceLastMotion() > 5 * 60 * 1000) {
            enterSleepMode();
        }
    }
};

2. Активация по присутствию

class PresenceActivator {
private:
    enum State { SLEEP, WAKEUP, ACTIVE };
    State current_state_;
    
public:
    void update() {
        switch(current_state_) {
            case SLEEP:
                if (pir_.motionDetected()) {
                    current_state_ = WAKEUP;
                    startWakeupSequence();
                }
                break;
                
            case WAKEUP:
                if (pir_.timeSinceLastMotion() > 10000) {
                    current_state_ = ACTIVE;
                }
                break;
                
            case ACTIVE:
                if (pir_.timeSinceLastMotion() > 300000) {
                    current_state_ = SLEEP;
                    enterSleepMode();
                }
                break;
        }
    }
};

3. Система подсчета людей

class PeopleCounter {
private:
    int count_;
    unsigned long last_direction_time_;
    enum Direction { ENTER, EXIT };
    
    Direction determineDirection() {
        // Анализ последовательности срабатывания
        // нескольких PIR датчиков
        return ENTER; // Упрощенная логика
    }
    
public:
    void update() {
        if (pir_.motionDetected()) {
            Direction dir = determineDirection();
            if (dir == ENTER) count_++;
            else if (dir == EXIT && count_ > 0) count_--;
            
            last_direction_time_ = millis();
        }
    }
};

Ограничения и решения

Проблема 1: Ложные срабатывания

Причины:

  • Быстрые изменения температуры воздуха
  • Нагревательные приборы
  • Насекомые перед датчиком

Решение: Двухстадийная фильтрация: \[ V_{\text{valid}} = \begin{cases} 1 & \text{if } \frac{dV}{dt} > V_{\text{th}} \text{ and } V > V_{\text{min}} \\ 0 & \text{otherwise} \end{cases} \]

Проблема 2: Мертвые зоны

Решение: Установка нескольких датчиков с перекрытием: \[ \theta_{\text{overlap}} = \frac{\theta_{\text{FOV}}}{2} \]

Проблема 3: Адаптация к фону

Алгоритм адаптивной калибровки:

void adaptiveCalibration() {
    static float background_level = 0;
    const float alpha = 0.01; // Коэффициент забывания
    
    // Экспоненциальное скользящее среднее
    background_level = alpha * readSensor() + (1-alpha) * background_level;
    
    // Динамический порог
    float threshold = background_level * 1.5;
}

Будущие технологии

1. Многопиксельные PIR массивы

Концепция: Матрица 8×8 или 16×16 пироэлектрических элементов. Применение: Определение направления и скорости движения.

2. Термографические PIR

Принцип: Измерение распределения температуры. Точность: Определение размеров объекта, различение человека и животных.

3. Гибридные системы (PIR + Микроволновый)

Преимущества:

  • PIR: Высокая точность определения живых объектов
  • Микроволновый: Работа сквозь препятствия, измерение скорости Fusion алгоритм: \[ P_{\text{detection}} = \alpha P_{\text{PIR}} + \beta P_{\text{microwave}} \]

Что дальше?

PIR датчики — основа для систем безопасности и автоматизации:

  1. Беспроводные сенсорные сети — распределенные системы мониторинга
  2. Энергосберегающие алгоритмы — работа от батарей
  3. Интеграция с камерами — активация записи при движении
  4. Умный дом и IoT — автоматизация на основе присутствия

Вывод: PIR датчики — это простые, но мощные “тепловые детекторы”, которые превращают невидимое инфракрасное излучение в полезные данные о присутствии и движении. Они идеальны для энергоэффективных систем, где нужно обнаруживать людей, не расходуя много энергии на постоянное излучение. Главное — понимать их ограничения (тепловой фон, направленность) и правильно интегрировать в общую систему.