Fino alla scorsa estate, uno dei problemi principali che assillavano gli appassionati dell'Internet delle cose, era quello di come far comunicare il proprio oggetto in rete. La questione riguardava più o meno tutti i microcontrollori, che infatti, fino ad oggi, venivano collegati a dei gateway – come un Router Wi-Fi su cui veniva installato un firmware alternativo come OpenWRT – mediante dei moduli ricetrasmittenti operanti spesso sui 433MHz. Anche il mondo Arduino, pure oggetto di innumerevoli espansioni, faticava a trovare una soluzione tecnicamente credibile ed economicamente sostenibile. Non solo l'ESP8266, prodotto dalla cinese Espressif e venduto su basetta a meno di 5 USD, ha cambiato drasticamente questo scenario, ma addirittura si è candidato a stravolgerlo completamente, in prospettiva diventando al tempo stesso sia un nodo elementare che il gateway di un sistema di controllo wireless. Oltre alle specifiche del prodotto, in questo articolo vedremo come collegarlo ad Arduino con relativo codice sorgente.
Il problema derivava dal fatto che, al di là dell'interfaccia radio, l'insieme delle componenti necessarie a far funzionare il Wi-Fi – stack TCP/IP, gestione del segnale, sicurezza WEP/WPA – è decisamente troppo complesso per essere implementato via software su un microcontrollore ad 8 o 16 bit. Sempre in ambito Arduino, fu così presa la decisione un po' estrema di integrare sulla stessa scheda, accanto al tradizionale Atmel a 8 bit, un vero e proprio System-On-a-Chip su architettura MIPS, che non solo gestisse il Wi-Fi, ma che potesse addirittura far girare un sistema Linux, ancorché embrionale. Nacque così la Arduino Yùn, che però, con il suo costo elevato e le sue funzionalità estese, apparve subito inadatta a ricoprire il ruolo di nodo, puntando invece a quello di gateway domestico. Le alternative erano poche e comunque dispendiose e scomode, trattandosi di moduli separati che andavano spesso configurati separatamente e poi alimentati e collegati alla porta seriale delle schede. Qualcun altro, come Texas Instruments, prese una strada un po' diversa e meno radicale: far gestire le funzionalità Wi-Fi a un core ARM M dedicato e programmato con un firmware apposito – ma senza sistema operativo – realizzando così un modulo aggiuntivo che potesse essere accoppiato con un altro microcontrollore a 16 o a 32 bit.
Cos'è l'ESP8266
L'ESP8266 è anch'esso un System-On-a-Chip a 32 bit, prodotto da Espressif, che incorpora nativamente le funzionalità WI-Fi – inclusa la gestione intelligente dell'interfaccia radio – ma che rende disponibili anche una serie di risorse e di periferiche che gli permettono di assolvere pure i compiti di un comune microcontrollore, da usare seguendo tre ben distinte modalità operative:
1) un suo primo utilizzo come mero modulo di comunicazione WI-FI, collegabile alla porta seriale di un microcontrollore qualsiasi, da comandare per mezzo di comandi AT che vengono invocati dall'MCU esterno. Ciò è reso possibile dal caricamento di un firmware apposito, che rimane residente nell'ESP8266;
2) può essere usato come microcontrollore autonomo abilitato al WI-FI, programmabile in modo interattivo e immediato mediante il linguaggio di scripting / interpretato Lua (il Python del mondo embedded). E' infatti disponibile un interprete Lua per ESP8266 e anche un semplice IDE ad esso dedicato, di complessità e con funzionalità intermedie fra l'IDE di Arduino e quelli basati su Eclipse o Visual Studio. Lua, tanto per fare un esempio, è comunemente utilizzato in ambito OpenWrt e, in pratica, in questa modalità, l'ESP8266 diventa una Yùn da 5-10 USD, a seconda della piedinatura della scheda;
3) infine può essere utilizzato sempre come MCU autonomo abilitato al WI-FI, ma programmabile in modo tradizionale in C/C++. Esso infatti supporta una toolchain completa basata su GCC e integrata in Eclipse, di cui - per ora - manca solo un supporto concreto al debugging, per il quale si brancola ancora nel buio.
In questo articolo ci occuperemo specificamente della prima modalità, usando l'ESP8266 come una sorta di interfaccia da seriale a Wi-Fi, con la particolarità davvero interessante che esso si può configurare non solo come client, ma anche come access point wireless, o persino come entrambe le cose allo stesso tempo, in modalità bridge tra due reti. Come ciliegina sulla torta, per chi utilizza prevalentemente Arduino e il suo linguaggio semplificato, vi è la presenza di una serie di librerie – al momento non ufficiali – che rendono l'accesso a Internet dall'interno di uno sketch un gioco da ragazzi. A tutti coloro che magari preferiscono programmare i propri microcontrollori preferiti in C/C++ o addirittura in Assembly, posso già anticipare che il tutto è ugualmente riconducibile al banale utilizzo di semplici comandi AT sulla porta seriale.
Schema del modulo ESP8266 ESP-01
In questo articolo, poiché ci soffermeremo esclusivamente sulla prima modalità, utilizzeremo l'ESP8266, montato sulla scheda più semplice ed economica e con l'antenna stampata, la cosiddetta ESP-01. In questa configurazione, dei molti piedini disponibili sul chip, ne sono resi disponibili all'utente solo otto: due pin per la comunicazione seriale con il core, due GPIO (che non useremo), due pin di controllo per la [...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3199 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.
Ciao Stefano,
grazie per il bel articolo, mi è piaciuto molto.
Mi piacerebbe approfondire anche le altre due modalità operative del ESP8266, ci potrebbero essere altri articoli in futuro?
Ciao Ernesto,
grazie per l’apprezzamento. Al momento non saprei dirti per gli altri approfondimenti, intanto vediamo se quest’articolo suscita interesse. Il problema principale è che (per ora) si tratta di una piattaforma hardware molto poco documentata rispetto agli standard usuali dei microcontrollori, per cui è principalmente territorio per smanettoni. L’approfondimento delle modalità di sviluppo in LUA e in C (specie quest’ultima) richiedono inoltre delle competenze abbastanza avanzate di programmazione che non so quanti lettori posseggano e dunque possano apprezzare. Invece nelle ultime settimane si è aggiunta una grande novità che potrebbe cambiare le carte in tavola: è infatti a buon punto il porting dell’ambiente Wiring/Arduino su ESP8266, consentendo quindi un’ulteriore, quarta modalità di utilizzo alla portata di tutti. Come puoi ben capire si tratta sicuramente di un chip da tenere d’occhio…
Bell’articolo. Ne ho presi giusto 3 un po’ di tempo fa e devo ancora provarli. Questo articolo mi aiuterà ad iniziare ad usarli in quanto quando li ho presi non avevo idea di cosa fossero di preciso. Sono uno smanettoni a tempo perso anch’io, ma ultimamente il tempo per gli hobby manca proprio 🙂
Resto invece in attesa nel caso vengano pubblicate le altre 2 modalità, oppure che vengano indicati dei link al riguardo. Grazie 🙂
Manuel (spero che ti chiami così ;),
ti ringrazio per il tuo commento favorevole. Di seguito ti elenco una lista di link (in inglese) dove potrai approfondire l’argomento ESP8266, credo che per un po’ ti basteranno 😉
Ciao
Stefano
******************************************************************
Come programmare un Arduino da remoto con l’ESP8266 (in spagnolo, ma si capisce o puoi usare Google Translate):
http://www.sistemasorp.es/2014/11/11/programando-un-arduino-remotamente-con-el-modulo-esp8266/
******************************************************************
Micro Python per ESP8266:
https://github.com/micropython/micropython/tree/master/esp8266
******************************************************************
La Bullettin Board ufficiale di Espressif (il costruttore):
http://bbs.espressif.com/
******************************************************************
Una Wiki per ESP8266:
https://github.com/esp8266/esp8266-wiki/wiki/Uploading
******************************************************************
La mappa della memoria dell’ESP8266:
https://github.com/esp8266/esp8266-wiki/wiki/Memory-Map
******************************************************************
La Toolchain per il core Xtensa dell’ESP8266:
https://github.com/jcmvbkbc/xtensa-toolchain-build
******************************************************************
Il firmware nodemcu (http://nodemcu.com) per ESP8266:
https://github.com/nodemcu/nodemcu-firmware
******************************************************************
Il loader (più molte altre informazioni, sempre su questo sito) per flashare il firmware con Lua:
http://benlo.com/esp8266/index.html#LuaLoader
******************************************************************
Il repository del framework Wiring/Arduino portato su ESP8266:
https://github.com/esp8266/arduino
******************************************************************
Il forum della comunità dell’ESP8266:
http://www.esp8266.com/
******************************************************************
Il sito di Peter Scargill, che ci sta smanettando da mesi, gli piace la domotica e usa Node Red:
http://tech.scargill.net/
******************************************************************
Tieni presente che alcuni di questi link non li visito da un po’…
Grazie!!! Ce né da perdersi quasi 🙂
Manuel
Articolo interessantissimo,
mi ha aperto un mondo!
Anch’io vorrei vedere preso articoli sulle altre modalità.
Vedo che la potenza del micontrollore è molto maggiore rispetto all’Arduino, che ha un RTC interno, anche capace di risvegliare dalla modalità sleep la scheda.
Sarebbe fantastico poterlo utilizzarlo con la semplicità di Arduino.
Ciao Stefano
ho visitato i link che hai postato ma non ho trovato nulla che possa aiutarmi nel mio progetto
Visto che sei considerato quasi un guru dell’ esp8266 volevo chiederti, se hai tempo , di cercare insieme una soluzione al mio progetto.
spiego brevemente cosa intendo fare…
vorrei realizzare una comunicazione bidirezionale tra piu esp8266 ( quindi non CLIENT – SERVER ) ed utilizzare i GPIO integrati per visualizzare lo stato dei pulsanti premuti.
esempio:
immaginiamo tre o più moduli esp in riga
idnirizzi IP pre assegnati.
premo un pulsante sul primo e tramite il wifi comando un GPIO sul secondo modulo il quale a sua volta ripete la stringa di comando al successivo e cosi via.
al ricevimento dell’ input il modulo successivo comunica al precedente che il comando e stato eseguito..
mi rendo conto che e una bella sfida perche volevo realizzare il tutto senza MCU aggiuntivi usando solo esp8266 , ed i suoi GPIO , o al massimo il kit nodemcu v3
grazie per il tempo dedicato
un saluto a tutti e buon lavoro
Ciao Dan.ilo,
ti premetto che non sono assolutamente un guru dell’ESP8266, che io utilizzo essenzialmente come processore host per applicazioni semplici basate su altri microcontrollori come unità “pensanti”. Questo, a distanza di più di un anno e mezzo dall’articolo (data in cui l’ho preparato), essenzialmente perché il livello di supporto della documentazione e degli strumenti offerto dalla Espressif, non è assolutamente competititvo rispetto a quanto fornito dalla concorrenza (anche se il prezzo rimane imbattibile). In particolare il debugging, assolutamente indispensabile soprattutto quando si affrontano progetti multitasking utilizzando un sistema operativo, rimane un problema. Oltre a questo, prediligo nettamente la modalità “comandi AT”, poiché essa permette il controllo e la modifica delle configurazioni di rete a runtime, semplicemente impartendo tali comandi, anche direttamente e senza prevedere alcuna routine particolare nel proprio codice applicativo). Detto questo e passando al tuo progetto – che spero di avere ben interpretato come una semplice rete lineare di ripetitori per poter coprire distanze più vaste – riterrei che per un’applicazione così semplice potresti tranquillamente caricare il firmware LUA e configurare tutti i moduli nella modalità Access Point + client (per evitare di limitare la portata della rete alla massima distanza fra l’AP e i client). Poi potresi configurarli in modo che ognuno si colleghi al successivo e fargli mandare un segnale (comprensivo di marcatore di origine per identificare chi l’ha impartito) il comando che preferisci. Potresti in questo modo simulare una specie di rete Ethernet o Token Ring dove ogni nodo esamina l’informazione e, se lo riguarda, esegue il comando sui suoi GPIO e rimanda sul “Bus virtuale” un messaggio di acknowlegdement destinato al nodo che l’ha originato, altrimenti lo ripete al nodo che lo segue. Fermo restando che non è detto che questa sia l’architettura di rete più efficiente per realizzare i tuoi scopi e che si possano utilizzare altre tecnologie di rete diverse dal Wi-Fi (e device diversi dall’ESP8266), spero di averti dato qualche stimolo in più.
Ciao
Stefano
Ciao Stefano,
complimenti per l’articolo. Ti volevo chiedere quale adattatore da USB a seriale CMOS 3,3V utilizzi? Per il momento io l’ho brutalmente collegato all’arduino uno (solamente per configuralo, controllare l’indirizzo ip e poche altre cose) ma vorrei evitare di danneggiarlo.
Spero di leggere altri approfondimenti su questo chip. Sandro
Ciao Sandro,
grazie tante per i complimenti. Quello che uso io è uno dei tanti che puoi trovare su Ebay facendo una ricerca con le parole “usb serial 3.3v”. Costano pochi Euro e sono tutti uguali e spesso di colore rosso… Come ho sottolineato tante volte nell’articolo, è assolutamente sconsigliato collegare il TX dell’Arduino Uno (che lavora a 5v) all’RX dell’ESP8266 (che tollera solo fino a 3,3v), perché è alquanto probabile danneggiarlo. Non ci sono invece particolari problemi a collegare il TX dell’ESP all’RX della Uno. Con altre schede Arduino o compatibili che lavorano a 3,3v naturalmente il problema non si pone.
Io mi sono appena iscritto scusate se faccio una domanda che magari è sciocca…
Volevo sapere se è possibile collegare questo modulo alla Raspberry pi 2 b?
Avrei necessità di liberare una porta usb dalla chiavetta WiFi e ho già troppi
cavi cavetti, adattatori… Non mi va di prendere un hub usb alimentato. Poi penso che a Raspberry manchi solo il WiFi per essere considerato un vero mini pc completo.
Grazie in anticipo per la risposta
Ciao FraMor,
la risposta è ni, nel senso che l’ESP8266 si puó collegare alla Raspberry Pi (tramite seriale, che verrebbe vista come tale da Linux) ma non per gli scopi che ti prefiggi, cioè di usarla come un PC. Quanto al fatto di non voler fare la scelta giusta della chiavetta USB per l’hub alimentato (scelta invece molto saggia), avresti comunque il problema di alimentare l’ESP8266 separatamente…
Grazie STEFANODS
Ho capito. Scusami per la domanda sciocca
ma sono veramente alle prime armi… E ho molto da imparare da voi!
Grazie mille
Buona serata
Questo integrato è uscito circa un anno fa ma solo negli ultimi mesi l’interesse ha avuto una crescita esponenziale. Questo dovuto al fatto che inizialmente tutta la documentazione era in cinese e quindi difficilmente accessibile a noi occidentali.
Detto questo direi che è un soc che offre grandi opportunità, basta fare una ricerca ESP8266 su Kickcstarter o Indiegogo per avere un’idea di come ci si possa “sbizzarrire” 😉
Siamo davanti al cIoT -> Cheap Internet of Thing 🙂
Complimenti, ottimo articolo!
Ci mancherebbe che ti scusi! Gli sciocchi sono quelli che non si interessano e che le domande non le fanno… Io so appena l’1×1000 di quanto mi piacerebbe sapere. In bocca al lupo per la tua nuova Raspberry Pi, mi raccomando non fermarti all’utilizzo come semplice PC ma utilizzala per imparare a fondo Linux (magari controllandola da remoto con la linea di comando) e prova ad usarla come gateway verso Internet con un microcontrollore. Scegline uno che puoi iniziare a programmare usando gli strumenti di Wiring/Arduino. Per esempio un LaunchPad MSP430 (il suo ambiente identico ad Arduino e compatibile si chiama Energia http://www.energia.nu), con 10 Euro hai una scheda con il debugger incorporato e strumenti di sviluppo professionali gratuiti che, se ci prendi gusto, ti permettono di imparare senza alcun limite…
Naturalmente la risposta precedente era indirizzata a FraMor.
Emanuele, grazie per i complimenti. Sull’ESP8265 sono d’accordo con te, peró solo in parte. Più vado avanti e mi appassiono ai microcontrollori e più ne apprezzo aspetti meno appariscenti del prezzo, della velocità e del numero di porte e di periferiche. Per quanto mi riguarda, i criteri di scelta sono nell’ordine: una documentazione chiara, la facilit
(Continua… Scusatemi mi è partito l’invio dal telefono)
la facilità e la disponibilità di strumenti hardware e software di debug e il basso consumo energetico. Per il momento è un po’ indietro, ma vediamo come evolverà su questi aspetti l’ESP8266…
Ne ho appena preso uno, leggerò a fondo l’articolo quando potrò metterci le mani sopra 😛
Peccato per l’alimentazione 3.3v non configurabile.
Ciao Stefano,
ottimo articolo.
Volevo chiederti come potevo fare per far fare un refresh automatico alla pagina web ogni volta che cambio il valore del potenziometro.
Grazie
Ciao Stefano,
purtroppo quello che letteralmente desideri fare non è concettualmente possibile, in quanto non può che essere il browser a richiedere i dati, e non può essere un evento esterno a far partire la richiesta. Credo però che quello che intendi sia in effetti una sorta di refresh in tempo reale, come accade, a volte, in alcuni siti web (i primi che mi vengono in mente sono quelli che fanno gli speed test alle connessioni). In quel caso viene utilizzata una tecnica chiamata AJAX, che si avvale tra le altre cose di JavaScript. Essa prevede non giá dei refresh dell’intera pagina, ma solo la richiesta continua di alcuni dati che rappresentano degli specifici oggetti della stessa, che vengono poi aggiornati dall’interprete JS del browser. In questo modo non solo si risparmiano risorse di rete, ma non c’è soluzione di continuità e la pagina rimane “stabile”, non dovendola appunto ricaricare. Un adattamento in questo senso del codice proposto è fuori dall’ambito introduttivo dell’articolo e si scontra con le limitate risorse a disposizione (in particolare riguardo alla modalità di connessione in rete tramite i comandi AT proposti (che utilizzano un modello “apri – chiudi” di connessione TCP/IP, quando invece essa dovrebbe rimanere sempre aperta). Esiste, con l’ESP8266, una modalità alternativa, cosiddetta “trasparente”, che potrebbe essere utilizzata per questa finalità, ma andrebbe completamente stravolto l’approccio. In ogni caso ti consiglio di effettuare una ricerca in rete con le chiavi Arduino AJAX (e ESP8266) e troverai molte discussioni e risorse sull’argomento (purtroppo per la maggior parte in inglese).
Un saluto, Stefano.
Ottimo, mille grazie per le informazioni.
Ciao Stefano,
dirti bravo è poco, io sono smanettone ma ci capisco poco, bravo davvero,
eccomi al qui problema, dopo tanti tentativi, copiando a destra e a sinistra, sono riuscito a comunicare con il modulino, con LUA, per accendere e spegnere un led dal telefonino, ora la missione impossibile è utilizzarlo per farlo funzionare al contrario, cioè, per esempio, quando apro una porta , mi manda il messaggio di porta aperta. Ogni tua informazione che potrai fornirmi mi sarà sicuramente utile.
grazie mille
Ciao Mellifugo,
scusami per la risposta tardiva, ma mi era sfuggito il tuo commento dopo così tanto tempo. L’articolo si riferisce a una modalità di controllo diversa dell’ESP8266, ovvero mediante l’utilizzo dei comandi AT che vengono elaborati dall’interprete del Firmware fornito dalla stessa Espressif. La modalità a cui fai riferimento, senz’altro teoricamente molto più potente, prevede il caricamento di un opportuno interprete LUA che, tuttavia, non è supportato dalla Casa ma sviluppato da terze parti. In ogni caso ci sarà un metodo (ovvero una funzione, nel gergo del linguaggio a oggetti) che permette la lettura della porta in questione. A mero titolo d’esempio (non necessariamente funzionante col tuo firmware, potrebbe esserci qualcosa tipo gpio.read(numero_della_porta), che restituirà 1 qualora essa sia alta (accesa) o, altrimenti, 0. Ti consiglio, comunque, di fare riferimento alla documentazione del firmware che hai caricato sulla scheda.
Un saluto
Stefano
Ciao Stefano ,
innanzitutto grazie per il prezioso aiuto , desideravo dove si puó acquistare la Scheda Alimentatore Esterna per ESP8266 e il Convertitore di Livello Bidirezionale presente nell’articolo ?
Grazie !!! 🙂
Ciao Linux
Prova su Ebay inserendo “alimentatore breadboard” e “convertitore livello 3.3v 5v”. Se prendi l’alimentatore, prima di utilizzarlo provalo col tester per vedere che funzioni bene (a volte con i prezzi stracciati che fanno, ci montano componenti sbagliati o fallati):
Puoi risparmiare sull’alimentatore, creandoti un circuitino con soli tre componenti: un LM3940, un condensatore elettrolitico e un condensatore al tantalio seguendo lo schema che trovi qui a pag. 1:
http://www.ti.com/lit/ds/symlink/lm3940.pdf
Per quanto riguarda il convertitore, puoi anche seguire l’indicazione che ho dato riguardo alla soluzione diodo/resistenza, così alla fine puoi cavartela con cinque componenti, dato che ormai hai la tensione a 3,3v.
Un saluto
Stefano