Come controllare la luminosità di due LED indipendenti tramite segnale PWM regolato da due potenziometri con ESP32 e PlatformIO

Introduzione

Il controllo della luminosità dei LED (per esempio per mezzo di potenziometri) è un elemento fondamentale nella progettazione di sistemi elettronici e nel campo dell’Internet of Things (IoT). Grazie alla tecnologia PWM (Pulse Width Modulation), è possibile regolare la luminosità di un LED in modo preciso e controllato. In questo articolo, esploreremo come utilizzare l’ESP32, una potente scheda di sviluppo IoT, insieme all’ambiente di sviluppo PlatformIO, per controllare la luminosità di due LED indipendenti in base alla lettura di due potenziometri indipendenti.

Utilizzeremo PlatformIO come ambiente di sviluppo, che offre un’interfaccia semplice e professionale per sviluppare progetti basati su microcontrollori come l’ESP32. Sfrutteremo le funzionalità avanzate dell’ESP32, tra cui il supporto per il segnale PWM, per creare un sistema di controllo della luminosità dei LED che rispondano alle variazioni dei potenziometri.

Attraverso passi chiari e dettagliati, impareremo come collegare i potenziometri all’ESP32, acquisire i valori dei potenziometri utilizzando gli ingressi analogici dell’ESP32 e utilizzare il segnale PWM per regolare la luminosità dei LED in base ai valori letti. Vedremo anche come configurare correttamente PlatformIO per lo sviluppo del progetto e come scrivere il codice necessario per implementare il controllo della luminosità.

Che tu sia un principiante nel mondo dell’elettronica o un esperto sviluppatore IoT, questo articolo ti guiderà passo dopo passo nel processo di creazione di un sistema di controllo della luminosità di sistemi a LED, offrendoti una solida base di conoscenze per esplorare ulteriori progetti e applicazioni nel campo dell’elettronica e dell’IoT.

Preparati quindi ad immergerti nel mondo dell’elettronica e a sfruttare le potenzialità dell’ESP32 e di PlatformIO per creare un sistema di controllo versatile e personalizzabile per la luminosità dei LED.

Di quali componenti abbiamo bisogno?

La lista dei componenti non è particolarmente lunga:

  • una breadboard per connettere la NodeMCU ESP32 agli altri componenti
  • alcuni fili DuPont (maschio – maschio, maschio – femmina, femmina – femmina)
  • due potenziometri da 22kΩ (in realtà il valore non è critico, potrebbero essere anche da 10kΩ) preferibilmente a variazione lineare
  • due resistori da 100Ω
  • due LED rossi
  • e, ovviamente, una NodeMCU ESP32 !

Cosa sono e come funzionano i potenziometri?

Un potenziometro, anche conosciuto come resistenza variabile, è un componente elettromeccanico che consente di regolare la resistenza elettrica all’interno di un circuito. È costituito da un corpo cilindrico o rettangolare con un alberino di regolazione e tre terminali: uno centrale e due estremi. Il potenziometro è dotato di un cursore, meccanicamente solidale con l’alberino, che si muove lungo una pista resistiva all’interno del corpo. La posizione del cursore determina la resistenza elettrica tra il terminale centrale e uno dei terminali estremi.
Il funzionamento del potenziometro si basa sul principio della resistenza variabile. Quando il cursore viene spostato lungo la pista resistiva, la lunghezza del percorso attraverso il quale il segnale deve passare cambia, alterando così la resistenza complessiva. Ciò influisce sulla quantità di corrente che può fluire tra il cursore e uno dei due terminali laterali. Quando il cursore è vicino a uno dei terminali estremi, la resistenza tra il cursore e l’altro terminale è massima, mentre la resistenza tra il cursore e il terminale laterale più vicino è minima (praticamente nulla).
Un potenziometro può essere utilizzato per vari scopi, come regolare il volume di un amplificatore audio, la luminosità di un display o la velocità di un motore. La sua versatilità deriva dalla possibilità di controllare in modo continuo il valore di resistenza all’interno di un circuito, offrendo un’ampia gamma di regolazione.
Esistono diverse tipologie di potenziometri, tra cui potenziometri lineari e logaritmici. Nei potenziometri lineari la resistenza tra il cursore e uno dei terminali varia linearmente rispetto alla rotazione dell’alberino. Nei potenziometri logaritmici la variazione avviene invece in maniera logaritmica. La scelta del tipo di potenziometro dipende dall’applicazione specifica e dai requisiti del circuito.

Il potenziometro è usato in genere come partitore di tensione.

Un classico potenziometro
Un classico potenziometro

Il suo simbolo elettrico è quello di una classica resistenza ma con il contatto intermedio comandato dalla manopola:

Il simbolo elettrico del potenziometro
Il simbolo elettrico del potenziometro

Esistono in commercio anche potenziometri completamente elettronici. Se vuoi approfondire l’argomento su come funzionano e su un loro possibile utilizzo puoi consultare gli articoli Come controllare un potenziometro digitale con Arduino UNO e Come controllare un amplificatore operazionale invertente usando Arduino UNO e un potenziometro digitale.

Come funziona un partitore di tensione?

Un partitore di tensione è un semplice circuito in cui la tensione in uscita è una frazione della tensione in ingresso. Si possono usare due resistori fissi oppure un potenziometro.

Vediamone lo schema e la formula:

Un semplice esempio di partitore di tensione realizzato con un potenziometro
Un semplice esempio di partitore di tensione realizzato con un potenziometro

Il potenziometro è indicato con la lettera P mentre R1 e R2 sono le due sezioni della resistenza totale che variano a seconda della posizione del cursore (che è comandato dalla manopola).

Come puoi osservare la tensione Vo di uscita è una frazione di quella di ingresso Vi. La Vo varia tra due estremi:

  • Vo = 0 quando R2 = 0 (la manopola è ruotata tutta verso il terminale collegato al polo negativo della batteria)
  • Vo = Vi quando R1 = 0 (la manopola è ruotata tutta verso il terminale collegato al polo positivo della batteria)

In un sistema digitale, come quello basato su ESP32 di questo articolo, il valore della tensione Vo viene acquisito e reso numerico da un apposito convertitore analogico-digitale, indicato anche con la sigla ADC. Nel nostro caso, avendo due potenziometri indipendenti, useremo due ingressi analogici dell’ESP32 (con i relativi ADC). Il paragrafo successivo parlerà dell’ADC più in dettaglio.

Cosa è un convertitore analogico-digitale (ADC)?

Un convertitore analogico-digitale (ADC) è un componente elettronico che converte un segnale analogico continuo in un segnale digitale discreto. Questo processo è essenziale quando si desidera misurare e acquisire dati provenienti da sensori o da altre fonti analogiche all’interno di un sistema digitale. L’ADC prende un segnale analogico, che rappresenta una grandezza fisica continua come la temperatura, la tensione o la pressione, e lo converte in un formato digitale che può essere elaborato da un microcontrollore o da un computer.

Il funzionamento di un ADC si basa su due fasi principali: campionamento e quantizzazione. Nel processo di campionamento, il segnale analogico viene misurato a intervalli di tempo regolari. Il segnale viene campionato in punti discreti, catturando un valore di tensione rappresentativo del segnale in quel determinato istante di tempo. Questi campioni sono rappresentazioni approssimate del segnale analogico originale.

Successivamente, nella fase di quantizzazione, ogni campione viene convertito in un valore digitale. Questo processo avviene assegnando un valore numerico al campione analogico in base a un certo numero di bit disponibili per la rappresentazione digitale. Il valore numerico corrisponde a un certo livello di tensione o intensità del segnale analogico. Ad esempio, un ADC a 8 bit può rappresentare il segnale con 256 livelli di tensione discreti (che vanno da 0 a 255).

La precisione di un ADC dipende dalla sua risoluzione, che è determinata dal numero di bit utilizzati per la rappresentazione digitale. Un ADC con una maggiore risoluzione può discriminare tra livelli di tensione più piccoli, offrendo una misurazione più precisa del segnale analogico. La differenza tra il valore vero del segnale analogico in quell’istante e il valore discreto che gli vien attribuito si chiama errore di quantizzazione.

Esistono diverse varianti di ADC, tra cui ADC a rampa, ADC a successione approssimata e ADC a integrazione. Ognuno di questi ha caratteristiche e prestazioni specifiche che li rendono adatti a diverse applicazioni.

In conclusione, un convertitore analogico-digitale (ADC) è un componente elettronico che converte un segnale analogico continuo in un segnale digitale discreto. Attraverso il processo di campionamento e quantizzazione, l’ADC misura il segnale analogico a intervalli di tempo regolari e lo converte in una rappresentazione digitale. Questa conversione consente di acquisire e elaborare i dati analogici in un sistema digitale, consentendo una vasta gamma di applicazioni nel campo dell’elettronica, delle telecomunicazioni e del controllo dei sensori.

Realizzazione del progetto

Lo schema elettrico

Prima di realizzare il circuito vero e proprio diamo un’occhiata al pinout della board:

Pinout della ESP32
Pinout della ESP32

Useremo i GPIO 5 e 18 per collegare i LED e i GPIO 34 e 35 per collegare i cursori dei due potenziometri. La luminosità di ciascun LED potrà essere regolata con la rotazione del cursore del potenziometro ad esso associato. Per ottenere questo risultato verrà pilotato dall’ESP32 tramite un segnale PWM il cui duty cycle varia al variare del valore contenuto in una variabile apposita, valore che va da 0 (LED spento) a 255 (LED completamente acceso) passando per i valori intermedi.

A questo punto puoi procedere alla realizzazione del circuito seguendo lo schema di collegamento più sotto. Purtroppo la NodeMCU ESP32 è troppo larga per stare sulla breadboard, motivo per cui sarà collegata con dei fili volanti al resto del circuito.

I LED sono collegati alla ESP32 tramite dei resistori da 100Ω per limitare la corrente che li attraversa ed evitare di bruciarli (e di bruciare le uscite digitali a cui sono collegati).

Il LED ha due terminali (chiamati anodo e catodo) e, come tutti i diodi, è un componente che ha una sua polarità: fa passare la corrente quando è polarizzato direttamente (cioè la tensione all’anodo è maggiore di quella al catodo) e blocca la corrente quando è polarizzato inversamente (cioè la tensione all’anodo è minore di quella al catodo). La tensione tra anodo e catodo, che indicheremo con Vd, varia a seconda del colore della luce emessa. In particolare abbiamo che:

  • Vd = 1.8 V per il LED rosso
  • Vd = 1.9 V per il LED giallo
  • Vd = 2 V per il LED verde
  • Vd = 2 V per il LED arancio
  • Vd = 3 V per il LED blu
  • Vd = 3 V per il LED bianco

Di seguito lo schema di montaggio realizzato con Fritzing:

Schema di collegamento
Schema di collegamento

Come puoi vedere, l’alimentazione dei potenziometri è presa dall’uscita 3.3V del NodeMCU (pin 3V3). E’ necessario alimentarli con 3.3V in modo che anche la loro uscita massima sia 3.3V in quanto i pin digitali del NodeMCU non accettano tensioni superiori a 3.3V.

ATTENZIONE: nel NodeMCU ESP32 la tensione massima tollerata dagli ingressi digitali è pari a 3.3V. Qualsiasi tensione superiore lo danneggerebbe irreparabilmente!!

Come facciamo ad identificare l’anodo e il catodo del LED? Lo facciamo osservando i suoi terminali. Il più lungo corrisponde all’anodo. Inoltre il corpo del LED presenta un appiattimento in un punto del bordo che indica che il terminale vicino è il catodo.

Quindi, se un LED non si accende è possibile che sia stato collegato al contrario. In questo caso, per farlo funzionare, è sufficiente invertirne i collegamenti.

Come si calcola la resistenza da collegare al LED?

Nota Bene: questo paragrafo tratta il calcolo della resistenza di limitazione in maniera teorica e richiede un minimo di conoscenza delle basi dell’Elettrotecnica. Pertanto non è fondamentale per la comprensione del resto del progetto e può essere saltato dal lettore non interessato a tali aspetti teorici.

Come abbiamo già detto, il resistore tra il generico GPIO e il LED serve a limitare la corrente che attraversa il LED. Ma come possiamo calcolare il suo valore di resistenza? Ci viene in soccorso la Legge di Ohm la quale dice che la differenza di potenziale ai capi di un resistore (cioè la tensione misurata agli estremi del resistore) è proporzionale alla corrente I che lo attraversa e la costante di proporzionalità è proprio il valore di resistenza del resistore R:

V2 - V1 = RI

Nota Bene: per amor di precisione bisogna puntualizzare che mentre il resistore è il componente fisico (l’oggetto vero e proprio), la resistenza è il suo valore. Quindi è improprio (anche se accade di frequente) chiamare il resistore col termine resistenza.

Possiamo vedere la Legge di Ohm su un semplice circuito costituito da un generatore di tensione (il cerchio a sinistra) e un resistore:

Rappresentazione della Legge di Ohm
Rappresentazione della Legge di Ohm

La tensione (o differenza di potenziale) V2 – V1 impressa dal generatore di tensione sul resistore è uguale al prodotto di R per I.

Vediamo ora uno schema leggermente più complesso dove sono presenti il solito generatore di tensione, il resistore e un LED rosso:

Circuito per il calcolo del resistore di limitazione della corrente sul LED
Circuito per il calcolo del resistore di limitazione della corrente sul LED

Nel nostro caso la Vg rappresenta la tensione presente all’uscita digitale della ESP32 quando è HIGH ed è pari quindi a 3.3V.

La Vd è la tensione ai capi del diodo (tra anodo e catodo) quando questo è polarizzato direttamente (cioè quando fa scorrere la corrente). Avendo scelto un LED rosso, sappiamo, dalla tabella precedente, che Vd = 1.8V.

Dobbiamo determinare il valore R del resistore. Abbiamo ancora una incognita: il valore della corrente I che deve scorrere nel circuito quando il pin è in stato HIGH.

Nota Bene: quando il pin digitale è nello stato LOW la sua tensione (cioè la Vg) è nulla, ne consegue che anche la corrente I nel circuito è nulla.

I LED in genere non sopportano correnti maggiori di 20mA, quindi imponiamo una corrente massima di 15mA per stare sul sicuro.

Per la Legge di Kirchhoff alle maglie (detta anche Legge di Kirchhoff delle tensioni) , abbiamo che:

Vg - Vr - Vd = 0

Da cui ricaviamo che:

Vr = Vg - Vd 

Passando ai valori reali, abbiamo che:

Vr = 3.3V - 1.8V

Ne risulta che:

Vr = 1.5V

Ma, per la Legge di Ohm, abbiamo che:

Vr = RI

da cui:

R = Vr / I

Sostituendo i valori reali:

R = 1.5V / 0.015A

Ne deriva un valore di R pari a 100Ω.

Lo sketch

Creiamo il progetto PlatformIO

Abbiamo già visto la procedura di creazione di un progetto PlatformIO nell’articolo Come creare un progetto per NodeMCU ESP8266 con PlatformIO.

Anche se si riferisce alla board ESP8266, la procedura è simile.
Semplicemente, nella scelta della piattaforma, dovrai scegliere la AZ-Delivery ESP-32 Dev Kit C V4.

Non installare le librerie indicate in quell’articolo perché non ci servono in questo progetto.

Ora modifica il file platformio.ini per aggiungere queste due righe:

monitor_speed = 115200
upload_speed = 921600

in modo che il file abbia un aspetto del genere:

[env:az-delivery-devkit-v4]
platform = espressif32
board = az-delivery-devkit-v4
monitor_speed = 115200
upload_speed = 921600
framework = arduino

Ovviamente puoi scaricare il progetto dal link seguente:

Sostituisci il file main.cpp del progetto che hai creato con quello presente nel file zip.

Vediamo ora come funziona lo sketch.

Inizialmente vengono incluse le librerie necessarie:

// Include the necessary libraries
#include <Arduino.h>

Poi vengono definiti i GPIO per il collegamento dei LED e dei potenziometri:

// Define the pins for the LEDs
const int ledPin1 = 5;   // Pin for the first LED
const int ledPin2 = 18;  // Pin for the second LED

// Define the pins for the potentiometers
const int potPin1 = 34;  // Pin for the first potentiometer
const int potPin2 = 35;  // Pin for the second potentiometer

Nella funzione setup viene prima inizializzata la porta seriale:

 // Start the serial communication
 Serial.begin(115200);
 delay(2000);

e poi vengono definite le uscite per pilotare i due LED:

 // Set the LED pins as outputs
 pinMode(ledPin1, OUTPUT);
 pinMode(ledPin2, OUTPUT);

Vediamo ora la funzione loop.

Inizialmente i valori di tensione provenienti dai potenziometri vengono acquisiti, digitalizzati e messi nelle due variabili potValue1 e potValue2:

 // Read values from the potentiometers
 int potValue1 = analogRead(potPin1);
 int potValue2 = analogRead(potPin2);

Successivamente, i valori acquisiti e memorizzati nelle variabili potValue1 e potValue2, vengono traslati in modo da trovarsi nell’intervallo 0 – 255 (che sono i valori ammissibili per pilotare il segnale PWM) e memorizzati nelle variabili brightness1 e brightness2:

 // Map the values read from the potentiometers to the 0-255 range for PWM brightness
int brightness1 = map(potValue1, 0, 4095, 0, 255);
int brightness2 = map(potValue2, 0, 4095, 0, 255);

A questo punto vengono settate le uscite PWM che pilotano i LED, con i duty cycle dati rispettivamente da brightness1 e brightness2:

 // Set the brightness of the LEDs using PWM signals
 analogWrite(ledPin1, brightness1);
 analogWrite(ledPin2, brightness2);

Successivamente vengono stampati sul Serial Monitor i valori acquisiti dai due potenziometri e imposto un delay di 100ms in modo da dare il tempo alla ESP32 di fare tutte le operazioni.

 // Print the values read from the potentiometers to the serial port
 Serial.print("Potentiometer 1: ");
 Serial.print(potValue1);
 Serial.print(" - LED 1 Brightness: ");
 Serial.println(brightness1);

 Serial.print("Potentiometer 2: ");
 Serial.print(potValue2);
 Serial.print(" - LED 2 Brightness: ");
 Serial.println(brightness2);

 // Update the brightness every 100 milliseconds
 delay(100);

Una volta caricato lo sketch non ti resta che ruotare gli alberini dei due potenziometri per vedere come la luminosità dei due LED varia di conseguenza.

Il video del funzionamento del progetto

Nel video seguente noterai come ruotando ciascun potenziometro riuscirai a variare la luminosità del LED corrispondente. Potrai anche vedere la variazione di entrambi i segnali PWM sullo schermo dell’oscilloscopio presente nel video. A duty cycle basso corrisponde luminosità bassa (o addiritura LED spento per duty cycle nullo) mentre a duty cycle alto corrispone una luminosità maggiore (con LED acceso al massimo per duty cycle al 100%).

Newsletter

Se vuoi essere aggiornato sui nuovi articoli, iscriviti alla newsletter. Prima dell’iscrizione alla newsletter leggi la pagina Privacy Policy (UE)

Se ti vuoi disiscrivere dalla newsletter clicca sul link che troverai nella mail della newsletter.

Inserisci il tuo nome
Inserisci la tua email
0 0 votes
Valutazione articolo
guest
0 Commenti
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
Torna in alto