En el artículo anterior vimos como podíamos tomar una fotografía con nuestra Raspberry Pi. En este nuevo artículo, vamos a bajar un escalón mas, para poder sacar el máximo partido a nuestra Raspberry Pi. En esta ocasión vamos a trabajar con la Raspberry Pi y un LED RGB.
Lo que vamos a hacer en este nuevo capítulo es trastear con la Raspberry Pi y las entradas y salida digitales que tiene la Raspberry. Simplemente trata de asentar nuestros conocimientos sobre este dispositivo, y como podemos interactuar con ella. Se trata de habituarnos a trabajar con las entradas/salida GPIO de las Raspberry. Conocer su funcionamiento y sus posibilidades, y en base a ello, abrir nuestra mente a nuevas posibilidades, y a toda una serie de interesantes acciones, que nos permitirá interesantes aplicaciones.
La Raspberry Pi y un LED RGB.
Lo primero y antes de adentrarnos en la pequeña aplicación que vamos a realizar con la Raspberry Pi y un LED RGB, vamos a ver que es eso de las entradas/salida GPIO de la Raspberry Pi, que he comentado en la introducción.
GPIO
GPIO (General Purpose Input/Ouput), son un conjunto de pines de propósito general. Es decir, se trata de conexiones que podemos definir como de entrada o salida, según nuestras necesidades.
Es importante tener cuidado con estos pines, porque carecen de protección. Es decir, que si por ejemplo, conectamos algo que demande mucha intensidad podemos terminar por dañar la placa.
Llegados a este punto, hay que distinguir cuatro tipos de pines,
- Pines de alimentación. Que pueden ser de 5V, de 3,3V y los de tierra (GND).
- DNC (Do Not Connect). Son pines que no tienen un fin especial, y que en la Raspberry Pi 3 están marcados como GND.
- GPIO normales. Son pines configurables.
- GPIO especiales. Son pines con un funcionamiento especial. Interfaz UART, para conexiones serie TXD y RXD, y otros como SDA, SCL, MOSI, MISO. SCLK, CEO, CE1
Por ahora con esto tenemos suficiente para lo que vamos a hacer en esta primera aproximación al mundo GPIO.
LED RGB
Un LED RGB es la combinación de tres LED con los colores básicos, encapsulados en un único elemento. Este elemento dispone de 4 patillas. Tres de estas patillas se corresponden con los colores R
– rojo, G
– verde, B
– azúl. La cuarta patilla se corresponde con la tierra, GND, que es común para los anteriores.
De esta manera si alimentamos con 3.3 V una de las patillas, por ejemplo la roja, se iluminará ese LED. De la misma manera si alimentamos dos se iluminarán dos LED, con lo que veremos el color resultante de la suma de los básicos. Y, por supuesto, si encendemos el tercer LED, obtendremos el blanco.
Conectando la Raspberry Pi y un LED RGB
Como he comentado anteriormente, hay que tener cuidado, porque depende de lo que conectemos a la Raspberry Pi, la podemos dañar. En este sentido un LED soporta una intensidad de hasta 20 mA, mientras que la salida de la Raspberry Pi, soporta una intensidad de hasta 50 mA.
La caída de tensión en un LED es constante, y varía desde los 1,8V hasta los 3,8V. Estos valores son función de los compuestos con los que están hechos, y determinan el color. Así, para los rojos, verdes, amarillos o naranjas la tensión suele oscilar entre los 1,8 y los 2,1 V, mientras que para los azules, blancos y violetas la tensión puede variar desde los 3 a los 3,8 V.
Teniendo en cuenta todo esto, y partiendo de una caída de tensión de 2V en el LED, queda 1,3 V que debemos consumir en una resistencia. Teniendo en cuenta esto, junto a la limitación de los 20 mA por LED, vamos a poner una resistencia que limite la intensidad a 15 mA, para asegurarnos que todo va correctamente. Así,
V = I x R 1,3 V = 15 mA x R R = 1,3 / 0,015 = 87 ohmios
¿Que pasaría si no conectamos un LED a la Raspberry Pi sin una resistencia?. La resistencia de un LED es realmente baja. Suponiendo que la resistencia del LED fuera de 1Ω, en ese caso, la intensidad sería
I = V / R = 3,3 V / 1Ω = 3,3 A = 3300 mA >> 20 mA
No solo es superior a la intensidad que soporta el LED, sino que también es muy superior a la de los GPIO, con lo que con toda seguridad dañaríamos la Raspberry Pi.
Conectando la Raspberry Pi y un LED RGB con resistencias integradas
Una solución muy interesante, y por la que me he decantado, es la utilización de un LED RGB que lleva integradas las resistencias. De esta manera solo tenemos que preocuparnos de las conexiones.
Este LED venía en un kit de sensores para Arduino que adquirí por unos 26€. El LED RGB incluido, permite conectar tres GPIO a los canales R, G, B y el cuarto a la tierra. Según puedes ver en la siguiente imagen,
Existe una variante de Sunfounder, donde no van integradas las resistencias, con lo que es necesario añadirlas para evitarnos los problemas comentados; y otra variante también de Sunfounder, en el que en lugar de conectar el cuarto pin a tierra, se conecta a la tensión de alimentación.
Conexiones y asignación de pines entre la Raspberry Pi y un LED RGB
En el siguiente esquema puedes ver con detalle, las conexiones de la Raspberry Pi y un LED RGB. En particular tenemos que fijarnos en la numeración de pines.
Aquí hay que destacar la diferencia entre GPIO.BOARD y GPIO.BCM, que posteriormente veremos en la aplicación. Los primeros se refieren a la numeración del pin, mientras que los segundos se refieren al número del GPIO. Así en la siguiente imagen, tenemos que el pin 3 en GPIO BOARD, se corresponde con el 2 en GPIO.BCM (GPIO2).
De esta manera he hecho las siguientes conexiones,
- GPIO17 -> R
- GPIO27 -> G
- GPIO22 -> B
- GND -> GND
Esto lo he hecho con una placa de pruebas, por comodidad y porque la utilizaremos en próximos artículos, pero realmente se podría haber realizado directamente.
El programa en Python…
El programa en Python para utilizar el LED RGB es el siguiente,
#!/usr/bin/env python3 import RPi.GPIO as GPIO import time # Define los colores en modo hexadecimal COLORS = [0xFF0000, 0x00FF00, 0x0000FF, 0x00FFFF, 0xFF00FF, 0xFFFF00, 0xFFFFFF, 0xB695C0] # Establece los pines conforme a GPIO pins = {'Red': 22, 'Green': 17, 'Blue': 27} def mapea(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min def set_color(color): # calcula el valor para cada canal R, G, B R_val = (color & 0xFF0000) >> 16 G_val = (color & 0x00FF00) >> 8 B_val = (color & 0x0000FF) >> 0 # Convierte el color de 0~255 a 0 ó 1 (entero) R_val = int(mapea(R_val, 0, 255, 0, 1)) G_val = int(mapea(G_val, 0, 255, 0, 1)) B_val = int(mapea(B_val, 0, 255, 0, 1)) # asigna a cada pin el valor calculado GPIO.output(pins['Red'], R_val) GPIO.output(pins['Green'], G_val) GPIO.output(pins['Blue'], B_val) # imprime los resultados print("R_val = %s, G_val = %s, B_val = %s"%(R_val, G_val, B_val)) # quita la tensión en cada uno de los pines def reset(): for i in pins: GPIO.output(pins[i], 0) def main(): try: # Establece el modo, en este caso a los valores GPIO GPIO.setmode(GPIO.BCM) for i in pins: # configura los pines como de salida GPIO.setup(pins[i], GPIO.OUT, initial=GPIO.HIGH) reset() while True: for color in COLORS: set_color(color) time.sleep(2) reset() except Exception as e: print(e) finally: # Release resource reset() GPIO.cleanup() if __name__ == '__main__': main()
Entrando en detalle
Repasemos con detalle alguna de las líneas mas interesantes.
pins = {'Red': 22, 'Green': 17, 'Blue': 27}
Con esta línea definimos los pines con la numeración GPIO según hemos comentado anteriormente. Para ello establecemos el modo en la línea,
GPIO.setmode(GPIO.BCM)
GPIO.setup(pins[i], GPIO.OUT, initial=GPIO.HIGH)
En esta línea configuramos los GPIO
que vamos a utilizar y los definimos como de salida con el valor GPIO.OUT
.
R_val = int(mapea(R_val, 0, 255, 0, 1))
convierte el valor de 255 a 1 ó 0 que es lo único que admite (Único por ahora…).
Documentación en GitHub
Con el fin ayudarte a la hora de seguir estas publicaciones, he subido a GitHub, tanto las imágenes como el código que utilizo.
Conclusiones
Con la solución que hemos visto, obtendremos solo 8 colores 2^3. Lo cual es un poco limitado dependiendo de lo que queramos hacer. Existe otra solución que veremos en el próximo artículo, que nos da una mayor gama de colores.
Como has podido ver, aunque inicialmente parece un poco complejo, la realidad es que es muy, pero que muy sencillo. Una vez has comprendido la numeración de la Raspberry Pi, el funcionamiento de un LED RGB, y pocos detalles mas, ya lo tienes todo resuelto. Desde luego, que esto nos va a dar pie a mucho mas…
Más información,
Hola… Esta temática me interesa, que modelo o placa tenés?
Hola,
Te dejo el enlace al artículo donde comento todo lo referente a la Raspberry Pi que compré. https://atareao.es/raspberry/raspberry-pi/
Un saludo.
Estrellica al canto en el repo de GitHub. Me encantan algunos de tus post.
Saludos.
Hola Manu,
Me alegra. Ya sabes…., cualquier sugerencia es bienvenida.
Un saludo.