Go Down

Topic: collegamento fisico modulo wifi ESP8266 v.12 ad arduino uno (Read 12746 times) previous topic - next topic

quercus

Buondì a tutti!
Dopo essermi presentato, illustro il mio progetto e il problema che sto riscontrando: utilizzo arduino uno (un clone comprato qua).

Vorrei controllare la temperatura di una stanza/ambiente e ricevere una mail ogniqualvolta la temperatura supera una certa soglia.
Attualmente utilizzo un DHT11 per la temperatura: dopo una giornata spesa a cercare dappertutto su guide, how to e datatsheet, sono riuscito a collegarlo all'uno e a leggere dalla seriale i dati che rileva.

Il problema è sul modulo wifi ESP8266 versione ESP-12 (comprato qua - immagine, altra immagine): non capisco minimamente come collegarlo all'arduino, o quali componenti devo mettere tra i vari pin, in quanto chiunque su internet scrive cose diverse, oppure parla di utilizzare solo il modulo wifi senza arduino tramite l'arduino IDE modificato (non credo che possa andare bene anche per il mio caso, in quanto poi voglio utilizzare una sonda/sensore che gestisca anche temperature sotto lo zero e credo sia necessario un arduino).

Inoltre tutti dicono che la tensione in ingresso al modulo wifi dev'essere massimo di 3.3V e non 5V come quella che forniscono i pin digitali dell'arduino uno.
Domanda da ignorante: non basta mettere una resistenza adeguata per abbassare la tensione da 5 a 3.3 o bisogna utilizzare un voltage divider come spesso ho letto in giro?
E inoltre neppure la corrente di alimentazione va bene, in quanto il modulo può arrivare ad assorbire fino a 80mA, quando l'uno al massimo riesce ad erogare 40mA prima di friggere (come scritto nella doc).
Tutto ciò è riportato su questo datasheet che ho trovato, in particolare si veda pagina 8/31. Questi discorsi sono sensati?

vorrei ora capire: sto sbagliando io a impostare tutto il progetto? sto sbagliando componenti? avete suggerimenti da darmi? o una guida passo passo affidabile da seguire per collegare le parti elettroniche?
Per il software dovrei riuscire a cavarmela, pensavo di appoggiarmi a questa libreria.

Accetto volentieri consigli,
buona serata
Alberto

gpb01

In attesa di risposte potresti leggerti QUESTO thread dedicato interamente al ESP8266 ... sicuramente troverai la soluzione a molti tuoi dubbi ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

icio

.... illustro il mio progetto e il problema che sto riscontrando: utilizzo arduino uno (un clone comprato qua).
......
buona serata
Alberto
Non è un clone è un compatibile

Questo è un clone

SukkoPera

Collegare quel modulo ("a francobollo") non è semplice, perché i pin non hanno la spaziatura standard e si possono solo saldare.

Per questo normalmente si saldano su dei piccoli PCB adattatori, come questi:



Che poi sono di una stupidità galattica, perché sono larghi come l'intera breadboard, e quindi non riesci ad attaccare nessun filo. Finisce che devi metterlo a cavallo di 2 breadboard per poterci fare qualcosa di utile.

Quei PCB comprendono già i pull-up/down necessari, di solito. Ti resta solo da procurare l'alimentazione (3.3V è corretto, ma non puoi usare quelli forniti da Arduino, devi mettere un regolatore esterno, a volte lo trovi già montato sui PCB). Devi anche abbassare la tensione del TX di Arduino, da 5 a 3.3V, con un partitore (1K/2K o simile) o qualche altro metodo che trovi in giro.

Sul forum abbiamo un progetto per sviluppare uno shield ESP8266 plug & play, ma al momento siamo tutti troppo impegnati:(.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

quercus

In attesa di risposte potresti leggerti QUESTO thread dedicato interamente al ESP8266 ... sicuramente troverai la soluzione a molti tuoi dubbi ... ;)
Grazie Guglielmo della pronta risposta. Sul link da te citato ci ero già finito, ma nelle prime dieci e ultime dieci pagine leggo solo chiacchiere da bar o tecnicismi da esperti, e non ho trovato alcuna soluzione al mio problema (forse troppo elementare per quel livello di discussione?)

Non è un clone è un compatibile
D'accordo, grazie dell'informazione icio.


Collegare quel modulo ("a francobollo") non è semplice, perché i pin non hanno la spaziatura standard e si possono solo saldare.
Grazie della risposta SukkoPera. Io in realtà ho saldato il "francobollo" con dei cavetti, per poterlo maneggiare:

(mi scuso per la bassa qualità dell'immagine.. sostanzialmente ho saldato ogni piedino ad un differente cavetto, così da essere comodo per raggrupparli insieme)


> Per questo normalmente si saldano su dei piccoli PCB adattatori, come questi:
grazie dell'informazione. Vedrò di recuperarne uno per il prossimo modulo, dato che ormai questo l'ho saldato.

>Quei PCB comprendono già i pull-up/down necessari, di solito.
La mia conoscenza qua si ferma. Cercherò di capire cosa siano.

> Ti resta solo da procurare l'alimentazione (3.3V è corretto, ma non puoi usare quelli forniti
> da Arduino, devi mettere un regolatore esterno, a volte lo trovi già montato sui PCB).
Intendi un qualcosa che stabilizzi i 3.3V che vado a prendere come tensione di alimentazione dall'arduino per essere sicuro che non ci siano oscillazioni che rovinino il modulo esp? una volta "stabilizzata" questa tensione, la corrente che arriva al modulo deve essere anch'essa stabilizzata o non è importante come alimentazione?

> Devi anche abbassare la tensione del TX di Arduino, da 5 a 3.3V, con un partitore (1K/2K
> o simile) o qualche altro metodo che trovi in giro.
Quindi mi basta una resistenza? e non un voltage level shifter come si legge in giro per la rete?


Quello che non trovo io è un documento *affidabile* che mi permetta di capire quali piedini dell'uno associare a quelli del modulo wifi.
Sapete direzionarmi per trovare una fonte sicura? Oppure aiutarmi a capire cosa studiare per capire da me gli articoli che trovo su internet?

Grazie ancora a tutti per le vostre risposte.

SukkoPera

Il pinout è questo:



Gli unici pin che devi collegare sono, alimentazione a parte, TX e RX. Questo modulo usa infatti la comunicazione Seriale. Lato Arduino l'unica seriale hardware presente sulla Uno è già impegnata per la console, quindi se non vuoi rinunciare a questa, devi istanziare una SoftwareSerial su due pin a caso (consiglio RX 10, TX 11) e usare questa. La SoftwareSerial non è affidabile ad alte velocità, per cui ti consiglio di usare 9600 bps. Non è detto che il tuo modulo sia configurato a questa velocità (probabilmente è a 115200 di default, ma non è detto), per cui dovrai prima collegartici con un adattatore USB-Seriale e abbassare la velocità (comando AT+UART_DEF, NON usare AT+IPR!).

Il TX Arduino -> RX ESP va passato da un partitore di tensione come detto prima. Se hai un level shifter tanto meglio, ma non è fondamentale. Va bene anche un diodo Zener 3.3V + R220 Ohm.

Oltre a questi due pin, devi mettere un resistore da 1K-10K tra GPIO15 e GND e uno simile tra CH_PD (nella foto è EN) e 3.3V.

Infine l'alimentazione: non è tanto questione di stabilizzazione, quanto il fatto che sti 3.3V li devi proprio generare in qualche modo che regga almeno 250-300 mA. In generale non si usano i partitori sull'alimentazione, meglio un vero e proprio regolatore tipo AMS1117. Anche un L4931 può andare, ma è proprio ai suoi limiti.

Fai pure qua tutte le domande che ti servono, abbiamo una certa esperienza in merito ;).
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

quercus

Grazie della risposta SukkoPera, sto recuperando un po' di componenti.

Lato Arduino l'unica seriale hardware presente sulla Uno è già impegnata per la console, quindi se non vuoi rinunciare a questa, devi istanziare una SoftwareSerial su due pin a caso (consiglio RX 10, TX 11) e usare questa.
Mi sono letto la documentazione in merito alla seriale: quindi se devo utilizzare solo un sensore DHT per la temperatura e il modulo wifi, posso evitare di utilizzare una software serial? Ossia, posso collegare il mio modulo wifi all'RX e TX dell'uno o devono essere lasciati vuoti?
In che senso la seriale hardware è impegnata per la console?

Se utilizzassi i pin RX (0) e TX (1) dell'arduino uno per il modulo wifi, e un altro qualsiasi pin digitale per il sensore DHT ci sarebbero problemi? Immagino che la risposta sia no, dato che il sensore DHT non lavora tramite seriale ma solo per differenza di tensione, e quindi è utilizzabile semplicemente tramite pin digitali: dico bene o è una boiata?

Quote
Il TX Arduino -> RX ESP va passato da un partitore di tensione come detto prima. Se hai un level shifter tanto meglio, ma non è fondamentale. Va bene anche un diodo Zener 3.3V + R220 Ohm.

Oltre a questi due pin, devi mettere un resistore da 1K-10K tra GPIO15 e GND e uno simile tra CH_PD (nella foto è EN) e 3.3V.
Sto recuperando lo zener. Una domanda: tutti questi dati li hai estrapolati dal datasheet?

Quote
Infine l'alimentazione: non è tanto questione di stabilizzazione, quanto il fatto che sti 3.3V li devi proprio generare in qualche modo che regga almeno 250-300 mA. In generale non si usano i partitori sull'alimentazione, meglio un vero e proprio regolatore tipo AMS1117. Anche un L4931 può andare, ma è proprio ai suoi limiti.
Cosa mi conviene utilizzare per l'alimentazione? Posso recuperare facilmente un trasformatore per plastici fermodellistici, ma quale è più adatto? Se trovo un 12V, immagino non vada bene attaccarlo al regolatore AMS1117 perché altrimenti si brucia.. O anche qua sto dicendo una boiata?

Ho proprio bisogno di capire come funziona l'alimentazione dei dispositivi.
Grazie della pazienza.

SukkoPera

La seriale è impegnata per la console nel senso che quello che vedi nel terminale di Arduino passa da lì, per cui se la usi per l'ESP devi rinunciare a tutte le Serial.print() e compagnia, cosa che rende sicuramente complessa la realizzazione e messa a punta del tuo sketch. Comunque la serial software funziona molto bene, lentezza a parte, per cui te la consiglio, almeno in prima approssimazione.

Per il DHT puoi usare qualunque pin, non c'è problema.

Non ho preso i valori dal datasheet, ma dall'esperienza personale. I valori dei pull-up in verità sono abbastanza flessibili, per cui c'è libertà. Per il resistore in serie allo Zener invece le cose sono più complicate e non sono nemmeno molto esperto in merito. Anzi, in verità ho fatto fior di calcoli che mi hanno suggerito valori ben diversi, con i quali però non riuscivo a fare funzionare il circuito. Alla fine, empiricamente ho trovato il valore di 220 ohm, valido per i diodi bzx84c3v3. Altri Zener potrebbero richiedere resistori diversi. In effetti ti consiglierei di usare il partitore, se hai 3 resistori uguali tra gli 1 e i 10 kohm sei a cavallo!

Il regolatore per i 3.3, se è a dropout (relativamente) basso come l'1117, puoi attaccarlo direttamente al +5V di Arduino, che è in grado di fornire la corrente necessaria. C'è già un regolatore 3.3 su Arduino (quello che genera la tensione sul pin 3.3), ma è dato per max 50 mA, per cui non si può utilizzare con l'ESP.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

quercus

La seriale è impegnata per la console nel senso che quello che vedi nel terminale di Arduino passa da lì, per cui se la usi per l'ESP devi rinunciare a tutte le Serial.print() e compagnia, cosa che rende sicuramente complessa la realizzazione e messa a punta del tuo sketch.
Ah.. quindi se attualmente attacco qualcosa ai digital pin 0 e 1 di un Uno, non funziona print su seriale? che storia.. grazie dell'informazione.

Quote
Comunque la serial software funziona molto bene, lentezza a parte, per cui te la consiglio, almeno in prima approssimazione.
Avrei quindi bisogno di prendere un affare del genere (link) per usare una software serial su altri pin digitali, come dicevi nel post dell'11 aprile? o questo pezzo serve solo per ricalibrare la velocità di trasmissione del modulo wifi e dopo non serve più?

Volendo posso collegare anche un display e fare il print su quello anziché su schermo, in modo da poter utilizzare lo 0 e l'1 per l'ESP ed evitare di usare l'adattatore usb-seriale.

Quote
Non ho preso i valori dal datasheet, ma dall'esperienza personale. I valori dei pull-up in verità sono abbastanza flessibili, per cui c'è libertà.
ho letto che le resistenze di pull-up/down sono normali resistenze che servono per dare stabilità (tensione alta o bassa) agli ingressi di un componente.. sbaglio?

Quote
Per il resistore in serie allo Zener invece le cose sono più complicate e non sono nemmeno molto esperto in merito. Anzi, in verità ho fatto fior di calcoli che mi hanno suggerito valori ben diversi, con i quali però non riuscivo a fare funzionare il circuito. Alla fine, empiricamente ho trovato il valore di 220 ohm, valido per i diodi bzx84c3v3. Altri Zener potrebbero richiedere resistori diversi. In effetti ti consiglierei di usare il partitore, se hai 3 resistori uguali tra gli 1 e i 10 kohm sei a cavallo!
Qua (link) parla esattamente di scalare una tensione da 5v a 3.3v, e la strategia due è tramite uno zener. Con i 220 ohm si ha un perfetto taglio della forma d'onda, visibile dallo screen dell'oscilloscopio.
E nella strategia 4 sconsiglia altamente di utilizzare delle resistenze.
Cito: "However! Danger! Danger! The impedance of the surrounding circuitry will wreck havoc with the voltage divider. I really do not recommend this method."

Quote
Il regolatore per i 3.3, se è a dropout (relativamente) basso come l'1117, puoi attaccarlo direttamente al +5V di Arduino, che è in grado di fornire la corrente necessaria. C'è già un regolatore 3.3 su Arduino (quello che genera la tensione sul pin 3.3), ma è dato per max 50 mA, per cui non si può utilizzare con l'ESP.
Ma non bisogna generare almeno 250-300mA per l'ESP? Qua (link) dice che l'uno sui pin Vcc eroga al max 200mA di corrente. (Il DHT11 in media richiede 0.5mA, e al massimo 2.5mA, quindi non lo considero quasi nel conto della corrente necessaria)

Quindi attaccando l'esp all'AMS1117 connesso ai 5V, non rischio di fare secco l'arduino in caso di una richiesta massiccia di corrente?

SukkoPera

L'"affare" serve solo a cambiare la velocità dell'ESP, poi non ti serve più, visto che collegherai ESP e Arduino direttamente. Potrebbe servirti se volessi usare una SoftwareSerial per parlare col PC, ma non è una cosa che capita tanto spesso. Forse con microcontrollori più piccoli, ma non ci pensare.

Puoi usare un display ma è estremamente più scomodo, non c'è motivo per farlo. Se proprio ti pesa tanto usare una SoftwareSerial, prenditi una Leonardo o una Uno: la prima ha una seriale hardware sola ma è libera, perché verso il PC comunica con una seriale CDC tramite USB, mentre la seconda ha addirittura 4 seriali hardware!

È vero che normalmente l'impedenza del circuito di contorno influisce sul partitore, ma in questo caso il circuito attorno non esiste, è solo un pin di input che, per definizione, ha un'impedenza elevatissima e nella pratica è come se non ci fosse. In più ho usato quella soluzione per molto tempo di persona senza alcun problema, e la uso tutt'ora. Se poi vuoi una soluzione ottima sotto tutti i punti di vista (ma, ripeto, non c'è motivo), vedi questo.

200-250 mA sono necessari per l'ESP, ma il 200 mA che hai trovato tu è un'altra roba: è la corrente massima erogabile da tutti i pin di I/O del microcontrollore. In questi non figura l'alimentazione che, sempre per definizione, non è certo generata dal microcontrollore. Il pin 5V è invece collegato all'output del regolatore di tensione 5V presente sulla scheda, che regge almeno 500 mA (se alimentato da USB, se vai di alimentatore può sfiorare anche 1A), e che quindi ti dà la possibilità di alimentare anche l'ESP con un po' di margine per altro.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

quercus

Puoi usare un display ma è estremamente più scomodo, non c'è motivo per farlo. Se proprio ti pesa tanto usare una SoftwareSerial, prenditi una Leonardo o una Uno: la prima ha una seriale hardware sola ma è libera, perché verso il PC comunica con una seriale CDC tramite USB, mentre la seconda ha addirittura 4 seriali hardware!
Intendevi un arduino mega? Comunque aggiungerò il convertitore usb-seriale alla lista della spesa.

Quote
È vero che normalmente l'impedenza del circuito di contorno influisce sul partitore, ma in questo caso il circuito attorno non esiste, è solo un pin di input che, per definizione, ha un'impedenza elevatissima e nella pratica è come se non ci fosse. In più ho usato quella soluzione per molto tempo di persona senza alcun problema, e la uso tutt'ora. Se poi vuoi una soluzione ottima sotto tutti i punti di vista (ma, ripeto, non c'è motivo), vedi questo.
Mi posso solo che fidare, in quanto sono solo un laureando in ingegneria informatica e l'elettronica non l'ho quasi vista  ;)

Quote
200-250 mA sono necessari per l'ESP, ma il 200 mA che hai trovato tu è un'altra roba: è la corrente massima erogabile da tutti i pin di I/O del microcontrollore. In questi non figura l'alimentazione che, sempre per definizione, non è certo generata dal microcontrollore.
D'accordo. Pensavo che "DC Current VCC and GND Pins...... 200.0 mA " indicasse la massima corrente transitabile per un pin Vcc o Gnd. Ma in effetti quella pagina è abbastanza striminzita. Grazie dell'informazione.

Quote
Il pin 5V è invece collegato all'output del regolatore di tensione 5V presente sulla scheda, che regge almeno 500 mA (se alimentato da USB, se vai di alimentatore può sfiorare anche 1A), e che quindi ti dà la possibilità di alimentare anche l'ESP con un po' di margine per altro.
Molto bene. Il passo successivo sarà alimentare il tutto tramite un pacco di batterie, ma prima devo pensare a tutto il resto.

SukkoPera

Erm sì, intendevo un Mega ovviamente :-[.

Evidentemente i tempi sono cambiati! Anch'io sono un laureato (magistrale) in ing inf, e l'elettronica me l'hanno fatta uscire dalle orecchie >:(. Poi beh, per una serie di motivi io non ci ho capito granché: vuoi l'incapacità di insegnamento dei professori, il nozionismo esasperato e la quasi totale assenza di laboratori, però ho dovuto passare 2 esami di elettrotecnica e 4 di elettronica! In compenso ho iniziato a capirci qualcosa solo ora, quando, complice Arduino, ho iniziato a metterci "le mani sopra" davvero.

Sì, probabilmente la corrente che transita da Vcc non può essere più di 200 mA, ma quella che ti va ad alimentare l'ESP non transiterà da Arduino, dato che di fatto il regolatore 3.3V sarà collegato in parallelo ad esso.

Quanto all'alimentazione a batterie, ne stiamo parlando proprio in questi giorni qua, dove sto cercando di documentarmi su come alimentare un Arduino con una batteria ricaricabile di capacità decente, gestendone anche il livello e la ricarica. Se ti va di dare un'occhiata... :)
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

quercus

Ciao SukkoPera, grazie delle risposte. Mi scuso per l'assenza, ma sono sotto studio..


Ho applicato tutte le dritte ricevute finora, ams1117 all'alimentazione, zener+resistenza da 220ohm sul TX del digitale e resistenze  varie come detto sopra. Ora le tensioni sono regolari a 3.3v.
Nel frattempo è arrivato anche l'adattatore usb-seriale cp2102 (come questo: https://www.amazon.it/Sparkykit-CP2102-Switch-Download-Speed/dp/B01C1IY8DI/ref=sr_1_9?s=electronics&ie=UTF8&qid=1464910430&sr=1-9&keywords=usb+serial+cp2102 ).

Ora volevo finalmente testare se questo modulo wifi funziona, ma non riesco a ricevere delle conferme positive.

All'inizio, mettendo TX e RX dell'esp sui pin 10 e 11 dell'arduino, e impostando la Software Serial a 115200baud (sapendo di sbagliare) riuscivo a leggere il messaggio Hello World di ritorno, seppure i caratteri dopo i primi 3 o 4 fossero sempre più "rovinati". Questo mi conferma che era impostato di default su 115200baud, dato che con altri tempi non si leggeva proprio niente.

Non sapendo (ancora) usare l'adattatore usb-seriale citato prima, ho provato a connettere ugualmente l'esp all'arduino, direttamente ai pin 0 e 1, rinunciando momentaneamente al monitor seriale e sfruttando il fatto che 0 e 1 possono viaggiare a qualunque velocità: ho printato momentaneamente su uno lcd shield connesso sopra l'arduino.
Provando a lanciare un semplice "AT" all'esp, tramite un
Code: [Select]
Serial.print("AT");
 ricevevo solo dei -1 come risposte: LCD funziona bene e i -1 derivano da Serial.read() che non trova disponibile il modulo, stando alla documentazione del metodo read().

Ho poi provato a dare uno
Code: [Select]
Serial.print("AT+UART_DEF=9600,8,1,0,0");
 un po' alla cieca sperando che il modulo leggesse il risultato e lo salvasse; provando poi a spostare i TX e RX dell'esp sui pin 10 e 11 ed utilizzando una SoftwareSerial a 9600baud, non si leggeva niente lo stesso.

Adesso vorrei solo capire cosa sto sbagliando e dove posso documentarmi meglio.
Questo può essere un metodo: http://fab.cba.mit.edu/classes/863.14/tutorials/Programming/serialwifi.html, usando il software di quel repo?
Altrimenti accetto anche altri consigli: sono curioso di imparare  :)

quercus

Intanto ho cambiato modulo wifi e ne sto usando un altro, in particolare la versione 12-E, per evitare che fosse il modulo bruciato a bloccare i miei tentativi, e sto provando la guida del messaggio precedente, ma senza alcun risultato. http://fab.cba.mit.edu/classes/863.14/tutorials/Programming/serialwifi.html
Il led sul modulo lampeggia appena lo collego con l'adattatore usb-seriale, ma utilizzando il programma di test:
Code: [Select]
$ python esp8266test.py /dev/ttyUSB0 115200 AP-casa xs02zl29cd953
INFO:root:Sending command: AT

non succede nulla. Il modulo resta bloccato sull'AT. Su due moduli provati non sono ancora riuscito ad ottenere una risposta in chiaro.

L'unico segno di vita lo ho quando, provando a collegare i TX e RX sui pin 10 e 11 dell'arduino ed attivando una software serial a 115200 baud, mi vedo rispondere un "Henlo, wk ERROR" al mio messaggio di saluto "Hello, world?", preso dall'esempio della libreria SoftwareSerial.


Mi basterebbe capire come collegarmi tramite adattatore usb-seriale all'esp, per potergli dare un AT+UART_DEF e modificare così la velocità di trasmissione una volta per tutte.

SukkoPera

Scusa, ma qual è il problema preciso per cui non riesci a collegarti con l'adattatore seriale?
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

Go Up