Una cámara WiFi programable que cuesta pocos euros, sumada a un sensor de movimiento PIR, se convierte en una herramienta de seguridad que avisa al celular por Telegram. Así lo plantea un proyecto publicado por Open Electronics con el ESP32-CAM de AI-Thinker.

¿Qué trae el ESP32-CAM?

El ESP32-CAM es una cámara barata y liviana, con WiFi y Bluetooth incluidos, que mide 40,5 x 27 x 4,5 milímetros. Open Electronics la llama la "navaja suiza" de cualquier maker.

El módulo lleva un ESP32, un microcontrolador programable con WiFi y Bluetooth integrados, más 4 MB de RAM externa. Tiene un conector para un módulo de cámara aparte y una ranura para tarjetas SD de hasta 4 GB.

El conector de cámara admite un OV2640 o un OV7670. El primero viene con el módulo y tiene una resolución de 2 megapíxeles. En la placa también hay un LED de alto brillo que sirve como flash o para iluminar la escena, y si la luz no alcanza se puede montar uno externo en alguno de sus GPIO.

El chip usa dos núcleos de procesamiento de 32 bits. Según el formato y el tamaño de la imagen, llega a unas 8 imágenes JPEG por segundo en SVGA (800 x 600).

Un control de acceso para una pieza o un garaje

El módulo es tan chico que permite armar un control de acceso dentro de una sola pieza o de un garaje, capturando una imagen por cada entrada. La pregunta práctica es qué hacer con esas fotos y cuándo revisarlas. Para eso el proyecto arma un periférico que reporta cada acceso en tiempo real al celular, o que alimenta una nube privada.

¿Cómo funciona?

El ESP32-CAM detecta, mediante el sensor PIR, la entrada a la zona vigilada y el movimiento dentro de ella.

Fig. 3. El sensor infrarrojo pasivo usado en el proyecto.

Cuando alguien cruza el área, el PIR detecta la radiación térmica del cuerpo en movimiento y se activa. Su salida, que en reposo está en cero lógico, pasa a nivel alto y enciende la cámara, que guarda los bytes de la imagen en un puntero que antes era NULL. Si esa estructura no se llena bien, un procedimiento de emergencia reinicia el dispositivo.

Avisar la intrusión, por HTTP o por MQTT

Falta definir cómo se avisa la intrusión hacia afuera y cuánto esperar antes de volver a disparar. Para el aviso hay varias opciones, que incluso pueden convivir.

  • API HTTP o HTTPS. Son las llamadas POST o GET clásicas a un servidor que se hace cargo de la solicitud, como los servicios y la API de Telegram. Primero el dispositivo se conecta al servidor remoto y, si lo logra, empieza a enviar los bytes de la foto.
  • Protocolo MQTT. Es la base de muchos aparatos de domótica y consiste en enviar mensajes de texto simples, muchas veces en JSON, que informan a otros dispositivos inteligentes.

El ejemplo usa la API HTTP para comunicarse con el servidor de Telegram y mandarle la foto. Al final se fija una espera antes de capturar la siguiente imagen. Esa espera puede ser cero si se busca una secuencia rápida de fotos, pero en el código resulta importante para no disparar en ráfagas.

Un botón en vez del PIR

Si no hay un sensor PIR a mano, se puede reemplazar por un botón y disparar a mano. El contacto del botón también se puede cambiar por una alfombra de contacto, para sacar una foto cada vez que alguien pisa una zona, como la entrada de una puerta.

Fig. 4. El botón montado en una placa de conexión.

El circuito espera que en reposo la señal esté en nivel lógico bajo y que suba al detectar algo, igual que con el PIR. Si el botón se conecta directo a la línea del PIR y cierra hacia tierra, el comportamiento se invierte.

Conexiones para programar el módulo

El firmware del ESP32-CAM se carga a través de un Arduino. También se puede usar un adaptador FTDI, lo que simplifica bastante el cableado durante la programación.

Primero hay que ubicar los pines TX y RX del ESP32-CAM, llamados U0TXD y U0RXD, que en el módulo de cámara corresponden a GPIO1 y GPIO3, y conectarlos a los pines TX y RX del Arduino. Los pines GND y GPIO0 del ESP32-CAM van a tierra junto con los pines GND y RESET del Arduino, y los dos pines de 5 V se unen entre sí. Para armar todo sirve una protoboard. La tabla 1 resume las conexiones.

Tabla 1. Correspondencia entre las conexiones del Arduino y del ESP32-CAM.

El diagrama del circuito de programación está en la figura 5.

Fig. 5. Conexiones del Arduino al ESP32-CAM para programarlo.

Después se agrega el sensor PIR. Los contactos 3V3 y GND del módulo van a VCC y GND del sensor, y la señal de disparo sale del pin GPIO13 hacia la salida OUT del PIR.

Una vez programado el ESP32-CAM hay que sacar la unión entre GPIO0 y GND. Todo el circuito se alimenta a través del Arduino Uno, con una fuente estabilizada de 8 a 12 V y un conector DC compatible con el del Arduino. El consumo ronda los 500 miliamperes.

Fig. 6. El circuito completo con el sensor PIR.

¿Cómo se prepara el IDE de Arduino?

Antes de programar hay que configurar el IDE de Arduino para que escriba bien en el módulo. En Archivo, Preferencias, se agrega esta dirección en el campo de URL adicionales del gestor de placas, dl.espressif.com/dl/package_esp32_index.json](https://dl.espressif.com/dl/package_esp32_index.json), y se presiona OK.

Fig. 7. La URL agregada al gestor de placas del IDE.

Si ya hay otras URL, se separan con una coma. Después, en Herramientas, Placa, Gestor de placas, se busca "esp32" y se instala el único resultado.

Fig. 8. Instalación del ESP32 en el gestor de placas.

Al volver a Herramientas, Placa, aparece una entrada nueva, ESP32 Arduino, con varias opciones. Se elige ESP32 Wrover Module, y en ese mismo menú aparece la línea Partition scheme, donde se selecciona Huge APP.

Fig. 9. Configuración del ESP32-CAM en el IDE.

Con eso ya se puede cargar el firmware. Se conecta el USB, se elige el puerto donde el sistema reconoce la placa y se presiona Subir.

El código

El firmware completo del proyecto no se reproduce en el artículo original por su largo, pero está disponible para descarga junto con los archivos del número de la revista. Open Electronics muestra algunos extractos, entre ellos la rutina principal, la que envía por Telegram la imagen capturada por la cámara del módulo.