2. Reconocimiento de gestos para apertura de casilleros
En la segunda mitad de 2024 tuve una de las asignaturas más importantes de mi carrera, Proyecto de Desarrollo de Software.
En esta tuvimos 3 proyectos, uno individual enfocado a lógica y programación tradicional, otro enfocado en aplicaciones web, y el último de sistemas embebidos y web.
Este último fue, por lejos, el más difícil, complejo y largo de los 3. Para ello, tuve que hacer grupo con 2 compañeros desconocidos, pero trabajaban realmente bien, en particular uno que manejaba muy bien todo lo relacionado con web y conexión con Django, cosa que yo y mi otro compañero no dominábamos.
Índice
2.1 Sobre el proyecto (enunciado)
El propósito del proyecto era evaluar el nivel de cumplimiento de múltiples requisitos de software y hardware. El proyecto consistía en realizar un sistema en línea de usuarios con casilleros asignados en la universidad.
-
•
Cada usuario tendría una clave para su casillero.
-
•
Cada casillero tendría un administrador.
-
•
Los casilleros se dividirían en bloques de 4.
-
•
La clave podía tener hasta 4 dígitos.
Sin embargo, el desafío estaba en que la lectura, inscripción y detección de los dígitos de cada casillero se realizaría sin conexión a un PC, y usando señales de manos.
Así es, utilizando inteligencia artificial u otras estrategias para leer los símbolos hechos con las manos frente a una cámara, con el fin de identificar qué dígito se ingresa y si es correcto o no.
El otro desafío era que si se cambiaba la clave de un casillero, ya fuera por el usuario o el administrador, la nueva clave debía verse reflejada en vivo y en directo, con un máximo de 5 minutos de delay (aunque en la presentación final no hubo delay, porque cada grupo tenía 5 minutos para montar y 5 para presentar). Además, se podría cambiar los gestos a usar a partir de modelos de IA proporcionados por el administrador de la página, de tal manera que TODOS los casilleros tendrían ese conjunto de dígitos especificado en el modelo de IA cargado (uno por defecto, otro para prueba).
2.2 Sobre el proyecto (el que nosotros desarrollamos)
Lo primero del proyecto fue definir cómo realizaríamos todo. Con mi grupo, definimos un prototipo básico, con LEDs indicadores del número de casillero y la clave a ingresar, además de varios botones para un manejo simple.

Esquema conceptual sobre el proyecto
La idea era tener un botón de inicio, con el cual se pregunta cuál de los 4 casilleros elegir. Luego, se debía presionar el botón correspondiente del 1 al 4 para indicar cuál se elegiría.
Una vez elegido, sonaría un BEEP de un altavoz y empezaría la lectura de la cámara. Cada vez que se leyera un dígito, se prendería un LED a la altura de los ojos, indicando en cuál dígito de los 4 de la clave se está leyendo.

Gestos con las manos para el proyecto (Version 1)
Una vez leídos todos, si la clave es correcta, una luz en el dispositivo que abre los casilleros (un servo motor) se encendería.
Si es incorrecto, sonaría un BEEP y no abriría los casilleros. Una vez abierto, se debe presionar el botón de inicio para cerrar el casillero.
Para la apertura y cierre de casilleros, es sólo en la cerradura, la cual tiene un ángulo de 90 grados. Para unir el motor a la cerradura, se usó cinta de doble contacto y silicona líquida.

Distribución de casilleros y pruebas
2.3 Desarrollo inicial
Lo segundo del proyecto fue realizar el prototipo inicial, básicamente una caja con los componentes descritos, haciendo uso de un ESP32 Controller y ESP32 Cam, y unir todo para tener una lectura de imagen transmitida por USB a un computador en el monitor del ESP32.
El prototipo debía tener 2 motores instalados y el modelo de IA para leer los dígitos. De momento no era necesario que la clave fuese modificable, ni que la instalación de los motores fuese capaz de abrir los casilleros, pero el modelo debía tener la precisión para poder hacer girar los motores al menos una vez y con todo lo especificado de las luces, botones, speaker, etc.

Prototipo inicial
Lo tercero, siendo la parte más exigente e importante, fue tener el prototipo inicial anterior, pero conectado con la web, hacer la aplicación, todo el sistema de usuarios, la conexión con el ESP32 y mantener el funcionamiento anterior.
Esta vez sí debían poderse cambiar las claves y los motores debían ser capaces de abrir el casillero.
Prácticamente pedían tenerlo todo listo, lo que faltaba era poder manejar los 4 casilleros, no depender de conexión a un PC (sólo a internet) y el cambio de modelo aplicable a todos los casilleros (es decir, a todos los ESP32, porque para tener 4 casilleros al mismo tiempo, se necesitaban 2 ESP32 Controller y Cam, ambos sincronizados con la página web).

Página web del proyecto (en celular)
Esto fue principalmente hecho por mi compañero que conocía de Django, pues se usó eso, un broker que transmitía la información desde el ESP32 a un servidor con mensajes UART y a través de un sistema de sockets, lo enviado por el broker era recibido por el ESP32 Controller y enviado al ESP32 Cam. O bueno, esa era la idea.
2.4 Desarrollo avanzado
Fue muy difícil hacer todo, pero al final se cumplió, aunque para la última entrega (que era la que tenía más peso, aproximadamente un 50%), no teníamos idea de cómo lograríamos lo del cambio del modelo, pues nuestro método consistía en que el ESP32 Cam se quedaba esperando a la señal del controller para tomar fotos.
Las fotos las enviaba al controller para que allí procesara la lógica de apertura de casilleros y con ello, las claves actualizadas. Pero el modelo de IA estaba en el ESP32 Cam, es decir, la que siempre estaba en ejecución, la única forma de cambiar el modelo sería enviando el modelo por bloques de mensajes UART, pero eso haría muy ineficiente la captura de fotos y el proceso, principalmente porque, aunque lo intentamos, al parecer el ESP32 Cam sólo reconocía el modelo ingresado como un archivo interno en su memoria, y no el que se ingresaba de forma dinámica.

Entrenamiento del modelo de inteligencia artificial

Desempeño temprano del modelo de inteligencia artificial
Pero bueno, eso es más que nada para la última entrega. Para la tercera sí cumplimos con casi todo, la apertura de casillero funcionó, el modelo estaba en su versión definitiva, pues decidimos estandarizar el ambiente desde el cual se toman las fotos, ya que en vez de ser sobre un fondo y distancia o luz variables, se hizo una estructura alrededor de la mano donde se usa el Flash del ESP32 y se mejora la nitidez y contraste de la imagen.

Prototipo final para el proyecto
Aún así, para mejorar la lectura, se tomaban 5 fotos para cada dígito, cosa que hacía que para abrir el casillero hubiese que estar como 1 minuto con la mano en alto, pero funcionaba.

Prototipo final para el proyecto (Por fuera)
2.4 Entrega
Finalmente, la entrega final fue un estrés horrible, principalmente porque en el intento de poner los 2 controller y hacer el cambio de modelo dinámico, el resultado final fue que, por algún motivo, la página web dejó de funcionar correctamente. Y cómo ahora todo debía depender de la web a distancia y no conectado al PC, la verdad es que no logramos hacer que las cosas funcionaran en lo más mínimo.
Sin embargo, teníamos todo lo que se pedía, sólo faltaba el funcionamiento en sí: La apertura de casilleros, lectura de dígitos, precisión del modelo, página web, cambio de claves, cambio de modelo, etc.
Estaba en esencia, pero cuando intentabas probarlo, nos falló la conexión con la página y el ESP32. Principalmente por los mensajes que se enviaban.
Nos faltó tiempo para corregirlo, y era muy frustrante, porque en la entrega anterior sí funcionaba, incluso cuando revertimos los cambios, seguía sin funcionar. Pero había muchos otros aspectos que sí funcionaban, y gracias a que se acordaron de mi grupo y que anteriormente todo funcionó bien, se nos perdonó mucho y nos fue muy bien al final, digo, para lo estresados que estábamos.

Día final (con 3 horas de sueño encima xD)
No sé si decir que es un orgullo, pero al final fuimos de los mejores y realmente hicimos un buen trabajo, es sólo que al final las cosas se complicaron, principalmente por dedicar mucho tiempo a hacer otro prototipo funcional, ya que debíamos tener 2 instalaciones de ESP Controller y Cam. Pero nada, esa fue la experiencia...
Un proyecto difícil en toda regla, donde usamos conocimientos de electrónica, IA, programación de lógica, de sistemas embebidos, de aplicaciones web, conexiones entre servidores y, obviamente, ingeniería para adaptarnos a las condiciones y requisitos.