Tra le tante funzionalità che Espressif offre per i suoi prodotti, c'è anche ESP-NOW, un protocollo senza connessione sviluppato dalla stessa azienda cinese per i microcontrollori ESP32 ed ESP8266. Con ESP-NOW è possibile costruire una rete privata senza Wi-Fi o router. ESP-NOW è un protocollo di comunicazione senza connessione, che prevede la trasmissione di brevi pacchetti e consente a più dispositivi di comunicare tra loro in maniera semplice ed immediata. In questo articolo, andremo a scoprire come utilizzare ESP-NOW per scambiare dati tra due schede ESP32 programmate con l'IDE Arduino.
Introduzione
I microcontrollori ESP32 ed ESP8266 offrono agli sviluppatori due ottime opzioni tra cui scegliere quando si tratta di comunicazione senza fili, ovvero Bluetooth e Wi-Fi. Le funzionalità Bluetooth e Wi-Fi, integrate su questi dispositivi, sono rese possibili da un modulo ricetrasmettitore operante alla frequenza di 2,4 GHz. Questo modulo radio può essere utilizzato anche per altri protocolli di comunicazione che utilizzano la banda ISM senza licenza a 2,4 GHz. Espressif ha sviluppato un protocollo che consente ai suoi dispositivi di creare una rete wireless privata utilizzando i ricetrasmettitori a 2,5 GHz. Questa è una rete separata dalla rete Wi-Fi e può essere utilizzata solo da microcontrollori di tipo ESP. Tale protocollo prende il nome di ESP-NOW.
ESP-NOW
ESP-NOW è un protocollo di comunicazione senza connessione che prevede la trasmissione di brevi pacchetti e consente a più dispositivi di parlare tra loro senza utilizzare il Wi-Fi. Si tratta di un protocollo di comunicazione veloce che può essere utilizzato per scambiare piccoli messaggi (fino a 250 byte) tra schede ESP. ESP-NOW è molto versatile e consente comunicazioni sia unidirezionali che bidirezionali in varie configurazioni. L'accoppiamento tra i dispositivi è necessario prima della loro comunicazione. Al termine dell'accoppiamento, la connessione è sicura e peer-to-peer, senza necessità di handshake. Ciò significa che dopo aver accoppiato due dispositivi tra loro, la connessione è persistente. In altre parole, se improvvisamente una delle tue schede perde l'alimentazione o si resetta, al riavvio si collegherà automaticamente al suo pari (peer) per continuare la comunicazione. Il limite dei pacchetti a 250 byte o meno, forse non è sufficiente per implementare messaggi vocali o video (sebbene ci siano modi per pacchettizzare entrambi). Sono, però, comunque sufficienti per permettere comandi di controllo remoto o dati dai sensori. I dati possono essere crittografati o non crittografati e si possono avere da 2 a 20 dispositivi comunicanti tra loro. La portata può variare notevolmente a causa dell'ambiente, ma nelle giuste condizioni (e con antenne adeguate) è possibile raggiungere oltre 400 metri. Il solo utilizzo delle antenne integrate nei moduli dovrebbe comunque consentire di comunicare senza problemi attraverso una casa di medie dimensioni. I dispositivi ESP32 e ESP8266 possono essere posizionati all'interno della stessa rete. Un dispositivo che partecipa a una rete ESP-NOW può assumere uno dei due ruoli:
- Initiator: questo dispositivo avvia la trasmissione. Richiederà l'indirizzo MAC del dispositivo ricevente
- Responder: questo dispositivo riceve la trasmissione
In modalità unidirezionale (half-duplex), il dispositivo trasmittente è l'Initiator e il dispositivo ricevente è il Responder. In modalità bidirezionale (full duplex), ogni dispositivo è sia Initiator che Responder.
Comunicazione unidirezionale
Nella modalità di comunicazione unidirezionale si possono avere tre tipologie di configurazione:
- Un Initiator che trasmette ad un Responder
- Un Initiator che trasmette a molti Responder
- Molti Responder che trasmettono ad un Initiator
La configurazione in cui un Initiator trasmette i dati ad un Responder, riportata in Figura 1(a), è molto facile da implementare ed è ottima per inviare dati da una scheda all'altra come letture dei sensori o comandi ON e OFF per controllare i GPIO. La configurazione in cui un Initiator trasmette a molti Responder, riportata in Figura 1(b), è utilizzabile sia per trasmettere in broadcast (Initiator invia lo stesso messaggio a tutti i Responder) e sia per trasmissioni individuali (Initiator comunica individualmente con ciascun Responder). Questa configurazione è ideale per controllare diverse schede ESP con un'unica scheda ESP principale, come una sorta di telecomando. Infine, la configurazione in cui molti Initiator trasmettono ad un Responder, riportata in Figura 1(c), è ideale se si desidera raccogliere dati da più nodi sensori verso un'unica scheda che può fungere, ad esempio, da web server e visualizzare i dati raccolti.
Comunicazione bidirezionale
Con ESP-NOW, ogni scheda può essere contemporaneamente un Initiator e un Responder. Quindi, è possibile stabilire una comunicazione bidirezionale o full-duplex tra le schede. La configurazione più semplice è quella in cui due dispositivi comunicano tra loro (Figura 2(a)), e si può espandere arrivando a quella in cui più schede comunicano bidirezionalmente l'una con l'altra (Figura 2(b)). In sintesi, ESP-NOW è l'ideale per costruire una rete in cui è possibile avere più schede ESP che si scambiano dati tra loro.
Indirizzo MAC
Per comunicare tramite ESP-NOW, è necessario conoscere l'indirizzo MAC del dispositivo ESP che funge da ricevitore. Un indirizzo MAC, o Media Access Control, è un numero esadecimale a 6 cifre univoco assegnato a ogni dispositivo su una rete. Generalmente, viene assegnato al dispositivo dal produttore, durante la fase di fabbricazione, sebbene sia anche possibile impostarlo manualmente. Grazie all'univocità dell'indirizzo MAC è possibile identificare ogni scheda a cui inviare i dati utilizzando ESP-NOW. Ecco un semplice sketch da caricare su un dispositivo ESP per determinarne l'indirizzo MAC:
// Includi libreria WiFi #include "WiFi.h" void setup() { // Configura il monitor seriale Serial.begin(115200); // Station mode WiFi.mode(WIFI_MODE_STA); // Stampa l'indirizzo MAC sul monitor seriale Serial.print("MAC Address: "); Serial.println(WiFi.macAddress()); } void loop() { }
Lo sketch mette il dispositivo ESP in modalità Station e quindi fa richiesta del suo indirizzo MAC. Il risultato viene stampato sul monitor seriale. L'indirizzo MAC è riportato nella parte inferiore del monitor seriale; conviene copiarlo in un luogo sicuro, in modo da poterlo utilizzare in seguito.
Il codice
La libreria ESP-NOW, inclusa nell'installazione del gestore delle schede dei dispositivi ESP, presenta una serie di funzioni e metodi per rendere più agevole e semplificare la scrittura del codice per utilizzare ESP-NOW. Per vedere come funziona, è necessario esaminare l'invio e la ricezione di un pacchetto di messaggi ESP-NOW. Un callback è un pò come un interrupt, che viene generato ogni volta che si verifica un evento specifico. Nel protocollo ESP-NOW, ci sono due callback di interesse:
- Invio di dati - Il callback esp_now_register_send_cb() viene chiamato ogni volta che vengono inviati dati
- Ricezione di dati - Il callback esp_now_register_rcv_cb() viene chiamato quando vengono ricevuti i dati
Nel proprio codice, occorre creare una funzione di callback da legare al callback di invio o di ricezione utilizzando le funzioni sopra elencate. La funzione di callback così definita verrà eseguita ogni volta che si verifica l'evento di invio o ricezione di dati.
Le funzioni di callback restituiscono anche alcuni dati utili:
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2204 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.