Continuando con el tema de los LED RGB, que comenzamos en el artículo anterior, vamos a avanzar un paso mas. El problema, de lo que vimos anteriormente, es que únicamente nos permitía mostrar hasta 8 colores. Sin embargo, lo suyo sería poder mostrar una mayor gama de colores aprovechando la combinación de los tres leds integrados en un LED RGB.
¿Como hacer esto? Para mostrar una mayor gama de colores con un LED RGB, utilizando solo salidas digitales, se utiliza el brillo de cada uno de los LED. De esta forma podemos dar mas o menos brillo a cada uno de los tres colores principales, rojo, verde y azul, y obtener un color combinado.
Para modificar el brillo de los LED se utiliza PWM. ¿Que es esto de PWM y como podemos utilizarlo para modificar el brillo, y obtener una mayor gama de colores?
Mas de 8 colores con un LED RGB y la Raspberry Pi
Modulación por ancho de pulso
En el artículo anterior, donde solo llegamos a obtener 8 colores, lo que hacíamos era asignar una tensión a uno o varios led en función del color que quisieramos obtener.
La tensión es siempre constante, tanto en su magnitud como en el tiempo, correspondiente con la tensión de salida de la Raspberry Pi, que puede ser de 3,3V o de 5V. Con el valor de la tensión no podemos jugar, es decir, o utilizamos 3,3V ó 5V, sin opción de modificarla.
Sin embargo, si que podemos modificar cuanto tiempo tenemos asignada la tensión a un pin. Es decir, podemos encender y apagar nuestra tensión, continuamente, lo que dará la impresión de que estamos variando la intensidad del led.
Como ves en la gráfica superior izquierda hemos dado un solo pulso, sin embargo, en el justo de la derecha hemos dado dos pulsos, variando el ancho de estos pulsos. En los dos inferiores, todavía hemos disminuido mas el ancho de cada uno de los pulsos. Esto lo que hace es que el led tenga tensión durante mas o menos tiempo, y dará la sensación de mas o menos intensidad.
Utilizando PWM y RPi.GPIO
Ahora, una vez que ya tenemos mas o menos claro como podemos variar el brillo de cada uno de los led de nuestro LED RGB, vamos a verlo desde el punto de vista de la programación en Python. Para ello utilizaremos el objeto PWM
.
El objeto PWM
se define en base a un número de pin y a una frecuencia. Este objeto lo definiremos para cada uno de los colores, rojo, verde y azul. Y le asignaremos a los tres la misma frecuencia.
Pero, ¿que frecuencia le tenemos que asignar? La frecuencia debe ser tal que no se note que el led parpadea. Así por ejemplo, si asignamos 10 Hz al rojo, veremos claramente que este parpadea, como puedes ver en el siguiente vídeo.
Mientras que si aumentamos por encima de los 50 Hz dejaremos de notarlo, al menos la mayoría de nosotros (hay quien es mas sensible a estas cosas, yo a 50 Hz ya no notaba absolutamente ningún parpadeo). En el siguiente vídeo, puedes verás que el efecto del parpadeo a 100 Hz no ses apreciable,
Así para inicializar nuestro led, haremos lo siguiente,
self.led = {} self.led['red'] = GPIO.PWM(pin_red, FRECUENCY) self.led['green'] = GPIO.PWM(pin_green, FRECUENCY) self.led['blue'] = GPIO.PWM(pin_blue, FRECUENCY)
Lo he definido como un diccionario para mi comodidad, pero se podría hacer de cualquier otra forma, por supuesto.
El siguiente paso es dar un ancho inicial del pulso. En principio, nosotros le asignaremos un ancho cero,
for color in self.led: self.led[color].start(0)
A partir de aquí ya podemos asignar colores. Para ello asignaremos un brillo a cada uno de los led, con un valor que irá de 0 a 100. Utilizando la misma función mapea
que vimos en el artículo anterior. Para asignar el ancho del pulso utilizaremos el método ChangeDutyCycle
. Así en nuestro caso,
self.led['red'].ChangeDutyCycle(R_val) self.led['green'].ChangeDutyCycle(G_val) self.led['blue'].ChangeDutyCycle(B_val)
Por último, cuando hayamos terminado de hacer el trabajo, nos queda parar estos pines…
for color in self.led: self.led[color].stop()
Colores
En el código fuente, encontrarás unos 140 colores aproximadamente, indicando el nombre del color y su correspondiente código hexadecimal. Cuando ejecutes la aplicación, verás que cada dos segundos el LED RGB cambia de color, y en el terminal aparecerá el nombre del color, también aparece la composición en tanto por ciento.
Documentación en GitHub
Al igual que he en otros artículos, y con el fin de ayudarte a seguir estas publicaciones, puedes encontrar el código fuente del uso de un LED RGB en GitHub. Igualmente puedes, encontrar el esquema de cableado utilizado, que está en el artículo anterior.
Conclusiones
Se trata de una aproximación, espero que sencilla e inteligible, de la modulación de ancho de pulso, que nos permite simular una salida analógica, o algo parecido. Tengo que decir, que desde mi punto de vista, la mezcla de colores en un único LED RGB, deja bastante que desear. Supongo que cuando tienes, decenas, cientos o miles de ellos, el resultado es mucho mejor. De cualquier forma, lo mas interesante es que lo pruebes, y experimentes por ti mismo, tanto los diferentes colores, como que juegues con la frecuencia.
En el próximo artículo vamos a dar un salto cualitativo en esto de las entradas y salidas. Vamos a pasar de entradas y salidas digitales a entradas y salidas analógicas, lo que nos permitirá interactúar con otros dispositivos, y sacarle mas partido a nuestra Raspberry Pi.
Más información,