Пироэлектрический инфракрасный датчик движения (PIR) используется для обнаружения движения человека или других «нагретых» тел. Поскольку сам PIR датчик при этом ничего не излучает (в отличие, к примеру, от датчика RCWL-0516), то его также называют пассивным датчиком движения. При обнаружении движения на выходном контакте PIR датчика формируется импульс с уровнем High.
В данной статье мы рассмотрим подключение инфракрасного датчика движения (PIR) к микроконтроллеру PIC16F877A. При обнаружении датчиком движения мы будем включать зуммер.
Ранее на нашем сайте мы рассматривали подключение PIR датчика к другим микроконтроллерам (платам):
Необходимые компоненты
- Микроконтроллер PIC16F877A (купить на AliExpress).
- PIR датчик движения (купить на AliExpress).
- Зуммер (купить на AliExpress).
- Держатель микросхем на 40 контактов (купить на AliExpress).
- Программатор PICkit 3 (купить на AliExpress).
- Кварцевый генератор 20 МГц (купить на AliExpress).
- Конденсаторы 33 пФ (2 шт.), 0,1 мкФ и 10 мкФ (купить на AliExpress).
- Резисторы 680 Ом, 560 Ом и 10 кОм (купить на AliExpress).
- Регулятор напряжения 7805 (купить на AliExpress).
- Светодиод любого цвета.
- Адаптер на 12 В.
- Перфорированная плата и соединительные провода.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Принцип работы PIR датчика
PIR датчик (пироэлектрический инфракрасный датчик) является пассивным устройством, поскольку он только улавливает инфракрасное излучение и не испускает его. Он обнаруживает любое изменение «тепла» и когда он это обнаруживает, он устанавливает на своем выходном контакте напряжение высокого уровня (HIGH).
Каждый нагретый объект создает излучение в инфракрасном диапазоне и человеческое тело не является исключением из этого правила. PIR датчик способен обнаруживать малейшие изменения излучения в инфракрасном диапазоне. При этом он способен обнаруживать не только нагретые тела (человека, кошку, собаку и т.д.), но и движущиеся «холодные» (не нагретые) тела, поскольку в результате трения о воздух движущееся тело нагревается и тем самым создает изменение излучения в инфракрасном диапазоне, которое и улавливается PIR датчиком.
Основным компонентом PIR датчика является пироэлектрический датчик – прямоугольный кристалл, показанный на рисунке ниже. В собранной конструкции датчика он закрыт пластиковой крышкой. Также датчик содержит ряд резисторов, конденсаторов и других компонентов, необходимых для его функционирования.
Пироэлектрический датчик накрыт пластиковой крышкой, содержащей массив линз Френеля, которые расположены таким образом, чтобы увеличиваться диапазон действия датчика. Более подробно про настройку PIR датчика можно прочитать в статье про его подключение к плате Arduino.
Схема проекта
Схема подключения PIR датчика движения к микроконтроллеру PIC представлена на следующем рисунке.
Программирование микроконтроллера PIC
Для программирования микроконтроллера PIC нам понадобится интегрированная среда разработки (Integrated Development Environment, IDE), в которой мы непосредственно будем писать нашу программу. Также нам будет необходим компилятор, преобразующий эту программу в HEX файл, который понимает наш микроконтроллер, и интегрированная среда программирования (Integrated Programming Environment, IPE), с помощью которой мы будем загружать полученный HEX файл в наш микроконтроллер.
В качестве этих инструментов в нашей программе мы будем использовать следующее программное обеспечение:
- IDE: MPLABX v3.35;
- IPE: MPLAB IPE v3.35;
- Compiler: XC8.
Компания Microchip предоставляет все эти инструменты абсолютно бесплатно. После скачивания их необходимо установить на свой компьютер.
Для загрузки программы в микроконтроллер PIC нам также потребуется программатор PICkit 3. Это простой и достаточно дешевый программатор/отладчик, управляемый из программы MPLAB IDE (версии v8.20 или свежее), запущенной на компьютере с операционной системой Windows. Программировать наш микроконтроллер мы будем с помощью опции внутрисхемного программирования (ICSP), доступной в микроконтроллере PIC16F877A.
Для загрузки кода программы в микроконтроллер выполните следующую последовательность шагов:
- Запустите MPLAB IPE.
- Подключите один конец программатора PicKit 3 к компьютеру, а другой – к контактам ICSP микроконтроллера.
- Соединитесь с вашим микроконтроллером PIC, нажав в программе на кнопку «connect».
- Откройте в программе HEX файл и нажмите на кнопку «Program».
Если вы начинающий в изучении микроконтроллеров PIC, то рекомендуем прочитать следующую подборку статей:
- начало работы с микроконтроллерами PIC с помощью программы MPLABX;
- написание первой программы для микроконтроллера PIC и установка в нем битов конфигурации;
- мигание светодиодом с помощью микроконтроллера PIC.
Объяснение программы для микроконтроллера PIC
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе установим биты конфигурации микроконтроллера и затем перейдем к основной функции программы – void main.
Подключим в программе заголовочный файл ‘XC.h’, который будет необходим для управления контактами ввода/вывода микроконтроллера и подключенными к нему периферийными устройствами. Также укажем тактовую частоту работы кварцевого генератора и контакты, к которым подключены PIR датчик и зуммер.
1 2 3 4 |
#include <xc.h> #define _XTAL_FREQ 20000000 //Specify the XTAL crystall FREQ #define PIR RC0 #define Buzzer RB2 |
Далее, в функции void main(), команда ‘TRISB=0X00’ используется для указания того, что все контакты PORTB будут работать на вывод данных (OUTPUT). Команда ‘TRISC=0Xff’ используется для указания того, что все контакты PORTC будут работать на ввод данных (INPUT). Команда ‘PORTB=0X00’ подает на все контакты PORTB (в том числе и на нужный нам контакт RB3) уровень Low.
1 2 3 |
TRISB=0X00; TRISC=0Xff; PORTB=0X00; //Make all output of RB3 LOW |
В следующем фрагменте кода мы проверяем состояние контакта, к которому подключен PIR датчик. Если оно равно HIGH, то на зуммер также подается уровень HIGH (он включается), иначе зуммер находится в выключенном состоянии.
1 2 3 4 5 6 7 8 9 10 11 |
while(1) //Get into the Infinie While loop { if(PIR ==1){ Buzzer=1; __delay_ms(1000); //Wait } else{ Buzzer=0; } } } |
Тестирование работы проекта
Схема нашего проекта достаточно проста, поэтому для ее сборки мы используем перфорированную плату с установленным на нее микроконтроллером PIC из нашего проекта мигания светодиодом. Фактически, к ней останется только подключить PIR датчик и зуммер. После этого можно будет загружать программу в микроконтроллер с помощью программатора PicKit 3.
После загрузки программы в микроконтроллер схема будет готова к работе. Как только PIR датчик будет обнаруживать какой-нибудь объект, излучающий инфракрасные лучи (например, тело человека), на своем выходном контакте он будет формировать уровень HIGH. Микроконтроллер PIC будет обнаруживать этот уровень и после этого включать сигнал зуммера. При пропадании из зоны действия PIR датчика нагретого объекта сигнал зуммера будет выключаться. Дистанцию срабатывания PIR датчика и его чувствительность можно отрегулировать с помощью двух потенциометров в его составе.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// 'C' source line config statements // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #define _XTAL_FREQ 20000000 //Specify the XTAL crystall FREQ #define PIR RC0 #define Buzzer RB2 void main() //основная функция программы { TRISB=0X00; //все контакты PORTB будут работать на вывод данных TRISC=0Xff; // все контакты PORTC будут работать на ввод данных PORTB=0X00; //подаем на все контакты PORTB (в том числе на нужный нам контакт RB3) уровень LOW while(1) //бесконечный цикл { if(PIR ==1){ Buzzer=1; __delay_ms(1000); //ждем } else{ Buzzer=0; } } } |