Guía para usar el ESP32-CAM en escaneo de códigos QR

¡Hola equipo! Bienvenidos a Ingtelecto Pro. Hoy vamos a llevar el módulo ESP32-CAM al límite.

Seguramente has visto proyectos de videovigilancia, pero... ¿sabías que el ESP32 tiene suficiente potencia bruta para procesar imágenes en tiempo real y decodificar información? Hoy vamos a construir un Lector de Códigos QR totalmente autónomo.

Este proyecto es ideal para sistemas de control de asistencia, abrir puertas automáticamente o validar tickets. Y lo mejor: resolveremos los 3 problemas clásicos que hacen que la gente abandone este proyecto (Enfoque, Memoria y Partición). ¡Vamos a escanear! 📸🔍

Analogía del Mundo Real: El Cajero del Supermercado

Imagina un escáner de códigos de barras láser. Cuesta cientos de dólares y solo hace una cosa.
Nosotros vamos a replicar esa función usando una cámara y "visión artificial" básica. El ESP32 tomará una foto, buscará patrones de cuadrados negros y blancos (los "ojos" del QR), y traducirá esos píxeles en texto (una URL, un nombre, una contraseña). ¡Todo eso ocurre dentro del chip en milisegundos!

Índice de contenido
  1. Materiales Necesarios
  2. Fundamentos Técnicos y "El Secreto del Enfoque"
    1. 🔧 El Truco del Enfoque (Macro)
  3. Configuración del Entorno (Arduino IDE)
  4. Instalación de la Librería QR
  5. El Código del Escáner
    1. Análisis del Código
  6. Prueba y Solución de Problemas
  7. Conclusión

Materiales Necesarios

Lista de Componentes ✅

  • 1 x Módulo ESP32-CAM (Modelo AI-Thinker recomendado).
  • 1 x Base programadora ESP32-CAM-MB (¡Altamente recomendada para no sufrir con cables!).
  • 1 x Cable Micro-USB de datos.
  • Códigos QR impresos o en la pantalla de tu celular para probar.

Fundamentos Técnicos y "El Secreto del Enfoque"

Antes de programar, tenemos que arreglar un problema de hardware que afecta al 99% de las ESP32-CAM nuevas.

Sensor OV2640

Cámara

Es el "ojo" de nuestro ESP32. Por defecto, viene de fábrica enfocado al infinito (para cámaras de seguridad). Esto es terrible para leer un QR a 10 o 15 cm de distancia; se verá borroso y no leerá nada.

🔧 El Truco del Enfoque (Macro)

Para que esto funcione, necesitas modificar la lente:

  1. Mira el lente de la cámara. Tiene un pegamento rojo o transparente en la rosca para que no se mueva.
  2. Con mucho cuidado (y un cutter o bisturí), raspa ese pegamento para liberar la rosca.
  3. Gira la lente lentamente en sentido anti-horario (hacia la izquierda) unos 10-20 grados.
  4. Abre el ejemplo de "Camera Web Server" para ver el video en tu PC y ajusta hasta que veas nítido un objeto a 10cm.

¡Cuidado con el Sensor!

Al girar la lente, sostén el bloque cuadrado de la cámara con los dedos. Si giras muy fuerte sin sujetar la base, puedes arrancar el cable flexible naranja y la cámara morirá para siempre. ¡Hazlo con suavidad!

Configuración del Entorno (Arduino IDE)

Este código es pesado. Si usas la configuración estándar, Arduino te dirá que "El sketch es muy grande". Sigue estos pasos:

  1. Selecciona la placa: AI Thinker ESP32-CAM.
  2. Ve a Herramientas > Partition Scheme.
  3. Cambia "Default 4MB" por "Huge APP (3MB No OTA/1MB SPIFFS)".
  4. Esto libera espacio reservado para actualizaciones inalámbricas y se lo da a tu programa. ¡Vital!

Instalación de la Librería QR

Usaremos la librería más eficiente, creada por Alvaro Viebrantz. No está en el gestor automático, así que haremos una instalación manual rápida:

  1. Descarga la librería desde este Repositorio de GitHub (ZIP).
  2. En Arduino IDE, ve a Programa > Incluir Librería > Añadir biblioteca .ZIP.
  3. Selecciona el archivo que bajaste.

El Código del Escáner

Este código configura la cámara y utiliza el **Núcleo 1** del ESP32 exclusivamente para procesar video, dejando el Núcleo 0 libre para WiFi o Bluetooth.

#include

#include
// Definimos el modelo de cámara

ESP32QRCodeReader reader(CAMERA_MODEL_AI_THINKER);
// --- TAREA DE PROCESAMIENTO QR ---

// Esta función se ejecuta en paralelo en un núcleo dedicado

void onQrCodeTask(void *pvParameters) {

struct QRCodeData qrCodeData;
while (true) {

// Intentar leer QR con una calidad de 100 (máxima)

if (reader.receiveQrCode(&qrCodeData, 100)) {

Serial.println("✅ ¡Código QR Encontrado!");
if (qrCodeData.valid) {

// Imprimir el contenido (URL, Texto, etc.)

Serial.print("Contenido: ");

Serial.println((const char *)qrCodeData.payload);

} else {

Serial.print("❌ Inválido: ");

Serial.println((const char *)qrCodeData.payload);

}

}

// Pequeña pausa para no saturar el procesador

vTaskDelay(100 / portTICK_PERIOD_MS);

}

}
void setup() {

Serial.begin(115200);

Serial.println("\n--- Iniciando Lector QR ESP32 ---");
// Configuración inicial de la cámara

reader.setup();
Serial.println("Cámara iniciada. Arrancando tarea en Núcleo 1...");
// Iniciar el lector en el Core 1 (Multitasking)

reader.beginOnCore(1);
// Crear la tarea que procesa las imágenes

xTaskCreate(onQrCodeTask, "onQrCode", 4 * 1024, NULL, 4, NULL);

}
void loop() {

// El loop queda vacío porque todo ocurre en la tarea onQrCodeTask

// Aquí podrías poner un LED parpadeando o control de WiFi

delay(100);

}

Análisis del Código

  • reader.setup(): Inicializa el sensor OV2640. Si falla aquí, revisa que la cámara esté bien conectada en su zócalo.
  • reader.beginOnCore(1): El ESP32 tiene dos cerebros (núcleos). Aquí le decimos: "Dedícate a analizar imágenes en el Cerebro 1 sin interrupciones".
  • qrCodeData.payload: Aquí es donde se guarda el texto que estaba oculto en el QR.

Prueba y Solución de Problemas

Sube el código (recuerda presionar el botón de Reset en la placa cuando empiece a cargar si no usas la base MB). Abre el Monitor Serie a **115200 baudios**.

¿Problemas Comunes? Revisa esto:

  • Error "ECC Failure" o lecturas extrañas: Significa que la cámara ve "algo" pero no lo entiende.
    • Causa #1: Enfoque. Acerca o aleja el código QR lentamente (entre 5cm y 20cm).
    • Causa #2: Iluminación. Los QR necesitan buen contraste. Si está muy oscuro, enciende el flash del ESP32 (LED GPIO 4) añadiendo pinMode(4, OUTPUT); digitalWrite(4, HIGH); en el setup.
  • La cámara no inicia ("Camera Init Failed"): El módulo de cámara está flojo. Levanta la pestaña negra del conector FPC, reconecta la cinta naranja y cierra con firmeza.
  • La imagen se congela: Fuente de alimentación insuficiente. El WiFi y la cámara juntos consumen picos altos. Usa un buen puerto USB o una fuente de 5V 2A externa.

Conclusión

¡Lectura Exitosa! 🧾

Acabas de dotar a tu ESP32 del sentido de la vista. Ya no necesitas teclados ni botones; puedes dar órdenes a tu microcontrolador simplemente mostrándole un papel.

Tu Próximo Reto:
Ahora que puedes leer un QR con una URL (ej: http://google.com), ¿por qué no programas el ESP32 para que abra esa página web automáticamente o envíe los datos a una base de datos Google Sheets?

¡Sigue explorando el mundo de la visión artificial!

Carlos Julián

Carlos Julián es el fundador de Ingtelecto, es Ingeniero Mecatrónico, Profesor y Programador, cuenta con una Maestria en Ciencias de la Educación, creador de contenido educativo en redes sociales. Lee más sobre mi trayectoria aquí.

Estos temas te pueden interesar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tu puntuación: Útil

Subir