bclose

Circuito con múltiples LEDs

Arduino com 8 LEDs, iteraciones

Objetivos

.

 
    • Conocer las Iteraciones en C++, Instrucción for.
    • Primeras variables en C++.
    • Circuito con múltiples LEDs.
    • Aprendiendo a programar…programando.

 

Material requerido.

ArduinoUNO Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.Un PC con el entorno de Arduino correctamente instalado y configurado.
Img_3_4 Una Protoboard.
componente  8 x diodos LED.
Img_3_5  Una resistencia de 330 Ohmios.
Img_3_6  Algunos cables de Protoboard.
tienda online prometec

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.

 
  • Una variable es un contenedor que puede tomar varios valores, en nuestro caso aceptará todos los valores entre 6 y 13.
  • C++ nos exige declarar el tipo de las variables antes de usarlas. En nuestro caso usaremos el tipo entero que se escribe int para indicar que esta variables es numérica y entera, sin decimales.
  • Iremos viendo que existen otros tipos de variables. Volveremos sobre este tema en próximas sesiones.
 

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:

 
  • Una variable que ira tomando valores según una cierta regla, y a la que asignamos un valor inicial. En este caso: i = 6 .
  • El ciclo continúa mientras se cumpla esta condición. En nuestro caso mientras la i sea menor que 14, o sea hasta el 13: i <14
  • Como cambia la variable en cada iteración. En nuestro caso i++ que es pedirle a C++ que incremente en uno la variable i, al final de cada iteración.
 

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.

 
  • Nótese que la instrucción for no lleva un punto y coma al final. Esto es porque se aplica al bloque de instrucciones que le siguen entre llaves, como es el caso del loop() La iteración realiza las cuatro instrucciones que siguen a la línea del for, porque están dentro de un bloque de instrucciones.
  • Las instrucciones que se aplican a bloques de código, no llevan punto y coma al final.
  • En el caso de particular de que el bloque lleve una única línea de código, las llaves pueden ser omitidas, como en el caso de la instrucción for en la función setup() de  arriba.
 

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.

Arduino mas ocho LEDs

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.

Img_4_3

 

 
  • En general, se considera buena costumbre (la recomendamos), montar los circuitos que veamos a partir del esquema electrónico del mismo, más que a partir del diagrama de conexiones de la Protoboard.
  • La razón es que con el esquema, la comprensión del circuito es completa y se evita la tentación de copiar la práctica sin necesidad de entenderla.
  • Además, el diagrama electrónico del circuito es su completa descripción y suele resultar más sencillo comprender la función del mismo. En cambio a medida que los circuitos se hacen más complejos, comprender su función desde un esquema de Protoboard puede complicarse mucho, y peor aún llevar a una interpretación errónea.
 

 

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  Descargar:

     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) ;
                      }
         }
 
  • El primer ciclo for hace que las luces se encienda en secuencia desde la 6 hasta la 13. El segundo bucle entra a continuación empezando con la luz 12 (para no repetir la 13) y finalizando con la 7(para no repetir la 6), y vuelta a empezar.
  • En el segundo bucle hemos hecho una cuenta atrás diciéndole a la variable i que se decrcmentara en uno en cada iteración mediante la instrucción i– .
  • También nos hemos aprovechado de que C++ nos permite definir variables sobre la marcha dentro de la propia instrucción for, sin necesidad de dedicarle una línea completa a la declaración e inicialización.
 

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.

 
  • Programar es en parte aprender las instrucciones de un lenguaje (la parte fácil), y otra más difícil que es aprender a resolver los problemas de un modo que nos permita darle instrucciones a un ordenador para que lo lleve a cabo.
  • Estos procedimientos secuenciales de cómo resolver un cierto tipo de problemas es lo que se conoce como un algoritmo.
  • Según el problema que abordemos el algoritmo será más o menos complicado pero aprender a programar tiene más que ver con desarrollar esta capacidad de resolver problemas lógicos en una secuencia de pasos que podamos codificar en un ordenador.
  • Por cierto, cualquiera puede aprender a programar. No lo dudéis. Solo que como en todo, a unos les lleva más tiempo que a otros desarrollar la habilidad necesaria. Al principio muchos me dicen que les duele la cabeza de pensar en este tipo de cosas, pero os animo a continuar (poco a poco si es preciso) porque os encontrareis que vale la pena.
 

Resumen de la sesión

.

En esta sesión hemos aprendido varias cosas importantes:

 
  • La instrucción For, nos permite iterar un bloque de instrucciones tantas veces le indiquemos.
  • Hemos visto uno de los tipos de variables que C++ acepta: los enteros.
  • Hemos introducido el concepto de algoritmo, como un procedimiento secuencial para resolver un problema concreto y lo hemos aplicado a varios ejemplos de programas sencillos con luces.

 

 

 

 

 

(188) Comments

  • Hola maestro ,estoy usando el arduino mega 2560 le codigo para los 8 leds en ola puede ser asi:
    void setup() {
    int i = 0 ;
    for ( i = 6 ; i < 14 ; i++)
    pinMode( i , OUTPUT) ;

    }

    void loop()
    {
    for ( int i = 6 ; i 5 ; i–)
    {

    digitalWrite( i , LOW);
    delay (500) ;

    }
    }

    • Hola Gustavo, al copiar el código se te modifica y no hay manera de interpretarlo, pero si te funciona seguro que vale. UN saludo.

  • Hola he conseguido hacer la ola, es mi segundo día con arduino y me ha gustado mucho, pero tengo un problema, al hacer la ola todo el rato un led esta parpadeando, mientras los otros van haciendo la ola porque? También tengo que dar a uno la vuelta para que funcione( es el que se repite todo el rato. Aquí os dejó el código

    Void setup()
    {
    int i = 0 ;
    forma ( i = 6 ; i < 14 ; i++)
    pinMode( i , OUTPUT) ;
    }

    void loop()
    {
    forma ( int i = 6 ; i < 14 ; i++)
    {
    digitalWrite( i , HIGH) ;
    delay (1000) ;
    digitalWrite( i , LOW) ;
    de la y (1000) ;
    }
    }

    • Hola Jan, vigila bien las conexiones porque si das la vuelta a un LED no puede ser que se encienda.

    • Nicolás Fraternali

    Tengo un problema al querer hacer la “Ola”, solo se encienden los LED`s 6, 8, 11, 13 y los LED`s 9, 10 se prenden con muy poca intensidad. Cosa que no pasa al hacer el circuito de la seccion anterior.

    Este es el codigo:
    void setup() {
    int i = 0 ; // indico que la variable es un numero entero
    for ( i = 6 ; i < 14 ; i++)
    pinMode ( i, OUTPUT) ;

    }

    void loop()
    {
    int i = 0 ;
    for (int i = 6 ; i 6 ; i–)
    {

    digitalWrite ( i, LOW ) ;
    delay (200) ;
    }
    }

    PD: Modifique el codigo de la seccion anterior (el cual resolvi sin problema alguno)

    • Hola Nico, me suena mas a un problema de cableado

      • Me fijare, pero revise varias veces y lo tengo igual al esquema mostrado en la sesion.
        Muchas gracias!! Muy bueno todo lo que hacen

      • Ante todo muchas gracias profesor!!
        Logre hacer la ola con el siguiente codigo, pero para que los leds brillaran mas tuve que bajar el valor de la resistencia:

        void setup() {
        // put your setup code here, to run once:
        int i = 0;
        for(int i= 6; i<14; i++)
        pinMode (i,OUTPUT);

        }

        void loop() {
        int i = 0;
        for (int i = 6; i 5 ;i–) {
        digitalWrite (i, LOW);
        delay(500);
        }
        }

        • Puede ser que si tiene que encender muchos LEDs la potencia del Arduino conectado por USB se quede un poco cortita. Si lo has solucionado, estupendo. Un saludo.

    • Juan manuel

    conseguido el reto… muy buen método y muy motivador no pongo mi resultado para que ternerlo que pensar cada es muy satisfactorio resolverlo

    • Estupendo Juan Manuel. Gracias por seguirnos y un saludo.

  • Es algo así lo que buscamos no? Yo estoy utiliando 6 leds.
    void setup()
    {
    int i = 0 ; // Inicializamos la variable i como un entero
    for ( i = 8 ; i < 14 ; i++)
    pinMode( i , OUTPUT) ;
    }

    void loop() // Prog_4_2
    {
    for ( int i = 8 ; i 7 ; i–) // Definimos la variable i sobre la marcha
    {

    digitalWrite( i , LOW);
    delay (1000) ;
    }
    }

    • Hola Tone, el código se corta, no estoy muy seguro a lo que te refieres.

  • Muy buenas.
    Estoy interesado en montar un sistema de 8 salidas digitales con 8 leds, que podrian activarse varios simultaneamente. Con objeto de reducir la carga de mi arduino he pensado montar un dispositivo del tipo que se puede ver aquí:
    https://www.electrohobby.es/es/digital/149-kit-modulo-monitor-led.html?search_query=led&results=65

    donde puedo conectar el pin Vcc a 5V de una fuente externa, tiene una resistencia comun para todos los leds de 470 ohnms y luego se divide en paralelo a cada led y finalmente llega a los pines digitales de arduino desde donde pretendo controlar que se enciendan o apaguen.
    Con las instrucciones de configuración en el setup:
    pinMode(pinLedN, OUTPUT);

    y en el control del loop:
    digitalWrite(pinLedN, LOW);

    no consigo que funcione bien, porque no se pone el pin a GND, ¿por qué?, no puedo utilizar estos modulos de leds con una sola resistencia para activar varios leds simultaneamente?, me podeis ayudar citando algun tutorial que desarrolle esta idea de activar varias leds sin que soporte arduino la carga de su consumo.
    Gracias,

  • Muchas gracias por la respuesta. El proyecto que hago, fue solicitado que ocupará los 53 puertos del Arduino para controlar el cubo. Cómo la figura no daba para los 53. Fue necesario poner algunos leds en línea. Lo cual me afecta al momento de darle corriente al puerto. Ya que enciende los dos leds al tiempo. Pensé que por el código en Arduino era posible indicar a cual dar corriente. Había pensado en un potenciómetro. Pero veo que sería difícil. Mil gracias

    • Edwin

    Buenas noches, he estado pendiente de los mensajes y ayuda y veo que son muy buenos en el trabajo que hacen. Quiero saber si tal vez puedan solucionar un problema que tengo.
    Estoy haciendo un cubo de leds, resulta que debo usar los 53 puertos del Arduino mega, y por esto he tenido que unir 2 leds simultáneos. Mi pregunta es. Hay alguna forma en la que por código pueda controlar el encendido de los leds sin verme afectado que están en simultáneo y no en paralelo?. La idea es que no quiero usar un potenciómetro y eso. Gracias

    • Buenos dias Edwin
      Utilizar tantos pines directamente es un poco lio y un tanto pesado, yo te recomendaria que usases algun sistema de ayuda como por ejemplo chips del tipo shift register externos . Parece que necesitarias 8 de 8 bits que puedes cascadear, o tambien si vas a por nota podrias usar una matriz de 8×8 y seria suficiente con un par de chips aunque esto ya es un poco para nota

    • JOSE EDUARDO CASTELLANOS

    Hola, soy Eduardo Castellanos, inicié el curso ayer y no he tenido problema en realizar los ejemplos hasta ahora, intenté resolver el último problema planteado de la siguiente manera:
    //Este sketch programa que se prendan en secuencia 8 LEDs y permite que se modifique el delay con el que se prenden y apagan cada uno

    void setup()
    {
    int i = 0 ; // Inicializamos la variable i como un entero
    for ( i = 6 ; i < 14 ; i++)
    pinMode( i , OUTPUT) ;
    }

    void loop() // Prog_4_2
    {
    for ( int i = 6 ; i 5 ; i–) // Definimos la variable i sobre la marcha
    {

    digitalWrite( i , LOW);
    delay (450) ;
    }
    }
    y veo que funciona para los leds intrmedios entre los extremos, pero los leds de los extremos siempre quedan prendidos y no comprendo que esta mal en el sketch, ¿podrían decirme que esta mal? en el breadboard solo instale una resistencia de 330 ohms en serie para todos los LEDs
    Gracias, Por cierto las explicaciones me parecen claras y magníficas. Felicidades

    • Hola Jose,

      Al primer bote veo que esta linea es incorrecta
      for ( int i = 6 ; i 5 ; i–)

      puede ser i=5 o i<5

  • Hola, tengo un problema, solo se me enciende el primer led y me sale el siguiente error:

    Arduino:1.8.2 (Windows 7), Tarjeta:”Arduino/Genuino Uno”

    El Sketch usa 1000 bytes (3%) del espacio de almacenamiento de programa. El máximo es 32256 bytes.
    Las variables Globales usan 9 bytes (0%) de la memoria dinámica, dejando 2039 bytes para las variables locales. El máximo es 2048 bytes.
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x30
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x20
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x30
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x20
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x30
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x20
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x30
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x20
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x30
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x20
    Ha ocurrido un error mientras se enviaba el sketch

    Este reporte podría tener más información con
    “Mostrar salida detallada durante la compilación”
    opción habilitada en Archivo -> Preferencias.

    He revisado todo y creo que esta correcto, a ver si puedes ayudarme.
    Gracias

    • Hola Juan, has podido hacer alguna de las otras sesiones anteriores? Puede ser que no estés seleccionando el puerto COM correcto en el IDE. Un saludo.

  • Buenas tardes y primero daros las gracias por el gran trabajo de estos tutoriales. Me he puesto con el de la ola y llevo dos días y no lo consigo. El código que he hecho es este:

    void setup()
    {
    int i = 0 ;
    for ( i = 6 ; i < 14 ; i++)
    pinMode( i , OUTPUT) ;
    }

    void loop()
    {
    for ( int i = 6 ; i 5 ; i–)
    {
    digitalWrite( i , LOW);
    delay (500) ;
    }
    }

    El problema me surge en que cuando lo transfiero me funciona bien pero solo con los led 6, 8, 10 y 12. El resto no se me encienden. Alguna idea de por qué?

    • Hola Truman,

      Fijate que en este programa que me envias, solo apagas los led, no hay encendido

  • Hola muchas gracias por tu pagina.
    Quiero qe los leds se iluminen desde los dos extremos y se encuentren en el centro para luego rebotar de vuelta a su origen usando el comando for como deberia hacerlo?

    • SI usas 8 leds:

      for (int i = 4 ; i <9 ; i++)
      { encender i+1 ;
      encender 8 - i ;
      apagar todo
      }

  • Hasta yo mismo me he sorprendido de la sencillez y lo bien explicado. Me funcionó todo a la primera, incluido el problema que planteais al final del tema.

  • Hola comprendi muy bien como funciona el ciclo for para encender les, mi pregunta es como hago par que ademas del ciclo for pueda controlar los leds con un potenciometro, es decir que los les se enciendan en forma secuencial pero si muevo el potenciometro hacia adelante tambien lo haga el led

    • Hola Wilmer
      SI lo que quieres hacer es que al girar el led la luz avance o retroceda siguiendo el giro del mismo, basta con que leas el valor analogico que hay en el led, y en funcion de su valor decidas cual encender.

      Por ejemplo, la salida analogica devuelve valores entre 0 y 1024.Si tomas la parate entera de la lectura y lo divides entre digamos 100 si hay 10 leds, La parte entera te devolvera valores entre 0 y 9 que corresponden al led que deberias encender

    • Hector

    Hola buena tarde, disculpe a mi me gustaría saber como puedo levantar dos leds de una sola salida del arduino? …
    muchas gracias

    • Hola Héctor, conecta los dos leds en serie, o sea uno detrás de otro y así se encenderán ambos con una salida. Un saludo.

  • Buenas;
    Enhorabuena en primer lugar por la Web y este tutorial sobre nuestro arduino.

    Debo decir, que en esta lección me he quedado algo sorprendido, aunque parte de las dudas las he podido resolver a través de los Post que han realizado otras personas.

    Pero sigo teniendo una duda.
    ¿Me podrias explicar por qué una resistencia colocada “al final” de un circuito, es suficiente para que realice su función, en vez de poner una resistencia por cada uno de los LED, antes de cada uno de ellos?
    Mi error, probablemente parta de mi desconocimiento. Y es que yo interpreto que si la electricidad va en un sentido, al entrar en un LED lo fundiría. Es por ello que no entiendo el porqué una resistencia al final del circuito.

    Mil gracias.
    Un saludo.

    • Hola Jose María, el orden no importa, lo importante es la resistencia total que haya en cada rama del circuito. Tienes que tener presente la ley de Ohm V=IxR. Si la resistencia total es alta, bajará la intensidad, y si es demasiado baja puede subir mucho hasta quemar un componente. La misma intensidad, con el mismo valor, circulará por los Leds y por la resistencia. Un saludo.

        • Ralle

        Entonces no importa si la resistencia va antes o después del led? por lo que entendí, “ralentizara” la corriente de igual manera para el circuito, o no?

        • Efectivamente lo importante es la resistencia total de la rama del circuito.

        • Efectivamente, lo importante es la resistencia total.

      • Sito

      Hola José maría para que lo entiendas más fácil en este caso solo necesitas una resistencia porque cada vez enciendes un Led diferente, es decir es como si tuvieras 8 circuitos diferentes pero aprovechando la misma resistencia.
      No se si me explico
      En el caso que quisieras que todos los les se encenderán simultáneamente necesitarás una resistencia por Led cómo decías tu.

Give a Reply

WordPress Anti-Spam by WP-SpamShield