В данной статье мы рассмотрим создание системы мониторинга посетителей на основе платы Raspberry Pi и специализированной камеры для нее. Мы рассмотрим подключение камеры к Raspberry Pi, которая будет захватывать изображение (делать фотоснимок) всех посетителей, которые будут проходить через ворота/дверь (Gate). Каждый посетитель, подходящий к двери/воротам, должен будет нажать кнопку чтобы открыть их – в это время камерой будет производиться фотографирование посетителя и сохранение этого изображения в память карты вместе с датой и временем прихода посетителя.
Данный проект может найти применение в системах безопасности. Кнопку в данном проекте может нажимать не только посетитель, но и оператор/охранник, осуществляющий допуск лиц на контролируемую территорию. Также данный проект является уроком по подключению камеры к плате Raspberry Pi.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress).
- Камера для Raspberry Pi (купить на AliExpress).
- ЖК дисплей 16x2 (купить на AliExpress).
- Электродвигатель постоянного тока.
- Микросхема драйвера двигателей L293D (купить на AliExpress).
- Зуммер (Buzzer) (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Резисторы 1 кОм, 10 кОм (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Конденсатор 100 нФ (купить на AliExpress).
- Кнопка.
- Источник питания.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Объяснение работы проекта
Принцип работы нашего проекта достаточно прост. При нажатии кнопки камера используется для получения фотоснимка посетителя – команду на это ей дает плата Raspberry Pi. Фотоснимок (изображение) сохраняется в памяти платы вместе с датой и временем визита посетителя. После этого ворота открываются на некоторое время чтобы впустить посетителя и затем снова закрываются. Зуммер используется для подачи звукового сигнала во время нажатия кнопки, а светодиод для индикации того, что плата Raspberry Pi готова принять нажатие кнопки, то есть система функционирует. Структурная схема работы проекта показана на следующем рисунке.
Фотографии посетителей сохраняются в памяти платы Raspberry Pi в виде изображений, имя файла изображения будет содержать дату и время фотоснимка как показано на рисунке ниже. То есть мы не сохраняем время и дату отдельно – мы сохраняем их в имени файла изображения. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Схема проекта
Схема системы мониторинга посетителей на Raspberry Pi и камеры представлена на следующем рисунке.
ЖК дисплей в схеме используется для отображения времени/даты визита и некоторых других сообщений о состоянии системы. ЖК дисплей подключен к плате Raspberry Pi в 4-битном режиме, его контакты RS, EN, D4, D5, D6 и D7 подключены к контактам GPIO 18, 23, 24, 16, 20 и 21 платы. Модуль камеры подключен к соответствующему разъему платы Raspberry Pi. Зуммер подключен к контакту 26 платы, светодиод – к контакту 5 платы 5 через резистор 1 кОм, кнопка - к контакту 19 платы. Электродвигатель постоянного тока, играющий в нашем проекте роль ворот (Gate), подключен к контактам 17 и 27 платы Raspberry Pi через драйвер двигателя L293D.
Для подключения камеры (Pi Camera) вставьте ее ленточный кабель (Ribbon cable) в соответствующий слот для него на плате Raspberry Pi.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Настройка платы Raspberry Pi
Для работы нашего проекта после первоначальной настройки операционной системы Raspberry Pi необходимо в нее файлы библиотеки для работы с камерой (Pi camera library files), это можно сделать с помощью следующих команд:
1 2 |
$ sudo apt-get install python-picamera $ sudo apt-get install python3-picamera |
После этого необходимо войти в меню настроек операционной системы чтобы включить в них использование камеры.
1 |
$ sudo raspi-config |
После этого выберите пункт Enable camera (включить использование камеры).
Далее необходимо перезагрузить Raspberry Pi чтобы изменения вступили в силу.
1 |
$ sudo reboot |
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
После того, как все необходимые соединения в схеме сделаны, мы можем подать питание на Raspberry Pi и после загрузки ее операционной системы можно начать писать программу в ней на Python. Подробнее о том, как это можно сделать, можно прочитать в статье про мигание светодиода с помощью Raspberry Pi.
Первым делом в программе нам необходимо подключить используемые библиотеки, инициализировать необходимые переменные и контакты.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import RPi.GPIO as gpio import picamera import time m11=17 m12=27 led=5 buz=26 button=19 RS =18 ... .... ... ..... |
Функция def capture_image() используется для захвата изображения посетителя с временем и датой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def capture_image(): lcdcmd(0x01) lcdprint("Please Wait.."); data= time.strftime("%d_%b_%Y\%H:%M:%S") camera.start_preview() time.sleep(5) print data camera.capture('/home/pi/Desktop/Visitors/%s.jpg'%data) camera.stop_preview() lcdcmd(0x01) lcdprint("Image Captured") lcdcmd(0xc0) lcdprint(" Successfully ") time.sleep(2) |
Функция def gate() используется для управления двигателем постоянного тока, который в нашем проекте используется в качестве ворот (Gate).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def gate(): lcdcmd(0x01) lcdprint(" Welcome ") gpio.output(m11, 1) gpio.output(m12, 0) time.sleep(1.5) gpio.output(m11, 0) gpio.output(m12, 0) time.sleep(3) gpio.output(m11, 0) gpio.output(m12, 1) time.sleep(1.5) gpio.output(m11, 0) gpio.output(m12, 0) lcdcmd(0x01); lcdprint(" Thank You ") time.sleep(2) |
Также запрограммируем ряд функций для работы с ЖК дисплеем (их коды приведены в конце статьи):
- def begin() – для инициализации ЖК дисплея;
- def lcdcmd(ch) – для передачи команд на ЖК дисплей;
- def lcdwrite(ch) – для передачи данных на ЖК дисплей;
- def lcdprint(Str) – для передачи строки на ЖК дисплей.
После этого мы инициализируем ЖК дисплей и камеру и начинаем непрерывно в цикле проверять состояние кнопки. При нажатии кнопки мы будем открывать ворота для входа, будет делаться фотоснимок посетителя и вместе с датой и временем сохраняться в памяти платы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
while 1: d= time.strftime("%d %b %Y") t= time.strftime("%H:%M:%S") lcdcmd(0x80) lcdprint("Time: %s"%t) lcdcmd(0xc0) lcdprint("Date:%s"%d) gpio.output(led, 1) if gpio.input(button)==0: gpio.output(buz, 1) gpio.output(led, 0) time.sleep(0.5) gpio.output(buz, 0) capture_image() gate() time.sleep(0.5) |
Рассмотренную в данном проекте систему мониторинга посетителей на основе платы Raspberry Pi и камеры можно значительно усовершенствовать, дополнив ее системой компьютерного зрения и библиотекой OpenCV, с помощью которой можно сравнивать полученное изображение посетителя с хранящимися в памяти изображениями и осуществлять допуск посетителя только при совпадении его изображения с одним из хранящихся образцов.
Исходный код программы на Python
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
import RPi.GPIO as gpio import picamera import time m11=17 m12=27 led=5 buz=26 button=19 RS =18 EN =23 D4 =24 D5 =16 D6 =20 D7 =21 HIGH=1 LOW=0 gpio.setwarnings(False) gpio.setmode(gpio.BCM) gpio.setup(RS, gpio.OUT) gpio.setup(EN, gpio.OUT) gpio.setup(D4, gpio.OUT) gpio.setup(D5, gpio.OUT) gpio.setup(D6, gpio.OUT) gpio.setup(D7, gpio.OUT) gpio.setup(led, gpio.OUT) gpio.setup(buz, gpio.OUT) gpio.setup(m11, gpio.OUT) gpio.setup(m12, gpio.OUT) gpio.setup(button, gpio.IN) gpio.output(led , 0) gpio.output(buz , 0) gpio.output(m11 , 0) gpio.output(m12 , 0) data="" def capture_image(): lcdcmd(0x01) lcdprint("Please Wait.."); data= time.strftime("%d_%b_%Y\%H:%M:%S") camera.start_preview() time.sleep(5) print data camera.capture('/home/pi/Desktop/Visitors/%s.jpg'%data) camera.stop_preview() lcdcmd(0x01) lcdprint("Image Captured") lcdcmd(0xc0) lcdprint(" Successfully ") time.sleep(2) def gate(): lcdcmd(0x01) lcdprint(" Welcome ") gpio.output(m11, 1) gpio.output(m12, 0) time.sleep(1.5) gpio.output(m11, 0) gpio.output(m12, 0) time.sleep(3) gpio.output(m11, 0) gpio.output(m12, 1) time.sleep(1.5) gpio.output(m11, 0) gpio.output(m12, 0) lcdcmd(0x01); lcdprint(" Thank You ") time.sleep(2) def begin(): lcdcmd(0x33) lcdcmd(0x32) lcdcmd(0x06) lcdcmd(0x0C) lcdcmd(0x28) lcdcmd(0x01) time.sleep(0.0005) def lcdcmd(ch): gpio.output(RS, 0) gpio.output(D4, 0) gpio.output(D5, 0) gpio.output(D6, 0) gpio.output(D7, 0) if ch&0x10==0x10: gpio.output(D4, 1) if ch&0x20==0x20: gpio.output(D5, 1) if ch&0x40==0x40: gpio.output(D6, 1) if ch&0x80==0x80: gpio.output(D7, 1) gpio.output(EN, 1) time.sleep(0.005) gpio.output(EN, 0) # Low bits gpio.output(D4, 0) gpio.output(D5, 0) gpio.output(D6, 0) gpio.output(D7, 0) if ch&0x01==0x01: gpio.output(D4, 1) if ch&0x02==0x02: gpio.output(D5, 1) if ch&0x04==0x04: gpio.output(D6, 1) if ch&0x08==0x08: gpio.output(D7, 1) gpio.output(EN, 1) time.sleep(0.005) gpio.output(EN, 0) def lcdwrite(ch): gpio.output(RS, 1) gpio.output(D4, 0) gpio.output(D5, 0) gpio.output(D6, 0) gpio.output(D7, 0) if ch&0x10==0x10: gpio.output(D4, 1) if ch&0x20==0x20: gpio.output(D5, 1) if ch&0x40==0x40: gpio.output(D6, 1) if ch&0x80==0x80: gpio.output(D7, 1) gpio.output(EN, 1) time.sleep(0.005) gpio.output(EN, 0) # Low bits gpio.output(D4, 0) gpio.output(D5, 0) gpio.output(D6, 0) gpio.output(D7, 0) if ch&0x01==0x01: gpio.output(D4, 1) if ch&0x02==0x02: gpio.output(D5, 1) if ch&0x04==0x04: gpio.output(D6, 1) if ch&0x08==0x08: gpio.output(D7, 1) gpio.output(EN, 1) time.sleep(0.005) gpio.output(EN, 0) def lcdprint(Str): l=0; l=len(Str) for i in range(l): lcdwrite(ord(Str[i])) begin() lcdcmd(0x01) lcdprint("Visitor Monitoring") lcdcmd(0xc0) lcdprint(" Using RPI ") time.sleep(3) lcdcmd(0x01) lcdprint("Circuit Digest") lcdcmd(0xc0) lcdprint("Saddam Khan") time.sleep(3) lcdcmd(0x01) camera = picamera.PiCamera() camera.rotation=180 camera.awb_mode= 'auto' camera.brightness=55 lcdcmd(0x01) lcdprint(" Please Press ") lcdcmd(0xc0) lcdprint(" Button ") time.sleep(2) while 1: d= time.strftime("%d %b %Y") t= time.strftime("%H:%M:%S") lcdcmd(0x80) lcdprint("Time: %s"%t) lcdcmd(0xc0) lcdprint("Date:%s"%d) gpio.output(led, 1) if gpio.input(button)==0: gpio.output(buz, 1) gpio.output(led, 0) time.sleep(0.5) gpio.output(buz, 0) capture_image() gate() time.sleep(0.5) |