Si dice che un LED diventi sempre più luminoso e sempre più scuro. (Chiamato anche"fade", dal verbo inglese to fade = svanire, diminuire). Vorremmo implementare questo fenomeno con la cosiddetta modulazione di ampiezza degli impulsi. Puoi trovare maggiori informazioni sulla modulazione dell'ampiezza degli impulsi su Raspberry Pi qui sotto.
Nella prima fase, daremo un'occhiata allo schema del circuito.
Lo schema del circuito: LED pulsante su Raspberry Pi (PWM)
Per variare la luminosità di un LED, non è sufficiente variare la tensione. A causa del design (diodo!), è necessaria una certa tensione minima; questa cosiddetta tensione di andata è compresa tra circa 1,6 e circa 3 V, a seconda del colore del LED. Al di sopra di questa tensione, il LED diventa conduttivo e la corrente è limitata da una resistenza in serie. Quindi, a differenza delle lampade a incandescenza, la luminosità non è regolata dal livello di tensione. Tra l'altro, i pin GPIO forniscono esattamente 3,3V.
Il rimedio è la modulazione di larghezza degli impulsi (PWM). In questo modo la tensione continua viene attivata e disattivata ad alta frequenza. L'energia totale trasmessa è determinata dal rapporto tra il duty cycle e la durata totale di un ciclo. Il ciclo di lavoro può essere compreso tra 0 e 100%.
Su Raspberry Pi, puoi utilizzare il PWM software su tutti i pin GPIO. Ma ci sono anche due speciali pin PWM hardware. Andiamo!
Il primo codice del programma: LED a impulsi su Raspberry Pi con modulazione di larghezza di impulso
# Iniziamo importando i moduli del programma
import RPi.GPIO as GPIO # Attenzione: nota la notazione: piccola i
importare tempo
GPIO.setmode(GPIO.BCM) # Impostiamo la modalità su BCM
LED=23 # La parola "LED" ora sta per il numero "23".
GPIO.setup(LED,GPIO.OUT) # "LED" (pin 23) è un'uscita.
Dimmer = GPIO.PWM(LED,100) # Impostiamo il LED come PWM con una frequenza di 100
Dimmer.start(0) # Dimmer avviato
# Il ciclo inizia qui
try:
while True: #while loop in modo che il programma venga eseguito continuamente
per dc in range(0,101,5): # Esegui un loop del ciclo di funzionamento a passi di 5.
Dimmer.ChangeDutyCycle(dc) # Cambia il ciclo di funzionamento del dimmer.
time.sleep(0.1) # Aspetta 0.1 secondi.
for dc in range(100,-1,-5): # Esegui un loop del ciclo di funzionamento apassi di -5.
Dimmer.ChangeDutyCycle(dc) # Cambia il ciclo di funzionamento del dimmer.
time.sleep(0.1) # Aspetta 0.1 secondi.
except KeyboardInterrupt: # Con CTRL+C interrompiamo il programma
print ("Finito") # Scrivi "Finito" nella finestra della shell
Dimmer.stop() # Arresta il dimmer.
GPIO.cleanup() # Termina il programma.
In questo esempio impariamo a conoscere un'altra forma di ciclo:
il ciclo for. Anche questa riga di comando termina con i due punti seguiti dall'indentazione delle righe da ripetere.
La variabile dc (per il ciclo di lavoro) viene incrementata nell'intervallo 0 fino a 101 escluso, con incrementi di cinque:
for dc in range(0,101,5):
Il secondo ciclo for conta all'indietro da 100 a -1 per -5:
for dc in range(100,-1,-5):
Il codice del secondo programma: LED a impulsi su Raspberry Pi con modulazione di larghezza di impulso con comando gpiozero
# Iniziamo importando i moduli del programma
da gpiozero importa PWMLED
importare tempo
pwmled = PWMLED(23) # parametro opzionale frequenza=xxx (default 100)
# Il ciclo iniziaqui
prova:
while True: # ciclo while in modo che il programmavenga eseguito continuamente
per dc in range(0,101,5): #Incrementa il tasgrade a passi di 5.
pwmled.value = (dc/100) # Cambia il duty cycle (tra 0 e 1) del dimmer.
time.sleep(0.1) # Aspetta 0.1 secondi.
per dc in range(100,-1,-5): # Conta alla rovescia il ciclo di funzionamento a passi di -5.
pwmled.value = (dc/100) #Cambia il ciclo di funzionamento (tra 0 e 1) del dimmer.
time.sleep(0.1) # Aspetta 0.1 secondi.
except KeyboardInterrupt: # Con CTRL+C interrompiamo il programma
print ("Finito") # Scriviamo"Finito" nella finestra della shell
# pwmled.value = 0 # Primo metodo percancellare il LED al termine del programma
pwmled.close() # 2°metodo per cancellare ilLED alla fine del programma
In generale, il codice del programma è più snello con gpiozero.
Nota bene: Il ciclo di lavoro è compreso tra 0 e 100%. Mentre l'argomento per il ciclo di lavoro in RPi.GPIO è il valore %, gpiozero si aspetta che il valore sia un numero in virgola mobile ( ) compreso tra 0,0 e 1,0, cioè 0,5 invece di 50 [%].