В этой статье мы рассмотрим как создать собственную простую камеру видеонаблюдения с использованием модуля ESP32-CAM. Ранее аналогичный проект мы рассматривали на основе платы Raspberry Pi, но, естественно, подобный проект на основе модуля ESP32-CAM будет существенно проще и дешевле.
Необходимые компоненты
- Модуль ESP32-CAM (купить на AliExpress).
- Плата адаптера FTDI (FTDI breakout Board) (купить на AliExpress).
- Некоторые детали, вырезанные из акрила.
- Соединительные провода.
- Micro SD-карта.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Модуль ESP32-CAM
Модуль ESP32-CAM — это мощный и универсальный микроконтроллер, разработанный компанией Espressif Systems, известный своей двухъядерной обработкой, встроенными возможностями Wi-Fi и Bluetooth , а также богатым набором контактов GPIO, что делает его предпочтительным выбором для широкого спектра задач и IoT-приложений. Его двухъядерная архитектура позволяет одновременно выполнять задачи, обеспечивая эффективную обработку сложных операций.
Ранее на нашем сайте мы рассматривали следующие проекты с применением данного модуля:
- дверной замок с распознаванием лиц на основе модуля ESP32-CAM;
- умный дверной звонок с камерой на основе модуля ESP32-CAM;
- использование модуля камеры ESP32 для видео трансляции и распознавания лиц.
Распиновка модуля ESP32-CAM
Модуль ESP32 CAM обычно имеет распиновку, которая включает в себя множество контактов GPIO для универсального подключения. Его типовая распиновка показана на следующем рисунке.
Обычно данный модуль содержит контакты питания и заземления, контакт GPIO для камеры, слот SD-карты для расширения памяти, контакты UART для последовательной связи и контакты GPIO общего назначения, которые можно использовать для различных целей, таких как связь I2C или SPI, цифрового ввода/вывода или для взаимодействия с датчиками и исполнительными устройствами. Кроме того, модуль часто включает контакты для включения флэш-памяти, управления камерой и облегчения режимов программирования, таких как загрузка и сброс.
Распиновка модуля FTDI
Модуль FTDI также известен как модуль Future Technology Devices International. Его внешний вид и распиновка показаны на следующем рисунке.
Он часто используется в качестве переходника между USB и последовательным интерфейсом и обычно имеет распиновку, которая включает в себя:
- RXD (получение данных): здесь чип FTDI принимает данные от внешнего устройства.
- TXD (передача данных): данные, которые должны быть переданы с чипа FTDI на внешнее устройство, передаются через этот вывод.
- CTS (готовность к отправке): этот вывод также связан с аппаратным управлением потоком данных и указывает микросхеме FTDI, что внешнее устройство готово к приему данных.
- DTR (готовность терминала данных): этот контакт часто используется для сброса или управления внешним устройством.
- 5 В или 3,3 В: в зависимости от модуля он обеспечивает выходную мощность 5 В или 3,3 В.
- GND (земля): контакт заземления обеспечивает опорное напряжение для модуля.
Пошаговое руководство по сборке камеры видеонаблюдения на ESP32-CAM своими руками
а) Настройка среды разработки:
- Установите Arduino IDE.
- Добавьте плату ESP32 в Arduino IDE. Скопируйте следующую ссылку «https://espressif.github.io/arduino-esp32/package_esp32_index.json» и вставьте ее в новую строку в меню File > preferences > additional boards manager.
- Установите необходимые библиотеки для модуля камеры ESP32, выбрав tools>boards>manage libraries («Инструменты»> «Платы»> «Управление библиотеками») и набрав «esp32» в строке поиска, затем установите библиотеку с помощью expressif.
б) Схема подключения:
Подключение модуля FTDI к модулю ESP32-CAM достаточно простое и показано на следующем рисунке.
Подключите контакт Vcc модуля ESP32-CAM к выводу 5V FTDI. Подключите контакт GND модуля ESP32-CAM к контакту GND модуля FTDI. Подключите контакт RX ESP32-CAM к контакту TX модуля FTDI. Подключите контакт TX модуля ESP32-CAM к контакту RX FTDI. Подключите GPIO0 к GND, чтобы можно было загрузить код в ESP32.
в) Как запрограммировать ESP32 CAM с помощью Arduino IDE?
После установки платы ESP32 перейдите в tools> board> ESP32 Arduino («Инструменты»> «Плата»> «ESP32 Arduino») и выберите плату Ai thinker ESP32 Cam.
После этого перейдите в Files> Examples> ESP32> Camera Web Server (Файлы> Примеры> ESP32> Веб-сервер камеры) и откройте код.
Вам нужно добавить // перед командой #define CAMERA_MODEL_ESP_EYE и удалить // перед #define CAMERA_MODEL_AI_THINKER. То есть помещаем в комментарии один тип модуля камеры и раскомментируем другой.
Затем замените строки «hotspot» и «hotspotpassword» на ssid и пароль точки доступа вашего телефона (или роутера) и загрузите код программы в модуль.
г) Тестирование в браузере
Возьмите IP-адрес последовательного монитора и напишите его в своем мобильном браузере.
После этого нажмите кнопку start stream («Начать трансляцию»), и вы увидите трансляцию с камеры.
д) Проектирование и сборка корпуса
Я хотел сделать дизайн максимально простым и легким. Поэтому я использовал простую диаграммную бумагу для основного корпуса камеры. Если вам нужен более прочный корпус вы также можете использовать трубу из ПВХ или корпус, напечатанный на 3D-принтере.
Для передней и задней пластины я использовал простую форму, спроектировал ее, а затем вырезал ее лазером.
После помещения модуля ESP32-CAM в корпус мы получили следующую конструкцию:
Исходный код программы
Весь код программы и картинку схемы проекта вы также можете скачать по следующей ссылке.
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 |
//Code for ESP32 CCTV Security Camera #include "esp_camera.h" #include <WiFi.h> // WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality // Ensure ESP32 Wrover Module or other board with PSRAM is selected // Partial images will be transmitted if image exceeds buffer size // // You must select partition scheme from the board menu that has at least 3MB APP space. // Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15 // seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well // =================== // Select camera model // =================== //#define CAMERA_MODEL_WROVER_KIT // Has PSRAM //#define CAMERA_MODEL_ESP_EYE // Has PSRAM //#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM //#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM //#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM //#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM //#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM //#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM #define CAMERA_MODEL_AI_THINKER // Has PSRAM //#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM //#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM // ** Espressif Internal Boards ** //#define CAMERA_MODEL_ESP32_CAM_BOARD //#define CAMERA_MODEL_ESP32S2_CAM_BOARD //#define CAMERA_MODEL_ESP32S3_CAM_LCD //#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 // Has PSRAM //#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 // Has PSRAM #include "camera_pins.h" // =========================== // Enter your WiFi credentials // =========================== const char* ssid = "ssid"; const char* password = "password"; void startCameraServer(); void setupLedFlash(int pin); void setup() { Serial.begin(115200); Serial.setDebugOutput(true); Serial.println(); 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_sccb_sda = SIOD_GPIO_NUM; config.pin_sccb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.frame_size = FRAMESIZE_UXGA; config.pixel_format = PIXFORMAT_JPEG; // for streaming //config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; config.fb_location = CAMERA_FB_IN_PSRAM; config.jpeg_quality = 12; config.fb_count = 1; // if PSRAM IC present, init with UXGA resolution and higher JPEG quality // for larger pre-allocated frame buffer. if(config.pixel_format == PIXFORMAT_JPEG){ if(psramFound()){ config.jpeg_quality = 10; config.fb_count = 2; config.grab_mode = CAMERA_GRAB_LATEST; } else { // Limit the frame size when PSRAM is not available config.frame_size = FRAMESIZE_SVGA; config.fb_location = CAMERA_FB_IN_DRAM; } } else { // Best option for face detection/recognition config.frame_size = FRAMESIZE_240X240; #if CONFIG_IDF_TARGET_ESP32S3 config.fb_count = 2; #endif } #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); // up the brightness just a bit s->set_saturation(s, -2); // lower the saturation } // drop down frame size for higher initial frame rate if(config.pixel_format == PIXFORMAT_JPEG){ s->set_framesize(s, FRAMESIZE_QVGA); } #if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM) s->set_vflip(s, 1); s->set_hmirror(s, 1); #endif #if defined(CAMERA_MODEL_ESP32S3_EYE) s->set_vflip(s, 1); #endif // Setup LED FLash if LED pin is defined in camera_pins.h #if defined(LED_GPIO_NUM) setupLedFlash(LED_GPIO_NUM); #endif WiFi.begin(ssid, password); WiFi.setSleep(false); 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() { // Do nothing. Everything is done in another task by the web server delay(10000); } |