Pin PWM in MicroPython: programmarli con semplici passi

In questa guida andremo a programmare sulla nostra LOLIN32 LITE con chip ESP32 i pin PWM, modificando l’intensità di luminosità di un LED tramite un potenziometro. Vi ricordiamo che, per lavorare in MicroPython, occorrerà installare sulla vostra ESP32, o altra dev-board, l’apposito firmware che abbiamo già visto in questo ARTICOLO.

Collegamenti

Per questo esempio ci serviranno, oltre alla nostra Lolin32 LITE, un LED, un resistore da 330Ω, una breadboard e un potenziometro da 10KΩ.

PWM

Iniziamo collocando la dev-board sulla breadboard, poi colleghiamo il potenziometro rotativo adoperando il pin centrale per connetterlo al pin 35 della Lolin32 Lite. Per la tensione da fornire, connetteremo il potenziometro ai 3,3V. Il Led va connesso all’anodo al pin digitale 5 tramite il resistore. Collegheremo sia il terminale a destra del potenziometro, sia il catodo del Led al GND della Lolin32 Lite.

Codice

Il codice che andiamo ad analizzare lo potete scaricare a questo LINK. Iniziamo come sempre includendo il modulo machine e importare le classi Pin e ADC per utilizzare, rispettivamente, i pin digitali e quelli analogici. Importiamo anche la classe PWM, utile per la gestione dell’omonimo pin. Infine, includiamo il modulo time e la classe sleep_ms per il timer stoppante in millisecondi.


from machine import Pin, PWM, ADC
from time import sleep_ms

Dichiariamo ora l’oggetto per la gestione del led, che chiameremo proprio led, indicando il pin a cui è connesso (5) e la frequenza (5000). La frequenza, espressa in hertz, può essere un valore compreso tra 0 e 78125. È possibile utilizzare una frequenza di 5000 Hz per controllare la luminosità del LED, in modo da creare l’effetto a dissolvenza.


led = PWM(Pin(5), 5000)


Andiamo a creare un oggetto che chiameremo sensor, il quale sarà adoperato per ricevere il segnale analogico al pin 35. Tale segnale avrà un valore compreso tra 0 e 4095, che corrisponde all’intervallo compreso tra gli 0 e i 3,3V, che abbiamo identificato, quando abbiamo parlato del segnale analogico, con il nome di attenuazione.


sensor = ADC(Pin(35))
sensor.atten(ADC.ATTN_11DB)

Apriamo il nostro ciclo infinito while True, leggiamo il valore analogico dal pin.


while True:
valore = sensor.read()

Convertiamo il segnale analogico su ESP32 in un segnale traducibile per controllare la luminosità del led. Definiamo come segnale la nuova variabile creata dalla conversione della variabile valore, i cui valori di minimo e massimo sono 0 e 4095, in una nuova variabile con valore minimo 0 e massimo 1023.


segnale = (int) (valore * vmaxo / vmaxi)

Stampiamo su shell la variabile valore.


print(valore)

Infine, facciamo variare la luminosità del led ad ogni variazione del segnale analogico, grazie alla funzione duty(). Essa permette di adoperare valori compresi tra 0 e 1023, ragion per cui abbiamo dovuto convertire un segnale in un valore leggibile dalla stessa funzione. Vedremo il led accendersi o spegnersi gradualmente, in base alla rotazione del potenziometro.


led.duty(segnale)
sleep_ms(5)

Carichiamo lo sketch e ruotiamo il potenziometro; durante la rotazione vedremo il led accendersi o spegnersi gradualmente.

PWM