Sei sulla pagina 1di 9

ESP8266 e Arduino

Autore: SukkoPera <software at sukkology punto net>

Ultimo aggiornamento: 21/11/2017

​Quest'opera è distribuita con Licenza ​Creative Commons


Attribuzione - Condividi allo stesso modo 4.0 Internazionale

ESP8266 è un chip che offre connettività wi-fi ed un intero stack TCP/IP. Esso si può usare
in due modi:

● Collegandolo ad una scheda Arduino, permettendo a questa di collegarsi in rete e ad


Internet.
● Da solo (standalone), facendo a meno di qualunque Arduino ma programmandolo
allo stesso modo. Questo è possibile in quanto l’ESP, alla fine dei conti, è un
microcontrollore non troppo diverso dagli ATmega che si trovano a bordo di Arduino.
Anzi, in realtà ​è decisamente più “potente” della maggior parte di questi, sebbene
presenti anche alcuni svantaggi.

Quando si decide di sfruttare un ESP per il proprio progetto, la prima decisione da prendere
riguarda dunque quale delle due configurazioni adottare. Ecco qualche considerazione per
aiutarvi nella scelta:

● L’ESP è più veloce a livello di clock (80/160 MHz contro 16) ed ha a disposizione
maggiori risorse hardware (64+96 kB di RAM contro 2, 512 kB/4 MB/8 MB di flash
contro 32 kB).
● L’ESP funziona a 3.3V​, il che vuol dire che la massima tensione su tutti i suoi ingressi
non può superare questa soglia. Arduino funziona normalmente a 5V. Valutate le
tensioni di lavoro degli altri componenti che volete utilizzare.
● L’ESP ha un solo ingresso analogico​, contro i 6 di Arduino. Alcuni modelli di ESP,
addirittura non espongono nemmeno il relativo pin! Per di più il fondo scala del
convertitore analogico-digitale dell’ESP dipende dalla scheda precisa che andrete ad
utilizzare, per cui è necessario documentarsi. ​Si possono comunque utilizzare
componenti esterni​ per superare questa limitazione.

Fate dunque le valutazioni del caso e… a voi la scelta!

1
Modelli di ESP
Nella pratica, il chip ESP8266 si presenta in varie forme, quasi equivalenti nella pratica ma
che presentano alcune differenze. Una piuttosto importante è la dimensione della memoria
flash: infatti, su questi chip tale memoria è esterna, e dunque può avere dimensione
variabile. Si tratta di un aspetto più importante nel caso vogliate usare la configurazione
standalone, ma ha un suo rilievo anche nell’utilizzo con Arduino. In questo contesto è bene
segnalare che le dimensioni di queste memorie sono spesso espresse in megabit, invece
che in megabyte. Per passare da un’unità all’altra basta ricordare che 1 byte = 8 bit, per cui:

● 4 Mbit = 512 kbyte


● 8 Mbit = 1 Mbyte
● 32 Mbit = 4 Mbyte
● 64 Mbit = 8 Mbyte

Vediamo una panoramica dei modelli più comuni:

Moduli singoli
Questi modelli sono costituiti dal minimo indispensabile per far funzionare l’ESP e sono
quindi particolarmente consigliati per l’utilizzo in coppia con Arduino.

● ESP-01: Il modello più comune, ma anche uno dei più scomodi da utilizzare, in
quanto difficilmente inseribile su una breadboard, a causa della disposizione dei suoi
pin. Possiede un’antenna integrata sul PCB.
● ESP-05: Modello ridotto ai minimi termini, presenta solo i pin di alimentazione e di
comunicazione, disposti tutti in linea e per questo è molto comodo per l’utilizzo su
breadboard. Possiede un connettore per un’antenna esterna, necessaria in quanto
non ne ha una sul PCB. Unico svantaggio: non è possibile aggiornare il firmware.
● ESP-07: Modello “a francobollo”, per cui difficilmente usabile su breadboard senza
saldarlo su un adattatore. Richiede un’antenna esterna. Esiste anche il modello
ESP-07S​, leggermente più piccolo.
● ESP-12: Sostanzialmente come lo -07 ma con antenna integrata sul PCB. Esistono
anche i modelli ESP-12E e -12F, con differenze minime.

Per maggiori dettagli sui vari modelli è possibile consultare ​questa pagina​.

Schede complete
Questi modelli sono costituiti da un modulo ESP e da componentistica di supporto (a
cominciare da una porta USB per la programmazione), per cui sono più adatti per l’utilizzo
standalone.

2
● NodeMCU​: Scheda basata sull’ESP-12 che arriva con un firmware che ne consente
la programmazione in ​Lua​, ma che è comunque programmabile a piacimento.
● Amica e LoLin: Cloni della NodeMCU, consultare ​questa pagina per maggiori
dettagli.
● WeMos D1​: Accoppia un ESP alla classica forma delle schede Arduino.
● WeMos D1 Mini​: Poco più grande del solo “francobollo”, risulta adatta dove lo spazio
è ristretto. È inoltre a disposizione ​una serie di shield con sensori, display e altre
periferiche direttamente impilabili sul modulo.
● WeMos D1 Mini Pro​: Come la Mini ma con 16 MB di memoria flash.

I prodotti Wemos sono acquistabili direttamente dal produttore sul loro ​negozio AliExpress​.

Interfacciare ESP8266 con Arduino


Se avete scelto questa strada, ci sono parecchi aspetti a cui dovete fare attenzione. Se siete
poco pratici o volete la vita facile (dopotutto avrete già parecchio da fare a sistemare il
software), il consiglio spassionato è di procurarvi ​lo shield prodotto da MLT Group​: costa il
giusto, è di ottima qualità ed ha a bordo tutto quel che serve, basta che inseriate un ESP-01
o saldiate un ESP-07 o -12 e siete pronti per partire.

Se invece preferite il fai-da-te, è importante sottolineare innanzitutto che ​in giro per la rete ci
sono molte guide che trascurano completamente questi due punti, ma si tratta
assolutamente di un errore che, a lungo termine ​può danneggiare l’ESP e ​Arduino. Basta
studiare il ​datasheet del chip per convincersene, per cui ignoratele e tenete presente quanto
segue:

● Alimentazione: come già detto, l’ESP funziona a 3.3V e, in trasmissione, consuma


fino a 200-250 mA. I vari modelli di Arduino hanno a bordo un regolatore in grado di
produrre la ​tensione richiesta, ma non è in grado di erogare così tanta ​corrente
(raggiunge al massimo i 70-80 mA), per cui è necessario ricorrere ad un regolatore
esterno come, ad esempio, un ​AMS1117-3.3​. Il suo ingresso va collegato al pin 5V di
Arduino, il pin comune a GND, e sul pin di uscita vi troverete i 3.3V necessari. Una
soluzione più artigianale è quella di usare 2-3 diodi in serie al pin 5V, in modo da
abbassarli ad una tensione più prossima a quella corretta. In questo modo sarà
difficile raggiungere esattamente 3.3V, ma di solito si riesce ad arrivare a livelli
accettabili. Ovviamente, qualunque soluzione scegliate, è necessario che
l’alimentatore che alimenta il tutto sia sufficientemente potente, diciamo da 500 mA in
su, meglio se ancora di più.

● Segnali: l’ESP ed Arduino vengono collegati tramite una porta seriale. Quella dei
modelli più comuni di Arduino (Uno, Nano, Leonardo, Micro e Mega) lavora a 5V,
mentre quella dell’ESP a 3.3, dunque non è possibile collegarli direttamente. In
questo caso la soluzione ideale è quella di usare un ​level shifter​, componente
esterno dal costo estremamente accessibile:

3
In alternativa è possibile cavarsela anche qua con qualche diodo.

Se la soluzione con i diodi vi aggrada, seguite lo schema che segue, che mostra come
collegare un ESP-01 ad Arduino Uno, ma che è facilmente adattabile a qualunque modello
delle due schede. Tenete presente che il modello dei diodi non è troppo importante, se ne
avete a disposizione altri rispetto a quelli indicati, provateli e misurate le tensioni risultanti
per assicurarvi che siano nel range ammesso.

Una volta collegato in qualche modo il tutto, potete dedicarvi al lato software. Qua è
fondamentale capire che se state usando Arduino Uno o Nano, questi gestiscono in
hardware un’unica porta seriale e, di norma, questa è utilizzata per il monitor seriale: tutti i
messaggi che vedete sullo schermo del vostro PC passano di lì. Siccome sviluppare
un’applicazione complessa senza avere idea di cosa stia succedendo non è esattamente
banale, è meglio trovare una soluzione alternativa: in vostro soccorso viene la libreria

4
SoftwareSerial (inclusa in Arduino), che vi permette di “emulare” una porta seriale aggiuntiva
usando due pin qualunque (o quasi). Ad esempio potete usare i pin 6 e 7, collegate questi
rispettivamente ai pin TX e RX dell’ESP.

Questa soluzione presenta tuttavia una complicazione: la SoftwareSerial non è in grado di


raggiungere la velocità di una seriale reale e, purtroppo, i moduli ESP8266 più recenti sono
configurati in fabbrica per comunicare alla velocità di 115200 bps, decisamente fuori portata
di una SoftwareSerial, che non va oltre i 9600 bps. Se il vostro ESP non risponde ai
comandi, potete provare ad abbassare la velocità di comunicazione come descritto più
avanti.

Se invece usate Arduino Leonardo, Micro o Mega, questi hanno a disposizione più di una
porta seriale, per cui dovrete identificarne una e collegare lì RX e TX dell’ESP, incrociandoli
(RX va a TX e viceversa). In questo caso potrete sfruttare appieno la velocità dell’ESP e
comunicare a 115200 bps!

Fatto anche questo, non vi resta che installare la libreria ​WiFiEsp e divertirvi con i suoi
esempi. L’interfaccia di programmazione è molto simile a quella della libreria WiFi/WiFi101
ufficiale, nonché a quella Ethernet, per cui il suo utilizzo dovrebbe essere immediato.

Risoluzione dei problemi


Se la libreria WiFiEsp non riesce a parlare con il modulo, le cause possono sostanzialmente
due, non necessariamente esclusive:

● Sul modulo non è caricato un firmware che supporta i comandi AT (ovvero i comandi
con cui WiFiEsp “pilota” l’ESP
● Se state usando la SoftwareSerial, la seriale dell’ESP potrebbe essere impostata ad
una velocità non adatta.

Per risolvere entrambi i problemi è necessario che vi muniate di una periferica aggiuntiva,
ovvero un convertitore USB-Seriale, che vi consiglio di comprare insieme all’ESP, dato che
comunque se ne trovano a prezzi più che accessibili (~1€) e che vi tornerà spesso utile. Si
tratta di un aggeggio del genere:

5
Non c’è un modello particolare da consigliare, ​l’unico requisito è che lavori a 3.3V​, visto che
l’ESP lavora a questa tensione, come ormai dovrebbe essere chiaro.

Per quanto riguarda i collegamenti, seguite la seguente tabella:

Adattatore USB-Seriale ESP8266

3.3V 3.3V

GND GND

RX TX

TX RX

Aggiornare il firmware
I firmware AT sono scaricabili ​dal forum di Espressif​. Prendete il più recente, salvatelo sul
vostro PC e scompattatelo. Al momento della scrittura, il più recente disponibile è l’​1.1​.

Per mettere l’ESP in modalità flash, dovete premere il tasto FLASH presente sulla scheda
PRIMA di collegare il convertitore USB-Seriale al PC e mantenerlo premuto mentre la
collegate. Se il vostro modulo non ha tale pulsante, dovrete identificare il pin ​GPIO0 e
collegarlo a GND.

Il resto della procedura dipende dal sistema operativo che utilizzate:

Windows
TBD

6
GNU/Linux
Il tool universale per manipolare l’ESP su GNU/Linux è ​esptool.py​. Per installarlo dovrebbe
bastare un singolo comando:

sudo pip install esptool

esptool.py è scritto in Python, per cui dovrete avere installato sul sistema l’interprete di tale
linguaggio, versione 2.7, 3.4 o più recente. Esso richiede inoltre la libreria ​pySerial​, versione
2.5 o più recente.

Il firmware dell’ESP è composto da più parti, ognuna delle quali deve essere flashata ad un
ben preciso indirizzo, dipendente dalla dimensione della memoria flash del vostro modulo.
Se non siete certi di quanta flash possiede il vostro modulo, lanciate il seguente comando:

esptool.py flash_id

La risposta dovrebbe essere simile alla seguente:

Manufacturer: c8
Device: 4013

A questo punto è necessario cercare la combinazione di produttore (manufacturer) e


dispositivo nel file disponibile ​qua​, per risalire alla sigla del modello di flash.
Successivamente dovrete cercarne su Google il relativo ​datasheet,​ da cui potrete finalmente
ricavare l’agognato valore. Ad esempio:

● Il produttore ​c8 è ​GigaDevice ed il dispositivo 4013 è il GD25Q40, che è una flash da


4 Mbit (512 kbyte)
● Il produttore ​ef è ​Winbond (ex ​Nexcom)​ ed il dispositivo 4016 è il W25Q32, che è
una flash da 32 Mbit (4 Mbyte)

Visto che la procedura è piuttosto tediosa, una volta che siete riusciti a risalire alla
dimensione della flash del vostro modulo, fareste bene a segnarla da qualche parte sul
modulo stesso!

Il passo successivo consiste nell’aprire il file README.md disponibile nella cartella ​/bin/at
del firmware che avete scaricato e cercare la configurazione adatta alla vostra flash. Ad
esempio, per una 32 Mbit:

### Flash size 32Mbit: 512KB+512KB


boot_v1.2+.bin 0x00000
user1.1024.new.2.bin 0x01000
esp_init_data_default.bin 0x3fc000 (optional)
blank.bin 0x7e000 & 0x3fe000

7
Per le flash da 32 Mbit c’è anche una seconda configurazione, chiamata ​32Mbit-C1​. La
differenza tra le due non è chiara, eventualmente provatele entrambe, se avete problemi.

Cercate la configurazione tra quelle ​BOOT MODE​, a meno che non abbiate un modulo
particolarmente vecchio con poca flash, che forse potreste recuperare con il firmware
NON-BOOT MODE.​ La differenza è che quest’ultimo non è aggiornabile via wireless, cosa
che comunque potrebbe tornare poco utile.

Finalmente siete pronti per effettuare il flash. Utilizzando i dati ricavati costruite un comando
simile al seguente e lanciatelo, assicurandovi di trovarvi nella cartella ​/bin/at:​

esptool.py write_flash \
0x00000 'boot_v1.5.bin' \
0x01000 512+512/user1.1024.new.2.bin \
0x3fc000 esp_init_data_default.bin \
0x7e000 blank.bin \
0x3fe000 blank.bin \
-fs 32m -fm dio -ff 40m

Se il comando non dà errori, avete finito!

OS X
In linea di massima la procedura per OS X non dovrebbe essere troppo diversa da quella
per GNU/Linux. In caso di problemi potete consultare ​questa pagina​.

Cambiare la velocità della seriale


Nelle prime versioni del firmware AT, la porta seriale era configurata di default alla velocità di
9600 bps ma, a partire dalla versione 0.22, la velocità di default è diventata 115200.
Purtroppo, come già accennato, la SoftwareSerial non è affidabile a questa velocità, per cui
è necessario abbassare la velocità del modulo, cosa comunque adeguata per la maggior
parte delle necessità Arduinistiche.

Questo si può fare con un semplice comando AT. Per eseguirlo, collegate l’ESP al
convertitore USB-Seriale e collegate il tutto al PC. Questa volta ​non dovrete premere il
pulsante FLASH durante il collegamento. Ora vi serve un emulatore di terminale: ve ne sono
parecchi (​minicom,​ ​picocom,​ ​dterm…
​ ), ma forse il più semplice è ​screen.​ Lanciate da un
terminale:

screen /dev/ttyUSB0 115200

E lo schermo dovrebbe svuotarsi. Se invece ottenete un errore, forse la porta è sbagliata,


provate eventualmente ​/dev/ttyACM0​. Provate quindi a scrivere ​AT e premete ​invio,​ il
modulo dovrebbe rispondere con un ​OK.​

8
ATTENZIONE: A questo punto, ​molte procedure riportano il comando AT+IPR=9600 che
però ha l’effetto collaterale di RENDERE INUTILIZZABILE IL MODUL​O, a meno di non
riflashare il firmware!

Fortunatamente esiste un comando alternativo, che è quello che dovrete usare:

AT+UART_DEF=9600,8,1,0,0

Dopo aver lanciato il comando, il terminale potrebbe dare l’impressione di bloccarsi. Questo
succede perché il modulo ha cambiato velocità ma il terminale ancora no. Pertanto uscite da
screen premendo ​CTRL+A​ e quindi ​Q​, e ricollegatevi a 9600 bps:

screen /dev/ttyUSB0 9600

Fate di nuovo il testo con il comando AT e, se il modulo risponde, la procedura è terminata.

Usare ESP8266 da solo


La via per usare l’ESP in standalone è decisamente più semplice, basta installare l’apposito
core.​ La procedura si può eseguire interamente tramite il Board Manager ed è la stessa che
si segue per installare il supporto per qualunque scheda non compresa di default in Arduino.
Maggiori informazioni e la procedura esatta sono disponibili ​a questo indirizzo​.

Una volta portato a termine questo passo selezionate il vostro modello di ESP nel menù
delle schede e… avete finito! D’ora in poi potrete programmare l’ESP esattamente come
fareste con qualunque scheda Arduino. Molte librerie sono direttamente compatibili e la
maggior parte degli sketch richiedono modifiche banali per funzionare. Si consiglia di dare
un’occhiata agli esempi inclusi nel ​core​ per tutte le particolarità del caso.