Estado de entrega y pendientes verificados contra la guía original: Auditoría de clase.
La idea elegida es una coctelera inteligente que reconoce movimientos reales de coctelería con un sensor inercial y utiliza TinyML para identificar el gesto que está realizando el usuario.
La experiencia se inspira en la lógica de juegos de cocina paso a paso: la app indica qué hacer, la coctelera mide cómo se hizo y el sistema muestra el resultado en tiempo real.
Nombre visual provisional: MixLab — Cooking Mama, pero de cócteles.
El foco principal ya no es mover servos o relés alrededor del vaso. El dispositivo debe funcionar como un módulo autónomo de adquisición + inferencia + comunicación:
- El IMU del Arduino captura acelerómetro y giroscopio.
- El modelo TinyML reconoce el movimiento.
- La placa envía por BLE la clase y su confianza.
- La app representa la receta, el paso actual, temporizador, precisión y progreso.
- Una OLED y un RGB pueden dar feedback local básico, pero no sustituyen la interfaz de la app.
🍸 COCTELERA INSTRUMENTADA
┌────────────────────────────────────────┐
│ Arduino Nano 33 BLE │
│ IMU → modelo TinyML → clase/confianza │
│ OLED / RGB (feedback local opcional) │
│ batería interna + carga USB-C │
└──────────────────┬─────────────────────┘
│ BLE
▼
📱 APP / TABLET
┌────────────────────────────────────────┐
│ Recetas · Entrenar · Jugar · Progreso │
│ gesto actual · tiempo · confianza │
│ feedback y puntuación │
└────────────────────────────────────────┘
Dataset propio con 5 clases + reposo:
| # | Clase | Movimiento | Firma esperada del IMU | Capturada |
|---|---|---|---|---|
| 1 | agitar |
Shake de coctelera | Oscilación fuerte y periódica | ☑ 10 tomas |
| 2 | remover |
Stir con cuchara | Rotación suave y sostenida | ☑ 10 tomas |
| 3 | servir |
Inclinar para verter | Inclinación mantenida y estable | ☑ 10 tomas |
| 4 | macerar |
Golpes verticales cortos | Impactos repetidos sobre un eje dominante | ☑ 10 tomas |
| 5 | colar |
Giro/inclinación final | Cambio angular marcado y parada | ☐ falta |
| 6 | reposo |
Coctelera quieta | Varianza mínima; solo gravedad | ☑ 10 tomas |
| – | reposo_mano |
Coctelera quieta en la mano | Varianza baja con deriva de pulso |
⚠️ El dataset todavía no cumple el requisito de 5 movimientos + reposo: hay 4 movimientos capturados, faltacolar, y sobra una segunda clase de reposo. Ese y los demás hallazgos de la captura del 21-sep están endocs/pendientes-dataset.md.
El principal riesgo de clasificación sigue siendo separar agitar de macerar; se trabajará con acelerómetro + giroscopio, eje dominante, frecuencia y ventanas de aproximadamente 1–2 s.
Esta tabla no describe lo planeado: describe lo que está hoy dentro del
modelo que se carga en el Arduino (modelo_via_b.h) y lo compara con el
dataset y con la app.
| Clase | Tomas etiquetadas | En el modelo/Arduino | En la app | Recall CV de la Vía B | Estado |
|---|---|---|---|---|---|
agitar |
10 | ✅ | ✅ | 1,00 | Lista para probar en el vaso |
macerar |
10 | ✅ | ✅ | 0,97 | Lista para probar en el vaso |
remover |
10 | ✅ | ✅ | 1,00 | Entrenada, pero aporta solo 60 ventanas; sigue desbalanceada |
servir |
10 | ✅ | ✅ | 0,97 | Lista para probar en el vaso |
reposo |
10 | ✅ | ✅ | 1,00 | Clase de rechazo/reposo |
reposo_mano |
10 | ✅ | ❌ | 1,00 | El modelo la emite, pero la app no la muestra como clase conocida |
colar |
0 | ❌ | ✅ | — | Paso guiado: conserva la receta, avanza por tiempo y no se puntúa |
Conclusión de la revisión: los datos sí están marcados correctamente cuando
se usa edge-impulse/dataset/info-6clases.labels:
hay 60 archivos, 10 por cada una de las seis etiquetas entrenadas. No se debe
usar info.labels, porque convierte cada toma en una clase diferente.
El modelo exportado también está sincronizado: notebooks/via_b_int8.h y
firmware/nano33ble_mixlab_inferencia/modelo_via_b.h son copias idénticas. Su
orden real de salida es:
agitar, macerar, remover, reposo, reposo_mano, servir
Solución temporal aplicada:
colarse conserva en todas las recetas como paso guiado. Su temporizador avanza normalmente, pero no consulta la inferencia y queda fuera de la precisión, los puntos, las estrellas y la libreta. Cuando se grabe y reentrene esa clase basta marcarla nuevamente como medible. También conviene decidir sireposo_manose conserva como clase separada o se combina conreposoantes del entrenamiento final.
Al Arduino se sube un solo sketch, y el modelo viaja compilado dentro de él:
firmware/nano33ble_mixlab_inferencia/
├── nano33ble_mixlab_inferencia.ino firmware, IMU, TinyML y BLE
└── modelo_via_b.h modelo int8 + normalización + etiquetas
No se copian al Arduino los .cbor, los notebooks, la web ni el archivo
.tflite suelto. modelo_via_b.h ya contiene el .tflite convertido a un
array C, junto con MEDIA, DESV, VENTANA, N_EJES y CLASES_C.
Después de volver a entrenar el modelo:
./firmware/tools/sync_modelo.sh
arduino-cli compile -b arduino:mbed_nano:nano33ble firmware/nano33ble_mixlab_inferencia
arduino-cli board list
arduino-cli upload -b arduino:mbed_nano:nano33ble -p /dev/ttyACM0 firmware/nano33ble_mixlab_inferenciaCambia /dev/ttyACM0 por el puerto que muestre arduino-cli board list. Para
una Nano 33 BLE Rev2 también hay que seleccionar USAR_BMI270 al principio del
sketch; la revisión original usa USAR_LSM9DS1.
En el PC quedan tres cosas con funciones distintas:
| Carpeta | Se usa para | ¿Hace falta durante la demo? |
|---|---|---|
app/ |
Mostrar recetas, conectarse por BLE, recibir clase/confianza, graficar y puntuar | ✅ |
notebooks/ |
Entrenar, validar y exportar un modelo nuevo | ❌ |
edge-impulse/dataset/ |
Guardar las tomas etiquetadas con las que se entrena | ❌ |
La app no vuelve a clasificar en el PC. El Arduino ejecuta el modelo y manda el nombre de la clase y la confianza. El PC solo interpreta el resultado.
Para abrir la app localmente:
cd app
python3 -m http.server 8000Luego abre http://localhost:8000 en Chrome o Edge. localhost cuenta como
contexto seguro para Web Bluetooth; abrir index.html con doble clic no.
- Sube
nano33ble_mixlab_inferenciaal Nano 33 BLE. - Desconecta el USB y alimenta la placa con batería o power bank para la demo.
- Abre la app en Chrome o Edge y entra a Taller → Conectar → Bluetooth LE.
- Selecciona el dispositivo llamado
MixLab. - La placa arranca en modo inferencia y envía unas 2,5 predicciones por segundo.
- En Inferencia se debe ver la clase y la confianza recibidas.
El recorrido de los datos es:
IMU → ventana de 125 muestras → modelo int8 en Arduino
→ {"g":"agitar","p":0.87} por BLE
→ app en el PC/teléfono → precisión, progreso y animaciones
La conexión usa el servicio UART de Nordic. La app escribe i para inferencia,
s para señal cruda, p para pausar y r para reanudar. Si llegan líneas
D,... pero no cambia el medidor, la placa está en modo señal cruda: vuelve a
Modo inferencia.
La interfaz se plantea como una experiencia lúdica de aprendizaje de coctelería:
- Recetas: elegir el cóctel y ver los pasos.
- Entrenar gestos: practicar cada movimiento de forma individual.
- Jugar: completar la receta en secuencia y recibir puntuación.
- Progreso: historial, precisión y mejores resultados.
- Modo en vivo: gesto solicitado, temporizador, confianza del modelo y estrellas/puntuación.
La idea es que una tablet pueda mostrar el menú general mientras un teléfono muestra el paso activo durante la preparación.
El módulo se monta en un costado de la coctelera mediante abrazaderas o velcro, sin perforar el recipiente.
| Componente | Rol |
|---|---|
| Arduino Nano 33 BLE / Rev2 | Procesamiento, IMU, TinyML y BLE |
| OLED SSD1306 0.96" I²C | Feedback local opcional |
| WS2812B RGB | Estado de conexión/captura opcional |
| LiPo 3.7 V ~1000 mAh | Alimentación autónoma |
| TP4056 USB-C con protección | Recarga de la batería |
| MT3608 Step-Up | Conversión de tensión |
| Interruptor ON/OFF | Encendido físico |
| Conector JST | Batería desmontable |
| Carcasa 3D + abrazaderas | Protección y fijación lateral |
| Cableado/conectores | Integración del prototipo |
👉 Presupuesto detallado y enlaces de compra: docs/materiales.md
- Todo desde cero: ~$337.951 COP
- Reutilizando el Nano 33 BLE del grupo: ~$177.469 COP
- MVP mínimo sin OLED ni RGB, reutilizando Arduino: ~$133.569 COP
- MVP mínimo + margen: ~$158.569 COP
Los precios son aproximados y pueden cambiar en Mercado Libre.
La guía actualmente guardada en docs/requisitos.md indica un actuador distinto por clase y que los LEDs no cuentan. La arquitectura seleccionada está centrada en captura, inferencia y representación en la app, así que este punto debe confirmarse antes de eliminar formalmente los actuadores del alcance evaluable.
Lo mismo aplica al comodín de la app móvil: si la app cuenta como parte obligatoria del MVP, se consumiría aquí.
Dos piezas, hechas para encajar: hablan el mismo protocolo de línea, así que se puede cambiar de placa o de transporte sin tocar la otra mitad.
app/ — webapp de captura
Sin build ni dependencias. Cuatro formas de conectar:
| Transporte | Para qué |
|---|---|
| Bluetooth LE | Nano 33 BLE o Uno + HM-10. El camino de la demo. |
| WiFi | WebSocket desde un Uno R4 WiFi o un ESP32. |
| Serial USB | Solo desarrollo — la entrega prohíbe el cable. |
| Simulador | Las seis clases sintéticas: se puede mostrar el flujo sin hardware. |
La interfaz es un bar de autor dentro de una consola de doble pantalla:
arriba el escaparate con el gesto que toca y el cronómetro, abajo la barra
táctil con la carta. Cinco cócteles, entrenamiento de gestos sueltos, puntuación
con estrellas y una libreta que señala en qué gesto flojeas. La app no clasifica
nada: el modelo corre en el Arduino y aquí solo se juzga lo que llega en las
líneas I,<clase>,<confianza>.
Detrás está el Taller: gráficas en vivo de acelerómetro y giroscopio con
frecuencia real medida, grabador de tomas etiquetadas con cuenta atrás y
balance por clase, y exportación a CSV y al JSON de adquisición de Edge
Impulse (en .zip cuando hay varias tomas). El nombre de archivo empieza por
la clase porque es de ahí de donde Edge Impulse saca la etiqueta.
⚠️ Web Bluetooth y Web Serial solo corren en contexto seguro (https://olocalhost). Y una página HTTPS no puede abrir unws://sin cifrar: el camino WiFi va por HTTP local. La app avisa de las dos cosas sola.
firmware/ — sketches
| Sketch | Placa | Enlace |
|---|---|---|
nano33ble_imu_ble |
Nano 33 BLE / Rev2 | BLE (UART de Nordic) |
uno_mpu6050_hm10_ble |
Uno + MPU6050 + HM-10 | BLE |
uno_r4_wifi_imu |
Uno R4 WiFi + MPU6050 | WebSocket en :81 |
Protocolo, una línea por evento:
D,<t_ms>,<ax>,<ay>,<az>,<gx>,<gy>,<gz> muestra (g y °/s)
I,<clase>,<confianza> inferencia (0..1)
H,<placa>,<hz> saludo al conectar
- Un Arduino Uno R3 no puede ser el corazón del proyecto. No tiene IMU, ni BLE, ni WiFi, y con 2 KB de RAM sin FPU el clasificador no le cabe. Sirve para capturar dataset; la inferencia a bordo necesita el Nano 33 BLE. El Uno R4 WiFi tiene músculo pero tampoco trae IMU.
- Un HC-05 no sirve para la app. Habla Bluetooth Classic (SPP) y ningún navegador puede abrir SPP — Web Bluetooth solo habla BLE. El módulo BLE equivalente es el HM-10 (o HM-19 / AT-09 / CC2541).
Detalle completo en firmware/README.md y
app/README.md.
Captura IMU
↓
Dataset propio — 3 integrantes
↓
Edge Impulse
↓
Procesamiento / features
↓
Clasificador TinyML
↓
Arduino Nano 33 BLE
↓
clase + confianza
↓ BLE
App móvil / tablet
El proyecto de Edge Impulse debe quedar público y su enlace irá tanto en este repositorio como en el paper IEEE.
La primera captura (21-sep, 60 tomas del Nano 33 BLE a 62,5 Hz) ya está en
edge-impulse/dataset/. Antes de entrenar hay que leer
docs/pendientes-dataset.md: el export llegó con las
etiquetas rotas y le falta una clase.
La investigación previa está en research/estado-del-arte.md. Los antecedentes encontrados indican que gestos como servir, agitar y remover son reconocibles mediante IMU, pero hay mucho menos trabajo en un tutor embebido de coctelería completo, que es donde está el aporte del proyecto.
- Dataset propio con sensor inercial.
- 5 clases de movimiento +
reposo. - Entrenamiento en Edge Impulse.
- Sistema autónomo: sin depender del PC para energía o ejecución.
- MVP funcional.
- Paper en formato IEEE.
- Código fuente.
- Sustentación ≤15 min.
- Validar con el profesor el requisito de actuadores y el uso del comodín de app.
📁 app/ Webapp de captura, visualizacion e inferencia
📁 firmware/ Sketches de Arduino (BLE, WiFi, Serial)
📁 edge-impulse/ Dataset exportado + pendientes antes de entrenar
📁 docs/ Requisitos + materiales y presupuesto
📁 ideas/ Propuestas originales + diseño ganador
📁 research/ Estado del arte y referencias
📁 decision/ Matriz y decisión del grupo
📁 assets/ Banner y diagramas del proyecto
