HC-SR501 — очень популярный и дешевый PIR инфракрасный детектор, работающий в инфракрасном диапазоне. Его задача — обнаружение движения. Он реагирует на перемещение объекта в поле его зрения на расстоянии до 7м.
Подключение HCSR-501
Для подключения датчика движения HCSR-501 достаточно 3-х проводов:
- VCC: питание от 4.5 до 20В (Ток потребления 50мА)
- GND: земля
- OUT: логический выход:
- 3,3 В (высокий уровень) — при обнаружении движения
- GND (низкий уровень) — когда движение отсутствует
Если объект перемещается в пределах видимости датчика, его выходной статус на выводе OUT изменится с низкого на высокий.
Плата датчика движения HCSR-501 оснащена двумя потенциометрами, которые позволяют регулировать на выходе длительность высокого уровня и чувствительность. Потенциометр Tx регулирует длительность высокого уровня после обнаружения объекта в диапазоне от 5 до 200 сек.
Дальность действия (чувствительность) HCSR-501 составляет до 7 м, угол обзора 100 градусов. Дальность действия можно отрегулировать с помощью потенциометра Sx в пределах от 3 до 7 м.
Дополнительная перемычка MD позволяет изменять реакцию датчика на движение:
- H: (состояние по умолчанию) датчик поддерживает высокий уровень на выходе до тех пор, пока не обнаружит какое-либо движение в течение времени, установленного потенциометром Tx (режим повторного запуска).
- L: датчик сигнализирует о каждом последующем обнаружении движения переходом в высокое состояние; после обнаружения движения датчик выдает высокий уровень, который длится в соответствии с настройкой потенциометра Tx, затем переходит в низкое состояние и снова выдает высокий уровень после обнаружения следующего движения.
Схема подключения HCSR-501
Выход OUT датчика HCSR-501 является цифровым и работает с логикой 3,3В. Благодаря этому вы можете подключить этот модуль напрямую к Ардуино или Raspberry.
Для Ардуино подключите датчик следующим образом:
Когда вы это сделаете, все, что останется, — это в скетче определить, когда вывод OUT переключается с низкого на высокий уровень. Это происходит, когда в поле зрения детектора происходит перемещение объекта.
#define PIR_PIN 2 void setup(){ Serial.begin(9600); pinMode(PIR_PIN, INPUT); } void alarm(){ // здесь код сигнализации //... Serial.println("ALARM!"); } void loop(){ int pirState = digitalRead( PIR_PIN ); // если выход PIR имеет HIGH if( pirState > 0 ){ alarm(); } else { Serial.println("."); } delay(100); }
Эта программа проверяет состояние сигнала на выводе D2 каждые 100 мс. Если на нем появляется высокий сигнал (определение с помощью функции digitalRead()) — запускается функция alarm(), в которой выполняются действия, связанные с поднятием тревоги.
Функция alarm() будет вызываться повторно каждые 100 мс, пока на выходе OUT PIR детектора будет высокий уровень.
Однако на практике нам может понадобиться решение, при котором наше устройство должно реагировать не на состояние сигнала, а на его изменение.
Прерывания
В этом случае стоит попробовать механизм, называемый прерываниями. Прерывания — это реакция микроконтроллера от внешних систем — например, описываемого ИК-детектора. Сигнал с извещеателя прерывает работу основной программы. Таким образом, он заставляет микроконтроллер реагировать на обнаружение движения.
В отличие от вышеприведенного примера, Ардуино не опрашивает время от времени состояние датчика (digitalRead() в функции loop()), а прерывает выполнение кода программы в результате сигнала от PIR детектора. У Ардуино UNO есть 2 контакта, которые обрабатывают внешние прерывания: D2 и D3.
Изменим нашу программу:
#define PIR_PIN 2 void setup(){ Serial.begin(9600); pinMode(PIR_PIN, INPUT); // Устанавливаем внешнее прерывание attachInterrupt( digitalPinToInterrupt(PIR_PIN), alarm, RISING); } void alarm(){ // здесь код сигнализации Serial.println("ALARM!"); } void loop(){ Serial.println("…test…"); delay(100); }
Обратите внимание, что в основном цикле loop() функция alarm() вообще не вызывается! Программа выполняется непрерывно, отправляя текст «…test…» на последовательный порт каждые 100 мс.
Ключевым моментом здесь является оператор attachInterrupt() в функции setup(). Установка:
digitalPinToInterrupt — прерывание подключено к цифровому выводу D2,
alarm — прерывание обрабатывается функцией alarm(),
RISING — функция alarm() сработает, когда состояние вывода D2 изменится с низкого на высокий (запуск по нарастающему фронту).
Однако у такого подхода есть особенность — функция alarm() сработает только один раз, когда детектор обнаружит движение. В следующий раз функция alarm() сработает только тогда, когда извещатель вернется в низкое состояние и снова активируется