Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth

Componentes y materiales

Componente Cantidad
Arduino Nano R3 1
Módulo Bluetooth HC-06 1
Sensor de seguimiento de línea TCRT5000 4CH 1
Sensor de línea SparkFun RedBot 1
Sensores infrarrojos reflectivos ZX03 (basados en TCRT5000, salida analógica) 2
Dispositivo Android 1
Servo de rotación continua RobotGeek 2
Portapilas 4xAA 2

Aplicaciones y servicios en línea

Sobre el proyecto

Introducción

Este tutorial se basa en mi proyecto anterior: Robot Seguidor de Línea - Control PID - Configuración Android. Una vez que tienes un robot con capacidad de seguimiento de línea, el siguiente paso natural es darle cierto grado de inteligencia. Nuestro querido "Rex, el Robot" intentará ahora encontrar la forma de escapar de un "laberinto" por el camino más corto y rápido (por cierto, odia al Minotauro).

Diferencia entre Laberinto y Maze: Según labyrinthos.net, en el mundo anglosajón se considera que un maze (laberinto con opciones) debe tener elecciones en el camino, mientras que un labyrinth (laberinto unicursal) tiene un único camino que conduce inexorablemente de la entrada a la meta. La mayoría de los mazes complejos se forman esencialmente a partir de una pared continua con muchas uniones y ramificaciones. Si la pared que rodea la meta está conectada al perímetro en la entrada, el maze siempre puede resolverse manteniendo una mano en contacto con la pared. Estos se llaman "simply-connected" o "perfect maze" (sin bucles).

El proyecto se divide en dos pasos (o "passes"):

  • Primer Paso: El robot encuentra la salida de un "perfect maze no conocido". No importa dónde lo coloques, hallará una "solución".
  • Segundo Paso: Una vez encontrada una solución, la optimiza hallando el "camino más corto de inicio a fin".

En el primer recorrido, el robot pierde tiempo "pensando" en cada intersección, probando caminos equivocados y callejones sin salida, acumulando experiencia. En el segundo paso, va directo y rápido al final sin errores.

Paso 1: Lista de Materiales (Bill of Materials)

Básicamente la misma lista del Robot Seguidor de Línea, añadiendo 2 sensores extra para mejor detección de intersecciones IZQUIERDA y DERECHA. Coste total aprox. $85.

  • Cuerpo: 2 cuadrados de madera (80x80mm), 3 clips de carpeta, 2 ruedas de madera (50mm), 1 rueda loca (ball caster), 9 gomas elásticas, tira 3M Command, uniones plásticas para sensores, protoboard y cableado
  • 2 sets de 4 pilas Ni-MH (5V cada set)
  • 2 Servos SM-S4303R de rotación continua 360°
  • Arduino Nano
  • Módulo Bluetooth HC-06
  • 5 Sensores de línea (módulo TCRT5000 4CH + 1 sensor independiente)
  • 2 Sensores ZX03 (salida analógica)
  • 1 LED, 1 botón

Nota: Usé sensores analógicos por no tener digitales a mano. Lo ideal es que todos sean iguales. Funciona con solo los 5 originales, pero requiere ajustes más finos.

Paso 2: Cambios en el Cuerpo

Retira el conjunto original de 5 sensores y fija los nuevos sensores "Far LEFT" y "Far RIGHT" en cada extremo de la barra soporte. Procura alinear los 7 sensores lo mejor posible.

Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth

Paso 3: Instalación y prueba de los nuevos sensores

El nuevo array de 7 sensores se monta de forma que los 5 originales se usan exclusivamente para control PID (y detección de "línea continua") y los 2 nuevos exclusivamente para detección de intersecciones IZQUIERDA y DERECHA.

Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth

Funcionamiento de los 5 sensores digitales originales: Si uno está centrado sobre la línea negra, solo ese da HIGH. El espaciado permite que 2 sensores cubran el ancho completo simultáneamente.

Funcionamiento de los 2 nuevos sensores analógicos: Centrados sobre la línea negra dan valor ADC bajo (<100). En superficies claras dan valores altos (500-600). Debe definirse un THRESHOLD adecuado tras pruebas.

Definición de pines en el código:

const int lineFollowSensor0 = 12; // Entrada digital
const int lineFollowSensor1 = 18; // Pin analógico A4 como digital
const int lineFollowSensor2 = 17; // Pin analógico A3 como digital
const int lineFollowSensor3 = 16; // Pin analógico A2 como digital
const int lineFollowSensor4 = 19; // Pin analógico A5 como digital
const int farRightSensorPin = 0;  // Pin analógico A0
const int farLeftSensorPin  = 1;  // Pin analógico A1

Lógica de detección de intersecciones (modo y error) implementada en readLFSsensors(). Incluye función de prueba testSensorLogic() para depuración por puerto serie.

Paso 4: Resolviendo el Laberinto - La Regla de la Mano Izquierda

Como se discutió, la mayoría de mazes pueden resolverse manteniendo la mano izquierda en la pared. La regla:

  1. Pon tu mano izquierda en la pared.
  2. Camina hacia adelante.
  3. Eventualmente llegarás al final (no necesariamente por el camino más corto).
Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth

Se identifican 8 tipos de intersecciones. Aplicando la Regla de la Mano Izquierda, las acciones se reducen a una por tipo:

  • Cruce (Cross): Girar IZQUIERDA
  • T: Girar IZQUIERDA
  • Solo Derecha: Girar DERECHA
  • Solo Izquierda: Girar IZQUIERDA
  • Recto o Izquierda: Girar IZQUIERDA
  • Recto o Derecha: Seguir RECTO
  • Callejón sin salida (Dead End): Media vuelta (U-turn)
  • Fin del Laberinto: PARAR

El reto está en distinguir intersecciones ambiguas (ej. una línea puede ser Cruce o T). Solución: el robot avanza un "pulgada extra" (runExtraInch) para ver qué hay después.

Paso 5: Implementando el Algoritmo "Mano Izquierda en la Pared" en Arduino

Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth
void loop() {
  readLFSsensors();
  switch (mode) {
    case NO_LINE:
      motorStop();
      goAndTurn(LEFT, 180);
      break;
    case CONT_LINE:
      runExtraInch();
      readLFSsensors();
      if (mode == CONT_LINE) mazeEnd();
      else goAndTurn(LEFT, 90); // T o Cross -> Izquierda
      break;
    case RIGHT_TURN:
      runExtraInch();
      readLFSsensors();
      if (mode == NO_LINE) goAndTurn(RIGHT, 90);
      break;
    case LEFT_TURN:
      goAndTurn(LEFT, 90);
      break;
    case FOLLOWING_LINE:
      followingLine();
      break;
  }
}

Funciones clave:

  • followingLine(): Control PID estándar (calculatePID() + motorPIDcontrol()).
  • runExtraInch(): Avanza un poco (delay(extraInch)) y para.
  • goAndTurn(direction, angle): Avanza para alinear ejes con intersección (delay(adjGoAndTurn)) y gira.

Paso 6: Almacenando el Camino

Ejemplo: el robot encuentra 15 intersecciones antes de la salida. Secuencia: L, B, L, L, L, B, S, B, L, L, B, S, L, L, End.

Se guarda cada acción en array path[100] con índices pathLength y pathIndex. Resultado: path = [LBLLLBSBLLBSLL], pathLength = 14.

Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth

Paso 7: Simplificando (Optimizando) el Camino

Secuencias con "U-turn" (B) de 3 pasos (xBx) se reducen a uno. Reglas de simplificación:

  • LBR = B
  • LBS = R
  • RBL = B
  • SBL = R
  • SBS = B
  • LBL = S

Aplicando al ejemplo:

LBLLLBSBLLBSLL → LBL=S → SLLBSBLLBSLL → LBS=R → SLRBLLBSLL
→ RBL=B → SLBLBSLL → LBL=S → SSBSLL → SBS=B → SBLL
→ SBL=R → RL

¡Resultado optimizado: RL (Derecha, luego Izquierda)!

Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth

Función mazeSolve() consolida la primera pasada, almacenando y simplificando en tiempo real. Variable status indica fin (0=resolviendo, 1=llegó al final).

void mazeSolve(void) {
  while (!status) {
    readLFSsensors();
    switch (mode) {
      case NO_LINE:
        motorStop(); goAndTurn(LEFT, 180); recIntersection('B'); break;
      case CONT_LINE:
        runExtraInch(); readLFSsensors();
        if (mode != CONT_LINE) { goAndTurn(LEFT, 90); recIntersection('L'); }
        else mazeEnd(); break;
      case RIGHT_TURN:
        runExtraInch(); readLFSsensors();
        if (mode == NO_LINE) { goAndTurn(RIGHT, 90); recIntersection('R'); }
        else recIntersection('S'); break;
      case LEFT_TURN:
        goAndTurn(LEFT, 90); recIntersection('L'); break;
      case FOLLOWING_LINE:
        followingLine(); break;
    }
  }
}

Funciones auxiliares:

void recIntersection(char direction) {
  path[pathLength] = direction;
  pathLength++;
  simplifyPath();
}

void simplifyPath() {
  if (pathLength < 3 || path[pathLength-2] != 'B') return;
  int totalAngle = 0;
  for (int i=1; i<=3; i++) {
    switch(path[pathLength-i]) {
      case 'R': totalAngle += 90; break;
      case 'L': totalAngle += 270; break;
      case 'B': totalAngle += 180; break;
    }
  }
  totalAngle %= 360;
  switch(totalAngle) {
    case 0:   path[pathLength-3] = 'S'; break;
    case 90:  path[pathLength-3] = 'R'; break;
    case 180: path[pathLength-3] = 'B'; break;
    case 270: path[pathLength-3] = 'L'; break;
  }
  pathLength -= 2;
}

Crédito de simplifyPath() a Patrick McCabe (patrickmccabemakes.com).

Paso 8: Segundo Paso - Resolver el Laberinto lo más Rápido Posible

void loop() {
  ledBlink(1);
  readLFSsensors();
  mazeSolve();        // Primera pasada
  ledBlink(2);
  while (digitalRead(buttonPin)) { } // Espera botón
  pathIndex = 0; status = 0;
  mazeOptimization(); // Segunda pasada: camino óptimo
  ledBlink(3);
  while (digitalRead(buttonPin)) { }
  mode = STOPPED; status = 0;
  pathIndex = 0; pathLength = 0;
}

Función mazeOptimization() usa el array path[] optimizado:

void mazeOptimization(void) {
  while (!status) {
    readLFSsensors();
    switch (mode) {
      case FOLLOWING_LINE: followingLine(); break;
      case CONT_LINE:
      case LEFT_TURN:
      case RIGHT_TURN:
        if (pathIndex >= pathLength) mazeEnd();
        else { mazeTurn(path[pathIndex]); pathIndex++; }
        break;
    }
  }
}

void mazeTurn(char dir) {
  switch(dir) {
    case 'L': goAndTurn(LEFT, 90); break;
    case 'R': goAndTurn(RIGHT, 90); break;
    case 'B': goAndTurn(RIGHT, 800); break; // Media vuelta
    case 'S': runExtraInch(); break;
  }
}

Paso 9: Usando Android para Ajuste (Tuning)

La App Android del proyecto Seguidor de Línea funciona aquí también (disponible en el tutorial anterior). El código Arduino ya incluye comunicación Bluetooth transparente. Variables clave a ajustar:

const int adj = 0;
float adjTurn = 8;
int adjGoAndTurn = 800;
int THRESHOLD = 150;
const int power = 250;
const int iniMotorPower = 250;
int extraInch = 200;
Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth

Paso 10: Conclusión

Robot Resolvedor de Laberintos con IA usando Arduino y Bluetooth

Esta es la segunda y última parte de un proyecto complejo que explora el potencial de un robot seguidor de línea, aplicando conceptos simples de Inteligencia Artificial (IA) para resolver un laberinto.

No soy experto en IA, pero según fuentes como Wikipedia y el paper "Maze Solving Robot Using Freeduino and LSRB Algorithm" (IJMER), lo que hace Rex puede considerarse una aplicación de IA.

Archivos actualizados en GitHub. Más tutoriales en mi blog: MJRoBot.org

¡Saludos desde el sur del mundo! — Marcelo

Código

El proyecto incluye múltiples fragmentos de código (snippets) que cubren: definición de pines, lectura de sensores, lógica de prueba, bucle principal con regla mano izquierda, funciones runExtraInch, goAndTurn, mazeSolve, recIntersection, simplifyPath, bucle principal con dos pasadas, mazeOptimization y mazeTurn. Todos disponibles en la sección de código del proyecto original.

Repositorio GitHub: https://github.com/Mjrovai/MJRoBot-Maze-Solver

Esquemáticos

Archivo Fritzing: z7IdLkxL1J66qOtphxqC.fzz

Proceso de manufactura

  1. Construye un robot inteligente con Bridge Shield – Integración Raspberry Pi y Arduino
  2. Robot Controlado por Gestos con Raspberry Pi
  3. Construye un Robot Raspberry Pi Controlado por Wi‑Fi con Python – Guía Paso a Paso
  4. Integración de Microsoft Kinect con Raspberry Pi para Detección Humana en Tiempo Real en Robot Sonbi
  5. Bosch presenta solución de fabricación impulsada por IA en Hannover Messe
  6. Robótica Impulsada por IA: Máquinas Inteligentes de Vanguardia
  7. Por Qué Elegir un Robot Colaborativo para su Espacio de Trabajo
  8. La IA permite a robots identificar más de 90 objetos mediante el tacto
  9. Inteligencia artificial en retail: beneficios probados, no una moda pasajera
  10. Kubernetes Impulsa Startups de IA con Soluciones Contenedorizadas Escalables
  11. Seguimiento de la deforestación en el Amazonas impulsado por IA