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 ] ← Два независимых элемента
↑
Линза Френеля
Детектирование движения:
- Объект входит в сектор A → сигнал
+ΔV - Объект переходит в сектор B → сигнал
-ΔV - Разностный усилитель: \(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-SR501 | AM312/Mini PIR | Panasonic 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/Repeat | Repeat | Repeat | — |
| Потребление | 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 датчики — основа для систем безопасности и автоматизации:
- Беспроводные сенсорные сети — распределенные системы мониторинга
- Энергосберегающие алгоритмы — работа от батарей
- Интеграция с камерами — активация записи при движении
- Умный дом и IoT — автоматизация на основе присутствия
Вывод: PIR датчики — это простые, но мощные “тепловые детекторы”, которые превращают невидимое инфракрасное излучение в полезные данные о присутствии и движении. Они идеальны для энергоэффективных систем, где нужно обнаруживать людей, не расходуя много энергии на постоянное излучение. Главное — понимать их ограничения (тепловой фон, направленность) и правильно интегрировать в общую систему.
