Construya un Micromouse: robot para laberintos con Flood Fill
Un robot que explora un laberinto con paredes, genera su mapa interno y ejecuta la ruta óptima de inicio a centro a máxima velocidad y sin colisiones.
Qué va a construir
Un robot al que se suelta en un laberinto que nunca ha visto, encuentra el centro y luego vuelve por la ruta más corta que puede demostrar que existe.
Esa segunda mitad es lo que distingue a un micromouse de cualquier otro robot de este sitio. Un seguidor de línea reacciona. Un esquivador de obstáculos reacciona. Un micromouse recuerda: construye un mapa mientras se mueve y luego planifica sobre celdas que no ha visitado. Es el problema de robótica completo más pequeño que hay: percepción, movimiento, mapeo y planificación, y todo tiene que funcionar a la vez.
La estrategia de dos pasadas
Los ratones de competición hacen varias pasadas y se puntúa la más rápida. Eso produce una estrategia que merece la pena copiar aunque nadie te esté cronometrando:
Pasada uno: explorar. Conduce con cuidado, registra qué celdas tienen qué paredes y llega al centro. La velocidad es irrelevante; el producto es el mapa.
Pasada dos: explotar. Haz un flood fill del mapa terminado, calcula la ruta más corta y recórrela sin parar a sensorear nada que ya sepas.
La división importa porque las dos pasadas quieren cosas opuestas. Explorar quiere movimiento lento y cauto y percepción constante. La pasada de velocidad quiere compromiso. Intentar hacer las dos a la vez produce un robot que se da mal en cada una.
Por qué el algoritmo no es la parte difícil
El flood fill es realmente simple: dale a la celda meta la distancia 0, dale a cada vecina 1 más que la menor vecina que puede alcanzar, y luego avanza siempre a un número menor. Son unas decenas de líneas y es demostrablemente el camino más corto en una rejilla.
La parte difícil es que da por supuesto que el robot sabe en qué celda está.
Cuentes mal una celda, o gires 88° en vez de 90° unas cuantas veces, y el planificador estará resolviendo el laberinto para un robot que está en otro sitio. El síntoma es desconcertante: el algoritmo es perfecto, el cableado está bien, y el robot se mete con confianza en una pared.
Así que el orden de construcción de abajo dedica la mayor parte de su esfuerzo al movimiento y añade el planificador al final. Puedes demostrar el planificador por separado en el simulador de resolución de laberintos, donde la posición es exacta por construcción —y precisamente por eso vale la pena simularlo primero.
Lista de materiales
| Componente | Cant. | Coste aprox. | Notas |
|---|---|---|---|
| Arduino Uno o Nano | 1 | $5 | Justo de RAM: un laberinto 16×16 pide cuidado. Un Mega o un ESP32 te quita el problema |
| VL53L0X | 3 | $15 | Izquierda, frente, derecha. Tres, no una: mira abajo |
| MPU-6050 | 1 | $2 | Rumbo en los giros; las ruedas raspan justo cuando más importa |
| Motores N20 con encoder | 2 | $16 | 1:50 o 1:100. El reductor metálico es imprescindible: el backlash se acumula en cada giro |
| TB6612FNG | 1 | $3 | |
| Chasis 2WD | 1 | $10 | Tiene que caber en una celda con holgura: unos 90 mm de ancho |
| Pack de baterías | 1 | $8 | 2×18650 |
| Paredes del laberinto | — | $10–30 | Cartón pluma o contrachapado. Las celdas estándar son de 180 mm con paredes de 50 mm |
Total: unos $70–95, más el laberinto.
Tres sensores de distancia, no uno. Un único sensor frontal obliga al robot a girar para mirar, y eso cuesta tiempo y —mucho peor— introduce error de rumbo en cada observación. Tres sensores fijos permiten leer las tres paredes de una celda en un instante, sin moverse. Esta es la diferencia entre un ratón que mapea de forma fiable y uno que acumula error cada vez que comprueba una pared.
Recuerda que los tres sensores VL53L0X arrancan en la dirección 0x29, así que necesitas tres
GPIO en XSHUT para levantarlos de uno en uno y reasignar direcciones —y hay que repetirlo en
cada arranque, porque el cambio es volátil.
Vigila la RAM. Un campo de distancias de flood fill para 16×16 guardado como uint8_t son
256 bytes, más el mapa de paredes, más una cola. En los 2 KB de un Uno eso cabe, pero solo si
eres deliberado al respecto —lo cual ya es un buen ejercicio, y una razón por la que mucha gente
se pasa al ESP32 aquí.
Orden de construcción
1 — Consigue tres lecturas de distancia limpias. Frente, izquierda y derecha, con sensores de tiempo de vuelo VL53L0X. Comparten un bus I²C y arrancan en la misma dirección, así que levántalos de uno en uno manteniendo los otros en reset y reasignando direcciones al arrancar. Confirma que cada uno lee una pared a una distancia conocida antes de montar nada.
2 — Consigue que conduzca recto y gire a escuadra. Este es el proyecto real. Sigue seguimiento de pared y giros precisos: un lazo PID sobre los sensores laterales para mantenerse centrado, giros con giróscopo integrado en vez de contar encoders, y re-escuadrar contra una pared frontal siempre que haya una disponible. No avances hasta que el robot pueda hacer diez giros y siga mirando en la dirección correcta.
3 — Cuenta celdas de forma fiable. Los encoders predicen dónde debería estar una frontera; el flanco de bajada de una pared lateral confirma dónde está de verdad. Cuando discrepen, cree a la pared: es una referencia física, no una estimación acumulada.
4 — Registra las paredes en un mapa. Dos bits por celda para cuatro paredes, y un laberinto 16 × 16 cabe en unos cientos de bytes. Registra lo que ves según lo ves.
5 — Añade el flood fill. Ahora el planificador tiene datos honestos. Recalcula las distancias cada vez que una pared recién descubierta invalide el plan actual: esa replanificación es la razón completa de usar flood fill en vez de una búsqueda de una sola pasada.
Notas de hardware que importan
Pequeño gana a rápido. El robot tiene que girar dentro de una celda. Un chasis ceñido con las ruedas cerca del centro de rotación pivota limpio; uno largo roza las paredes en cada giro, y ningún ajuste arregla la geometría.
El backlash es error de rumbo. Cada giro sobre el sitio invierte los motores, y un reductor flojo pierde los primeros pocos grados: unos 0.9° de rumbo en una rueda de 42 mm por 4° de juego. Los motores N20 con reductor metálico existen justo por eso.
Monta los sensores laterales algo adelantados y angulados. Apuntarlos de frente significa que solo ven una pared cuando están exactamente a su lado, así que el robot se entera de la pared tarde. Un pequeño ángulo hacia delante le da al lazo de control un adelanto.
Dale a los sensores una alimentación estable. Un VL53L0X devuelve números plausibles pero equivocados en un raíl que se hunde en vez de fallar de forma evidente —el peor tipo de fallo, porque el mapa se llena de paredes que no están.
Qué significa hacerlo bien
| Medida | Primer ratón que funciona | Bien ajustado |
|---|---|---|
| Velocidad de exploración | 0.2–0.3 m/s | 0.3–0.5 m/s |
| Pasada de velocidad | 0.4–0.6 m/s | 1.0–2.0 m/s |
| Error de centrado tras 10 celdas | 10–20 mm | Menos de 5 mm |
| Error de rumbo tras 10 giros | 8–15° | Menos de 3° |
| Precisión de detección de paredes | Tiene que ser del 100 % | 100 % |
| Exploración completa de 16×16 | 3–6 minutos | 1–2 minutos |
Dos de esas filas merecen énfasis.
La detección de paredes no tiene crédito parcial. Una pared registrada mal corrompe el mapa, el flood fill calcula entonces una ruta segura a través de una pared, y la pasada de velocidad se mete de frente en ella. No hay degradación suave, y por eso la pasada de exploración va lenta.
Las filas de deriva son el proyecto real. El algoritmo no es la parte difícil: el flood fill son unas cuarenta líneas y puedes probarlo entero en el simulador sin hardware alguno. La parte difícil es que tras diez celdas el robot ya no está donde cree que está, y un ratón que deriva 20 mm cada diez celdas estará tocando una pared al llegar al lado opuesto del laberinto. Todo lo que hace que un micromouse real funcione —corrección por seguimiento de pared, giros con giróscopo fusionado, calibración de encoders— existe para luchar contra ese único número.
Cuando va mal
| Síntoma | Causa habitual |
|---|---|
| Se mete con confianza en una pared | El conteo de celdas falla: es posición, no planificación |
| Acaba en diagonal tras varios giros | No se ha restado el sesgo del giróscopo, o los giros no se re-escuadran |
| Se ladea hacia aberturas laterales | Falta la comprobación de presencia de pared en el lazo de seguimiento |
| Mapea paredes que no existen | Alimentación de sensores que se hunde, o diafonía entre módulos |
| Lo resuelve lento y se estrella rápido | La pasada de velocidad es demasiado rápida para la capa de movimiento: frenala y luego súbela |
Casi todas las entradas de esa tabla son fallos de movimiento o percepción y no del algoritmo. Esa distribución es lo más útil que conviene saber antes de empezar, porque te dice en qué gastar tus fines de semana.
Si quieres las ideas de mapeo y planificación sin el hardware, el simulador de resolución de laberintos ejecuta la misma estrategia de dos fases en el navegador, y la ruta de planificación de caminos y mapeo la lleva hacia A* y SLAM. Para un primer robot de laberinto mucho más barato, el solucionador de laberintos sobre línea usa cinta en vez de paredes y no necesita ningún sensor de distancia.
Hoja de ruta del proyecto
La ruta de construcción
Sigue el árbol tecnológico desde las piezas hasta un robot que funciona. Cada nodo se desbloquea cuando completas sus requisitos previos, y tu progreso se guarda en este dispositivo.
0 / 16 completados
Componentes
- ControladorArduino UnoLa tolerante placa de 8 bits con la que la mayoría descubre la robótica.
- SensorVL53L0X Time-of-Flight SensorMedición de distancia por láser invisible y tiempo de vuelo auténtico hasta 2 metros.
- SensorMPU6050 IMUEl sensor inercial de 6 DOF para medir inclinación, balanceo y orientación angular en robots.
- ActuadorN20 Micro Gearmotor with EncoderMicromotor con reductora metálica y encoder trasero, para que el robot sepa cuánto ha avanzado realmente.
- DriverTB6612FNG Motor DriverPuente en H dual con tecnología MOSFET: alta eficiencia y tamaño ultracompacto para robots móviles.
- Chasis2WD Robot ChassisLa plataforma donde se atornillan dos motores, una rueda loca y toda tu electrónica.
- AlimentaciónBattery Power PackLa fuente de energía determinante: por qué la química y la resistencia interna importan más que los voltios.
Tutoriales de esta ruta
- Intermedio · 1.5 horasSeguimiento de paredes y giros precisos para robots en laberintosMantente centrado entre paredes y gira exactamente 90°: las dos habilidades de las que depende la vida de un robot en laberintos.
- Intermedio · 16 min de lecturaResolucion de laberintos por flood fill para robots micromouseComo el flood fill convierte un laberinto parcialmente conocido en un campo de distancias que el robot desciende hasta la meta.
- Principiante · 17 min de lecturaLeer codificadores en cuadratura para distancia y velocidadConvierte los pulsos de un codificador en cuadratura en direccion, distancia y velocidad de rueda fiables.
- Principiante · 18 min de lecturaSensores ultrasónicos frente a tiempo de vuelo (ToF) en robóticaElige, monta, calibra y prueba sensores ultrasónicos o de tiempo de vuelo para la detección fiable de obstáculos.
- Intermedio · 20 min de lecturaOdometria diferencial con codificadores de ruedaIntegra el movimiento de las ruedas izquierda y derecha en la pose de un robot movil y despues identifica y calibra la deriva.
Practica antes de cablear
Ajústalo en el simulador en vivo
La ruta de construcción pasa por un laboratorio en el navegador. Consigue aquí el comportamiento correcto y luego traslada tus ajustes al robot real.
Preguntas frecuentes
¿Qué es un robot Micromouse?
Un robot móvil autónomo de pequeñas dimensiones diseñado para resolver un laberinto de paredes verticales en el menor tiempo posible, siendo la competición de robótica más antigua del mundo. El laberinto reglamentario estándar consta de 16×16 celdas de 18 cm de lado con la meta en el centro. El robot no dispone de un mapa previo: debe explorar el recinto, cartografiar sus muros en memoria y ejecutar la carrera rápida más veloz posible combinando percepción, odometría y planificación.
¿Por qué emplear sensores láser ToF en lugar de sensores ultrasónicos?
Por tres limitaciones acústicas severas en pasillos estrechos: el cono de un sensor ultrasónico abre unos 15°, por lo que dentro de una celda de 18 cm rebota contra las paredes laterales falseando la distancia frontal; varios transductores acústicos sufren interferencias cruzadas al captar los pulsos del vecino; y la velocidad del sonido exige decenas de milisegundos por lectura, ralentizando el lazo de control. El sensor láser VL53L0X emite un haz infrarrojo colimado milimétrico que no interfiere y entrega lecturas precisas en 20 ms.
¿Es indispensable un giróscopo si ya se cuenta con encoders en las ruedas?
En un laberinto es imperativo. Los encoders miden la rotación de los ejes motrices, no la orientación del chasis: en cada viraje sobre el sitio las ruedas sufren un microdeslizamiento inevitable. Un error residual de 2° en un giro resulta imperceptible de forma aislada, pero tras diez esquinas desvía el chasis 20°, provocando colisiones directas contra las esquinas. La IMU mide la rotación inercial absoluta asegurando que los giros sean rigurosamente ortogonales a 90°.
¿Qué diferencia este desarrollo del solucionador de laberintos sobre cinta?
El entorno físico y el algoritmo de navegación. El laberinto sobre cinta es bidimensional, usa fotosensores dirigidos al suelo y resuelve la ruta mediante la regla de la mano izquierda y reducción de cadenas LSRB. El Micromouse se enfrenta a paredes tridimensionales con sensores de distancia y debe construir un mapa topológico matricial completo en memoria RAM sobre el cual planifica mediante el algoritmo Flood Fill (campos de potenciales de distancia).
¿Por qué el robot resuelve el laberinto en exploración pero colisiona en la carrera rápida?
Porque una mayor velocidad altera la física del contacto: mayor deslizamiento de rueda, mayor distancia de frenado y menor margen temporal para que el lazo de centrado lateral corrija desviaciones. La solución pasa por verificar la repetibilidad del lazo cinemático y aprovechar los muros frontales para 'reescuadrar' el chasis físicamente (contactando suavemente contra la pared) para resetear el error acumulado a cero.
¿Es posible construir un Micromouse con Arduino Uno?
Como primer prototipo didáctico es perfectamente viable. El microcontrolador ATmega328P puede gestionar tres sensores VL53L0X e IMU por I²C y almacenar el mapa de 16×16 celdas en memoria RAM empleando 2 bits por casilla (64 bytes). No obstante, para competir a nivel internacional se emplean microcontroladores de 32 bits (como ARM Cortex-M o ESP32) que ejecutan lazos de velocidad a frecuencias de varios kilohercios.