Objetivos
Material requerido.
Kit inicio UNO | |
Kit Inicio Mega |
Un circuito con varios LED: Iteraciones For
.
En las sesiones anteriores vimos como gobernar que un diodo LED externo. Si quisiéramos montar un circuito que tuviera 8 LEDs y en el que la luz se desplazara de uno a otro, una posibilidad sería repetir varias veces las mismas secuencias de instrucciones que ya conocemos.
Por ejemplo si conectamos distintos LEDs a distintos pines digitales de Arduino, deberíamos declararlo en nuestra Función de setup() que podría ser:
void setup() { // initialize the digital pins as an output pinMode( 13, OUTPUT) ; pinMode( 12, OUTPUT) ; pinMode( 11, OUTPUT) ; ………………………… pinMode( 6, OUTPUT) ; }
Y a su vez nuestro loop() debería repetir tantas veces como LEDs tengamos el juego de encender y apagar cada uno de los LEDs en secuencia desde el pin 13 hasta el 6.
Esta solución es la que podríamos describir como de fuerza bruta, pero no es muy elegante, es trabajosa y probablemente cometeríamos más de un error al escribirla, porque las personas tendemos a equivocarnos haciendo tareas repetitivas aburridas (y esta lo es mortalmente, imaginad un circuito de de 16 LEDs).
En cambio los ordenadores no se aburren y además C++ nos ofrece un medio cómodo de indicarle que debe repetir algo un número definido de veces. Este medio es la instrucción For que podemos usar en combinación con una variable.
Así por ejemplo, para inicializar en nuestro setup() los pines desde el 13 hasta el 6 como salidas (requerido por nuestro Arduino) podríamos usar la instrucción for de la siguiente manera:
void setup() { int i = 0 ; // Inicializamos la variable i como un entero for ( i = 6 ; i < 14 ; i++) pinMode( i , OUTPUT) ; }
Aunque la sintaxis parece complicada al principio, uno se acostumbra con rapidez. Aquí lo importante es que for necesita 3 parámetros separados por un carácter de punto y coma.
Estos parámetros son y en éste orden:
Con el mismo criterio podríamos escribir la función loop() así Descargar
void loop() { int i = 0 ; // Inicializamos la variable i como un entero for ( i = 6 ; i < 14 ; i++) { digitalWrite( i , HIGH) ; delay (500) ; digitalWrite( i , LOW); delay (500) ; } }
En la sesión 3 el código era muy similar excepto en que escribíamos el valor 13 para el único pin que tenía un LED conectado. Aquí asignamos el pin con una variable i , que va tomando los valores de 6 hasta el 13 para el pin.
Esquema electrónico del circuito
.
El esquema del circuito es muy similar al de la sesión 3, salvo por el hecho de que colocamos en la Protoboard 8 LEDs.
La única novedad es que dado que la función de la resistencia es limitar la intensidad de la corriente que circula por el circuito, y puesto que todos los diodos tienen masa común, basta una única resistencia entre este punto y Ground.
Cuando nuestro programa levante el pin correspondiente a valor a HIGH, se cerrar el circuito iluminándose el LED asociado.
Con este circuito, y con el programa 4.1 descrito en las páginas anteriores, tendremos un efecto de luces similar al del “coche fantástico” (O de los Zylon para los aficionados a la ciencia ficción).
A continuación incluimos un esquema de conexión del circuito en una protoboard.
Variantes del programa con el mismo circuito
.
Este montaje nos permite jugar con las luces y se presta a varios programas diferentes para conseguir distintos efectos.
Por ejemplo, con el programa anterior 4.1, el efecto no es exactamente el del coche fantástico porque cuando acabamos de iterar el for, el programa vuelve a empezar desde el principio, lo que hace que la luz salte desde el pin 6 hasta la del pin 13.
Así pues ¿ Podríamos hacer que la luz rebotara ? Pensadlo un poco.
Desde luego que sí, bastaría con usar dos ciclos for, similar a lo siguiente:
void loop() // Prog_4_2 { for ( int i = 6 ; i < 14 ; i++) // Definimos la variable i sobre la marcha { digitalWrite( i , HIGH) ; delay (500) ; digitalWrite( i , LOW); delay (500) ; } for ( int i = 12 ; i >6 ; i--) // Definimos la variable i sobre la marcha { digitalWrite( i , HIGH) ; delay (500) ; digitalWrite( i , LOW); delay (500) ; }
Otra variante seria, hacer un efecto de ola en al que las luces subieran dejando encendidos los LEDs previos hasta alcanzar el máximo y ahora descender apagando los LEDs superiores. Os recomendamos intentar resolver el problema como desafío, antes de buscar una solución.
Resumen de la sesión
<
problema concreto y lo hemos aplicado a varios ejemplos de programas sencillos con luces.