Todos los proyectos
en desarrollo

Micromouse Ubi Sum?

Micromouse para resolver laberintos de 16×16: chasis impreso, motores N20 económicos, encoders magnéticos de 4096 puntos de resolución/rpm y algoritmo flood fill.

El proyecto

Ubi sum? significa “¿dónde estoy?” en latín, y resume bastante bien el problema de un micromouse: no basta con avanzar, hay que saber en qué celda del laberinto estás, hacia dónde miras y qué paredes tienes alrededor.

El robot recorre un laberinto de 16×16 celdas de 18 cm, construye un mapa con las paredes que detecta, calcula la ruta más rápida (que no tiene por qué ser la más corta) hasta el centro y después la repite a la mayor velocidad que le permiten los sensores. No está pensado para competir a alto nivel pero tampoco tiene nada que envidiarles. Es una plataforma para iterar rápido y probar cambios de firmware sin rehacer el hardware cada vez.

Hardware

La base es un STM32F411CEU6 montado sobre una PCB propia de una capa. La intención de este primer modelo es utilizar módulos independientes. La alimentación viene de una LiPo 2S de 300 mAh: los motores van directos a la batería a través del driver y el resto pasa por varios módulos buck.

  • Driver: DRV8833, con PWM a 20 kHz para que no se oiga el zumbido.
  • Motores: dos N20 de 750 rpm con encoders magnéticos de dos canales.
  • Sensores de pared: cuatro GP2Y0E03, uno a cada lado y dos frontales.
  • Debug: UART RX/TX y una tira de 8 LEDs RGB Neopixel WS2812 para indicar estado sin abrir el monitor serie.

La PCB se diseñó en KiCad y se soldó a mano.

Chasis

El chasis está modelado en OnShape y ocupa 88 × 84 mm, con dos alturas: la inferior para la batería y la superior para la placa. Las paredes laterales llevan los sensores en ángulo para que lean la pared sin montarse unos sobre otros.

Las ruedas son impresas en PLA y van calzadas con una tira de neumático de goma. En las pruebas la tracción cambió mucho al pasar de PLA desnudo a goma: el robot dejó de derrapar en los giros rápidos, que era el principal problema de repetibilidad.

Firmware

El firmware está en PlatformIO con el framework de Arduino. El lazo de control corre a 1 kHz y se apoya en las interrupciones de los encoders para medir velocidad.

// Seguimiento de pared con PID sobre el error lateral
const float error = (lecturaIzquierda - lecturaDerecha) - offset;
integral += error * dt;
const float derivada = (error - errorAnterior) / dt;
const float giro = kp * error + ki * integral + kd * derivada;

const int base = 180;  // pasos por segundo
mover(base - giro, base + giro);
errorAnterior = error;

Además del PID hay dos cosas que marcan la diferencia:

  • Calibración al arrancar: el robot gira sobre sí mismo y guarda los mínimos y máximos de cada sensor contra la pared.
  • Telemetría: envía por serie el error, la velocidad y el estado del mapa, y se puede ver en vivo mientras se ajustan las constantes.

El algoritmo: flood fill

El mapa es una matriz de 16×16 celdas; cada celda guarda un bitmask con las paredes conocidas. Con el mapa parcial se lanza un flood fill desde el centro: se propaga un coste desde las celdas centrales y el robot siempre avanza hacia la vecina con menor coste.

Cuando encuentra una pared que no estaba en el mapa, actualiza la celda, recalcula y sigue. Así no hace falta explorar el laberinto entero: en cuanto la ruta al centro está libre, puede intentar el recorrido rápido.

  • Movimiento en celdas completas al explorar.
  • Giros de 90° con desaceleración y corrección por encoder.
  • En la vuelta rápida se encadenan giros y rectas, sin parar en cada celda.

Pruebas

Para no montar un laberinto completo, hice una pista modular de 4×4 celdas en DM con paredes de 5 mm. Es suficiente para probar el seguimiento de pared, los giros y el flood fill.

Lo que peor se comporta, por orden: la deriva en rectas largas (los encoders no son perfectos), el rebote en las esquinas y la lectura de los sensores cuando la luz ambiente cambia. Bajar la velocidad resolvía las tres, así que ahora toca mejorar la mecánica antes de subirla.

Próximos pasos

  • Cambiar los TCRT5000 por sensores IR modulados, o añadir dos ToF laterales.
  • Chasis v2: menos piezas, más rígido y con el centro de gravedad más bajo.
  • IMU para corregir el giro sin depender solo de los encoders.
  • Probar diagonales y el giro de 180° en la vuelta rápida.

Descargas

Archivos de este proyecto, con la misma licencia que la ficha.

Código, diseños y documentación de este proyecto: CC BY-NC-SA 4.0(se abre en una pestaña nueva).