Introduzione
Introduciamo una nuova board di casa Arduino, l’ Arduino Nano ESP32, uscita da pochi mesi, con questo articolo (che è praticamente un “getting started” dedicato a questa board) con un semplice progetto che fa lampeggiare due LED in maniera indipendente. In particolare uno dei due lampeggerà in maniera ON/OFF mentre l’altro si accenderà gradualmente utilizzando la tecnica PWM. Imparare a controllare LED è un passaggio fondamentale per chiunque muova i primi passi nel mondo dell’elettronica e della programmazione con Arduino. In questo articolo, ti guiderò passo dopo passo alla scoperta di come controllare due LED in modo indipendente con l’Arduino Nano ESP32, una potente scheda di sviluppo microcontrollore che vanta la presenza integrata di Wi-Fi e Bluetooth.
L’articolo si rivolge a un pubblico ampio e diversificato, dagli hobbisti e maker desiderosi di apprendere le basi del controllo LED con Arduino ai principianti che vogliono approcciarsi per la prima volta all’utilizzo dell’Arduino Nano ESP32. Studenti di elettronica e ingegneria, come anche professionisti alla ricerca di una soluzione compatta e versatile per il controllo di LED, troveranno in questo articolo spunti interessanti e utili.
L’obiettivo è fornire ai lettori le conoscenze e le competenze necessarie per realizzare autonomamente progetti di controllo LED con l’Arduino Nano ESP32. A tal fine, l’articolo si avvale di una struttura chiara e concisa, ponendo l’accento sull’apprendimento pratico.
Come al solito, per lo sviluppo del progetto, useremo l’ottimo IDE PlatformIO.
Arduino Nano ESP32: Un Microcontrollore Potente e Versatile
Introduzione:
L’Arduino Nano ESP32 è una scheda di sviluppo microcontrollore basata sul chip ESP32-S2FH4. Offre un’ampia gamma di funzionalità in un formato compatto e conveniente, rendendola ideale per una varietà di progetti IoT e embedded.
Caratteristiche principali:
- Microcontrollore ESP32-S2FH4: CPU dual-core Tensilica Xtensa LX106 a 240 MHz, 4 MB di Flash SPI, 200 KB di SRAM, 802.11 b/g/n Wi-Fi e Bluetooth 4.2 BLE.
- Connettività integrata: Wi-Fi e Bluetooth 4.2 BLE per la comunicazione wireless con altri dispositivi e Internet.
- Ampia gamma di I/O: 14 pin GPIO, 1 ADC a 12 bit, 1 DAC a 8 bit, SPI, I2C, UART e JTAG.
- Supporto per schede di espansione: Compatibile con le schede di espansione Arduino Nano.
- Alimentazione: Alimentazione tramite USB o 5V esterno.
- Dimensioni compatte: 45 mm x 18 mm x 7 mm.
Vantaggi:
- Potente e versatile: L’ESP32-S2FH4 offre prestazioni elevate e un’ampia gamma di funzionalità.
- Connettività integrata: Wi-Fi e Bluetooth 4.2 BLE per la comunicazione wireless.
- Ampia gamma di I/O: Adatto a una varietà di sensori, attuatori e altri dispositivi.
- Supporto per schede di espansione: Espandi le funzionalità con le schede di espansione Arduino Nano.
- Facile da usare: Compatibile con l’IDE di Arduino e con il linguaggio di programmazione Arduino.
Applicazioni:
- IoT: Progetti di domotica, wearable tech, monitoraggio ambientale e industriale.
- Robotica: Controllo di robot e droni.
- Elettronica indossabile: Orologi intelligenti, fitness tracker e altri dispositivi indossabili.
- Prototipazione rapida: Crea rapidamente prototipi di dispositivi elettronici.
L’Arduino Nano ESP32 è una potente e versatile scheda di sviluppo microcontrollore che offre un’ampia gamma di funzionalità in un formato compatto e conveniente. È una scelta eccellente per una varietà di progetti IoT e embedded.
L’Arduino Nano ESP32: Motivazioni e Vantaggi
L’Arduino Nano ESP32 è stato creato per soddisfare diverse esigenze emergenti nel mondo dell’IoT e dell’elettronica embedded:
1. Integrazione di Wi-Fi e Bluetooth:
- La precedente generazione di schede Nano non includeva la connettività wireless. L’ESP32 integra Wi-Fi e Bluetooth 4.2 BLE, aprendo nuove possibilità per la comunicazione wireless con altri dispositivi e Internet.
2. Maggiore potenza di elaborazione:
- L’ESP32-S2FH4 offre prestazioni CPU dual-core superiori ai microcontrollori AVR utilizzati nelle precedenti schede Nano. Questo permette di gestire applicazioni più complesse e impegnative.
3. Riduzione delle dimensioni:
- L’ESP32-S2FH4 ha un ingombro minore rispetto ai chip AVR, consentendo di realizzare schede Nano ESP32 più compatte e leggere.
4. Compatibilità con le schede di espansione:
- L’Arduino Nano ESP32 mantiene la compatibilità con le schede di espansione Arduino Nano, permettendo di espandere le funzionalità della scheda con sensori, attuatori e altri dispositivi.
5. Facilità d’uso:
- L’Arduino Nano ESP32 è compatibile con l’IDE di Arduino e con il linguaggio di programmazione Arduino, rendendolo facile da usare anche per i principianti.
In sintesi, l’Arduino Nano ESP32 offre:
- Maggiore potenza e flessibilità: Permette di realizzare progetti IoT e embedded più complessi e performanti.
- Connettività integrata: Wi-Fi e Bluetooth 4.2 BLE per la comunicazione wireless.
- Dimensioni compatte: Ideale per dispositivi wearable e miniaturizzati.
- Facilità d’uso: Accessibile a hobbisti, maker e ingegneri di tutti i livelli di esperienza.
Esempio di applicazioni:
- Domotica: Controllo di luci, termostati, serrature intelligenti e altri dispositivi domestici.
- Wearable tech: Orologi intelligenti, fitness tracker e altri dispositivi indossabili.
- Monitoraggio ambientale: Rilevamento di temperatura, umidità, qualità dell’aria e altri parametri ambientali.
- Robotica: Controllo di robot e droni.
L’Arduino Nano ESP32 rappresenta un passo avanti significativo per la piattaforma Arduino, offrendo una combinazione unica di potenza, flessibilità e facilità d’uso che lo rende ideale per una varietà di progetti IoT e embedded.
Pulse Width Modulation (PWM): Una Visione Tecnica
Il Pulse Width Modulation (PWM) è una tecnica ampiamente utilizzata nell’elettronica per la modulazione della larghezza dell’impulso di un segnale. Questa tecnica si basa sulla variazione della durata dell’impulso del segnale, mantenendo costante la frequenza. Ecco alcuni punti chiave che illustrano la natura e l’utilità del PWM:
- Generazione del Segnale PWM:
- Il PWM può essere generato utilizzando timer e contatori presenti in molti microcontrollori e microprocessori.
- La frequenza del segnale PWM è determinata dalla frequenza del timer, mentre il rapporto tra il tempo in cui il segnale è “alto” (livello logico alto) e il periodo totale definisce il ciclo di lavoro.
- Ciclo di Lavoro e Duty Cycle:
- Il ciclo di lavoro rappresenta la percentuale di tempo in cui il segnale è alto rispetto al periodo totale.
- Il duty cycle è il valore numerico del ciclo di lavoro ed è espresso come percentuale. Ad esempio, un duty cycle del 50% indica che il segnale è alto per metà del periodo.
- Applicazioni del PWM:
- Controllo di Motori: Il PWM è ampiamente utilizzato nel controllo di motori elettrici per regolare la velocità. Modulando il ciclo di lavoro, è possibile variare la potenza fornita al motore.
- Controllo di Luminosità: Nei LED e in altre sorgenti luminose, il PWM regola la luminosità variando il tempo in cui la luce è accesa.
- Audio: Nel campo audio, il PWM può essere utilizzato per generare segnali analogici simulati, contribuendo alla sintesi sonora.
- Vantaggi del PWM:
- Efficienza Energetica: Poiché il PWM regola la potenza fornita a un dispositivo, contribuisce all’efficienza energetica riducendo la dissipazione di calore.
- Controllo Preciso: Il PWM consente un controllo preciso di vari dispositivi, consentendo regolazioni fini e una risposta rapida.
- Effetto Sonoro e Visivo:
- Nel dominio audio, un segnale PWM può creare effetti sonori unici e modulazioni.
- Nelle applicazioni di illuminazione, il PWM può creare effetti visivi, come la regolazione della luminosità in modo graduale.
Di quali componenti abbiamo bisogno?
La lista dei componenti non è particolarmente lunga:
- una breadboard per connettere la Arduino Nano ESP32 agli altri componenti
- alcuni fili DuPont (maschio – maschio, maschio – femmina, femmina – femmina)
- due resistori da 100Ω
- due LED rossi
- e, ovviamente, una Arduino Nano ESP32 !
Realizzazione del progetto
Lo schema elettrico
Prima di realizzare il circuito vero e proprio diamo un’occhiata al pinout della board:
Useremo i GPIO D2 e D5 per collegare i LED.
A questo punto puoi procedere alla realizzazione del circuito seguendo lo schema di collegamento più sotto.
I LED sono collegati alla Arduino Nano 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:
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:
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:
Nel nostro caso la Vg rappresenta la tensione presente all’uscita digitale della Arduino Nano 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. Puoi seguire la guida ma al momento di scegliere la piattaforma dovrai scegliere Arduino Nano ESP32 nel campo Board del wizard, come nell’immagine sotto:
Non installare le librerie indicate nella guida in quanto non ci servono.
Ora modifica il file platformio.ini in modo che abbia questo aspetto:
[env:arduino_nano_esp32]
platform = espressif32
board = arduino_nano_esp32
framework = arduino
monitor_speed = 115200
upload_speed = 921600
Ovviamente puoi scaricare il progetto dal link seguente:
Arduino Nano ESP32: getting started
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 <Arduino.h>
Poi vengono definiti i GPIO su cui collegheremo il LED:
const int led1Pin = D2; // LED 1 connected to pin D2
const int led2Pin = D5; // LED 2 connected to pin D5
In seguito vengono definite le variabili che si occupano delle temporizzazioni delle accensioni dei LED:
const unsigned long period1 = 1000; // LED 1 flashing period (1 second)
const unsigned long period2 = 1000; // LED 2 flashing period (1 second)
unsigned long previousMillis1 = 0; // Previous time for LED 1
unsigned long previousMillis2 = 0; // Previous time for LED 2
Nella funzione setup vengono settati i GPIO come OUTPUT:
// Set LED pins as output
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
e inizializzata la porta seriale, seguita dalla stampa di un messaggio di benvenuto sul Serial Monitor:
// Serial initialization
Serial.begin(115200);
delay(2000);
Serial.println("Hello world from Arduino Nano ESP32!");
Nella funzione loop incontriamo due blocchi:
unsigned long currentMillis = millis();
// LED 1 control
if (currentMillis - previousMillis1 >= period1) {
digitalWrite(led1Pin, !digitalRead(led1Pin));
previousMillis1 = currentMillis;
}
// LED 2 control
if (currentMillis - previousMillis2 >= period2) {
for(int brightness = 0; brightness < 255; brightness++) {
delay(10);
analogWrite(led2Pin, brightness);
}
previousMillis2 = currentMillis;
}
Il primo si attiva ogni period1 ms e accende e spegne il primo LED. Il secondo blocco si attiva ogni period2 ms e fa partire un for che incrementa da 0 a 254 il valore della variabile brightness che regolerà il segnale PWM per accendere gradatamente il secondo LED, agendo tramite la funzione analogWrite(led2Pin, brightness);
Come puoi constatare tu stesso, si tratta di un progetto molto semplice, adatto per iniziare a prendere confidenza questa nuova board realizzata recentemente da Arduino.
Una volta che hai compilato il progetto, trasferiscilo sulla board e, se tutto è andato bene, vedrai i due LED accendersi.
AVVISO IMPORTANTE: può capitare, almeno come è capitato a me per il primo caricamento, di ricevere un errore di questo tipo:
dfu-util: Cannot open DFU device 2341:0364 found on devnum 10 (LIBUSB_ERROR_ACCESS)
dfu-util: No DFU capable USB device available
Io uso una distribuzione Linux (in particolare una Fedora) e quindi ho dovuto cercare una soluzione per il mio sistema.
Nel caso si stia quindi usando Linux e dovesse apparire l’errore citato, bisogna creare un file di nome 99-platformio-udev.rules nella cartella /etc/udev/rules.d/ dando il comando:
sudo touch /etc/udev/rules.d/99-platformio-udev.rules
e poi, sempre su terminale dare il comando :
curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules
Fatto questo è necessario riavviare udev (o riavviare il pc) con uno di questi due metodi alternativi:
sudo service udev restart
oppure
sudo udevadm control --reload-rules
sudo udevadm trigger
Per un maggiore approfondimento ti invito a consultare la pagina https://docs.platformio.org/en/latest/core/installation/udev-rules.html#platformio-udev-rules
Nel caso il problema si dovesse presentare su Windows, è necessario installare i driver appropriati secondo quanto riportato in questo link https://docs.espressif.com/projects/esp-idf/en/stable/esp32s2/api-guides/dfu.html#:~:text=The%20reason%20for%20No%20DFU,is%20not%20in%20bootloader%20mode. al paragrafo USB Drivers (Windows Only).
Video del funzionamento
Il video seguente mostra il funzionamento del nostro primo progetto con Arduino Nano ESP32:
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.
Fantastic read! I was especially impressed by the depth provided on the topic, offering a perspective I hadn’t considered. Your insight adds significant value to the conversation. For future articles, it would be fascinating to explore more to dive deeper into this subject. Could you also clarify more about the topic? It caught my interest, and I’d love to understand more about it. Keep up the excellent work!
Thank you for your appreciation. This is just a first introductory article to the Arduino Nano ESP32. Others will follow in the future, with more significant projects.