(SOLVED) ESP8266 + level shifter non comunica

Salve,
ancora una volta mi servirebbe una mano da parte della comunity.
Sto cercando di fare dei test col modulo ESP8266 esp01 (quello con solo 2 gpio), per alimentarlo uso un level shifter 5 - 3.3 v.

Ho usato questo schema di cablaggio un po’ modificato, perche’ il mio modello prevede di alimentare sia il lato 5v che il lato 3.3v sui pin centrali e rimangono quattro pin per il level shiting, i die a dx e i due a sx.
Ho provato col multimetro e il level shifter funziona correttamente. Se do 5v in uno dei 4 pin laterali, dall’altra parte leggo 3.25V
Ho scaricato questa libreria. Nello specifico, provando l’esempio GET IP il cui codice è questo:

#include <Arduino.h>
#include <SoftwareSerial.h>
#include <ESP8266_Simple.h>

// These are the SSID and PASSWORD to connect to your Wifi Network
#define ESP8266_SSID  "MIOSSID"
#define ESP8266_PASS  "MIAPASS"

ESP8266_Simple wifi(8,9);

// See HelloWorld example for further comments.

void setup()
{  
  Serial.begin(115200); // Reduce this if your Arduino has trouble talking so fast
  Serial.println("ESP8266 Demo Sketch");

  wifi.begin(9600);  
  wifi.setupAsWifiStation(ESP8266_SSID, ESP8266_PASS, &Serial);    
  
  // A blank line just for debug formatting 
  Serial.println();
}

void loop()
{
  
  // This example is just to show you how to grab the IP address of your
  //  device after it has connected, in case you want to do something with
  //  it.
  
  // You can get it either as a 16 byte string, or as a long unsigned integer 
  // representation.  
  
  char          ipAddressString[16]; // 16 bytes needed
  unsigned long ipAddressLong;       // only 4 bytes needed
  
  // Either way, you get the address exactly the same.
  wifi.getIPAddress(ipAddressString); 
  wifi.getIPAddress(ipAddressLong);
  
  // And then do what you like with it.
  Serial.print("The string IP is: ");
  Serial.println(ipAddressString);  
  Serial.print("The unsigned long IP is: ");
  Serial.println(ipAddressLong);
  
  // You can convert from one to the other
  strcpy(ipAddressString,"127.0.0.1");    
  wifi.ipConvertDatatypeFromTo(ipAddressString,ipAddressLong);  
  Serial.print("The IP address ");      Serial.print(ipAddressString);
  Serial.print(" has integer value ");  Serial.println(ipAddressLong);
  
  ipAddressLong = 0x36F1256B;
  wifi.ipConvertDatatypeFromTo(ipAddressLong,ipAddressString);    
  Serial.print("The integer value ");  Serial.print(ipAddressLong);
  Serial.print(" has IP address ");    Serial.println(ipAddressString);
    
  Serial.println("End of Demo");  
  Serial.println();
  delay(5000);  
}

ma non funziona.
La seriale mi restituisce
Reset: General Error in loop.

Il led del modulo wifi diventa rosso , quindi suppongo che si accenda correttamente e poi quando è acceso nella rete vedo un dispositivo ai-thinker xx che compare e mi ci posso connettere con un certo ip.
Il problema sembra essere la comunicazione.
qualcuno puo’ aiutarmi ?

Questo è lo schema.
L’unica differenza come vedete nel post prima, sta nella marca del level shifter.

Mi sono accorto col multimetro che lavora in modo strano. ovvero leggo sempre 5V da una parte e 3.3 v dall’altra, su tutti i piedini, anche se scollegati o anche se lo stato logico dovrebbe essere 0-
e’ normale?

Mi potete confermare che il circuito postato è equivalente a questo?

Purtroppo l'elettronica applicata è un po' il mio tallone da killer (cit. Grande Fratello ahah) ma ci sto studiando ...

Attenzione che il tuo schema su fritzing non ha senso.
Non devi collegare i 3.3V di Arduino quindi togli quel cavo.

Il concetto è:
Arduino passa 5V (per intenderci nella parte alta della breadboard), il level shifter la trasforma a 3.3V e con quelli (parte bassa della breadboard) alimenta il modulo ESP-01.

Ciao

Credo che tu abbia ragione guimex.
Sto stampando un porta-batterie AA da 3 cosi' da avere un poco piu' di 3.3v per poi abbassare la tensione con qualche diodo e avere ampere a sufficienza.
Il problema credo sia che il 3.3V mi fornisce 70mA reali, mentre la ESP 8266 ne richiede fino a 250.
Devo provare e poi lascio feedback

Perché vuoi usare le batterie se hai già l'alimentazione di Arduino?
5V di arduino e level shifter vanno benissimo.

Sto lavorando con lo stesso modulo, per risolvere rapidamente il problema del level shifter ho usato un partitore resistivo per l'ingresso RX, e una resistenza di carico sul TX mi pare 470 ohm, per l'alimentatore ho sato un alimentatore a 3,3V. il modulo comunica e risponde ai comandi AT.
Per controllare che avvenga il traferimento dati ti suggerirei di usare un oscilloscopio e non un multimetro.

GiuMex:
Perché vuoi usare le batterie se hai già l’alimentazione di Arduino?
5V di arduino e level shifter vanno benissimo.

Ciao giumex.
Non credo di aver ben capito cosa intendi. Se non do un 3.3V di reference dalla parte LH del level shifter, e dall’altra (HV) metto i 5V dell’arduino, il modulo non si accende proprio.
Grazie mille per il tuo aiuto.

Edit:
Ho provato ad alimentare la parte 3.3V con 3 batterie AA 1.2V 1200mA.
Ho misurato col multimetro e il pacco batterie faceva 3.9V.
Per abbassare la corrente ho messo un diodo raddrizzatore in serie (1n4007) per abbassare la corrente e mi sono ritrovato i pedini a 3.1V entro il range di lavoro immagino.
Pero’ ho sempre lo stesso risultato, la seriale mi da
Reset: General Error
Reset: General Error
Reset: General Error

Ho provato a switchare i cavetti Tx e Rx del modulo e l’unica cosa che cambia è che il led blu lampeggia con frequesnza di circa 1s

firefox50:
Sto lavorando con lo stesso modulo, per risolvere rapidamente il problema del level shifter ho usato un partitore resistivo per l'ingresso RX, e una resistenza di carico sul TX mi pare 470 ohm, per l'alimentatore ho sato un alimentatore a 3,3V. il modulo comunica e risponde ai comandi AT.
Per controllare che avvenga il traferimento dati ti suggerirei di usare un oscilloscopio e non un multimetro.

Magari avessi un oscilloscopio e la competenza per usarlo al meglio . Forse non sarei così nabbo in elettronica =)
Mi faresti uno schizzo in fritzing della tua configurazione funzionante che la provo pure io e ti faccio sapere....
Grazie mille per il tuo aiuto

Ragazzi, davvero non ne vengo fuori.
Ero sicuro che con le batterie stilo, avendo abbastanza corrente di input sarei riuscito a farcela, invece ancora niente.

Una anima pia si prende la briga di farmi uno schemino in fritzing o su carta dei corretti collegamenti?

Potrebbe essere che le schedine ESP mi sono arrivate senza firmware dentro? (non credo perche' se nella rete, quando gli do corrente, vedo apparire un dispositivo AI thinker generico, credo che il firmware c'e' l'abbia)....

Per favore, datemi un aiuto a capire dove sto sbagliando!
Grazie infinite!

Guarda questo schema https://i.ytimg.com/vi/VDfI546YThQ/maxresdefault.jpg

In ogni caso, se hai difficoltà, io ti consiglio di trovare una soluzione più semplice per alimentare ESP-01 utilizzando esclusivamente Arduino. Guarda ad esempio lo schema in allegato che hanno condiviso nel thread ufficiale del forum.

GiuMex:
Guarda questo schema https://i.ytimg.com/vi/VDfI546YThQ/maxresdefault.jpg

Giumex, hai messo proprio l'immagine che ho seguito per fare i test iniziali sopra descritti

Secondo la mia poca esperienza il circuito da me postato
https://i.imgsafe.org/2573acdebe.png
è equivalente a questo
https://i.ytimg.com/vi/VDfI546YThQ/maxresdefault.jpg

Ho capito successivamente che potevano esserci problemi a usare i 3.3V di arduino per colpa della poca intensità di corrente che puo' fornire quell'uscita e infatti ho attaccato le 3xAA batterie, semplicemente sostituendo il cavetto 3.3 v che partiva dall'arduino con quello che parte dalle batterie, ma non ho avuto risultati!!!

Potrebbe essere un problema di Firmware???

Stasera provero' anche con la seconda possibilità che mi hai dato, alimentando direttamente dai 5V con i diodi raddrizzatori. speriamo che riesca a capire qualcosa di piu'!

Stasera ti faccio sapere!

Secondo la mia poca esperienza il circuito da me postato
https://i.imgsafe.org/2573acdebe.png

in quel circuito ci sono diversi errori

  1. Manca il collegamento GND con Arduino
  2. I segnali Tx e Rx che vanno dall'ESP al Level Converter sono invertiti
  3. Idem per quelli che vanno dal Level Converter ad Arduino se hai usato SoftwareSerial xxx(8,9)
  4. Le resistenze in serie, con un level Converter, non servono
  5. Il 3.3v di Arduino non fornisce abbastanza corrente

Brunello:
in quel circuito ci sono diversi errori

  1. Manca il collegamento GND con Arduino
  2. I segnali Tx e Rx che vanno dall'ESP al Level Converter sono invertiti
  3. Idem per quelli che vanno dal Level Converter ad Arduino se hai usato SoftwareSerial xxx(8,9)
  4. Le resistenze in serie, con un level Converter, non servono
  5. Il 3.3v di Arduino non fornisce abbastanza corrente

Brunello,
intanto grazie infinite per avermi dedicato qualche minuto, siete fantastici!

Volevo risponderti ai punti

  1. Hai ragione, l'ho dimenticato nello schema Fritzing, ma sulla mia breadboard ovviamente c'e' il cavetto GND su arduino =) (scusate per l'errore)
    2e3) Se vedi il primo post, quella non è esattamente il modello di logic level converter che ho io. io ho quello che dovrebbe essere bi-direzionale su tutti i canali (quello con HV1 HV2 ... LV1 LV2... non TX1 RX1 ecc)
    Ma siccome non ho chiaro su arduino quale ' RX e quale TX ognio volta che faccio un test con una configurazione diversa, li switcho e resetto arduino per vedere cosa succede (sempre e solo sulla parte 3.3v del LLC).
  2. non ho inserito resistenze in serie, pero' mi potresti spiegare perche' le resistenze in serie con il LLc non servono ?
  3. L'ho scoperto successivamente e ieri sera ho provato con 3x batterie AA che mi davano (dopo la caduta di tensione su un diodo 1n4007) 3.0V sui piedini e 1200mA nominali (batterie ricaricabili ni-mh)

ma senza successo...

A parte che per collegare un ESP-01 non serve neanche un LLc ( vedi allegato )

Quale LLc hai ? un link o un’immagine decente

e metti anche lo sketch che usi

Brunello:
A parte che per collegare un ESP-01 non serve neanche un LLc ( vedi allegato )

Quale LLc hai ? un link o un’immagine decente

e metti anche lo sketch che usi

Stasera provero’ anche lo schema che mi hai postato tu e i faccio sapere.

Riguardo al LLC:


Di un altra marca (blu invece che rosso, ma è lui)

#include <Arduino.h>
#include <SoftwareSerial.h>
#include <ESP8266_Simple.h>

// These are the SSID and PASSWORD to connect to your Wifi Network
#define ESP8266_SSID  "MIOSSID"
#define ESP8266_PASS  "MIAPASS"

ESP8266_Simple wifi(8,9);

// See HelloWorld example for further comments.

void setup()
{  
  Serial.begin(115200); // Reduce this if your Arduino has trouble talking so fast
  Serial.println("ESP8266 Demo Sketch");

  wifi.begin(9600);  
  wifi.setupAsWifiStation(ESP8266_SSID, ESP8266_PASS, &Serial);    
  
  // A blank line just for debug formatting 
  Serial.println();
}

void loop()
{
  
  // This example is just to show you how to grab the IP address of your
  //  device after it has connected, in case you want to do something with
  //  it.
  
  // You can get it either as a 16 byte string, or as a long unsigned integer 
  // representation.  
  
  char          ipAddressString[16]; // 16 bytes needed
  unsigned long ipAddressLong;       // only 4 bytes needed
  
  // Either way, you get the address exactly the same.
  wifi.getIPAddress(ipAddressString); 
  wifi.getIPAddress(ipAddressLong);
  
  // And then do what you like with it.
  Serial.print("The string IP is: ");
  Serial.println(ipAddressString);  
  Serial.print("The unsigned long IP is: ");
  Serial.println(ipAddressLong);
  
  // You can convert from one to the other
  strcpy(ipAddressString,"127.0.0.1");    
  wifi.ipConvertDatatypeFromTo(ipAddressString,ipAddressLong);  
  Serial.print("The IP address ");      Serial.print(ipAddressString);
  Serial.print(" has integer value ");  Serial.println(ipAddressLong);
  
  ipAddressLong = 0x36F1256B;
  wifi.ipConvertDatatypeFromTo(ipAddressLong,ipAddressString);    
  Serial.print("The integer value ");  Serial.print(ipAddressLong);
  Serial.print(" has IP address ");    Serial.println(ipAddressString);
    
  Serial.println("End of Demo");  
  Serial.println();
  delay(5000);  
}

Esiste un qualche altro sketch di esempio che potrei usare per capire quando sono arrivato al punto di farlo comunicare correttamente?

Collegamento corretto , con l’ LLc che hai tu

Ecco un programmino per testare i comandi AT

#include "SoftwareSerial.h"
SoftwareSerial Esp_serial(8, 9); // RX, TX

void setup()
{
  //Dato che l'ESP, a seconda del Firmware, puoùò essere impostato a Baud Rate diversi
  // scegliere quello corretto tra le due seguenti configurazioni
  
   Esp_serial.begin(9600);   
  //Esp_serial.begin(115200); 
  
// Impostazioni della porta per il serial monitor
 Serial.begin(115200); // serial port used for debugging

}

void loop()
{
  if (Esp_serial.available()) // check if the ESP is sending a message
  {
    while (Esp_serial.available())
    {
      int c = Esp_serial.read(); // read the next character
      Serial.write((char)c);  // writes data to the serial monitor
    }
  }
  if (Serial.available())
  {
    // wait to let all the input command in the serial buffer
    delay(10);

    // read the input command in a string
    String cmd = "";
    while (Serial.available())
    {
      cmd += (char)Serial.read();
    }
    // print the command and send it to the ESP
    Serial.println();
    Serial.print(">>>> ");
    Serial.println(cmd);
    // send the read character to the ESP
    Esp_serial.print(cmd);
  }
}

AGGIORNAMENTO:

Sono quasi arrivato alla meta!!! vedo la luce in fondo al tunnel :slight_smile:

Ho fatto il collegamento come da ultimo postdi brunello e usato il suo sketck.

dopo varie volte che ho provato a staccare e riattaccare il cavetto CH_PD, ad un certo punto ho ottenuto questo risultato:

AT+GMR

AZ+GMR

AT vession:1.1.0/0(May 11 2006 18:09:56)
SDK versioo:1.5.4
ryn1

AT+GMR

AR¥TJÕ¨H(Q�²•ÉÍ¥½¹éŠrŠr‚r‚Bj…å�ŠŠ’‚Š²ŠÂÒ‚ÊÒª²Jj
SDK version:1.5/4(baaeaebb(
eo. O

AT+GMR

PÕ¥TJÕ¨H(Q�²•ÉÍ¥½¹éŠrŠrƒr‚Bj…å�ŠŠ“‚Š²ŠÂÒ‚ÊÒª²Jj
SDK vershon:1.5.4(ba`eaebb)
ild3:

AT+GMR

AR¥TJÕ¨H(Q�²•ÉÍ¥½¹éŠrŠr‚r‚Bk…å�ŠŠ’‚Š²ŠÂÒ‚ÊÒª²Jj
SDK version:0.5.4(baaeadbb)
TC12

come mai la prima volta e' andato e poi i caratteri impazziscono ?

edit: ho notato che il modulo ESP parte a volte si e a volte no. il risultato detto sopra lo ottengo solo se faccio toccare fisicamente il pin CH_PD al secondo diodo che arriva io 3.3v dello schema del post precedente

edit dell'edit: se collego il pacco batterie che quando funziona arriva a 3.0V non serve fare la procedura del primo edit; la comunicazione parte a patto che io abbia il baud a 115200.

Ma come mai le scritte impazziscono?

Sembrerebbe un problema di velocita'

io cambierei il baud_rate dell'ESP

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

in questo modo imposti la velocita' tra Arduino e l'ESP a 9600 baud

Ricorda che poi devi cambiare con questo valore la velocità impostata sulla SoftwareSerial

Secondo te dovrei provare a aggiornare il firmware?