Leds con Raspberry Pi

La idea del proyecto es generar una señal de onda cuadrada a través de los pines GPIO de la Raspberry que encenderá y apagará unos LEDs a una velocidad que el ojo humano no puede apreciar (por encima de 50Hz) y poco a poco incrementará o disminuirá su intensidad variando la duración del ciclo de trabajo.

Es el mismo principio que usaban las antiguas pantallas CRT (de tubo).

Como recordarás el ciclo de trabajo es el porcentaje de tiempo que la señal esta como ‘ON’. Si variamos este porcentaje de tiempo podremos controlar la intensidad de los LEDs.

Un valor de 0 en el ciclo de trabajo significa que el LED estará completamente apagado, un valor de 100 hará que esté totalmente encendido, o al menos eso creerá tu ojo ya que el LED solo se encuentra encendido una parte del tiempo, cuando la onda esta ‘ON’.

Esquema de montaje y componentes

El esquema de montaje es muy sencillo y lo haremos con dos LEDs, solo tenemos que conectar un pin GND de la Raspberry Pi al protoboard y pinchar los 2 LEDs en los pines 24 y 25 con dos resistencias de 330 Ohm o superior en medio para proteger el circuito, todo lo demás se controla vía software.

Aquí tenéis el esquema del circuito:

Como controlar un LED con Raspberry Pi y PWM

Script Python para el control de LEDs con PWM

Con este script lo que haremos será iniciar un bucle que cambia los ciclos de trabajo de los LEDs, de forma que cuando uno está al 100% (completamente encendido), el otro estará al 0% (completamente apagado).

Ese bucle estará funcionando hasta que se pulse CTRL+C ya que el bucle ‘while True‘ está dentro de un bloque ‘try: … Except KeyboardInterrupt‘ que detendrá los LEDs y limpiará los puertos GPIO que hemos abierto al salir. El código del script es el siguiente, esta comentado para que lo interpretéis mejor:

import RPi.GPIO as GPIO # Cargamos la libreria RPi.GPIO 
from time import sleep # cargamos la función sleep del módulo time 
 
GPIO.setmode(GPIO.BCM) # Ponemos la Raspberry en modo BCM 
 
GPIO.setup(25, GPIO.OUT) # Ponemos el pin GPIO nº25 como salida para el LED #1 
GPIO.setup(24, GPIO.OUT) # Ponemos el pin GPIO nº24 como salida para el LED #2 
 
white = GPIO.PWM(25, 100) # Creamos el objeto 'white' en el pin 25 a 100 Hz 
red = GPIO.PWM(24, 100) # Creamos el objeto 'red' en el pin 24 a 100 Hz 
 
white.start(0) # Iniciamos el objeto 'white' al 0% del ciclo de trabajo (completamente apagado) 
red.start(100) # Iniciamos el objeto 'red' al 100% del ciclo de trabajo (completamente encendido) 
 
# A partir de ahora empezamos a modificar los valores del ciclo de trabajo
 
pause_time = 0.02 # Declaramos un lapso de tiempo para las pausas
 
try: # Abrimos un bloque 'Try...except KeyboardInterrupt'
 while True: # Iniciamos un bucle 'while true' 
 for i in range(0,101): # De i=0 hasta i=101 (101 porque el script se detiene al 100%)
 white.ChangeDutyCycle(i) # LED #1 = i
 red.ChangeDutyCycle(100 - i) # LED #2 resta 100 - i
 sleep(pause_time) # Pequeña pausa para no saturar el procesador
 for i in range(100,-1,-1): # Desde i=100 a i=0 en pasos de -1 
 white.ChangeDutyCycle(i) # LED #1 = i
 red.ChangeDutyCycle(100 - i) # LED #2 resta 100 - i 
 sleep(pause_time) # Pequeña pausa para no saturar el procesador 
 
except KeyboardInterrupt: # Se ha pulsado CTRL+C!!
 white.stop() # Detenemos el objeto 'white'
 red.stop() # Detenemos el objeto 'red'
 GPIO.cleanup() # Limpiamos los pines GPIO y salimos