Датчик движения на МК PIC и PIR-сенсоре

Датчик движения на МК PIC и PIR-сенсоре

В этой статье описано создание датчика движения на основе модулей с пассивным ИК датчиком. Есть много моделей модулей с PIR датчиком от разных производителей, но в основе у них лежит один принцип. Они имеют один выход, который дает сигнал низкого или высокого уровня (в зависимости от модели) при обнаружении движения.  В моем проекте микроконтроллер PIC12F635 постоянно следит за логическим уровнем на выходе модуля с датчиком и включает зуммер, когда он высокий.

Теория

Некоторые кристаллические материалы обладают свойством генерировать поверхностный электрический заряд при контакте с тепловым ИК излучением. Это явление известно как пироэлектричество. Пассивные модули с ИК датчиком работают на основе этого принципа.  Тело человека излучает тепло в виде ИК излучения с максимальной длиной волны около 9,4 мкм. Появление человека создает внезапные изменения в ИК диапазоне окружающей среды, что воспринимается пироэлектрическим датчиком. Модуль с PIR датчиком имеет элементы которые усиливают сигнал для его соответствия логическим уровням. Перед началом работы датчику необходимо от 10 до 60 секунд для ознакомления с окружающей средой для дальнейшего нормального функционирования. В это время следует избегать движений в поле зрения датчика. Датчик действует на расстояние до 20 футов и не реагирует на естественные изменения окружающей среды, связанные с течение времени. При этом, датчик реагирует на любое резкое изменение окружающей среды(например появление человека). Модель с датчиком не следует размещать рядом с батареями, розетками и любыми другими предметами быстро меняющими свою температуру, т.к. это приведёт к ложному срабатыванию. Модули с PIR датчиком обычно имеют 3 контакта : Vcc, Выход и GND. Цоколевка у разных производителей может отличаться, поэтому я рекомендую проверить документацию. Также значение вывода может быть обозначено прямо на плате. На моём  датчике таких обозначений нет. Он может работать при напряжении питания от 5 до 12V и имеет свой собственный всторенный стабилизатор напряжения. При наличии движения на выходе датчика появляется высокий логический уровень. Также он имеет 3х контактный джампер для установки режима работы. Боковые контакты имеют метки H и L. Когда перемычка находится в положении H, при срабатывании датчика несколько раз подряд на его выходе остается высокий логический уровень. В положении L, на выходе при каждом срабатывании датчика появляется отдельный импульс. Передняя часть модуля имеет линзу Френеля для фокусировки ИК излучения на чувствительный элемент.

Схема и конструкция

Схема датчика движения довольно проста. Устройство работает от  4 AA батарей, которые дают 6V. На диоде, который используется как защита от неправильного подключения питания, напряжение падает до 5,4V. Я проверял схему с NI-MH аккумулятором 4,8 V и она работала, но я рекомендую использовать щелочные батарейки по 1,5V каждая для лучшей производительности. Вы можете также использовать батареи 9V , но тогда вам необходим стабилизатор LM7805. Выход с модуля контролируется микроконтроллером PIC12F635 через порт GP5 (вывод 2). При движении на выходе датчика появляется напряжение около 3,3 V. Это напряжение распознаётся микроконтроллером ка высокий логический уровень, но я предпочел использовать это напряжение для управления NPN транзистором BC547, коллектор которого подключил к микроконтроллеру.  Когда транзистор закрыт, на его коллекторе высокий логический уровень (+5V). При движении на выходе модуля появляется высокий логический уровень который насыщает транзистор и напряжение на его коллекторе падает до низкого логического уровня. Перемычки на датчике находится в позиции H, так что выходной сигнал датчика будет оставаться высоким до тех пор, пока движение не прекратится. Микроконтроллер PIC12F635 использует внутренний тактовый генератор, работающий на частоте 4,0 МГц.

Светодиод, подключенный к порту GP4 через  токоограничивающий резистор мигает 3 раза при подключении питания. Пьезоэлектрический зуммер EFM-290ED подключенный к порту GP2 сообщает о наличии движения. Пьезоэлектрический зуммер дает максимально громкий звук на своей резонансной частоте. Зуммер который я использовал, имеет резонансную частоту 3,4 ± 0,5 кГц. После экспериментов с ним, я обнаружил, что максимальный звук он дает на частоте около 372Гц. Хотя в документации сказано, что рабочее напряжение составляет от 7-12V, он работает и от напряжения 5V.

Программа

Программа написана на С и скомпилирована в MikroC Pro для PIC. При подаче питания светодиод мигает три раза и это свидетельствует о успешном запуске. После этого микроконтроллер ждет 60 секунд до начала проверки значения на выходе с датчика. Это требуется для стабилизации датчика. Когда микроконтроллер определяет срабатывание датчика, он запускает пьезозуммер на частоте 3725Гц. MikroC имеет встроенную библиотеку для генерации звука (Sound_Play()). Зуммер издает звук до тех пор, пока датчик ощущает движение. Когда движение прекращается, логический уровень на выходе датчика изменяется, но зуммер не замолкает сразу, а еще в течение примерно 10 секунд  издает звук на частоте 3570Гц. Если он обнаруживает движение снова, он опять запустится на частоте 3725 Гц. Этот проект использует внутренний генератор запущенный  на частоте 4,0 МГц, MCLR и сторожевой таймер выключены.

/* Project: PIR Motion Sensor Alarm (PIC12F635) Piezo: EFM-290ED, 3.7 KHz connected at GP2 PIR sensor module in retriggering mode Internal Clock @ 4.0 MHz, MCLR Disabled, WDT OFF */ sbit Sensor_IP at GP5_bit; // sensor I/P sbit LED at GP4_bit; // LED O/P unsigned short trigger, counter; void Get_Delay(){ Delay_ms(300); } void main() { CMCON0 = 7; TRISIO = 0b00101000; // GP5, 5 I/P’s, Rest O/P’s GPIO = 0; Sound_Init(&GPIO,2); // Blink LED at Startup LED = 1; Get_Delay(); LED = 0; Get_Delay(); LED = 1; Get_Delay(); LED = 0; Get_Delay(); LED = 1; Get_Delay(); LED = 0; Delay_ms(60000); // 45 Sec delay for PIR module stabilization counter = 0; trigger = 0; do { while (!Sensor_IP) { // Sensor I/P Low Sound_Play(3725, 600); Delay_ms(500); trigger = 1; counter = 0; } if (trigger) { Sound_Play(3570, 600); Delay_ms(500); counter = counter+1; if(counter == 10) trigger=0; } }while(1); } // End main()

Фото и видео работы устройства:

Скачать прошивку

Оригинал статьи на английском языке (перевод: Александр Касьянов для сайта cxem.net)


Категория: Микроконтроллеры
Метки:

Написать коментарий

*
= 5 + 5

Добавить изображение

Последние статьи