BITIRO SimuladorSimulador libre del IROH

Simulador libre del IROH

BITIRO / S01 / 3DPERSPECTIVA LIBRE · 100 × 140 cmPLOTTER S01
EN ESPERA
S01 · Geometría del proyecto BITIRO
100%
Sensores y telemetría
Línea
I028C395D028
Sonar200 cm
Motores I / D0 / 0
Servo0° · REPOSO
LCD 16 × 2
Entradas
Tiempo0.0 s

Escoge una pista, escribe tu programa y ejecútalo.

PREPARAR EL EXPERIMENTO

Calibrar sensores de línea

En este banco virtual, blanco es 0 y negro es 1000 después de normalizar. Mide ambas referencias o introduce sus valores brutos por sensor. La simulación se pausa mientras calibras.

SensorBlanco · 0–1023Negro · 0–1023
Izquierdo
Central
Derecho
Más sensible al negroMás exigente

Una lectura normalizada igual o superior al umbral detecta línea. Las funciones de lectura bruta conservan sus valores; tus programas anteriores no cambian automáticamente.

Banco simulado, sin conexión con el IROH físico. Los valores son ilustrativos; no constituyen una calibración del robot real.

Escenario

Añade y mueve cajas para experimentar con el robot.

    Sin caja seleccionada

    Esquina superior izquierda de la caja de 8 × 8 cm.

    ¿Restaurar el código inicial?

    Tu código actual de esta pista se reemplazará por el código inicial. Esta acción no se puede deshacer.

    Guía de programación IROH

    Aprende a darle instrucciones a IROH, paso a paso. Abre un tema o busca una instrucción.

    Primeros pasosCómo darle instrucciones a IROH y cómo funciona un programa

    Empieza por aquí: copia este programa, pulsa Ejecutar y mira qué hace IROH. Después te explicamos cada parte, una por una.

    Mi primer programa

    void setup() {
      inicializarMovimiento();
      inicializarPantalla();
      escribirPantalla(0, 0, "Hola, IROH");
    }
    
    void loop() {
      avanzar(40);
      pausa(1500);
      detenerse();
      finPrograma();
    }

    Qué hace: IROH escribe «Hola, IROH» en su pantalla, avanza un segundo y medio y se detiene.

    1. Escribe o copia el programa en el editor.
    2. Pulsa Ejecutar.
    3. Mira la pantalla de IROH y cómo avanza.

    Prueba: cambia «Hola, IROH» por tu nombre, o cambia 1500 por 3000. ¿Qué notas?

    ¿Qué es setup()?

    void setup() {
      inicializarMovimiento();
    }

    setup() significa «preparación». Lo que escribas dentro se ejecuta una sola vez, al empezar. Es opcional.

    ¿Qué es loop()?

    void loop() {
      avanzar(40);
    }

    loop() significa «repetir». Lo que escribas dentro se ejecuta una y otra vez mientras el programa corre. Es obligatoria.

    ¿Qué significa inicializar?

    inicializarMovimiento();
    inicializarSensores();
    inicializarGolpe();

    Como en el robot real, cada parte se activa una vez antes de usarla: el movimiento (ruedas), los sensores (línea, sonar e infrarrojos) y el golpe (garra). Se hace dentro de setup().

    Prueba: cuando tu programa lea un sensor, añade inicializarSensores(); en setup().

    Para qué sirven ; y { }

    avanzar(40);
    if (lineaCentral()) {
      detenerse();
    }

    El punto y coma ; marca el final de una instrucción. Las llaves { } agrupan las instrucciones de un bloque: el cuerpo de setup(), de loop() o de un if.

    Las líneas que empiezan con // son comentarios: IROH las ignora.

    Lee los mensajes del simulador

    Debajo del editor aparecen mensajes: ✔ todo bien, ⚠ aviso (el programa sigue, pero algo no funcionará) y ✖ error (el programa se detiene y te dice en qué línea está el problema).

    Si falta inicializar una parte, verás un aviso ⚠ que te dice cuál.

    ¡Vamos a movernos!Avanzar, retroceder, girar, detenerse y esperar

    Las ruedas reciben una velocidad de 0 a 100. IROH mantiene la última orden hasta que le des otra, incluso mientras esperas con pausa(). Recuerda llamar a inicializarMovimiento(); en setup().

    Avanzar

    avanzar(50);

    IROH avanza con sus dos ruedas. El número indica la velocidad: 0 es quieto y 100 es la máxima.

    Prueba: cambia el 50 por 30. ¿Qué notas?

    Avanzar en curva

    avanzar(20, 60);

    Con dos números, el primero es la rueda izquierda y el segundo la derecha. IROH curva hacia el lado de la rueda más lenta.

    Prueba: intercambia el 20 y el 60. ¿Hacia dónde gira ahora?

    Retroceder

    retroceder(40);

    IROH va hacia atrás. Igual que avanzar(), acepta un número o dos: retroceder(izquierda, derecha).

    Girar a la derecha

    girarDerecha(40);

    IROH gira sobre sí mismo hacia la derecha: una rueda avanza y la otra retrocede.

    Girar a la izquierda

    girarIzquierda(40);

    Lo mismo, hacia la izquierda.

    Detenerse

    detenerse();

    Pone las dos ruedas en 0. IROH frena de forma gradual, no de golpe.

    Esperar

    avanzar(40);
    pausa(1000);
    detenerse();

    pausa(1000); hace que el programa espere 1000 milisegundos (1 segundo). Mientras espera, las ruedas siguen con la última orden: aquí IROH avanza un segundo y luego se detiene.

    Prueba: ¿cuánto avanza con pausa(2000);?

    Terminar el programa

    finPrograma();

    Detiene a IROH y termina el programa: ya no se repite loop().

    Avanza, gira y detente

    void setup() {
      inicializarMovimiento();
    }
    
    void loop() {
      avanzar(40);
      pausa(1000);
      detenerse();
      pausa(300);
      girarDerecha(40);
      pausa(700);
      detenerse();
      finPrograma();
    }

    IROH avanza un poco, se detiene, gira hacia la derecha y termina. Cada paso dura el tiempo que escribes en pausa().

    Prueba: cambia 700 por otro número y mira cómo cambia el giro.

    Siguiendo la líneaSensores que reconocen una línea negra

    IROH tiene tres sensores de línea en la parte delantera: izquierdo, central y derecho. Cada uno mira el suelo y reconoce si ve negro. Llama a inicializarSensores(); en setup() antes de leerlos.

    ¿Hay línea debajo?

    if (lineaCentral()) {
      avanzar(30);
    }

    lineaIzquierda(), lineaCentral() y lineaDerecha() responden 1 si el sensor ve negro y 0 si no. Como 1 significa «verdadero», se usan directamente dentro de un if.

    Prueba: haz que IROH se detenga cuando el sensor central deje de ver la línea.

    Medir cuánto negro ve

    int valor = leerLineaNormalizada(1);

    Devuelve un número de 0 (blanco) a 1000 (negro). El número entre paréntesis elige el sensor: 0 izquierdo, 1 central y 2 derecho.

    Lectura sin ajustar

    int bruto = leerSensorLineaCentral();

    Valor directo del sensor, de 0 a 1023. También existen leerSensorLineaIzquierdo() y leerSensorLineaDerecho(). Sirven para calibrar; para decidir suele ser más cómodo usar las funciones anteriores.

    El umbral de la línea

    int umbral = leerUmbralLinea();

    Es el valor (de 0 a 1000) desde el cual un sensor considera que ve línea. Empieza en 500 y puedes cambiarlo con el botón Calibración.

    Seguidor de línea

    void setup() {
      inicializarMovimiento();
      inicializarSensores();
    }
    
    void loop() {
      if (lineaCentral()) {
        avanzar(30);
      } else if (lineaIzquierda()) {
        avanzar(10, 30);
      } else if (lineaDerecha()) {
        avanzar(30, 10);
      } else {
        detenerse();
      }
    }

    Programa completo. Si el centro ve la línea, avanza; si la ve a un lado, curva hacia ese lado; si no la ve, se detiene. Pruébalo en la pista Óvalo.

    Prueba: cambia 30 por 50. ¿Sigue la línea o se sale?

    Este programa básico puede detenerse en cruces, bifurcaciones o huecos de las pistas S01–S08: necesitarás más reglas.

    Detectando obstáculosSonar, sensores infrarrojos y botón

    IROH puede medir la distancia a una caja con el sonar y recibir señales de dos sensores infrarrojos y de un botón. Usa inicializarSensores(); en setup().

    Medir la distancia con el sonar

    int distancia = leerDistanciaSonar();

    Devuelve la distancia en centímetros hasta la caja más cercana en la dirección en que mira la cabeza (justo delante, si no la giras con moverServoYaw()). Si no hay ninguna al alcance, devuelve 200.

    Prueba: con Editar escenario acerca una caja y observa cómo cambia el valor en «Sonar».

    Sensores infrarrojos

    if (leerSensorObstaculoIzquierdo()) {
      detenerse();
    }

    leerSensorObstaculoIzquierdo() y leerSensorObstaculoDerecho() devuelven 1 si el sensor está activo y 0 si está libre. En el simulador no detectan las cajas por sí solos: los activas tú con los botones IR izquierdo e IR derecho de la franja «Entradas».

    Leer el botón

    int presionado = leerBoton();

    Devuelve 1 si el Pulsador está presionado y 0 si está libre. Lo cambias con el botón Pulsador de la franja «Entradas».

    Esperar el botón

    botonInicio();

    El programa se queda aquí hasta que el Pulsador esté presionado. Úsalo al final de setup() para que IROH espere tu señal antes de empezar.

    Prueba: ejecuta tu programa con botonInicio(); y pulsa Pulsador.

    Detenerse ante una caja

    void setup() {
      inicializarMovimiento();
      inicializarSensores();
    }
    
    void loop() {
      int distancia = leerDistanciaSonar();
      if (distancia < 17) {
        detenerse();
      } else {
        avanzar(30);
      }
    }

    Programa completo. IROH avanza y se detiene cuando la caja está a menos de 17 cm, antes de tocarla con la garra.

    Prueba: cambia 17 por 40. ¿Dónde se detiene ahora?

    Si no hay ninguna caja delante, IROH avanzará sin parar: añade una con Editar escenario.

    La pantalla de IROHMostrar mensajes y números en la LCD

    La pantalla tiene 2 filas (0 y 1) de 16 columnas (0 a 15). Sirve para que IROH te cuente lo que está leyendo o pensando.

    Preparar la pantalla

    inicializarPantalla();

    Prepara la LCD, como en el robot real. En el simulador funciona aunque la olvides, pero conviene incluirla en setup().

    Escribir en la pantalla

    escribirPantalla(0, 0, "Hola");

    Los tres valores son: columna, fila y lo que quieres mostrar. El texto va entre comillas dobles; también puedes pasar un número o una variable.

    Prueba: escribe en la columna 5 de la fila 1.

    Borrar la pantalla

    borrarPantalla();

    Deja las dos filas vacías. Úsala antes de escribir números que cambian, para que no queden dígitos de la lectura anterior.

    Apagar y prender la pantalla

    apagarPantalla();
    prenderPantalla();

    El simulador las reconoce, pero todavía no cambian nada en la LCD: mostrará un aviso ⚠.

    Mostrar la distancia

    void setup() {
      inicializarMovimiento();
      inicializarSensores();
      inicializarPantalla();
    }
    
    void loop() {
      int distancia = leerDistanciaSonar();
      borrarPantalla();
      escribirPantalla(0, 0, "Distancia:");
      escribirPantalla(0, 1, distancia);
      if (distancia < 17) {
        detenerse();
      } else {
        avanzar(30);
      }
    }

    Programa completo: es el de la caja, pero además muestra en la LCD la distancia que mide el sonar.

    Moviendo sus mecanismosServomotores, garra y cabeza

    La garra de IROH puede girar a la izquierda, al centro o a la derecha. En el simulador la garra se mueve solo con instrucciones de tu programa.

    Activar la garra

    inicializarGolpe();

    Activa la garra y la lleva al centro. Va en setup(), antes de moverla.

    Mover la garra

    moverServoGolpe(1);

    El número elige la posición: -1 izquierda, 0 centro y 1 derecha. Con cualquier otro número aparece un aviso ⚠ y la garra no se mueve.

    La garra tarda un momento en girar: usa pausa() entre movimientos. Solo mueve una caja si la toca; no la empuja a distancia.

    Prueba: mueve la garra a -1 y luego de vuelta a 0.

    La cabeza de IROH

    inicializarCabeza();
    moverServoYaw(30);
    moverServoPitch(30);
    apagarCabeza();

    La cabeza tiene dos servomotores: moverServoYaw() la gira a los lados y moverServoPitch() la inclina. moverServoYaw(grados) funciona en el simulador: 0 es derecha, 90 es frente y 180 es izquierda, y acepta cualquier ángulo intermedio. El giro es progresivo, no instantáneo: espera con pausa() antes de leer el sonar. Llama a inicializarCabeza() en setup() antes de moverla. leerDistanciaSonar() mide hacia donde apunta la cabeza en ese momento. moverServoPitch() y apagarCabeza() se reconocen, pero el simulador no los modela: no tienen efecto y muestran un aviso ⚠. La velocidad y el alcance de la cabeza son valores virtuales del simulador, todavía sin medir en el robot real.

    La garra se mueve sola

    void setup() {
      inicializarMovimiento();
      inicializarGolpe();
    }
    
    void loop() {
      moverServoGolpe(-1);
      pausa(800);
      moverServoGolpe(1);
      pausa(800);
      moverServoGolpe(0);
      pausa(800);
    }

    Programa completo: la garra va a la izquierda, a la derecha y al centro, y repite.

    Apartar un obstáculo con la garra

    1. Detéctalo: lee leerDistanciaSonar(). Un 200 significa que no ve nada.
    2. Acércate despacio hasta una distancia adecuada y detente con detenerse().
    3. Haz un barrido: con la garra en un lado, llévala al lado contrario con moverServoGolpe() y espera con pausa().
    4. Comprueba: vuelve la garra al centro y lee el sonar otra vez. Si todavía ve la caja delante, no se despejó.
    5. Recupera la línea y sigue. Si la caja no se despejó, retrocede un poco con retroceder() e inténtalo de nuevo.

    Mover no es despejar. Una caja puede moverse un poco y seguir en tu camino. Despejar es dejarla fuera de la trayectoria del robot.

    La distancia importa. La garra llega a unos 22 cm del centro del robot y el sonar está más adelante. En S01, con un barrido que empieza al leer 10 cm, la caja se movió unos 19 cm y el robot siguió su camino. Con 12 cm la garra ya estaba tocando la caja y solo la movió 1 cm: siguió en el camino y el robot la empujó hasta el borde de la pista. La distancia adecuada depende de cómo llega el robot y de la forma del obstáculo: prueba y comprueba con el sonar.

    ¿Por qué se bloquea un giro? Si la garra toca una caja mientras el robot gira, el robot se detiene: no puede empujar una caja girando. Retrocede un poco o mueve la garra a un lado antes de girar con girarDerecha().

    Prueba: haz el barrido al leer 10 cm y luego al leer 12 cm. Mira dónde queda la caja cada vez.

    Aprende a programarVariables, condiciones, repeticiones y funciones

    Estas ideas sirven en cualquier lenguaje. Con ellas, tus programas pueden recordar datos, tomar decisiones, repetir y reutilizar partes.

    Variables: guardar un dato

    int velocidad = 40;
    avanzar(velocidad);
    velocidad += 10;

    Una variable es una cajita con nombre que guarda un número. int guarda números enteros. velocidad += 10; le suma 10.

    Prueba: cambia el 40 y mira cómo cambia todo lo que usa velocidad.

    Condiciones: decidir

    if (leerDistanciaSonar() < 20) {
      detenerse();
    } else {
      avanzar(30);
    }

    if significa «si»: el bloque se ejecuta solo cuando la condición se cumple. else es «si no». Para más opciones usa else if.

    Se comparan valores con == (igual), != (distinto), <, >, <= y >=.

    Combinar condiciones

    if (lineaCentral() &&
        !lineaDerecha()) {
      avanzar(30);
    }

    && significa «y», || significa «o» y ! significa «no». Aquí IROH avanza si el centro ve línea y la derecha no.

    Repeticiones: hacer algo varias veces

    while (leerDistanciaSonar() > 20) {
      avanzar(30);
    }
    detenerse();

    loop() ya se repite sola. while repite su bloque mientras la condición sea verdadera; cuando deja de serlo, el programa continúa con lo que sigue.

    Este lenguaje no tiene for: usa while.

    Funciones: ponerle nombre a un grupo de pasos

    void recorrerUnSegundo(int velocidad) {
      avanzar(velocidad);
      pausa(1000);
      detenerse();
    }

    Una función agrupa instrucciones bajo un nombre. Se escribe fuera de setup() y loop(), y después se usa como cualquier otra instrucción: recorrerUnSegundo(50);

    Funciones que devuelven un resultado

    int velocidadSegura(int distancia) {
      if (distancia < 20) {
        return 0;
      }
      return 40;
    }

    return entrega un valor a quien llamó a la función. Úsala así: avanzar(velocidadSegura(leerDistanciaSonar()));

    Para seguir aprendiendoConceptos y límites técnicos del simulador

    Instrucciones que se reconocen pero no hacen nada visible

    apagarPantalla(), prenderPantalla(), apagarCabeza() y moverServoPitch() se aceptan, pero no tienen efecto en este modelo y muestran un aviso ⚠. inicializarPantalla() se acepta sin aviso y la LCD funciona aunque no la llames.

    Rangos y unidades

    • Velocidad de las ruedas: de 0 a 100. Un valor mayor se limita a 100 y aparece un aviso ⚠.
    • Línea sin ajustar: de 0 a 1023. Línea normalizada: de 0 a 1000. El negro da valores altos.
    • Sonar: centímetros, número entero de 0 a 200. El valor 200 significa «nada al alcance». Solo ve cajas altas que estén justo donde apunta la cabeza, en un haz estrecho.
    • pausa(): milisegundos de tiempo del simulador.
    • Pantalla: columnas 0–15 y filas 0–1. Lo que no cabe en 16 columnas se corta.
    • Garra: solo -1, 0 y 1.

    Inicializaciones y avisos

    Cuando el programa tiene setup() y loop(), el simulador exige inicializarMovimiento(), inicializarSensores() e inicializarGolpe() antes de mover las ruedas, leer sensores o mover la garra. Si faltan, avisa y esa parte no responde. Las instrucciones sueltas, sin setup() ni loop(), se repiten como si estuvieran en loop() y no exigen inicializar.

    Entradas manuales y sensores simulados

    La línea y el sonar se calculan a partir de la posición de IROH en la pista (y, en el sonar, de hacia dónde mira la cabeza). Los dos infrarrojos y el Pulsador son entradas que tú activas y desactivas con los botones de la franja «Entradas».

    Tipos y operaciones

    • Tipos de variable: int, long, float, bool y byte (0 a 255). Pueden ser globales (fuera de las funciones) o locales.
    • Dividir enteros descarta los decimales: 7 / 2 da 3.
    • Operadores: + - * / %, comparaciones, && || !, y +=, -=, ++, --.
    • Valores predefinidos: true, false, HIGH (1) y LOW (0).
    • Los nombres usan letras sin tilde ni ñ, números y guion bajo.
    • El texto entre comillas solo se puede usar en escribirPantalla(); no se guarda en variables.
    • Una función puede llamarse a sí misma hasta 64 niveles.

    Tiempo simulado

    El programa corre en el tiempo del simulador: con velocidad 2× una pausa(1000) dura medio segundo reales. Mientras esperas con pausa(), IROH sigue con la última orden de las ruedas.

    Lo que todavía no está disponible

    for, const, switch, do-while, break, arreglos, el operador ? :, prototipos de función, referencias, parámetros con valor por defecto, *= y /=, millis(), delay(), analogRead() y Serial. Es un intérprete de un subconjunto de Arduino/C++, no un compilador, y no usa la biblioteca original de Arduino. Las líneas #include se ignoran.

    Plotter de referencia

    Compara la pista 3D virtual con la imagen de referencia. S01–S06 y S08 usan geometrías reconstruidas desde los PDF vectoriales oficiales; S07 es un repaso sin plotter propio.

    Imagen original del plotter seleccionado