Modalità deep-sleep con ESP32

I chip della famiglia ESP32 sono noti per le loro caratteristiche di risparmio energetico. Infatti, sono disponibili per gli sviluppatori fino a 5 modalità di funzionamento (active, modem, light, deep ed hibernation). Ogni modalità presenta degli aspetti chiave di funzionamento e soprattutto dei livelli di assorbimento ben definiti. In questo articolo andremo a lavorare con diverse modalità di risparmio energetico, soffermandoci sulla gestione attenta dalla modalità deep-sleep.

Introduzione

Tra i principali motivi del successo dei moduli ESP32 all’interno del fantastico mondo dei makers c’è sicuramente la completa compatibilità di questi chip e delle development boards all’Arduino IDE, una scelta strategica e vincente che ha di fatto diffuso in maniera capillare l’utilizzo di questi oggetti all’interno delle community. Ciò significa che i chip della famiglia ESP32 sono stati utilizzati per la realizzazione di innumerevoli progetti sia a livello didattico che a livello professionale o anche open source. All’interno di questo articolo utilizzeremo appunto l’IDE di Arduino per poter programmare il nostro modulo ESP32 e poter gestire la modalità di risparmio energetico deep-sleep nelle differenti configurazioni possibili di risveglio (wake-up).

LE MODALITÀ DI LAVORO DEGLI ESP32

I chip ESP32 sono molto versatili e potenti grazie all'integrazione dei moduli di comunicazione Wi-Fi e Bluetooth ma sono stati concepiti anche per soddisfare le più estreme esigenze di dissipazione e consumo energetico. La modalità operativa di default dei chip ESP32 è l’active-mode, anche a seguito di un qualsiasi reset del sistema. In questa modalità tutte le periferiche e le unità di elaborazione interne al chip sono attive a piena potenza (e velocità), ma questi microprocessori sono progettati per fornire sia prestazioni che risparmio del consumo energetico per le applicazioni a batteria. I chip ESP32 offrono fino a 5 differenti modalità di funzionamento per fornire al progettista la miglior soluzione per la corretta gestione delle risorse e dunque del consumo energetico (Figura 1) nelle seguenti configurazioni: active-mode, modem-sleep, light-sleep, deep-sleep e hibernation.

Figura 1: Modalità di risparmio energetico negli ESP32

Per i nostri esempi utilizzeremo la modalità deep-sleep in cui si riduce drasticamente il consumo di energia ed è una soluzione tecnica necessaria quando si progettano dispositivi a batteria per applicazioni remote. Infatti, grazie al ricorso di queste tecniche di risparmio energetico è possibile incrementare notevolmente il tempo di operatività del dispositivo. Come si osserva, nella modalità deep-sleep, i chip ESP32 disabilitano interamente tutte le periferiche interne che consumano energia (core principale, periferiche, moduli di comunicazione) e lasciano attive solo le periferiche necessarie per gestire eventi di riaccensione dell’operatività. Tra le periferiche che vengono disabilitate troviamo sicuramente la CPU principale ed i moduli di connettività wireless (che comprendono le percentuali di consumo più consistente). Ciò che rimane attivo è il coprocessore ULP (acronimo di Ultra Low Power) progettato appositamente per gestire le modalità di risparmio energetico. Anche il modulo RTC rimane alimentato per poter fornire le funzionalità di riattivazione legate ai pin GPIO. Dunque, nella modalità deep-sleep solamente le funzionalità base legate al modulo RTC possono essere utilizzate per gestire il risveglio (wake-up) da tale modalità. Queste funzionalità sono principalmente:

  • Temporizzazione: attraverso la gestione di un timer configurato prima dell’ingresso nella modalità deep
  • Interrupt esterni sui pin di GPIO. Non tutti i pin di GPIO possono essere utilizzati, ma solamente quelli afferenti al modulo RTC. Questi possono essere facilmente individuabili a partire dal datasheet del chip ESP32
  • I pin della funzionalità touch

Lavorare nell’IDE Arduino

Lavorare con l’IDE Arduino e le schede ESP32 è davvero facile ed immediato in 4 semplici passi. Per la corretta integrazione è necessario installare i driver secondo la seguente procedura:

  1. Aprire l’IDE di Arduino
  2. Dall’IDE selezionare la finestra Boards Manager (Tools > Board > Boards Manager) oppure in italiano (Strumenti > Scheda > Gestore schede)
  3. Cercare i driver “ESP32 by Espressif Systems“ ed installarli (Figura 2)
  4. Dopo aver installato i driver è necessario selezionare la voce corrispondente alla board che si vuole utilizzare. Nel caso in esempio ho a disposizione una board ESP32 DevkitV1 con processore ESP-WROOM-32. Andrò dunque a selezionare (Strumenti > Scheda > ESP32 Arduino > DOIT ESP32 DEVKIT V1)

Figura 2: Installazione driver ESP32 all'interno dell'IDE Arduino

Ora possiamo collegare la scheda al nostro PC e provare già qualche esempio disponibile in File > Esempi > ESP32.

Funzionalità di Libreria

L’installazione della libreria ESP32, attraverso l’installazione dei driver dal “Board Manager” rende disponibili all’interno dell’IDE tutte le funzionalità per poter gestire al meglio le proprie schede dotate di ESP32. Al di là degli esempi che dopo vedremo, ora affrontiamo le funzioni base che possono consentirci di gestire correttamente la modalità deep-sleep, o volendo anche le altre differenti modalità di lavoro degli ESP32. Per la realizzazione della nostra applicazione, a partire da queste semplici funzioni, è possibile creare e codificare la propria strategia di wake-up dalla modalità di sonno profondo. Infatti, attraverso la corretta configurazione e gestione delle sorgenti e degli eventi di wake-up è possibile tenere sotto controllo l’esecuzione del proprio dispositivo e ridurre al minimo il consumo energetico incrementando di fatto le prestazioni e la durata dei nostri dispositivi low power.

All’interno della libreria esp_sleep.h per l'IDE Arduino (che si trova nella directory C:\Users\”Nome Utente” \AppData\Local\ Arduino15\packages\esp32\hardware\esp32\2.0.0\tools\sdk\esp32\include\esp_hw_support\include dove per “Nome Utente” si indica il nome del tuo account su Windows 10) è possibile trovare i prototipi di tutte le funzionalità realizzate per gestire correttamente le modalità di sleep.

La prima funzione che individuiamo è la seguente:

void esp_deep_sleep_start(void)

Con la funzione esp_deep_sleep_start non facciamo altro che mettere nello stato di “deep-sleep” la nostra board. Questa funzione, senza una corretta configurazione delle modalità di risveglio prima della sua chiamata, porterà la scheda in uno stato di inattività da cui può essere risvegliata solo con un reset dell’alimentazione. Invece, se si configurano correttamente le sorgenti di “wake-up”, la nostra scheda potrà uscire dalla modalità di deep-sleep ogni qualvolta si presenta lo stimolo sulla sorgente configurata. Come osserviamo, questa funzione di start non prevede alcun parametro da trasmettere o di ritorno.

La successiva funzione di interesse è la seguente:

esp_err_t esp_sleep_enable_timer_wakeup(uint64_t time_in_us);

Questa funzione può essere utilizzata per configurare un risveglio a partire da un timer, configurato in termini di micro-secondi attraverso l’unico parametro che deve essere passato alla funzione stessa quando invocata. L’utilizzo di questa funzione è facile ed immediato e deve essere invocata per configurare la modalità di risveglio prima di invocare la funzione esp_deep_sleep_start(). Prevede anche un valore di errore di ritorno che potrebbe essere gestito per incrementare l’affidabilità del proprio codice. In alternativa, esiste anche una funzione che consente, con un unico comando, di configurare il timer ed entrare nella modalità deep-sleep. La funzione è la seguente:

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2377 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.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend