Jugando con la Raspberry Pi y un LED RGB

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.

Jugando con la Raspberry Pi y un LED RGB. Portada.

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,

Jugando con la Raspberry Pi y un LED RGB. LED.

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).

Jugando con la Raspberry Pi y un LED RGB. Conexiones.

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.

Jugando con la Raspberry Pi y un LED RGB. Resultado.

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.

  1. 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,

  1. GPIO.setmode(GPIO.BCM)
  2. 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.

  1. 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,

  • PPT

    Hola… Esta temática me interesa, que modelo o placa tenés?

  • Manu

    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.