Bucles con LEDs

Este contenido es un complemento práctico para los contenidos teóricos de los temas 4. Fundamentos de Computación Física, 5. Internet de las Cosas y 6. Robótica, de la asignatura Computación y Robótica de 2º y 3º de ESO.

🛠️ Materiales:

Seguimos avanzando en nuestra tarea de aprender programación con microcontroladores. Vistas las estructuras condicionales, que estudiamos en el ejercicio anterior, vamos a continuar estudiando las estructuras repetitivas o iterativas.

Una instrucción repetitiva es aquella que se repite un número determinado de veces. Esto ya no es ninguna sorpresa para ninguno de nosotros, puesto que ya conocemos la función loop de Arduino con la que llevamos trabajando desde hace tiempo. Sin embargo, no tenemos ningún control sobre la cantidad de veces que se va a ejecutar ese bloque de código, básicamente porque por definición, se ejecuta de forma indefinida mientras que reciba corriente.

Pero, ¿qué pasa si lo que queremos es repetir cierto número de instrucciones o tareas durante un número determinado de veces, pongamos 3, 5 o 47?. Para ello, tenemos que usar un bucle FOR.

Yendo un poco más allá, ¿qué pasa si lo que queremos es repetir un bloque de código pero no sabemos cuántas veces vamos a hacerlo? ¿Qué pasa si lo que queremos es que una tarea se repita mientras que se cumpla cierta condición? En ambos casos utilizaremos un bucle WHILE.

Es importante que recuerdes esto: ambos son bucles que realizan tareas repetitivas. Lo que determina si debemos usar un bucle FOR o un WHILE, es si sabemos a priori cuántas veces deben repetirse nuestras instrucciones. Si lo sabemos, FOR. Si no lo sabemos, WHILE.

Para ilustrar la utilidad de un FOR, vamos a crear un diseño en el que tendremos 2 LEDs, uno rojo y otro verde. El objetivo es que ambos LEDs realicen una pequeña coreografía:

  • Encender rojo durante 1s y apagarlo.
  • Encender verde durante 1s y apagarlo.
  • Encender rojo durante 2s y apagarlo.

Que todo esto se haga 3 veces, y luego todo apagado durante 5 segundos.

🔴🟢🔴  🔴🟢🔴  🔴🟢🔴          🔴🟢🔴  🔴🟢🔴  🔴🟢🔴         🔴🟢🔴  🔴🟢🔴  🔴🟢🔴

Nuestro montaje vuelve a ser algo que ya conocemos, así que no tardaremos nada en hacerlo:

Lo que hemos hecho hasta ahora, ha sido situar los dos LEDs, cada uno con su resistencia de 220Ω. Hemos usado la salida digital 2 para el LED rojo, y la 4 para el LED verde. Además, hemos conectado el riel negativo a tierra y allí hemos conectado los dos polos negativos de los LEDs. Ninguna novedad.

¿Por qué salidas digitales y no analógicas? Fácil, porque solo necesitamos trabajar con LEDs encendidos o apagados, dos únicos posibles valores, así que: DIGITAL.

Ahora, escribiremos el programa que nos permite ejecutar la coreografía que teníamos como objetivo.

Como siempre, creamos nuestras variables y preparamos el setup:

Y luego, escribiremos el loop, con nuestro código de operación:

Este programa resuelve a la perfección el objetivo que buscábamos. Sin embargo, ¿qué ocurriría si quisiéramos realizar un pequeño cambio a la coreografía? Pues tendríamos que ir línea por línea cambiando lo mismo tres veces. Pero, si nuestra coreografía se repitiera 500 veces en vez de 3, tendríamos que ir cambiándola línea a línea a lo largo de miles de líneas de código. ¡Una auténtica locura! Lo mismo ocurriría si quisiéramos cambiar los tiempos de espera o corregir un error detectado.

Para estas situaciones, como sabemos cuántas veces queremos ejecutar un fragmento de código, en este caso las líneas 12 a 20, podemos recurrir a un bucle for:

Lo primero que llama la atención es el enorme ahorro de código. Hemos conseguido exactamente el mismo efecto con casi la mitad de líneas de código (y por tanto, de tamaño del programa), pasando de 43 líneas a 24.

El bucle FOR, funciona de la siguiente manera:

for ( inicialización; condición; actualización )  {

// instrucciones que se ejecutarán de forma repetitiva

}

La inicialización tiene por objeto iniciar una variable de control que utilizaremos para controlar el avance del bucle. En este caso hemos utilizado una variable entera llamada i, y la hemos inicializado a 0.

En condición se establece esa condición que debe cumplirse para que el bucle siga ejecutándose una vez más o termine. Mientras se cumpla esa condición, el bucle continuará. Cuando no se cumpla, el bucle finalizará.

En actualización es donde modificamos la variable de control para ir actualizando la cantidad de veces que hemos repetido el bucle y saber cuándo terminar.

Veamos en la siguiente tabla cómo se lee este bucle:

for ( int i = 0; i < 5; i = i + 1 ) {

mostrar el valor de i;

}

Valor de iCondiciónEjecuciónActualiza i
0¿ 0 < 5 ?SiContinuarMuestra 01
1¿ 1 < 5 ?SiContinuarMuestra 12
2¿ 2 < 5 ?SiContinuarMuestra 23
3¿ 3 < 5 ?SiContinuarMuestra 34
4¿ 4 < 5 ?SIContinuarMuestra 45
5¿ 5 < 5 ?NOTerminar

IMPORTANTE: la inicialización y condición se ejecutan antes que el bloque de código del interior, pero la actualización se realiza justo después de la ejecución del bloque de código interior.

Veamos ahora cómo podemos adaptar nuestro código para sustituir el bucle FOR por un bucle WHILE:

En este caso, la inicialización de la variable de control se realiza fuera de la estructura repetitiva (línea 12). Sin embargo, su funcionamiento es muy similar: mientras se cumpla la condición se ejecutará el bloque de instrucciones que contiene. Además, la línea 23 es la que realiza la actualización de la variable de control.

Utilizar un bucle WHILE en este ejercicio no tiene sentido, puesto que sabíamos a priori cuántas veces queríamos ejecutar el bucle, y ese es precisamente el caso en el que debemos usar el FOR. Únicamente hemos usado el WHILE aquí con el objetivo de ilustrar su funcionamiento.

¿Cúando, entonces, usamos un WHILE y no un FOR? Pues en aquellos casos en los que no sabemos cuántas veces vamos a repetir las mismas instrucciones. Supongamos que nuestra coreografía se debe ejecutar hasta que se pulse un botón. Ahí no podríamos usar un FOR porque no sabemos cuándo se pulsará. Usaríamos un WHILE:

while (BOTÓN_NO_PULSADO) {

// instrucciones que se repetirán

}

Así, cuando se pulse el botón, la condición no se cumplirá y el bucle WHILE terminará.

Ahora, es momento de llevar el proyecto a los componentes reales del aula.

Como siempre, ya sabes:

  1. Descarga en tu ordenador el archivo .ino
  2. Conecta la placa al ordenador.
  3. Abre Arduino IDE.
  4. Carga el programa y revisa que el código sea correcto.
  5. Desde Arduino IDE, guarda el programa en la placa.
  6. Desconecta la placa.
  7. Monta tu circuito sobre la mesa.
  8. Avisa al profesor para que lo revise.
  9. Solo si te da el visto bueno, puedes conectar la placa y comprobar que todo funciona correctamente.

Esto es lo que debes obtener:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *