bclose

Los diodos LED RGB

Circuito con LED RGB

Objetivos

.

 
    • Ampliar la experiencia con los pines PWM.
    • Conocer los LED RGB.
    • Presentar la función random().

 

Material requerido.

 

 Tienda EspañaTienda Mexico
Kit Arduino Uno Kit inicio UNOKit inicio UNO
Kit Arduino MEGAKit Inicio MegaKit Inicio Mega

 

Los diodos RGB

.

 

Hasta ahora hemos usado varias combinaciones de LEDS, pero siempre de un color definido. Habitualmente los rojos y amarillos son los más fáciles de conseguir, pero se pueden comprar también en tonos azules, verdes y hasta blancos. No suele haber grandes diferencias entre ellos excepto en el color.

Pero a veces es interesante disponer de una luz piloto que cambie de color según las condiciones. Por ejemplo, todos identificamos el verde como una señal de OK, mientras que el rojo indica problemas y el amarillo… bueno pues algo intermedio.

Poner varios diodos para hacer esto es engorroso y complica el diseño, así que estaría bien disponer de un diodo al que podamos indicar que color queremos que muestre. Esto es un LED RGB.

Para quien este acostumbrado al diseño por ordenador ya está familiarizado con la idea de que podemos generar cualquier color en la pantalla con la mezcla, en diferentes grados de tres colores básicos:

     Red : Rojo

     Green: Verde

     Blue: Azul

Es decir RGB, uno de esos acrónimos que surgen continuamente en imagen, TV, etc.

Un LED RGB es en realidad la unión de tres LEDs de los colores básicos, en un encapsulado común, compartiendo el Ground (cátodo es otro nombre más para el negativo).

En función de la tensión que pongamos en cada pin podemos conseguir la mezcla de color que deseemos con relativa sencillez

 
  • Para quien haya dibujado con lápices de colores o acuarelas, las mezclas de colores de arriba les resultará extraña. Esto es porque cuando pintamos en un papel blanco, la mezcla de colores es substractiva: Si mezclamos los tres colores obtenemos negro, o por lo menos algo oscuro
  • En cambio cuando pintamos con luz directamente, la mezcla es aditiva y obtenemos blanco al mezclar los tres colores básicos. Las reglas de mezcla de color en ambos casos son opuestas.

 

Vamos a montar un pequeño circuito que nos permita gobernar el color que emite uno de éstos LEDs de RGB.

Esquema del circuito

.

esquema electrico

El montaje supone sencillamente conectar el negativo (el pin más largo) a Ground mediante una resistencia que limite la intensidad, y luego identificar los pines de colores:

 
  • El pin más largo en estos LED es el GND.
  • Al lado de GND hay dos pines a un lado y uno solitario al otro. Por lo normal el solitario es el rojo R.
  • Así pues el pin out (patillaje) de un RGB LED suele ser R, GND, G, B.

 

De todos modos conviene asegurarse leyendo las especificaciones del fabricante, o bien identificando cada PIN. Para identificarlos basta conectar el GND a nuestro Arduino e ir probando cada una de las patas independientemente para ver qué color producen.

 
  • Si tu RGB tiene una montura Keyes, no tendrás que hacer esto, porque los pines vienen marcados y GND viene rotulado como -.

 

Diagrama de conexion

 

Atención, en contra de la norma habitual, en este caso el cable rojo no indica la tensionVcc, sino el pin de gobierno del LED rojo.

En este esquema hemos utilizado los pines 9, 10 y 11. Podemos usar otros pero aseguraros de que puedan hacer PWM(los que tienen  ~) para poder poner distintas intensidades.

Programa de control RGB

 

Dado que nuestra idea es poder mezclar las tonalidades de los componentes RGB para generar diferentes matices de colores, parece buena idea escribir una función que haga esta mezcla de colores y a la que podamos recurrir de forma abstracta y práctica (además de para encapsular una utilidad curiosa, a la que podremos recurrir en futuros ejemplos y de paso insistir en el concepto de función).

Lo primero sería definir en el setup() los pines a usar:

void setup()
   {
       for (int i =9 ; i<12 ; i++)
            pinMode(i, OUTPUT);
   }

Y después podríamos escribir una función como esta

void Color(int R, int G, int B)
    {     
        analogWrite(9 , R) ;   // Red    - Rojo
        analogWrite(10, G) ;   // Green - Verde
        analogWrite(11, B) ;   // Blue - Azul
    }

De este modo tendríamos fácil llamar a Color ( 0, 255, 0) para el verde. De hecho vamos a empezar asegurándonos de que tenemos identificados correctamente los pines, escribiendo un sketch como este:

void loop()
   {    Color(255 ,0 ,0) ;
        delay(500); 
        Color(0,255 ,0) ;
        delay(500);
        Color(0 ,0 ,255) ;
        delay(500);
        Color(0,0,0);
        delay(1000);
   }

Este programa debería producir una secuencia de rojo, verde, azul, apagado y vuelta a empezar.

Conviene asegurarse de que hemos identificado correctamente los pines del RGB, porque de lo contrario, las mezclas posteriores de colores no serán lo que esperamos.

Vamos a ver como averiguar qué mezcla de RGB necesitamos para conseguir un color determinado. Para quienes uséis Windows disponéis del programa Paint incluido (en el menú de accesorios) y para quienes uséis Mac o Linux tenéis programas similares.

Si arrancáis el Paint(o equivalente) suele tener un selector de colores:

Paleta Paint

Pulsándolo aparecerá algo parecido a esto:

Calculando componentes RGB de los colores



Si vais pinchando en la zona de colores de la derecha, en la barra vertical aparecen los matices próximos al que habéis pinchado y podéis elegir el que más os guste. Debajo podéis ver la separación en RGB precisa para conseguir un tono determinado.

Así pues para conseguir ese tono de azulito de la imagen basta con que llaméis a

Color(13, 227, 201) ;
 
  • Dado que Arduino nos permite escribir valores de 0 a 255 en los pines digitales, cuando utilizamos analogWrite(), en la práctica tendremos 255 x 255 x 255 colores diferentes o lo que es igual: 16.581.375 colores posibles.
 

La función Color() que hemos creado en esta sesión es muy sencilla pero se va añadiendo a otras que hemos  ido creando en sesiones anteriores con lo que vamos haciendo una pequeña colección de ellas.

El grupo de desarrollo de Arduino ha ido creando también muchas funciones que están disponibles para incorporar en nuestros programas y que por razones de espacio resultan imposibles de ver más que muy por encima.

Solo como ejemplo introduciremos una de ellas. La función  La función random( N ) devuelve un valor al azar, comprendido entre 0 y N y en este caso, se presta especialmente bien para generar colores aleatorios en nuestro LED RGB. Probad esto:

Contenido solo disponible para suscriptores. ¡Accede al contenido!

    

Os generará un ciclo de colores aleatorios bastante psicodélico.

 

 

Resumen de la sesión

.

 

 

    • Ya conocemos la utilidad y manejo de un LED RGB.
    • Hemos insistido con la programación de los pines de Arduino como salidas analogías (PWM).
    • Hemos introducido la función random() que suele ser sorprendentemente útil en un montón de situaciones diversas.

 

 

 

 

 

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(64) Comments

  • buenas tardes
    primero que todo muchisimas gracias por su foro es demasiado bueno he aprendido muchisimo.
    tengo una inquietud sobre la generación de los colores de mi led RGB. haciendo el programa y comparando los colores del programa vs los de paint, no me dan exactos, quisiera saber si es debido a la calidad de mi led o algo del programa esta mal o que podria ser.
    muchisimas gracias

      • Ivan

      Hola Jorge, primero cerciorate que tienes bien conectado cada color, no vaya a ser que pienses por ejemplo que estás iluminando el rojo y en realidad se el azul. Por otra parte los colores no son tan perfectos como en el paint, pero si deberían parecerse bastante. Un saludo.

    • Héctor

    Si no es mucho pedir me podría ayudar con la programación completa, soy nuevo en esto, una disculpa, muchas gracias por ayudar

      • Alca3d

      Hector, yo lo he hecho de esta manera y me parece que estan todos, pero no los he contado.

      void setup()
      {
      for (int cont=9 ; cont<12; cont++)
      pinMode (cont, OUTPUT);
      }
      void loop()
      {
      for (int B=0; B<255; B++) {
      for (int G=0; G<255; G++) {
      for (int R=0; R <255; R++){
      Color (R, G, 0);
      delay (2);
      } } } }
      void Color(int R, int G, int B)
      {
      analogWrite(9 , R) ; // Red – Rojo
      analogWrite(10, G) ; // Green – Verde
      analogWrite(11, B) ; // Blue – Azul
      }

    • Héctor

    Cual seria la programación para ver los 16581375 colores??

      • Admin

      Muy facil:
      for (int R = 0 ; R<256 ; R++)
      for (int G = 0 ; R<256 ; R++)
      for (B = 0 ; B< 256 ; B++) { Color (R,G,B) ; delay ( 100); }

  • Estimado, estuve viendo el post y me resulto de mucha utilidad, yo estoy haciendo una maqueta con tiras RGB en las cuales con los pines PWM de cada color intento controlar el espectro de la luz, teniendo tanto de azul tanto de rojo, etc. Quisiera saber si ademas de controloar esa proporcion, es posible controlar la intensidad de la luz. Con un LDR controlamos que el valor de la luz permanezca siempre en el mismo valor, en LUX. Pero ademas la proporcion de colores siempre debe ser la misma. Hay alguna Forma posible de lograrlo?

      • Admin

      Hola Miguel, como un LED RGB en realidad son tres leds de difernete color el pin PWM que usamos para determinar la intensidad de cada color fija en definitiva la intensidad de cada uno de los tonos basicos.

      Si tenemos tres valores de RGB que determinan un tono de color, Para conseguir que bajemos la intensidad global, bastaria con dividir los tres valores por un mismo factor, por ejemplo, podemos multiplicar cada valor RGB por un float como 0.2f y el resultado seria un float, pero a su vez podemos forzar la conversion de ese float a int y tendriamos a cada uno de los valores inciales disminuidos un 20%, lo que en conjunto disminuiria la intensidad global en ese 20% pero creo que mantendria el tono basico de color pero mas oscuro (Espero porque no lo he probado)

      • Muchisimas gracias por responder tan rapido, ya mismo lo pruebo y confirmo si funciona

    • Francisco Javier

    Yo contaba con hacerlo como dices, a través de un número aleatorio, pero no consigo hacer el programa. Para que me lo lea.

    Seguiré probando. Gracias

    • Francisco Javier

    Hola estoy haciendo un circuito de 10 letras hechas con varios Led, cada letra es un pin de salida. Ahora e diseñado 9 programas distintos (que parpadeo, que parpadee por letras, etc…) los e juntado los 9 juegos de luces y se repiten constantemente en ciclo. Mi pregunta es si podría hacer random con los 9 juegos de luces para que salgan aleatoria mente.

      • Admin

      No veo porque no Francisco, Lo mas sencillo que s eme ocurre es que en funcion de un numero aleatorio reproduzcas una u otra de las series

        • Francisco Javier

        este es el programa que tengo, y me gustaria meterle un random en void loop

        int tiempo1 = 750;
        int tiempo2 = 3000;
        int tiempo3 = 1000;
        int tiempo4 = 500;
        int pin;
        int led = 3; //Se escoje la variable donde se controlara la intensidad
        int i,j;//Variable auxiliar para condicionales

        void setup() {
        pinMode(led, OUTPUT);//Se inicializa como OUTPUT el pin a usar. Debe ser PWM
        pinMode(4, OUTPUT);
        pinMode(5, OUTPUT);
        pinMode(6, OUTPUT);
        pinMode(7, OUTPUT);
        pinMode(8, OUTPUT);
        pinMode(9, OUTPUT);
        pinMode(10, OUTPUT);
        pinMode(11, OUTPUT);
        pinMode(12, OUTPUT);
        pinMode(13, OUTPUT);
        }

        ////////////////////////////////////////////////
        void programa_1()
        {
        delay(tiempo3);
        for(pin=4;pin<=13;pin++)
        digitalWrite(pin,HIGH);
        delay(tiempo1);
        digitalWrite(pin,LOW);
        delay(tiempo1);

        }

        //////////////////////////////////////////////
        void programa_2()
        {
        delay(tiempo3);
        digitalWrite(4,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(7,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(11,HIGH);
        digitalWrite(12,HIGH);
        digitalWrite(13,HIGH);
        delay(tiempo3);
        digitalWrite(4,LOW);
        digitalWrite(5,LOW);
        digitalWrite(6,LOW);
        digitalWrite(7,LOW);
        digitalWrite(8,LOW);
        digitalWrite(9,LOW);
        digitalWrite(10,LOW);
        digitalWrite(11,LOW);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        delay(tiempo3);

        }

        ////////////////////////////////////////////////
        void programa_3()
        {
        digitalWrite(4,HIGH);
        delay(tiempo4);
        digitalWrite(4,LOW);
        delay(tiempo4);
        digitalWrite(4,HIGH);
        delay(tiempo4);
        digitalWrite(4,LOW);
        delay(tiempo4);
        digitalWrite(4,HIGH);
        delay(tiempo3);
        digitalWrite(4,LOW);

        digitalWrite(5,HIGH);
        delay(tiempo4);
        digitalWrite(5,LOW);
        delay(tiempo4);
        digitalWrite(5,HIGH);
        delay(tiempo4);
        digitalWrite(5,LOW);
        delay(tiempo4);
        digitalWrite(5,HIGH);
        delay(tiempo3);
        digitalWrite(5,LOW);

        digitalWrite(6,HIGH);
        delay(tiempo4);
        digitalWrite(6,LOW);
        delay(tiempo4);
        digitalWrite(6,HIGH);
        delay(tiempo4);
        digitalWrite(6,LOW);
        delay(tiempo4);
        digitalWrite(6,HIGH);
        delay(tiempo3);
        digitalWrite(6,LOW);

        digitalWrite(7,HIGH);
        delay(tiempo4);
        digitalWrite(7,LOW);
        delay(tiempo4);
        digitalWrite(7,HIGH);
        delay(tiempo4);
        digitalWrite(7,LOW);
        delay(tiempo4);
        digitalWrite(7,HIGH);
        delay(tiempo3);
        digitalWrite(7,LOW);

        digitalWrite(8,HIGH);
        delay(tiempo4);
        digitalWrite(8,LOW);
        delay(tiempo4);
        digitalWrite(8,HIGH);
        delay(tiempo4);
        digitalWrite(8,LOW);
        delay(tiempo4);
        digitalWrite(8,HIGH);
        delay(tiempo3);
        digitalWrite(8,LOW);

        digitalWrite(9,HIGH);
        delay(tiempo4);
        digitalWrite(9,LOW);
        delay(tiempo4);
        digitalWrite(9,HIGH);
        delay(tiempo4);
        digitalWrite(9,LOW);
        delay(tiempo4);
        digitalWrite(9,HIGH);
        delay(tiempo3);
        digitalWrite(9,LOW);

        digitalWrite(10,HIGH);
        delay(tiempo4);
        digitalWrite(10,LOW);
        delay(tiempo4);
        digitalWrite(10,HIGH);
        delay(tiempo4);
        digitalWrite(10,LOW);
        delay(tiempo4);
        digitalWrite(10,HIGH);
        delay(tiempo3);
        digitalWrite(10,LOW);

        digitalWrite(11,HIGH);
        delay(tiempo4);
        digitalWrite(11,LOW);
        delay(tiempo4);
        digitalWrite(11,HIGH);
        delay(tiempo4);
        digitalWrite(11,LOW);
        delay(tiempo4);
        digitalWrite(11,HIGH);
        delay(tiempo3);
        digitalWrite(11,LOW);

        digitalWrite(12,HIGH);
        delay(tiempo4);
        digitalWrite(12,LOW);
        delay(tiempo4);
        digitalWrite(12,HIGH);
        delay(tiempo4);
        digitalWrite(12,LOW);
        delay(tiempo4);
        digitalWrite(12,HIGH);
        delay(tiempo3);
        digitalWrite(12,LOW);

        digitalWrite(13,HIGH);
        delay(tiempo4);
        digitalWrite(13,LOW);
        delay(tiempo4);
        digitalWrite(13,HIGH);
        delay(tiempo4);
        digitalWrite(13,LOW);
        delay(tiempo4);
        digitalWrite(13,HIGH);
        delay(tiempo3);
        digitalWrite(13,LOW);

        digitalWrite(14,HIGH);
        delay(tiempo4);
        digitalWrite(14,LOW);
        delay(tiempo4);
        digitalWrite(14,HIGH);
        delay(tiempo4);
        digitalWrite(14,LOW);
        delay(tiempo4);
        digitalWrite(14,HIGH);
        delay(tiempo3);
        digitalWrite(14,LOW);
        }

        /////////////////////////////////////////////
        void programa_4()
        {
        digitalWrite(4,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(7,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(11,HIGH);
        digitalWrite(12,HIGH);
        digitalWrite(13,HIGH);
        digitalWrite(14,HIGH);
        delay(tiempo3);
        digitalWrite(4,LOW);
        digitalWrite(5,LOW);
        digitalWrite(6,LOW);
        digitalWrite(7,LOW);
        digitalWrite(8,LOW);
        digitalWrite(9,LOW);
        digitalWrite(10,LOW);
        digitalWrite(11,LOW);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        digitalWrite(14,LOW);
        delay(tiempo3);

        digitalWrite(4,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(7,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(11,HIGH);
        digitalWrite(12,HIGH);
        digitalWrite(13,HIGH);
        digitalWrite(14,HIGH);
        delay(tiempo3);
        digitalWrite(4,LOW);
        digitalWrite(5,LOW);
        digitalWrite(6,LOW);
        digitalWrite(7,LOW);
        digitalWrite(8,LOW);
        digitalWrite(9,LOW);
        digitalWrite(10,LOW);
        digitalWrite(11,LOW);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        digitalWrite(14,LOW);
        delay(tiempo3);

        digitalWrite(4,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(7,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(11,HIGH);
        digitalWrite(12,HIGH);
        digitalWrite(13,HIGH);
        digitalWrite(14,HIGH);
        delay(tiempo3);
        digitalWrite(4,LOW);
        digitalWrite(5,LOW);
        digitalWrite(6,LOW);
        digitalWrite(7,LOW);
        digitalWrite(8,LOW);
        digitalWrite(9,LOW);
        digitalWrite(10,LOW);
        digitalWrite(11,LOW);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        digitalWrite(14,LOW);
        delay(tiempo4);

        digitalWrite(4,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(7,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(11,HIGH);
        digitalWrite(12,HIGH);
        digitalWrite(13,HIGH);
        digitalWrite(14,HIGH);
        delay(tiempo3);
        digitalWrite(4,LOW);
        digitalWrite(5,LOW);
        digitalWrite(6,LOW);
        digitalWrite(7,LOW);
        digitalWrite(8,LOW);
        digitalWrite(9,LOW);
        digitalWrite(10,LOW);
        digitalWrite(11,LOW);
        digitalWrite(12,LOW);
        digitalWrite(13,LOW);
        digitalWrite(14,LOW);
        delay(tiempo3);
        }

        //////////////////////////////////////////////
        void programa_5()
        {
        delay(tiempo3);
        for(pin=4;pin=4;pin–)
        digitalWrite(pin,HIGH);
        delay(tiempo1);
        digitalWrite(pin,LOW);
        delay(tiempo1);
        }

        //////////////////////////////////////////////
        void programa_6()
        {
        digitalWrite(4,HIGH);
        delay(tiempo1);
        digitalWrite(4,LOW);
        digitalWrite(5,HIGH);
        delay(tiempo1);
        digitalWrite(5,LOW);
        digitalWrite(6,HIGH);
        delay(tiempo1);
        digitalWrite(6,LOW);
        digitalWrite(7,HIGH);
        delay(tiempo1);
        digitalWrite(7,LOW);
        digitalWrite(8,HIGH);
        delay(tiempo1);
        digitalWrite(8,LOW);
        digitalWrite(9,HIGH);
        delay(tiempo1);
        digitalWrite(9,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(13,HIGH);
        delay(tiempo1);
        digitalWrite(13,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(9,HIGH);
        delay(tiempo1);
        digitalWrite(9,LOW);
        digitalWrite(8,HIGH);
        delay(tiempo1);
        digitalWrite(8,LOW);
        digitalWrite(7,HIGH);
        delay(tiempo1);
        digitalWrite(7,LOW);
        digitalWrite(6,HIGH);
        delay(tiempo1);
        digitalWrite(6,LOW);
        digitalWrite(5,HIGH);
        delay(tiempo1);
        digitalWrite(5,LOW);
        digitalWrite(4,HIGH);
        delay(tiempo1);

        digitalWrite(5,HIGH);
        delay(tiempo1);
        digitalWrite(5,LOW);
        digitalWrite(6,HIGH);
        delay(tiempo1);
        digitalWrite(6,LOW);
        digitalWrite(7,HIGH);
        delay(tiempo1);
        digitalWrite(7,LOW);
        digitalWrite(8,HIGH);
        delay(tiempo1);
        digitalWrite(8,LOW);
        digitalWrite(9,HIGH);
        delay(tiempo1);
        digitalWrite(9,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(13,HIGH);
        delay(tiempo1);
        digitalWrite(13,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(9,HIGH);
        delay(tiempo1);
        digitalWrite(9,LOW);
        digitalWrite(8,HIGH);
        delay(tiempo1);
        digitalWrite(8,LOW);
        digitalWrite(7,HIGH);
        delay(tiempo1);
        digitalWrite(7,LOW);
        digitalWrite(6,HIGH);
        delay(tiempo1);
        digitalWrite(6,LOW);
        digitalWrite(5,HIGH);
        delay(tiempo1);

        digitalWrite(6,HIGH);
        delay(tiempo1);
        digitalWrite(6,LOW);
        digitalWrite(7,HIGH);
        delay(tiempo1);
        digitalWrite(7,LOW);
        digitalWrite(8,HIGH);
        delay(tiempo1);
        digitalWrite(8,LOW);
        digitalWrite(9,HIGH);
        delay(tiempo1);
        digitalWrite(9,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(13,HIGH);
        delay(tiempo1);
        digitalWrite(13,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(9,HIGH);
        delay(tiempo1);
        digitalWrite(9,LOW);
        digitalWrite(8,HIGH);
        delay(tiempo1);
        digitalWrite(8,LOW);
        digitalWrite(7,HIGH);
        delay(tiempo1);
        digitalWrite(7,LOW);
        digitalWrite(6,HIGH);
        delay(tiempo1);

        digitalWrite(7,HIGH);
        delay(tiempo1);
        digitalWrite(7,LOW);
        digitalWrite(8,HIGH);
        delay(tiempo1);
        digitalWrite(8,LOW);
        digitalWrite(9,HIGH);
        delay(tiempo1);
        digitalWrite(9,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(13,HIGH);
        delay(tiempo1);
        digitalWrite(13,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(9,HIGH);
        delay(tiempo1);
        digitalWrite(9,LOW);
        digitalWrite(8,HIGH);
        delay(tiempo1);
        digitalWrite(8,LOW);
        digitalWrite(7,HIGH);
        delay(tiempo1);

        digitalWrite(8,HIGH);
        delay(tiempo1);
        digitalWrite(8,LOW);
        digitalWrite(9,HIGH);
        delay(tiempo1);
        digitalWrite(9,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(13,HIGH);
        delay(tiempo1);
        digitalWrite(13,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(9,HIGH);
        delay(tiempo1);
        digitalWrite(9,LOW);
        digitalWrite(8,HIGH);
        delay(tiempo1);

        digitalWrite(9,HIGH);
        delay(tiempo1);
        digitalWrite(9,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(13,HIGH);
        delay(tiempo1);
        digitalWrite(13,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(9,HIGH);
        delay(tiempo1);

        digitalWrite(10,HIGH);
        delay(tiempo1);
        digitalWrite(10,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(13,HIGH);
        delay(tiempo1);
        digitalWrite(13,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(10,HIGH);
        delay(tiempo1);

        digitalWrite(11,HIGH);
        delay(tiempo1);
        digitalWrite(11,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(13,HIGH);
        delay(tiempo1);
        digitalWrite(13,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(11,HIGH);
        delay(tiempo1);

        digitalWrite(12,HIGH);
        delay(tiempo1);
        digitalWrite(12,LOW);
        digitalWrite(13,HIGH);
        delay(tiempo1);
        digitalWrite(13,LOW);
        digitalWrite(12,HIGH);
        delay(tiempo1);

        digitalWrite(13,HIGH);
        delay(2000);
        digitalWrite(4,LOW);
        delay(tiempo1);
        digitalWrite(5,LOW);
        delay(tiempo1);
        digitalWrite(6,LOW);
        delay(tiempo1);
        digitalWrite(7,LOW);
        delay(tiempo1);
        digitalWrite(8,LOW);
        delay(tiempo1);
        digitalWrite(9,LOW);
        delay(tiempo1);
        digitalWrite(10,LOW);
        delay(tiempo1);
        digitalWrite(11,LOW);
        delay(tiempo1);
        digitalWrite(12,LOW);
        delay(tiempo1);
        digitalWrite(13,LOW);
        delay(tiempo1);
        digitalWrite(14,LOW);
        delay(tiempo1);
        }

        //////////////////////////////////////////////

        void programa_7(){

          • Fernando J.

          Hola Francisco Javier, sobre tu programa, lo primero que deberías hacer es usar bucles “for” en las funciones, te ahorrarás muchas líneas de código, lo que implica menos errores a la hora de escribir y tambien menos memoria usada en el micro.
          Y pasando a lo que preguntas, creo que lo podrías hacer con estructuras “if…else” o con “switch case”, en tucaso apuesto por la segunda, y usar la funcion random() para generar el número aleatorio para seleccionar las distintas funciones. Algo parecido a lo siguiente:

          void programa_1() {
          Acciones programa 1
          }
          void programa_2() {
          Acciones programa 2
          }
          .
          .
          void programa_9() {
          Acciones programa 9
          }

          void loop() {
          Int rd=random(1,10);
          switch (rd) {
          case 1:
          programa_1();
          break;
          case 2:
          programa_2();
          break;
          .
          .
          case 9:
          programa_9();
          break;
          }
          }

          Lo que te he puesto supongo que debería funcionar, no lo he probado. Está hecho a grosso modo, yo también estoy empezendo con arduino y estos tutos los encuentro muy interesantes y fáciles de entender. (Gracias admin).
          Si miras en la página de arduino verás cómo funcionan estas estructuras y además siempre puedes buscar un poco por internet.

    • Javi

    Hola, me gustan tus tutoriales y estoy aprendiendo mucho con ellos.
    Estoy intentando crear un random con varios juegos de luces, concretamente tengo 9 juegos de luces con 10 salidas, y lo que me interesaría es que haga aleatoria mente los 9 programas. ¿Se puede?

    Gracias

      • Admin

      Hola Javi no estoy eguro de lo que preguntas

  • hola, el modulo de led rgb ya trae resistencias? Seria conectarlo directamente a las pwn y 5v? Gracias

      • Admin

      Hola David, no, el modulo no suele incluir las resistencias. Tienes que comprarlas aparte

  • En realidad necesito controlar solo el color rojo , verde y azul. no necesito el pwm, y tiene q ser si o si el uno ya q necesito sacar el chip para ponerlo en una plaqueta externa. se podra hacer mediante multiplexacion?

      • Admin

      Si no necesitas tonos de color sino simplemente colores basicos, puedes hacerlo con 3 pines digitales no PWM. Puede usar un mshift register pero no ahorras pines ya que este necesita al menos 3 pines

  • hola, necesito conectar 15 led rgb a arduino uno para poder controlar los colores en cada uno en forma independiente. saque cuenta y solo podria conectar 6 contando con los puertos analogicos. hay alguna forma de poder tener mas salidas?

      • Admin

      Hola Gustavo, lo primero que se me ocurre es que uses un Mega que tendria pines suficientes, pero ten en cuenta que solo los pines PWM pueden simular señales analogicas y darte toda la variedad de tonos

    • Juan

    Hola Admin, tengo una pequeña duda. Mi diodo LED viene montado en un módulo Keyes, y me cambia de color pero cuando intento hacer uso de la función random() la verdad es que estos nos son muy intensos y prevalece una luz blanca sobre todos ellos. Los colores cambian pero no es como me lo esperaba, pensé que los colores serían más intensos.
    ¿Puede ser por el tipo de diodo que tengo?
    ¿Hay en el mercado otros diodos que muestren la luz de un color más intenso?
    Son mejores los diodos que vienen en un módulo listos para conectar a la placa o los que vienen sueltos?

    Muchas gracias como siempre por tu tiempo y ayuda.
    Saludos.

      • Admin

      Hola juan, los diodos rgb son todos parecidos y poco importa si llevan placa de montaje o estan solos. Los colores que te van a dar son poco intensos por la luz ambiente que tienes y mejoraran bastante si lo ves a oscuras.

      No obstante puedes dar cualquier color eligiendo la intensidad de cada color

    • Axel

    Saludos, muy buena página :D.
    Si quisiera conectar los LEDs RGB en paralelo, ¿ocupo escribir el código por cada uno o solo ocupo escribir el de uno y los otros lo interpretaran igual?

      • Admin

      Hola Axel, si pones los RGBs en pararlelo arduino los vera como solo uno por lo que bastara que programaes como si fuera uno, Pero ten en cuenta que cada LED consume unos 20mA y por tanto los 40 mA de un pin de Arduino UNO solo puede alimentar a un maximo de 2 en paralelo. SI requieres mas tienes que usar un transistor por ejempo o rele para garantizar suficiente corriente

  • amigo disculpa mi ignorancia,pero como se que vooltaje tiene cada pin,para cierto color?
    dices que va de 0-255 pero que con rango de 0v-5V?

      • Admin

      Hola Jose, no tienes q preocuparte del voltaje, porque si estas con un arduino a 5V, el rango de 0 a 255 de las salidas PWM representan el rango de 0 a 5V ¿Vale?
      Tienes que calcular la relacion de cada uno de los colores primarios RGB en ese rango para dar el tono q buscas que es loq ue espero haber indicado como hacer en la sesion de los RGBs

    • Alba

    Hola, muy interesante el tema, quisiera saber si es posible (y no muy complejo) conectar varios led rgb a una misma placa arduino para ser controlados por un sensor ultrasonido.
    Gracias por la respuesta

      • Admin

      No veo mucha complicacion ALba. No se que es lo que pretendes pero cada RGB va a necesitar 3 pines salvo que los pongas en paralelo

    • Pere Soler

    Pues la verdad es q no se que puede ser pero he probado de todas las maneras y nada sigue sin darme los colores q toca

    es como si un color absorviese el otro si desconecto el pin del rojo entonces se ve el verde, es mas hoy al probarlo he vuelto montar el circuito y color(255,255,0) se ve verde y al desconectar el pin del verde aparece el rojo, para q esto sucediese la unica diferencia a sido poner 3 resistencias una en cada pin en vez de una sola en GND, lo mas parecido al amarillo q saca es cuando lo conecto sin las resistencias sale un amarillo verdoso, las resistencias que he estado usando son marron negro rojo, el fallo podria estar en eso ya que no domino como medir su valor

      • Admin

      Hola Pere, en internet encontraras enseguida las tablas de colores que te indican los valores d elas resistencias y si no, comprate un tester en cualquier tienda de electronica q son baratos.

      Tu problema puede ser sencillamente que el diodo RGB este ma, te recominedo que pruebes con otro porque son habas contadas

    • Pere Soler

    Muy buenos los tutos

    Los Colores Son los mismos q los de la tabla de rbg??

    estoy poniendo el color amarillo que seria color(255,255,0) y me muestra el rojo tengo las conexiones comprobadas los colores basicos estan bien en random hace una amplia gama de colores pero si intento con algun color en especial algunos no coinciden es normal o estoy haciendo algo MAL

      • Admin

      Hola Pere, Los colores que obtienes con el RGB LED son los normales que puedes comprobar con cualquier programa de dibujo en el ordenador y ciertamente rojo seria (255,0,0) y amarillo (255,255,0) si ambas combinaciones te dan rojo yo diria que el pin G del verde tiene algun problema

    • Luis

    cordial saludo, excelente página, me estoy iniciando en arduino y me ha sido muy útil sus tutoriales, estoy tratando de hacer un juego de luces rgb, pero me gustaría añadir la opción de fading, podrían indicarme como? lo he intentado pero siempre me arroja algún error, gracias :0)

      • Admin

      Hola Luis, me alegro de que disfrutos con nosotros. ¿Con que quieres hacer el fading? ¿Con diodos RGBs, con LEDs de cierta potencia, con ….?

  • Pues el led RGB mas fácil de lo que inmaginaba.GRACIAS.

    • Fernando

    Hola, buenísimo el curso. Voy acá, lo estoy siguiendo. Felicitaciones.

    Soy informático. Una indicación: son 256x256x256 (no 255x255x255), el #000 (0x0x0) también puede ser generado.

    • Daniel

    Buenas, la patilla larga no se conecta la pin de los 5 volts??? si la conecto a gnd no funciona,

      • Admin

      Veras,lo mas habitual, es que la patilla larga sea el catodo comun (GND) de los tres diodos LED que van encapsulados en el RGB. El diodo que yo usé para el ejemplo era así y por eso se iluminan cuando pones un valor positivo de tensión en las otras patas.

      Pero tambien existen RGBs de anodo comun, lo que significaria que tendrias que conectar la pata mas larga o anodo a 5V y se ilumina cuando pones menos de 5V en los pines de Arduino.

      Necesitas saber si tu RGB es de catodo comun o d anodo comun de los tres LEDs. Espero que te sirva si no dimelo y lo volveremos a intentar

        • Baltazar

        Buenas! muchisimas gracias por el curso. Me resulta muy practico e instructivo.
        He utilizado un LED de Anodo común y para que funcione conecté el anodo a 5v y una resistencia entre las patitas RGB y los pines digitales de Arduino. El LED funciono perfectamente pero se invierten los valores ingresados, resultando por ej: R=0 (luz rojo), G=0 (luz verde) y B=0 (luz azul).

        Pude resolverlo agregando una resta en la funcion creada que invierte los valores ingresados.

        void Color(int R, int G, int B)
        {
        analogWrite(9,(255-R)); //Rojo
        analogWrite(10,(255-G)); //Verde
        analogWrite(11,(255-B)); //Azul
        }

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login