Descripción
Este artículo detalla como crear un panel LED, el cual se puede controlar por medio de gestos con las manos mostrados ante una pequeña cámara y procesador por un microcontrolador. El video muestra de manera general el proyecto.
Componentes
Este proyecto se construyó con las siguientes partes:
Adicionalmente, puedes requerir un cautín para soldar o un protoboard para prototipar el cableado.
Software
El proyecto tiene dos componentes principales, el software para el panel Led y el software para el procesamiento de imágenes con redes neuronales.
- WLED: Firmware que va a correr en un ESP32 o Xiao para controlar la matriz LED
- SenseCraft: Plataforma de Seeed Studio donde se pueden cargar los modelos directo al módulo de visión.
- Comunicación: Repo de GitHub con un script que va en el Xiao conectado al módulo de visión. Su tarea es controlar al módulo de visión para obtener las predicciones de las imágenes.
WLED config
Vamos a cargar al ESP32 el firmware de WLED para eso solo se tiene que hacer lo siguiente desde Chrome (Si tiene que ser Chrome, algunos exploradores con Chromium pueden presentar problemas):
- Entrar a: https://install.wled.me/
- Conectar el ESP32 a la computadora
- Dar clic en instalar
- Se abrirá una ventana donde seleccionaras el ESP32
- Esperar a la instalación
- Ingresar los datos de la red Wifi donde se conectará
- Dar clic en “Visit device”
- Guardar la IP del dispositivo
Con esto hecho ya se debería poder ingresar a la interfaz gráfica de WLED, donde se configurará la matriz led más adelante.
Conectar ESP32 a matriz LED
Se deben de realizar las siguientes conexiones para dar corriente a la matriz y conectarla al ESP32. El diagrama de conexión incluye partes adicionales, lo utilizado para este proyecto solo son las 3 conexiones del lado derecho
(ESP32) D2 —-> (Panel) DIN
(ESP32) GND—> (Panel) GND
(ESP32) VIN —> (Panel) 5 V
Cargar modelo al módulo de visión
Ya que la matriz puede ser controlada por el ESP32, lo siguiente a hacer es cargar el modelo de detección de manos al módulo de visión. Para esto debemos ingresar a SenseCraftAI una plataforma de Seeed studio que te permite subir el modelo que quieras a tu módulo. Para cargar el modelo es un proceso muy similar al de WLED:
- Conectar el módulo de la computadora
- Dar clic en “Connect” en la esquina superior derecha
- Seleccionar el puerto USB donde está conectado el módulo
- Seleccionar el modelo que quieras subir al módulo, en este caso será el de piedra papel y tijera
- Dar clic en “Send” y esperar a que se escriba el modelo
Una vez que se cargó el modelo, se puede dar clic en “Invoke” a la derecha para tener una vista previa de como funciona el modelo.
Código al Xiao
El Xiao debe tener un script para poder comunicarse con el módulo de visión. Solo se debe de descargar el script en la siguiente liga y cargarlo al Xiao ya sea desde Arduino IDE o tu plataforma de preferencia.
Antes de cargar el código deberás instalar una libreria de Seeed para poder conectarte con el módulo, la librería a instalar se encuentra en esta liga Arduino SSCMA
Los elementos de mayor importancia en el script son los siguientes:
#include <Seeed_Arduino_SSCMA.h> // Libreria de la plataforma Seeed
#include <WiFi.h>
#include <HTTPClient.h>
SSCMA AI;
...
// AI.invoke se encarga de pedirle al modulo de vision que use la imágen actual de la camara y corra una predicción
if (!AI.invoke()) {
...
//AI.perf().inference contiene la clase detectada (0,1,2)
Serial.print(AI.perf().inference);
...
// AI.boxes() contiene informacion de las coordenadas de cada deteccion
Serial.print(AI.boxes()[i].target);
Serial.print(", score=");
Serial.print(AI.boxes()[i].score);
Serial.print(", x=");
Serial.print(AI.boxes()[i].x);
Serial.print(", y=");
Serial.print(AI.boxes()[i].y);
Serial.print(", w=");
Serial.print(AI.boxes()[i].w);
Serial.print(", h=");
...
//sendWledPreset es una funcion que recibe el parametro de AI.perf().inference y lo envia al panel LED llamando a la IP del dispositivo junto con /win&PL= que es para seleccionar el preset 0,1 o 2 de WLED
void sendWledPreset(int preset) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "http://" + String(wled_ip) + "/win&PL=" + String(preset);
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String response = http.getString();
//Serial.println(httpResponseCode);
//Serial.println(response);
} else {
Serial.print("Error al enviar GET: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("No WiFi");
}
}