Escuela Técnica — Proyecto Integrador

Tortuga Limpiaplaya

Documentación del Algoritmo de Control — Arduino IDE

¿Qué es este proyecto?

"El objetivo principal no es construir el algoritmo perfecto, sino aprender a pensar como programadores mientras resolvemos un problema real."

La Tortuga Limpiaplaya es un robot autónomo con forma de tortuga diseñado para recorrer playas, detectar y recolectar residuos de manera automática. El sistema está programado en Arduino IDE con C++ embebido, y combina el control de motores, sensores de obstáculos y un depósito de recolección en un único algoritmo de estados.

Como estudiantes de escuela técnica, el valor de este proyecto está en entender por qué se toman cada una de las decisiones lógicas del diagrama: desde cómo el robot evita chocar con objetos hasta cómo decide cuándo volver a su base de descarga. La eficiencia del algoritmo importa, pero la comprensión de cada paso es lo que nos convierte en mejores programadores.


Estados del Sistema

El algoritmo opera en tres grandes modos o estados. Esta estructura se llama Máquina de Estados Finitos (FSM), un patrón muy común en sistemas embebidos con Arduino:

🟢 Modo LIMPIEZA

Estado activo de trabajo. El robot avanza, enciende el mecanismo de recolección y esquiva obstáculos que encuentre en su camino.

🟠 Modo RETORNO

Se activa cuando el depósito está lleno. El robot apaga la recolección y navega de vuelta a la base usando su sensor de localización.

🟡 Modo VACIADO

El robot espera detenido en la base mientras un operario vacía el depósito manualmente. Cuando el sensor confirma que está vacío, vuelve al Modo LIMPIEZA.


Explicación Paso a Paso

🔧 Inicialización

Al encenderse, el sistema ejecuta setup() en Arduino: configura los pines de sensores y motores, calibra valores iniciales y establece el modo LIMPIEZA como estado por defecto. Esta etapa es crítica porque un sensor mal inicializado puede generar lecturas incorrectas durante toda la ejecución.

📦 Lectura del depósito

Cada ciclo del loop() comienza leyendo el sensor de depósito. Esta decisión es intencional: verificar el estado de carga antes de cualquier movimiento permite al robot reaccionar rápidamente cuando el depósito se llena, sin completar un ciclo innecesario de avance.

🚧 Detección de obstáculos (Modo LIMPIEZA)

Si el depósito no está lleno, el sensor frontal (típicamente un HC-SR04 ultrasónico) mide la distancia hacia adelante. Si hay un obstáculo:

  • Se detienen los motores.
  • Se apaga el mecanismo de recolección (para no dañarlo).
  • El robot retrocede y gira izquierda o derecha para esquivar.

Si no hay obstáculo, el robot avanza y enciende la recolección. Este ciclo se repite continuamente.

🏠 Retorno a la base

Cuando el depósito está lleno, el robot entra en Modo RETORNO. Apaga la recolección y busca la señal de la base (puede ser un emisor IR, un beacon RF o una línea en el suelo). La lógica de búsqueda es un bucle: si no detecta la base, sigue buscando. Cuando la detecta, avanza hacia ella esquivando obstáculos si los hay.

⏳ Vaciado y reinicio

Al llegar a la base, el robot se detiene y espera que el operario vacíe el depósito manualmente. El sensor de depósito confirma cuando está vacío, y el sistema vuelve automáticamente al Modo LIMPIEZA para continuar operando.


Diagrama de Flujo (v2)

Respecto al diagrama original, esta versión incorpora: el ciclo de retorno al Modo LIMPIEZA tras el vaciado (que estaba implícito), una condición de timeout para la búsqueda de base (para evitar que el robot se quede buscando indefinidamente), y etiquetas más claras en las bifurcaciones.

flowchart TD A([INICIO]) --> B[Inicializar sensores y motores] B --> C[MODO LIMPIEZA] C --> D[Leer sensor de deposito] D --> E{Deposito lleno?} E -- No --> F[Leer sensor frontal] F --> G{Obstaculo?} G -- No --> H[Avanzar] H --> I[Encender recoleccion] I --> D G -- Si --> J[Detener] J --> K[Apagar recoleccion] K --> L[Retroceder] L --> M[Girar izq/der] M --> D E -- Si --> N[MODO RETORNO] N --> O[Apagar recoleccion] O --> P[Buscar base] P --> Q{Timeout busqueda?} Q -- Si --> R[Girar 360 y reintentar] R --> P Q -- No --> S{Base detectada?} S -- No --> P S -- Si --> T[Avanzar hacia base] T --> U{Obstaculo en camino?} U -- Si --> V[Esquivar obstaculo] V --> T U -- No --> W{Llego a base?} W -- No --> T W -- Si --> X[Detener robot] X --> Y[MODO VACIADO] Y --> Z[Esperar vaciado manual] Z --> AA{Deposito vacio?} AA -- No --> Z AA -- Si --> C style A fill:#2a7f7f,color:#fff,stroke:none style C fill:#1a3a4a,color:#4db6a4,stroke:#4db6a4,stroke-width:2px style N fill:#1a3a4a,color:#c4622d,stroke:#c4622d,stroke-width:2px style Y fill:#1a3a4a,color:#e8d5a3,stroke:#e8d5a3,stroke-width:2px style E fill:#0d1f29,color:#c8d8e0,stroke:#4db6a4 style G fill:#0d1f29,color:#c8d8e0,stroke:#4db6a4 style S fill:#0d1f29,color:#c8d8e0,stroke:#c4622d style U fill:#0d1f29,color:#c8d8e0,stroke:#c4622d style W fill:#0d1f29,color:#c8d8e0,stroke:#c4622d style Q fill:#0d1f29,color:#c8d8e0,stroke:#e8d5a3 style AA fill:#0d1f29,color:#c8d8e0,stroke:#e8d5a3

Mejoras para Implementar

🔩 Hardware

  • Sensores de humedad ubicados en los laterales y frente del chasis — detectan si el robot se acerca al agua para frenar antes de caer al mar
  • Motores de escobillones montados en la parte frontal que giran para barrer y tragar arena con residuos hacia el depósito interno
  • Sensor lateral para evitar obstáculos sin necesidad de retroceder
  • Sensor de nivel analógico para saber el % de llenado del depósito
  • GPS o encoder en las ruedas para medir distancia recorrida

💻 Software

  • Timeout en búsqueda de base para no quedar en bucle infinito
  • Logging por Serial para depurar el estado en tiempo real
  • Función de pausa activable por botón físico o comando RF

📖 Para seguir aprendiendo

Este proyecto toca conceptos fundamentales que van a seguir usando en su carrera:

  • Máquinas de estados (FSM): la base de todo sistema embebido y de muchos videojuegos
  • Polling vs interrupciones: el sensor se lee cada ciclo (polling); una mejora sería usar interrupciones de hardware
  • Deuda técnica: cada vez que dicen "esto lo arreglo después" en el código, están acumulando deuda técnica — aprenderán a gestionarla
  • Depuración sistemática: usar Serial.println() para entender qué hace el robot en cada momento