venerdì 28 agosto 2015

Test del modulo Wifi ESP8266


Recentemente ho ricevuto una coppia di moduli Wifi ESP8266-01. 



Questo modulo e’ un piccolo transceiver Wifi per progetti Arduino, Raspberry o altri ambienti con caratteristiche eccezionali [https://github.com/esp8266/esp8266-wiki/wiki] e dal costo molto contenuto di circa 3$


Nei miei vari esperimenti per dotare i miei progettini di un canale di comunicazione ho provato i vari moduli RF a 433Mhz, connessione infrarossi, gli stupefacenti moduli Nrf24L01 wireless etc, ottenendo risultati piu’ o meno soddisfacenti.

Ma nessun modulo da me provato finora mi ha offerto le incredibili capacita’ del modulo ESP8266-01.  
Questo modulo mi permette di dotare i miei progettini di connettivita’ WiFi e quindi  permettermi di controllarli via Internet (sia da casa sia fuori casa).


In questo articolo descrivo il mio primo approccio e test con questo modulo. 



BoM

  • 1x modulo ESP8266-01

  • 1x breadboard

  • 1x PL2302HX USB to TTL converter

  • 1x porta batterie AA (riciclato da una vecchia macchinina telecomandata) e 2x batterie stilo AA

  • 8x rainbow wire maschio-femmina per i collegamenti



Connessioni

Ho realizzato le connessino come rappresentato nello schema qui sotto


Alimentazione

Il modulo ESP8266-01 necessita di alimentazione e segnali a 3.3V. Consigli di usare un’alimentazione stabile in quanto ho notato che il modulo e’ molto sensibile e potrebbe resettarsi di continuo di fatto non funzionando.
Nel mio caso ho provato a prendere l’alimentazione da Arduino Uno ma non era sufficiente, quindi ho utilizzato due batterie AA da 1,5 Volt.

Nel schema le batterie di alimentazione vanno collegate cosi:
  •  filo blu e’ il positivo (+) 
  •  file  nero e’ il negativo (-) [massa]

Connessione Seriale

Ho utilizzato l’unico modulo USB to TTL che posseggo (PL2302HX USB to TTL converter). Questo modulo fornisce anche l’alimentazione a 3.3V ma anche in questo caso non e’ sufficiente per alimentare correttamente il modulo ESP8266-01.

Nello schema il modulo USB to TTL va collegato cosi’:
  •           filo nero [1] a massa
  •           filo viola [1] pin RX
  •          filo grigio [1] pin TX







Modulo EPS8266-01

Il modulo ESP8266-01 che ho usato io ha la seguente piedinatura (moduli differenti ESP8266-X hanno piedinatura diversa ma comunque simile e facilmente riconducibile a quanto descritto qui)



Ho connesso il modulo in questo modo:
  • filo blu [1] pin VCC
  • filo blu [2] pin CH_PD (boot mode – deve essere sempre ad livello logico 1 per far funzionare il WiFi)
  • filo viola [2] pix TX


  • filo grigio [2] pin RX
  • filo nero [2] pin GND


Una volta fatti questi collegati i fili in base alla colorazione come descritto sopra e’ facilissimo collegarli sulla breadboard. Basta collegare i fili a coppie di colori.

Quindi tutti i fili neri vanno a massa, tutti i fili blu vanno a VCC, poi viola con viola (USB RX – Wifi TX) e grigio con grigio (USB TX – Wifi RX)

Qui i collegamenti che ho fatto io in base a quanto spiegato sopra





ESP8266-01 Test


ESP8266 Wifi Access Point

A questo punto non resta che alimentare il modulo collegando i due fili delle batterie alla breadboard come indicato sopra.
Se tutto e’ andato a buon fine non si vedra’ niente, ma solo in apparenza.
Verifichiamo dal nonstro PC le connessioni wireless disponibili


Con grande piacere e’ comparsa una nuova rete wireless. Il modulo ESP8266 e’ di default configurato come un wireless access point (il nome della rete wifi potrebbe variare con il vostrop modulo). Ok i collegamenti sono corretti in quanto il modulo funziona.
Adesso proviamo a configurarlo come wireless client e a verificarne il funzionamento
Avremo bisogno di un terminale seriale come il vecchio hyperterminal, minicom ,etcc.
Io per comodita’ uso l’IDE di Arduino che ne include gia’ uno (Monitor Seriale)

ESP8266 Wifi Client

A questo punto inserisco il modulo USB to TTL in una porta USB del mio PC.
Nel mio caso questo modulo USB to TTL viene configurato su windows come COM6. Nel vostro caso il numero di porta seriale potrebbe essere diverso ma la procedura rimane ovviamente la stessa.
Adesso accertiamoci che la porta seriale in questione sia configurata correttamente per poter comunicare con il modulo ESP8266
Vado su


E qui trovo la porta COM6. Right-Click e selezione proprieta’
Selezioni la tab Hardware


Poi dinuovo proprieta’ e poi selezioni la tab Port Settings (o l’equivalente nella lingua del vostro Windows)
Adesso configuro la porta con gli stessi parametri della figura sotto



Adesso lancio l’IDE Arduino e selezioni la porta seriale corretta come in figura


Adesso apro il Monitor seriale e mi accerto che la velocita’ di trasmissione ed i caratteri di terminazione linea siano impostati come in figura


Adesso resetto il modulo ESP8266 disconnettendo e poi riconnettendo l’alimentazione.
Se tutto funziona correttamente il modulo risponde con la scritta ready



Il firmware standard del modulo ESP8266 mette a disposizione una serie di comandi standard Hayes (per chi si ricorda questo e’ lo standard usato nei vecchi modem analogici) anche detti comandi AT [https://en.wikipedia.org/wiki/Hayes_command_set




Verifichiamo innanzitutto che funzioni correttamente inviando con il comando AT (Test AT startup) . 
Se in risposta otteniamo un OK allora siamo apposto. Tutto funziona correttamente.
I comandi AT si inviano al modulo tramite il vostro programma di emulazione di terminale. Nel monitor seriale di Arduino che ho usato io basta scrivere il comando nella barra superiore e premere invio



Solo per curiosita’ verifico la versione del firmware con AT+GMR (View Version Info). Nel mio caso e’ la versione 0.9.5 ma vostro caso la versione del firmware puo’ essere diversa.
A questo punto cambio la modalita’ in Wifi client con il comando AT+CWMODE (Wifi mode)
Come da specifica il modulo ESP8266 commuta in client mode (station mode) con il parametro 1
Siccome ho ricevuto un OK significa che ora il modulo ESP8266 non e’ piu’ un access point ma un client wifi, quindi controllo quali siano gli access point disponibili con il comando AT+CWLAP (List available APs)


Il modulo EPS8266 “vede” tutte le reti wifi che vedo anche dal mio PC a conferma che tutto funziona correttamente anche in client mode.
Verifico quale sia l’indirizzo IP assegnato al modulo (ovviamente non mi aspetto nessun indirizzo siccome non e’ ancora associato a nessuna rete). Per questo uso il comando AT+CIFSR (Get local IP address)




Il modulo mi conferma che nessun indirizzo e’ assegnato (0.0.0.0) ed inoltre mi fa vedere qual’e’ il MAC address del modulo (utile per fare controllo d’accesso nel router wifi del vostro provider).
A questo punto siccome ho cambiato modalita di funzionamento da AP a client wifi devo fare un reset tramite il comando AT+RST (reset module)





A questo punto mi posso collegare alla mia rete Wifi tramite il comando AT+CWJAP (Connect to AP), specificando il node della rete e la password.




Adesso che mi sono collegato alla rete Wifi controllo dinuovo quale indirizzo IP e’ stato assegnato allo ESP8266 usando lo stesso comando di prima (AT+CIFSR)




Adesso come si vede dalla figura mi e’ stato assegnato un indirizzo IP valido
Adesso che il modulo e’ collegato alla mia rete Wifi verifichiamone il funzionamento a livello TCP/IP
Inizio facendo un ping all’indirizzo dello ESP8266




Ok come mi aspettavo e’ raggiungibile. Buon segno J
ESP8266 come client TCP
Lancio dalla mia VM linux il piu’ semplice TCP/web  server possibile tramite il comando nc (netcat)



Adesso configuriamo il modulo ESP8266 in modo da creare una sessione TCP col mio server ed inviare alcuni dati
Imposto per semplicita’ una singola connessione tramite il comando AT+CIPMUX (Enable multiple connections or not). Il parametro 0 (zero) significa singola connessione




Adesso creaiamo la conneccione TCP verso il server che e’ in ascolto sulla porta 9090 del mio linux tramite il comando AT+CIPSTART (Establish TCP connection or register UDP port and start connection).
I parametri da passare sono il tipo di connessione, l’indirizzo del server e la porta su cui il server e’ in ascolto

Dopo aver eseguto questo comando il modulo ESP8266 mi dice CONNECT e OK. Quindi il socket TCP e’ aperto verso il server 192.168.1.2:9090

Adesso inviamo una semplice stringa al nostro server tramite il comando AT+CIPSEND (Send data) e specifichiamno la lunghezza della stringa (hello ESP8266 = 13 byte). Se inviate una stringa diversa usate la giusta lunghezza come parametro

Quando riceviamo OK possiamo inserire la stringa da inviare e premere invio
Il modulo ci informa con SEND OK che i dati sono stati inviati correttamente.

Adesso chiudo la conneccione TCP con AT+CIPCLOSE (Close TCP or UDP connection)
L’OK finale mi conferma che il comando e’ stato eseguito correttamente e’ la connessione TCP e’ chiusa.

Lato server abbiamo la conferma che la stringa inviata dal modulo ESP8266 e’ stata ricevuta correttamente e che la connessione TCP e’ stata chiusa correttamente




Non so voi ma a me il fatto che questo semplice test abbia funzionato e pensare che in un piccolo chip come ESP8266 e’ implementato un intero stack TCP/IP mi galvanizza molto.

ESP8266 come server TCP

Siccome adesso vogliamo che il modulo ESP8266 funzioni come un server TCP/IP  lo imposto in modo che accetti connessioni multiple (max 4) quindi al comando AT+CIPMUX passo il parametro 1




Adesso configuro il server TCP con il comando AT+CIPSERVER (Configure as server) passando come parametri 1 (create server) e la porta 9090 su cui mettersi in ascolto

A questo punto dal mio linux invio una semplice stringa (ciao) al server sempre il comando nc




Ed il server una volta ricevuta la stringa la stampa confermandomi che la comunicazione e’ avvenuta con successo.




In conclusione ho verificato che lo ESP8266 funziona come Wifi Access Point, come Wifi client. Che funziona come TCP server per ricvere dati e come TCP client per inviare dati.
Come detto all’inizio questo mi conferma che il ESP8266 e’ il miglior modulo che abbiamo mai provato per fornire i miei progettini Arduino di un canale di comunicazione affidabile e facile da usare.