BUCLES EN LEGO MINDSTORMS
¿QUE SON?
El icono "Ciclo" o "Bucle" o "Loop" repite la ejecución una determinada parte del programa. Puede repetirse desde unas pocas veces hasta que se cumpla una determinada condición o infinitas veces. Iremos viendo los distintos casos con ejemplos.
NOTA: para comprobar los programas de los ejemplos, usaremos con frecuencia el icono de sonido configurado de la siguiente forma:
BUCLE FOREVER
Bueno, este es el más habitual y sencillo. Repite infinitamente un conjunto de tareas. No se parará hasta que cancelemos el programa. Es decir, el programa "se queda atrapado" dentro de ese bucle, del que no sale nunca. En el ejemplo siguiente, pulsa el botón naranja repetidamente para que suene un "bip".
Un primer detalle: sería imposible programar esto de otra forma, ya que el programa sería infinitamente largo.
BUCLE FOREVER CON UN "COUNTER"
El mismo programa antrior nos puede permitir visualizar en pantalla las veces que hemos pulsado el botón o, dicho de otra forma, las veces que se ha repetido el ciclo. Esta función está disponible para cualquier otra configuración de los Ciclos.
Con esta pestaña activada, aparece en el bucle una pestañita desde la cual podemos sacar un cable para visualizar en pantalla las repeticiones.
BUCLES "HASTA QUE"...
El anterior bucle se repetía infinitamente. Cualquiera de los bucles que explicaremos ahora se repiten infinitamente hasta que se produce una determinada condición, momento en el cual el programa avanza saliendo del bucle. Por eso, cuando programes algo, piensa de esa forma para saber si este es el icono adecuado. Si lo que necesitas es repetir algunos iconos infinitamente hasta que pase tal cosa, usalo.
Hay que hacer una aclaración a esto. Repetir una cosa "infinitamente" puede ser engañoso y hay que entenderlo desde el punto de vista de la programación. Cuando pensamos el programa, esperar a que un sensor de color lea "rojo" para nosotros es una única tarea: esperar. Para el NXT es repetir infinitamente la lectura del sensor "hasta que" encuentre el rojo.
¿BUCLE "HASTA QUE" O BLOQUE DE ESPERA?
¿Cuál usar? Si NO necesitas repetir una serie de tareas, BASTA con usar un bloque de espera. Por ejemplo, si quieres que el robot avance "hasta que" encuentre una pared usando un ultrasonido, basta un icono de espera de ultrasonido. En este caso, el programa se comporta como si estuviera en un bucle a la espera de que se cumpla la condición del ultrasonido, y solo estará realizando esa tarea.
Si lo que quieres es esperar "hasta que" encuentre una pared PERO DURANTE ESA ESPERA QUIERES QUE HAGA TAREAS ADICIONALES, tendrás que usar un BUCLE "hasta que" llegue a la pared y encerrar todas esas tareas adicionales en el bucle. Tareas adicionales pueden ser que simultanemente compruebe si has pulsado un sensor de contacto para parar el robot manualmente.
BUCLE "SENSOR"
Con todo lo explicado, podemos interpretar este icono como "repite esto hasta que el sensor X cumpla esta condición".
Podría ser el caso de un robot que avanza "hasta que" el sensor de ultrasonido encuentra una pared. O puede ser el caso del siguiente programa, en el que esperamos indefinidamente a que se pulse el botón naranja para salir del bucle. En caso contrario, si no se da la condición, el ciclo se repite de nuevo.
Esto también es común al resto de bucles: el programa sale del bucle cuando se cumple la condición, sea temporal, sensor, etc. En caso contrario, el programa sigue encerrado en el bucle.
AVISO: este bucle puede ser fuente de problemas y de mal funcionamiento de algunos programas. Un ejemplo de mala programación sería este:
Aquí, el programa se detiene en el icono de espera, hasta que pulsamos el botón naranja. En ese momento, el programa avanza tan deprisa que vuelve al mismo punto sin que nos de tiempo a pulsarlo de nuevo para salir del bucle.
Otros casos de mala programación o de fuente de problemas tiene que ver con la longitud de los programas; o con iconos de espera; o con bucles dentro de bucles. El siguiente programa es muy interesante para aprender cómo funciona el NXT. Lo explico a continuación.
El programa queda a la espera de pulsar el cursor izquierdo del NXT para avanzar y, como antes, no hay tiempo entre medias de pulsar el botón naranja para finalizar el programa. Parece que el programa siempre queda detendo justo en el icono de espera de la flecha izquierda. PERO, aunque el programa esté "detenido" en ese punto, prueba a pulsar el botón naranja antes de pulsar la flecha.
El NXT almacena la pulsación y, cuando es el momento, acaba el programa y no antes. Es decir, el programa NO acaba inmediatamente cuando pulsas el botón naranja como era nuestra intención, sino después de pulsar la flecha, lo que le permite entonces llegar al final del bucle y salir. Estos problemas son comunes al resto de bucles del tipo "hasta que..." que estamos viendo.
TIPOS. Los tipos de condiciones que puedes añadir a un bucle de este tipo son tantas como sensores tengas a disposición. Puedes esperar hasta que el sensor detecte rojo, hasta que la pared esté cerca, hasta que recibas una señal BT de otro NXT, hasta que se pulse un botón... Todo ello te aparece en el panel de configuración del bucle cuando está seleccionado "Sensor".
BUCLE "TIME"
Este bucle es mucho más sencillo. Simplemente repite todas las tareas encerradas en el bucle "hasta que" pasa un determinado tiempo. Si simplemente quieres esperar a que pase un tiempo, ya sabes, un simple bloque de espera. Hago aquí la misma precaución que hice antes para que el programa no nos de comportamientos inesperados. Veamos un ejemplo:
El tiempo está a 5 segundos. Pulsa 2 o 3 veces rápidamente al inicio del programa para ver cómo avanza y luego para a la espera de que se cumplan los 5 segundos. ¿Qué ocurre? Nada. El programa no se para. Eso es porque está detenido justo en el bloque de espera. Cuando lo pulses una vez más y ya haya vencido el tiempo, el programa avanzará hasta el final del bucle y, ahora sí, acabará.
BUCLE "COUNT"
Este bucle también es muy sencillo, pero tiene un detalle que lo hace puñetero en un aspecto. El programa sale del bucle cuando ha repetido el ciclo n veces, según lo configures en la ventanita correspondiente. El "problema" reside en lo siguiente, que lo vemos con un ejemplo. Programa el siguiente bucle, con 4 repeticiones y un icono de espera de 1 segundo:
El icono final sirve simplemente para que se mantenga el resultado en pantalla sin que el programa finalice. Ejecutalo en el NXT. Para finalizar el programa, recuerda pulsar el botón naranja. ¿No notas algo raro?.
Lo primero que se nos puede ocurrir es cambiar el icono "Sound" de sitio, así:
Pero resulta que sigue "sin funcionar bien": le hemos dicho que repita 4 veces y solo cuenta hasta 3. ¿porqué? El problema reside en la numeración del "counter": hasta que no ha completado el ciclo, no cuenta 1. Es decir, en la primera pasada el contador marca cero. Por tanto, para resolver el problema y que podamos contar hasta 4 como era nuestra intención, basta poner en el "Count" de la configuración del bucle un número más, el 5.
Anda con cuidado con esto porque a veces es un lío y programa según las necesidades.
BUCLE "LOGIC"
Este bucle si que puede llegar a ser un auténtico "cacao". Principalmente porque los bloques y variables lógicas tienen su propio "idioma". Pero bueno, haremos algunos ejemplos sencillos sin intentar meternos es cuestiones complejas. Recuerda que los bloques lógicos solo pueden tomar 2 valores: verdadero o falso. Empezamos con un programa muy sencillo: esperar hasta que el sensor de color detecte amarillo.
Esta sería la forma correcta de programarlo, pero como esto es un ejemplo, voy a programar exactamente lo mismo con un bucle lógico:
Cuando se cumple la condición impuesta en el bloque del sensor de color (detectar amarillo), sale del ciclo y el programa finaliza. Cuando no detecta amarillo, la condición es "Falso". Cuando lo detecta, la condición que sale del sensor es "Verdadero", se cumple con lo que dice el panel del bucle (True=Verdadero) y el programa acaba.
Si en el bucle pones "False", el ciclo esperará hasta que se cumpla esa condición. Es decir, avanzará cuando detecte cualquier otro color que no sea amarillo. Se quedará encerrado en el bucle "hasta que" deje de detectar amarillo. Sería equivalente a poner en el panel del sensor "Outside Range", es decir, fuera del amarillo. O sea, el siguiente programa hace EXACTAMENTE lo mismo que el anterior:
BUCLES ANIDADOS
Un bucle anidado no es más que un bucle dentro de otro bucle. Personalmente me gustaría más que se llamaran "bucles anillados", pero no le puse yo el nombre. Como ejemplo tomaremos el programa que escribimos antes, en el apartado "Bucle "Count"" (esto sería un ejemplo de "comillas anidadas"). El programa que pusimos allí era este:
Pero de esta forma el programa acaba tras los ciclos correspondientes y si queremos repetir, hay que volver a ejecutar el programa. Para solucionarlo, metemos todo en un bucle infinito:
O bien combinamos el bucle exterior para que acabe al pulsar el botón naranja del NXT. Para avanzar sin que el programa se líe como ya vimos más arriba, seleccionamos la tecla izquierda del NXT.
No hay comentarios:
Publicar un comentario