Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Raspberry Pi: Controllo luminosità Led con GPIOZero e PWM

Controllo luminosità di un Led su Raspberry Pi con GPIOZero e PWM.
Controllo luminosità di un Led su Raspberry Pi con GPIOZero e PWM.
Link copiato negli appunti

Nella lezione 14 abbiamo introdotto l'uso del led e imparato a pilotarlo.
In particolare abbiamo descritto l'uso dei metodi on() e off() per accendere e spegnere totalmente il led.
In questa lezione illustreremo l'uso di una tecnica chiamata PWM per controllare la luminosità di un led.

Pulse Width Modulation

Non occorre andare lontano per avere una definizione convincente, quindi, senza reinventare l'acqua calda, ecco come Wikipedia definisce l'argomento al momento in cui scriviamo questa lezione:
in elettronica e telecomunicazioni, la modulazione di larghezza di impulso (o PWM, acronimo del corrispettivo inglese pulse-width modulation), è un tipo di modulazione digitale che permette di ottenere una tensione media variabile dipendente dal rapporto tra la durata dell'impulso positivo e di quello negativo (duty cycle).

pwm

In figura è rappresentato l'andamento nel tempo dell'uscita di un piedino GPIO controllato in PWM. Come si vede l'uscita può essere allo stato logico HIGH (3.3 Volt) o allo stato logico LOW (0 Volt).
Ciò che varia è il duty cycle, cioè il rapporto percentuale, tra il tempo in cui l'uscita rimane HIGH rispetto al tempo in cui l'uscita è LOW.
Siccome la tensione viene alternata tra i due valori 0 e 3.3V possiamo calcolare quale sarà la tensione media sul piedino GPIO.
In figura tale tensione è rappresentata da una linea orizzontale.
Essa dipende direttamente dal valore del duty cycle.
Se il duty cycle è al 25% allora la tensione media, ai capi del piedino GPIO, sarà di 0.825 Volt (25% di 3.3V).
Mentre se il duty cycle è al 75% allora il valore medio sarà pari a 2.475 Volt (75% di 3.3V).
Lo stesso ragionamento si applica per qualsiasi valore di duty cycle nel range 0-100%.
Quindi, siccome la luminosità del led è proporzionale alla corrente che lo attraversa, variando la tensione ai suoi capi, con una resistenza costante, otterremo l'accensione del led con un valore d'intensità proporzionale al duty cycle.

La classe PWMLED

Un led a luminosità variabile (PWM LED), all'interno della libreria GPIOZero, appartiene alla classe dei dispositivi di Output (DigitalOutputDevice) e viene modellato da una semplice interfaccia intuitiva.
Il costruttore della classe ha la seguente sintassi:


PWMLED(pin,
active_high=True,
initial_value=0,
frequency=100,
pin_factory=None)

Andiamo a dettagliare alcuni elementi nel lista seguente.

  • pin: parametro obbligatorio di tipo integer, rappresenta il numero del pin in numerazione BCM a cui è collegato il led.
  • active_high: parametro facoltativo di tipo boolean, valore di default True, determina la modalità di collegamento del led al pin GPIO.
  • frequency: parametro facoltativo di tipo integer, valore di default 100, dichiara la frequenza in Hertz dell'onda generata sul GPIO pin.
  • pin_factory: parametro facoltativo solo per uso avanzato. Permette di specificare un GPIO pin factory differente da quella fornita da GPIOZero.

Rispetto alla classe LED, viene aggiunto un nuovo metodo che accende e spegne il led con un effetto di fade-in e fade-out:


pulse(fade_in_time=1, fade_out_time=1, n=None, background=True)

Ulteriori informazioni su quanto abbiamo appena visto sono riportate immediatamente a seguire.

  • fade_in_time: tempo in secondi per il fade-in, cioè per passare da una luminosità 0% ad una luminosità 100%.
  • fade_out_time: tempo in secondi per il fade-out, cioè per passare da una luminosità 100% ad una luminosità 0%.
  • n: numero di lampeggi, None indica un numero di lampeggi illimitato.

Led a luminosità variabile

Realizziamo un circuito simile a quello della lezione 14.

led pwm

Ecco alcuni esempi di utilizzo della classe:


from gpiozero import PWMLED
from time import sleep
from signal import pause

pwm_led1 = PWMLED(19)
pwm_led2 = PWMLED(26)

pwm_led1.value = 1
pwm_led2.value = 0

pause()

led pwm2

Come è possibile vedere in fotografia il primo led è completamente acceso mentre il secondo led è spento.
Il valore float passato al parametro value rappresenta la percentuale di luminosità del led (0 = 0%, 1 = 100%).


from gpiozero import PWMLED
from time import sleep
from signal import pause

pwm_led1 = PWMLED(19)
pwm_led2 = PWMLED(26)

pwm_led1.value = 1
pwm_led2.value = 0.1

pause()

led pwm 3

Ora il primo led è accesso con luminosità 100% mentre il secondo led con luminosità 10% (0.1).


from gpiozero import PWMLED
from time import sleep
from signal import pause

pwm_led1 = PWMLED(19)
pwm_led2 = PWMLED(26)

while True:
    for val in range(0,101):
        pwm_led1.value = val * 0.01
        pwm_led2.value = 1 - (val * 0.01)
        sleep(0.2)
    sleep(1)

In quest'ultimo esempio il primo led si accenderà gradualmente con un effetto fade-in mentre il secondo si spegnerà con un effetto fade-out.

Conclusioni

In questa lezione abbiamo introdotto il concetto di modulazione PWM e abbiamo appreso come utilizzarla con il Raspberry Pi per variare la luminosità di un led. Questo concetto è molto importante in quanto si applica in molte altre situazioni (es: controllo velocità di un motore DC).

Ti consigliamo anche