martes, 31 de enero de 2017

Controlar el color de un LED RGB con Python

En este post vamos a ver como controlar el color de un LED de tipo RGB. Estos LEDS son más complejos que los que hemos visto en los anteriores posts y permiten cambiar el color que emiten gracias a que disponen de tres "canales" (Red, Green, Blue o Rojo, Verde, Azul) con los que podemos dar más o menos intensidad a cada color y obtener una amplia gama de colores. Disponen de 4 conexiones una para cada color y una cuarta (que se identifica porque es más larga que las otras), aquí tenéis un dibujo para identificarlos


Este tipo de LED puede ser de cátodo común (el más habitual), o de ánodo común. Luego os explico como usarlos en cada uno de los casos.

Vamos a usar una placa protoboard, cables de conexión, un led RGB, tres resistencias y nuestra Raspberry Pi. Si sois nuevos os aconsejo leer los anteriores posts sobre los conectores GPIO que encontraréis en este apartado de la web Programación/GPIO.


1. Organización del circuito

En primer lugar vamos ver como nos debe quedar nuestro circuito para poder controlar el LED RGB de cátodo común. Aquí os dejo una imagen para que veáis la distribución que he usado yo. (la conexión más larga se conecta al pin GROUND)



Si disponéis de un LED RGB de ánodo común la distribución del circuito debería ser esta (el pin más largo se conecta al pin de 3,3V)


Tened en cuenta que yo uso una Raspberry Pi B+ o Raspberry Pi 3, y la distribución de los conectores GPIO puede variar respecto a otros modelos. Si tenéis dudas consultad el post anterior (Conector GPIO principios básicos), y si vuestro modelo de Raspberry Pi no está consultad la documentación oficial.

2. Código Python

Para poder controlar cada uno de los canales vamos a usar el PWM (Pulse-Width Modulation), que ya vimos en un post anterior (Controlar la intensidad de un LED con Python), pero en este caso lo aplicaremos a tres salidas de la Raspberry Pi (una para cada canal de color), de esta forma podremos controlar la intensidad de cada uno y obtener diferentes colores.

En primer lugar abrimos el IDLE de Python en nuestra Raspberry Pi (yo uso Python3), una vez abierto creamos un nuevo fichero (en el menú File-NewFile) y ponemos el siguiente código

# importamos la libreria GPIO
import RPi.GPIO as GPIO
# desactivamos mensajes de error
GPIO.setwarnings(False)
# guardamos en una variable los pines GPIO que usaremos
led_pinR=18
led_pinG=23
led_pinB=24
# indicamos el uso de  la identificacion BCM para los GPIO
GPIO.setmode(GPIO.BCM)
# indicamos que los puertos GPIO son de salida de corriente
GPIO.setup(led_pinR,GPIO.OUT)
GPIO.setup(led_pinG,GPIO.OUT)
GPIO.setup(led_pinB,GPIO.OUT)
# guardamos en una variable el valor de PWM para los GPIO
pwm_ledR=GPIO.PWM(led_pinR,500)
pwm_ledG=GPIO.PWM(led_pinG,500)
pwm_ledB=GPIO.PWM(led_pinB,500)
# iniciamos el led con longitud de pulso 0 para los GPIO
pwm_ledR.start(0)
pwm_ledG.start(0)
pwm_ledB.start(0)
# definimos una función que actualiza el pulso de los GPIO
def Led_On(duty_s_R,duty_s_G,duty_s_B):
    pwm_ledR.ChangeDutyCycle(int(duty_s_R))
    pwm_ledG.ChangeDutyCycle(int(duty_s_G))
    pwm_ledB.ChangeDutyCycle(int(duty_s_B))
# bucle que nos pide los valores de pulso de los GPIO
# y llama a la función para actualizar los colores del LED
while (True):
    # introducimos los valores de pulso para cada GPIO
    duty_s_R=input("Enter brightness R (0 to 100):")
    duty_s_G=input("Enter brightness G (0 to 100):")
    duty_s_B=input("Enter brightness B (0 to 100):")
    # llamamos a la función para actualizar el LED
    Led_On(duty_s_R,duty_s_G,duty_s_B)
    # esta linea indica que hay que hacer Intro para volver
    # a poner los valores
    input("Pulse Intro para introducir nuevos valores...")
atención si usáis Python2 tendréis que sustituir el comando input por raw_input

guardamos el archivo en una ubicación conocida (en el menú File-Save As) y si es necesario apuntad la ruta, para utilizarla más tarde.

Podemos ejecutar directamente este pequeño programa presionando la tecla F5 (o en el menú Run-RunModule)

Si todo es correcto se abre una ventana de IDLE de python y empeza la ejecución, si usáis un LED de cátodo común el LED inicialmente estará apagado. Introduciremos el valor 100 y presionamos Intro, introducimmos el valor 0 y presionamos Intro, introducimos el valor 0 y presionamos Intro, el LED debería iluminarse con el color Rojo. para volver a introducir los valores presionad Intro.

Si usáis un LED de ánodo común inicialmente el LED se encenderá con los tres colores ya que en este caso 0 es el máximo valor y 100 es el mínimo valor.

Probad diferentes valores a ver que colores sois capaces de conseguir. Hasta pronto!

6 comentarios:

  1. estube revisando ese script y funciona. gracias
    pero note que esta escrito para led con catodo comun no para anodo

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. podrías subir el código para ánodo común?

    ResponderEliminar
    Respuestas
    1. En principio el código es el mismo, solo hay que cambiar los valores de intensidad brightness (de 100 a 0) para que funcione

      Eliminar
  4. Buenos días.
    Tengo duda sobre la elección de la resistencia.
    Si en el LED RBG, tenemos estos valores:
    VF [2] Forward Voltage
    - Hyper Red 1.95 (Typ) 2,5 (Max)
    - Blue 3.3 (Typ) 4 (Max)
    - Green 3.3 (Typ) 4,1 (Max)
    Y V IF=20mA.
    Preguntas.
    - Si se utiliza la salida de 3,3v no necesitaría protección para Blue y Green y una resistencia de 40 Ohm para Red. ¿Es correcto?
    - Si se utiliza la salida de 5v, serían necesarias 50 Ohms para BLue y Green y 125 Ohm para Red. ¿Es correcto?
    Muy interesante el post.
    Gracias.
    Un saludo.

    ResponderEliminar
    Respuestas
    1. al final de ese post añadí las resistencias que uso yo en función del tipo de LED:
      https://frambuesa-pi.blogspot.com/2016/11/controlar-un-led-con-python-parte-1.html

      Eliminar