KY-009

Esta placa emisora está basada en un LED tricolor SMD modelo SMD-5050-LED.

Tendríamos a grandes rasgos una placa que:
- Emisor LED triclor (rojo, verde y azul).
- El LED está conectado directamente a las patillas de la placa.

CARACTERISTICAS

Las características principales de esta placa son:
- Alto brillo de los led: 400mcd el led verde y 100mcd los led rojo y azul
- conexionado en cátodo común
- Requiere componentes externos para limitar la intensidad en cada led
- La intensidad máxima en cada led será de 20mA
- Temperatura de funcionamiento entre -25ºC y +85ºC
- La caida de tensión en cada led depende de la corriente. Para saber el dato exacto debemos consultar el Datasheet

Si queremos ver la hoja de características completa del LED, podemos consultar su datasheet


PINEADO

El pineado de esta placa es:

1 : Este pin es la entrada del color azul (B - Blue) y está conectado directamente al ánodo del diodo azul.

2 : Este pin es la entrada del color verde (G - Green) y está conectado directamente al ánodo del diodo verde.

3 : Este pin es la entrada del color rojo (R - Red) y está conectado directamente al ánodo del diodo rojo.

4 : Este pin es la entrada común de los cátodos de los tres diodos.















LED's INDICADORES

No tenemos ningún led indicador en esta placa sensora

PROBEMOS EL SENSOR KY-009

Vamos a montar en una placa protoboard el sensor KY-009 y conectarlo a un Arduino ZERO. Recordemos que este modelo de Arduino funciona a 3,3V. Tenemos que tener en cuenta esto para realizar los cálculos.

También tenemos que tener en cuenta que el Arduino ZERO tiene dos puertos de conexión. El nativo que está al lado del botón de reset y aunque podriamos usarlo sin problemas, no recibiría los datos que envíe la placa al visor serie del IDE. Para este montaje y para poder usar el visor serie y recibir los mensajes en el IDE usaremos el puerto de programación que está al lado de la toma de alimentación externa del Arduino ZERO.

NECESITAREMOS

Placa sensora KY-009

Placa protoboard pequeña

Arduino ZERO

Diodo LED verde de 3mm, resistencias que calcularemos de 220Ω y de 47Ω. Todas de 1/4W

Cableado macho-macho o hilo rígido que entre en la protoboard

Soporte AFTP para ZERO y protoboard pequeña

Cable USB corto de USB tipo A a USB micro tipo B

ESQUEMA

En es esquema podemos ver:

- La placa Arduino ZERO se encarga de alimentar la protoboard. La linea de alimentación de la protoboard en este montaje está conectada a +5V, y solo se usa para encender el led verde y su resistencia asociada e informarnos de que hay tensión.
- La placa emisora KY-009 está conectada en la protoboard y conectada mediante resistencias limitadoras (a calcular mas adelante) a los puertos de salida del Arduino ZERO.
- El pin 4 o negativo (cátodo común del diodo tricolor) está conectado a la linea de masa de la protoboard.
- La alimentación de todo el sistema se realiza a través del puerto USB
- Usaremos salidas del Arduino ZERO con la funcionalidad PWM y así poder variar la luminosidad de cada color del led.

Para calcular la resistencia R1 del LED solo tenemos que ver el voltaje que va a caer en la resistencia y dividirlo entre la intensidad que queremos que pase por el LED.
La tensión que tiene la resistencia sería el voltaje total menos el voltaje que se queda el LED rojo (aprox. 1,5V). Esto nos deja 5V-1,5V = 3,5V caen en la resistencia.
Vamos a fijar una intensidad por el LED de 15mA (suficientes para que se encienda a buen brillo un LED rojo). Tendriamos entonces una resistencia de 3,5V/0,015A = 233,33Ω
El valor mas cercano al calculado es de 220Ω (Rojo-Rojo-Marrón). Las resistencias comunes de 1/4W deberían servir, ya que la potencia disipada por nuestra resistencia será de 3,5Vx0,015A = 0,05W, valor muy por debajo de los 0,25W máximos que es capaz la resistencia de disipar.

Para calcular las resistencias limitadoras de cada entrada del led tricolor debemos consultar el datasheet del mismo y mirar el valor de la caida de tensión en cada diodo dependiendo de la corriente que pasa por él. Antes deberemos decidir la intensidad que queremos que pase, y esta será la máxima que pueden las salidas del Arduino ZERO: 7mA por cada una de ellas. Habiendo decidido este dato y consultando las imágenes que tenemos a la derecha, podemos ver que para el diodo rojo y a 7mA de corriente tenemos una caida en el diodo de aproximadamente 1,75V (apuntamos este valor para los cálculos). Igualmente para los 7mA de corriente en los diodos azul y verde tenemos una caida de 2,95V (lo apuntamos para los cálculos).
Ahora ya tenemos todos los datos para calcular las resistencias limitadoras. En el caso del led rojo tenemos que su resistencia tiene por un lado los 3,3V de la salida del Arduino ZERO y por otro la caida de su diodo de 1,75V, lo que nos da una tensión en la resistencia de 3,3-1,75 = 1,55V que dividido entre la corriente que hemos especificado al principio de 7mA o 0,007A, nos da un resultado de 221,42Ω. El valor estandar mas cercano es de 220Ω (Rojo-Rojo-Marrón).
Para las resistencias de los led azul y verde haremos lo mismo, pero la caida en los diodos es diferente. Las resistencias de estos led tienen por un lado los 3,3V de la salida del Arduino ZERO y por otro la caida de su diodo de 2,95V, lo que nos da una tensión en la resistencia de 0,35V que dividido entre la corriente que hemos especificado al principio de 7mA o 0,007A, nos da un resultado de 50Ω. El valor estandar mas cercano es de 47Ω (Amarillo-Violeta-Negro).
Ya tenemos el resultado de las resistencias de los tres colores del led:
- Entrada ROJO: 220Ω
- Entrada VERDE: 47Ω
- Entrada AZUL: 47Ω

Vamos a ver algunas imágenes mas de cerca del montaje

Detalle de la conexión de la placa emisora

Detalle de la conexión de la placa emisora

Detalle de la conexión del LED y la resistencia R1

Detalle de la conexión de la placa emisora

Detalle de la conexión de la placa Arduino ZERO

Detalle del montaje completo

PROGRAMACIÓN

¿Qué vamos a programar?, Un encendido suave de cada diodo y todas sus combinaciones. Crearemos tres arrays con los valores de encendido y apagado. Aquí como veremos en el código tenemos una limitación para hacer el programa mas sencillo, y es qué no podemos encender o apagar dos led a la vez, tenemos que ir de uno en uno. Aunque igualmente pasaremos por todas las combinaciones de colores posibles.
Otro dato importante es que tenemos que usar salidas con la función PWM activa. En nuestro caso elegimos las salidas 3, 4 y 5 del Arduino ZERO.
Configuraremos el puerto serie del Arduino para que mande mensajes al visor serie del IDE y así tengamos información en tiempo real de que está haciendo el Sketch.

Tenemos explicaciones detalladas en el código del programa para ayudarnos a entenderlo.

A continuación tenemos el código fuente del Sketch terminado para consultarlo. Se puede escribir copiándolo o descargarlo desde aquí

CÓDIGO ARDUINO
/*
 * AFPT - Arduino Fácil Para Todos
 * 
 * Prueba Arduino ZERO + KY009
 * 
 * Recordar conectar el Arduino ZERO mediante el puerto de programación, el mas cercano al led
 * de Debug. Solo a traves de este puerto podemos mandar mensajes al visor serie del IDE
 * 
 * Modulo_KY-009.ino
 * 
 * www.fantasystudios.es/arduino
 * 
 * Creado el 29 de Abril de 2020
 * Por Manuel Peláez
 * 
 */

//Pines I/O
int pin_G = 3;                  //definimos el pin de salida al LED de color verde
int pin_R = 4;                  //definimos el pin de salida al LED de color rojo
int pin_B = 5;                  //definimos el pin de salida al LED de color azul

//Arrays con los valores por los que pasaran todos los LED en los 9 bloques
int led_rojo[11] = {0,0,1,1,1,0,0,1,1,1,0};    //Valores por los que pasara el LED rojo
int led_verde[11]= {0,1,1,0,0,0,1,1,1,0,0};    //Valores por los que pasara el LED verde
int led_azul[11] = {0,0,0,0,1,1,1,1,0,0,0};    //Valores por los que pasara el LED azul
String color[11] = {"Negro","Verde","Amarillo","Rojo","Magenta",        //Nombres de los
                    "Azul","Cyan","Blanco","Amarillo","Rojo","Negro"};  //colores


//Variables del sistema
int rapidez = 10;       //valor que marca la velocidad del cambio entre los colores
int ciclo;              //variable que almacena el "ciclo" o bucle que estamos haciendo
int a;                  //variable usada en los bucles for



void setup() {
  // put your setup code here, to run once:
  pinMode(pin_G, OUTPUT);       //configuramos el pin del verde como salida digital
  pinMode(pin_R, OUTPUT);       //configuramos el pin del rojo como salida digital
  pinMode(pin_B, OUTPUT);       //configuramos el pin del azul como salida digital

  Serial.begin(9600);           //inicializo el puerto serie USB
}


void loop() {
  // put your main code here, to run repeatedly:

  /* Descripcion del programa
  Vamos a encender todos los colores disponibles funciendolos desde:
  - Negro -> Verde -> Amarillo -> Rojo -> Magenta -> Azul -> Cyan -> 
    Blanco -> Amarillo -> Rojo -> Negro
    
  ¡¡OJO!! - Este programa tiene una limitación para hacerlo mas sencillo: no se pueden
            modificar mas de un valor RGB entre cada color y el siguiente.
  */
  

  ciclo = 1;    //Empezamos en 1 para que el 0 sea en valor anterior (si empezamos en 0 da error)
  
  do {
    //Mandamos el mensaje del puerto serie dl valor de las variables y del color que toca
    Serial.print(" rojo=");
    Serial.print(led_rojo[ciclo]);
    Serial.print(" verde=");
    Serial.print(led_verde[ciclo]);
    Serial.print(" azul=");
    Serial.print(led_azul[ciclo]);
    Serial.print(" : ");
    Serial.println(color[ciclo]);


    //Codigo que comprueba si ha habido cambio en el valor a monstrar en el rojo y mira
    //si tiene que apagar o encender el rojo
    if(led_rojo[ciclo] != led_rojo[ciclo-1]) {
      if(led_rojo[ciclo]) {
        for (int a=0 ; a <=255 ; a++) {
          analogWrite(pin_R,a);
          delay(rapidez);
        }
      }
      else {
        for (int a=255 ; a >= 0 ; a--) {
          analogWrite(pin_R,a);
          delay(rapidez);
        }
      }
    }


    //Codigo que comprueba si ha habido cambio en el valor a monstrar en el verde y mira
    //si tiene que apagar o encender el verde
    if(led_verde[ciclo] != led_verde[ciclo-1]) {
      if(led_verde[ciclo]) {
        for (int a=0 ; a <=255 ; a++) {
          analogWrite(pin_G,a);
          delay(rapidez);
        }
      }
      else {
        for (int a=255 ; a >= 0 ; a--) {
          analogWrite(pin_G,a);
          delay(rapidez);
        }
      }
    }


    //Codigo que comprueba si ha habido cambio en el valor a monstrar en el azul y mira
    //si tiene que apagar o encender el azul
    if(led_azul[ciclo] != led_azul[ciclo-1]) {
      if(led_azul[ciclo]) {
        for (int a=0 ; a <=255 ; a++) {
          analogWrite(pin_B,a);
          delay(rapidez);
        }
      }
      else {
        for (int a=255 ; a >= 0 ; a--) {
          analogWrite(pin_B,a);
          delay(rapidez);
        }
      }
    }


    //codigo que solo se ejecuta si todos los valores de RGB son 0, o sea, tenemos que
    //mostrar un negro y para que delay sea igual que con los bucles IF, multiplicamos
    //el valor rapidez (usado en los bucles IF) por las 255 veces que se ejecuta. Asi
    //el tiempo que se muestra el negro es correcto (igual que los colores)
    if (led_rojo[ciclo] == 0 && led_verde[ciclo] == 0 && led_azul[ciclo] == 0) {
      delay(255*rapidez);
    }
    
    ciclo++;              //Aumentamos el valor de "ciclo" para el siguiente color
  } while (ciclo < 11);   //bucle WHILE y su condicion de repeticion. Cuando el ciclo
                          //supere la 11ª vez sale del bucle
}

CÓDIGO ARDUINO

A continuación tenemos un video con todo el proceso completo.