Se dice que un LED se vuelve pulsantemente más brillante y más oscuro. (También se llama"desvanecer", por el verbo inglés to fade = desvanecerse, disminuir). Nos gustaría ponerlo en práctica con la llamada modulación por ancho de pulso. A continuación encontrarás más información sobre la modulación por ancho de pulso en la Raspberry Pi.
En primer lugar, echaremos un vistazo al esquema del circuito.
El esquema del circuito: LED pulsante en la Raspberry Pi (PWM)
Para variar el brillo de un LED, no basta con variar la tensión. Debido a su diseño (¡diodos!), se requiere una tensión mínima determinada; esta denominada tensión de avance se sitúa entre 1,6 y 3 V aproximadamente, dependiendo del color del LED. Por encima de esta tensión directa, el LED se vuelve conductor y la corriente está limitada por una resistencia en serie. Por tanto: a diferencia de las lámparas incandescentes, el brillo no se regula por el nivel de tensión. Por cierto, los pines GPIO sólo suministran exactamente 3,3 V.
El remedio en este caso es la modulación por ancho de pulsos (PWM). Esto activa y desactiva la tensión continua con alta frecuencia. La energía total transmitida viene determinada por la relación entre el ciclo de trabajo y la duración total de un ciclo. Este ciclo de trabajo puede estar entre 0 y 100%.
En la Raspberry Pi, puedes utilizar el PWM por software en todos los pines GPIO. Pero también hay dos pines PWM hardware especiales. ¡Vamos allá!
El primer código de programa: LED pulsante en la Raspberry Pi con modulación por ancho de pulsos
# Empezamos importando los módulos del programa
import RPi.GPIO as GPIO # Atención: Fíjate en la notación: i pequeña
importar tiempo
GPIO.setmode(GPIO.BCM) # Establecemos el modo a BCM
LED=23 # La palabra "LED" representa ahora el número "23".
GPIO.setup(LED,GPIO.OUT) # " LED" (pin 23) es una salida.
Dimmer = GPIO.PWM(LED,100) # Configuramos el LED como PWM con una frecuencia de 100
Dimmer.start(0) # Se iniciael Dimmer
# El bucle comienza aquí
prueba:
while True: #buclewhile para que el programa se ejecute continuamente
for dc in range(0,101,5): # Haz un bucle con el ciclo de trabajo en pasos de 5.
Dimmer.ChangeDutyCycle(dc) # Cambia el ciclo de trabajo del dimmer.
time.sleep(0,1) # Espera 0,1 segundos.
for dc in range(100,-1,-5): # Recorre el ciclo de trabajo enpasos de -5.
Dimmer.ChangeDutyCycle(dc) # Cambia el ciclo de trabajo del regulador.
time.sleep(0.1) # Espera 0.1 segundos.
except InterrupciónTeclado: # Con CTRL+C interrumpimos el programa
print ("Finalizado") # Escribe "Finalizado" en la ventana del intérprete de comandos
Dimmer.stop() # Detén el dimmer.
GPIO.cleanup() # Finaliza el programa.
En este ejemplo conocemos otra forma de bucle:
el bucle for. Esta línea de comandos también termina con dos puntos seguidos de la sangría de las líneas que se van a repetir.
La variable dc (de ciclo de trabajo) se incrementa en elintervalo de 0 hasta 101, excluido, en incrementos de cinco:
for dc in range(0,101,5):
El segundo bucle for cuenta hacia atrás desde 100 hasta -1 en -5:
para dc en rango(100,-1,-5):
El segundo código del programa: LED pulsante en Raspberry Pi con modulación por ancho de pulso con el comando gpiozero
# Empezamos importando los módulos del programa
from gpiozero import PWMLED
import tiempo
pwmled = PWMLED(23) # parámetro opcional frecuencia=xxx (por defecto 100)
# El bucle comienzaaquí
prueba
while True: # bucle while para que el programase ejecute continuamente
for dc in range(0,101,5): #Incrementa el tasgrado en pasos de 5.
pwmled.value = (dc/100) # Cambia el ciclo de trabajo (entre 0 y 1) del regulador de intensidad.
time.sleep(0,1) # Espera 0,1 segundos.
para dc en rango(100,-1,-5): # Cuenta hacia atrás el ciclo de trabajo en pasos de -5.
pwmled.value = (dc/100) #Cambia el ciclo de trabajo (entre 0 y 1) del regulador.
time.sleep(0.1) # Espera 0.1 segundos.
except InterrupciónTeclado: # Con CTRL+C interrumpimos el programa
print ("Finalizado") # Escribe"Finalizado" en la ventana del intérprete de comandos
# pwmled.value = 0 # 1er método paraborrar el LED al final delprograma
pwmled.close() #2º método para borrar elLED al final del programa
En general, el código del programa es más sencillo con gpiozero.
Tenlo en cuenta: El ciclo de trabajo está entre 0 y 100%. Mientras que el argumento para el ciclo de trabajo en RPi.GPIO es el valor %, gpiozero espera el valor como un número de coma flotante (número ) entre 0,0 y 1,0, es decir, 0,5 en lugar de 50 [%].