Безопасность в настоящее время является одной из ключевых проблем человечества. С развитием технологий достаточно важную роль в обеспечении безопасности помещений различного назначения стали играть цифровые замки. Существующие цифровые замки могут работать на различных физических принципах: радиочастотная идентификация (RFID), распознавание лиц, отпечатки пальцев и т.д. В данной статье мы рассмотрим создание умного дверного замка с распознаванием лиц на основе модуля ESP32-CAM.
AI-Thinker ESP32-CAM представляет собой дешевый модуль с очень маленькой камерой OV2640 и слотом для карт micro SD. Он содержит чип ESP32 S с поддержкой технологий Wi-Fi и Bluetooth, двухъядерным 32-битным микропроцессором LX6 с 7-уровневой конвейерной архитектурой. Более подробно данный модуль мы уже рассматривали на нашем сайте в статьях про распознавание лиц на основе модуля ESP32-CAM и умный дверной звонок с камерой на основе модуля ESP32-CAM.
Необходимые компоненты
- Модуль ESP32 CAM (купить на AliExpress).
- Плата FTDI для программирования модуля (купить на AliExpress).
- Модуль реле (купить на AliExpress).
- Замок с электромагнитным управлением.
- Соединительные провода.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Замок с электромагнитным управлением (Solenoid Lock)
Принцип работы замка с электромагнитным управлением основан на электромеханическом механизме запирания. Он имеет личинку со скошенным концом и монтажным кронштейном. При подаче питания на замок постоянный ток создает магнитное поле, которое задвигает личинку внутрь замка и, таким образом, дверь открывается. Когда подача питания прекращается личинка высвобождается и возвращается в исходное состояние, тем самым закрывая дверь. В закрытом состоянии замок не потребляет электроэнергии. Чтобы замок с электромагнитным управлением сработал, необходим источник питания обеспечивающий 12V @ 500mA.
Ранее подобный замок с электромагнитным управлением мы рассматривали в статье про замок с электромагнитным управлением на основе Arduino и радиочастотной идентификации.
Схема проекта
Схема дверного замка с распознаванием лиц на основе модуля ESP32-CAM представлена на следующем рисунке.
Полная схема соединений проекта представлена в следующей таблице.
ESP32-CAM | Плата FTDI |
5V | VCC |
GND | GND |
UOR | TX |
UOT | RX |
ESP32-CAM | Модуль реле |
5V | VCC |
GND | GND |
IO4 | IN |
Примечание: перед загрузкой программы в модуль ESP32-CAM замкните его контакт IO0 на землю. Контакт IO0 определяет, находится ли модуль в режиме загрузке программы или нет. Когда GPIO 0 подключен к земле, модуль ESP32 находится в режиме загрузки.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Установка платы ESP32 в Arduino IDE
В нашем проекте мы будем программировать модуль ESP32-CAM с помощью Arduino IDE. Для этого необходимо добавить поддержку данного модуля в Arduino IDE.
Вначале в Arduino IDE выберите пункт File> Preferences.
В открывшемся окне в поле “Additional Board Manager URLs” скопируйте ссылку https://dl.espressif.com/dl/package_esp32_index.json. После этого нажмите на кнопку “OK”.
Затем откройте пункт меню Tools > Board > Boards Manager.
В открывшемся менеджере библиотек выполните поиск ESP32 и установите библиотеку “ESP32 by Espressif Systems“.
Объяснение программы для модуля ESP32
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Ранее на нашем сайте мы уже рассматривали основы распознавания лиц с помощью модуля ESP32-CAM. В этом проекте мы модифицируем рассмотренный в той статье код программы.
Первым делом мы в программе подключим используемые библиотеки.
1 2 3 |
#include "esp_camera.h" #include <WiFi.h> #include "camera_pins.h" |
Среди следующих строк кода раскомментируйте ту, которая соответствует используемой вами модели модуля. В нашем случае мы используем модель AI-THINKER.
1 2 3 4 5 |
//#define CAMERA_MODEL_WROVER_KIT //#define CAMERA_MODEL_ESP_EYE //#define CAMERA_MODEL_M5STACK_PSRAM //#define CAMERA_MODEL_M5STACK_WIDE #define CAMERA_MODEL_AI_THINKER |
После этого укажем параметры доступа к сети Wi-Fi – ее имя и пароль.
1 2 |
const char* ssid = "Wi-Fi Name"; const char* password = "Wi-Fi password"; |
Далее укажем контакт, к которому подключен модуль реле. Мы будем использовать функцию millis() для того чтобы автоматически закрывать дверь после того, как она была открыта некоторый интервал времени (5 секунд).
1 2 3 |
#define relay 4 long prevMillis = 0; int interval = 5000; |
В функции setup() мы инициализируем последовательную связь со скоростью 115200 бод для целей отладки. Также в этой функции мы зададим режим работы контакта, к которому подключен модуль реле, на вывод данных, и подадим на этот контакт уровень low.
1 2 3 4 |
void setup() { Serial.begin(115200); pinMode(relay, OUTPUT); digitalWrite(relay, LOW); |
Внутри функции loop() мы будем проверять соответствует ли проверяемое лицо ранее сохраненному лицу. Если да, то разблокируем (открываем) дверь на 5 секунд и затем снова ее закрываем.
1 2 3 4 5 6 7 8 9 10 11 |
void loop() { if (matchFace == true && activeRelay == false){ activeRelay = true; digitalWrite (relay, HIGH); prevMillis = millis(); } if(activeRelay == true && millis()- prevMillis > interval){ activeRelay = false; matchFace = false; digitalWrite(relay, LOW); } |
Тестирование работы проекта
Соберите схему проекта, подключите плату FDTI к компьютеру/ноутбуку, в качестве платы в Arduino IDE выберите ‘ESP32 Wrover Module’. Измените ряд других настроек как показано на следующем рисунке.
Не забудьте подключить контакт IO0 к земле (GND) перед загрузкой программы в модуль, также нажмите на модуле ESP32 кнопку сброса (reset button), после этого нажимайте на кнопку загрузки программы в Arduino IDE.
Примечание: если у вас возникли ошибки при загрузке программы в модуль, проверьте подключен ли контакт IO0 к земле и правильные ли выбраны настройки в пункте меню Tools в Arduino IDE.
После загрузки кода программы в модуль отключите IO0 от земли (GND). Откройте окно монитора последовательной связи и измените в нем скорость на 115200. После этого нажмите кнопку сброса на модуле ESP32, в результате чего в окно монитора последовательной связи будет выведен IP адрес модуля ESP32 и номер порта, к которому он подключен.
Затем в адресной строке браузера введите определенный IP адрес модуля ESP32 – после этого вы получите доступ к настройкам камеры модуля. Вас перебросит на страницу видео трансляции камеры. Если вы хотите начать трансляцию (streaming), нажмите на кнопку ‘Start Stream’ внизу страницы.
Чтобы распознавать лица с помощью модуля ESP32-CAM сначала в его память мы должны записать лица людей, которым разрешен доступ в помещение. Для этого выберите в настройках пункт «Face recognition and detection» и затем нажмите на кнопку «Enroll Face». Произойдет несколько попыток сохранения лица. После того как сохранение лица произойдет, этому лицу присвоится имя subject 0, где 0 будет обозначать номер лица.
После захвата и сохранения необходимых лиц, если лицо будет распознаваться в видео потоке, то модуль ESP32-CAM будет подавать на реле уровень high и электромагнитный замок будет открывать дверь.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
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 |
#include "esp_camera.h" #include <WiFi.h> // // WARNING!!! Make sure that you have either selected ESP32 Wrover Module, // or another board which has PSRAM enabled // // Select camera model //#define CAMERA_MODEL_WROVER_KIT //#define CAMERA_MODEL_ESP_EYE //#define CAMERA_MODEL_M5STACK_PSRAM //#define CAMERA_MODEL_M5STACK_WIDE #define CAMERA_MODEL_AI_THINKER #include "camera_pins.h" const char* ssid = "Galaxy-M20"; const char* password = "ac312124"; #define LED_BUILTIN 4 #define relay 4 #define buzzer 2 boolean matchFace = false; boolean activeRelay = false; long prevMillis = 0; int interval = 5000; void startCameraServer(); void setup() { Serial.begin(115200); Serial.setDebugOutput(true); Serial.println(); pinMode(relay, OUTPUT); pinMode(buzzer, OUTPUT); pinMode (LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); digitalWrite(relay, LOW); digitalWrite(buzzer, LOW); camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; //init with high specs to pre-allocate larger buffers if(psramFound()){ config.frame_size = FRAMESIZE_UXGA; config.jpeg_quality = 10; config.fb_count = 2; } else { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 12; config.fb_count = 1; } #if defined(CAMERA_MODEL_ESP_EYE) pinMode(13, INPUT_PULLUP); pinMode(14, INPUT_PULLUP); #endif // camera init esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; } sensor_t * s = esp_camera_sensor_get(); //initial sensors are flipped vertically and colors are a bit saturated if (s->id.PID == OV3660_PID) { s->set_vflip(s, 1);//flip it back s->set_brightness(s, 1);//немного увеличиваем яркость s->set_saturation(s, -2);//немного уменьшаем насыщенность } //drop down frame size for higher initial frame rate s->set_framesize(s, FRAMESIZE_QVGA); #if defined(CAMERA_MODEL_M5STACK_WIDE) s->set_vflip(s, 1); s->set_hmirror(s, 1); #endif WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); startCameraServer(); Serial.print("Camera Ready! Use 'http://"); Serial.print(WiFi.localIP()); Serial.println("' to connect"); } void loop() { if (matchFace == true && activeRelay == false){ activeRelay = true; digitalWrite (relay, HIGH); digitalWrite (buzzer, HIGH); delay(800); digitalWrite (buzzer, LOW); prevMillis = millis(); } if(activeRelay == true && millis()- prevMillis > interval){ activeRelay = false; matchFace = false; digitalWrite(relay, LOW); } } |
16 ответов к “Дверной замок с распознаванием лиц на основе модуля ESP32-CAM”
Добрый вечер
1 что то я не понимаю мы устанавливаем ESP32 Wrover Module а расскоментируем в коде строку CAMERA_MODEL_AI_THINKER а почему сражу не установить Ai Thinker ESP32-CAM?
2 какую библиотеку надо установить чтобы появился файл camera_pin.h
3. а что означает вот эта процедура не содержащая кода void startCameraServer();
вообщем по итогу имеем ошибки
sketch\face_cam_1.ino.cpp.o:(.literal._Z5setupv+0x38): undefined reference to
startCameraServer()'
setup()’:sketch\face_cam_1.ino.cpp.o: In function
D:\ProgramingProject\Arduino\face_cam_1/face_cam_1.ino:91: undefined reference to `startCameraServer()’
collect2.exe: error: ld returned 1 exit status
Несколько библиотек найдено для «WiFi.h»
Используется: C:\Users\Harry\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.5\libraries\WiFi
Не используется: D:\ProgramingProject\Arduino\libraries\WiFiEspAT
Не используется: C:\Program Files (x86)\Arduino\libraries\WiFi
Не используется: D:\ProgramingProject\Arduino\libraries\WiFi
exit status 1
Ошибка компиляции для платы AI Thinker ESP32-CAM.
может подскажете что это?
Добрый день.
1. ESP32 Wrover Module — это целое семейство модулей, у каждой конкретной модели этого семейства свой особенный модуль камеры, поэтому раскомментировать нужно именно ту строчку кода, которая соответствует модулю камеры на вашей модели модуля.
2. Не в курсе, к сожалению, данного вопроса.
3. Скорее всего это опечатка и эту строку нужно удалить из программы.
Если после удаления этой строки у вас программа не заработает скорее всего у вас используется другой модуль камеры и вам в этом случае нужно раскомментировать другую строку с заданием модели камеры
Добрый день, хочу дополнительно подключить светодиод к контроллеру, чтобы он светился в функции loop() постоянно, используя любой пин, однако он загорается только при нажатии кнопки RESET(
Добрый вечер. Ну если он должен светиться постоянно вы можете зажечь его в функции setup()
помогите пожалуйста, после загрузки на плату и нажатия кнопки обновления вместо строчек с IP выдаёт
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8
[E][camera.c:1049] camera_probe(): Detected camera not supported.
[E][camera.c:1249] esp_camera_init(): Camera probe failed with error 0x20004
На этой странице приведена самая подробная информация в сети по решению данной проблемы. Предлагают разные пути ее решения:
— замена USB кабеля;
— переключение на питание 5V вместо 3.3V;
— задание правильной конфигурации контактов ввода/вывода;
— смена модели камеры в скетче (например, #define CAMERA_MODEL_WROVER_KIT)
и др.
Сложно сказать какое из этих решений вам поможет, нужно пробовать.
Здравствуй хороший человек!
Вопрос, как поменять номер порта http 80 на свой?
В esp_http_server.h есть server_port при замене на другой
страница грузится, но не идёт видео трафик.
Добрый день. Насколько я знаю, если вы используете роутер, то нужно настроить перенаправление трафика на ваш порт еще и на нем
Да, если заходить с сети интернет 80 и 81 нужно перенаправить на локальный хост, а вот с другими портами страница грузиться, а видео трафик не идёт.
Честно говоря, тогда точно не знаю. Можно в исходных кодах библиотеки попробовать посмотреть может там где то жестко порт 81 прописывается. И если это так, то тогда просто в программе с помощью такой же команды как в библиотеке изменить номер порта
при компиляции скетча выдало ошибку.
camera_pins.h: No such file or directory
в чем может быть проблемма ?
Может быть, вы не в то место установили библиотеку для работы с модулем ESP32. Попробуйте через поиск на компьютере поискать где у вас находится файл camera_pins.h
Не работает. Не возможно зарегистрировать лицо, кнопка регистрации не дает результата…вообще не понятно, куда сохраняются снимки — на флешку или во внутреннюю память
Александр, а более простой проект данной тематики у вас работает?
Сколько максимально фоток лиц может поместиться в микруху?
Точно не знаю поскольку лично этот проект не собирал, но оно определенно будет зависеть от того качества, в котором вы будете сохранять фотографии