ESP32 Ethernet come si programma?

Ciao,
la scheda in oggetto non ha il connettore usb, pensavo di poterla programmare utilizzando un convertitore USB-SERIALE come ho fatto con altre ESP, ma la ide mi da errore di comunicazione.
Mi sono collegato al pin TX0 e RX0, naturalmente GND, e il pin DTR al pin IO0 della ESP; tramite monitor seriale leggo quello che trasmette la ESP, quindi il collegamento funziona; ho provato a tenere basso il pin IO0 durante la programmazione, nulla, ho provato ad abbassare il pin IO0 appena parte la programmazione e poi rilasciarlo, ma nulla.
Il convertitore USB-SERIALE mi mantiene il pin DTR a 2V, mentre quando va in programmazione prova qualche volta ad abbassarlo a circa 1,5V poi torna a 2V.

Come scheda ho selezionato la ESP32 Dev Module, mentre proprio sul chip ESP32 nella shield leggo WT32 S1.

Sto sbagliando qualcosa? Allego la shield utilizzata.

Grazie :slight_smile:

Per mettere l'ESP32 in donwload mode, devi tenere sul livello LOW il GPIO0 e poi fare il reset della MCU (pin EN su LOW).

Il pin DTR del convertitore USB/TTL non serve a nulla senza il circuito di switch che c'è tipicamente nelle schede basate su ESP.


Questo ad esempio è quello usato con la Wemos D32. Stessa cosa con la NodeMCU-32 solo che i transitor non sono racchiusi in un integrato

Ciao,
quindi va alimentata quando il pin IO0 è LOW, oppure dopo averlo messo LOW c'è da fare il reset...
Faccio una prova...
Mentre facendo il collegamento come lo schema che hai messo, e collegando anche DTR e RTS farebbe tutto da solo?
Grazie :smiley:

Si ti basta replicare lo schema (completo) usato nelle dev-board più comuni.

Ottimo, ho provato per ora in modo manuale, e ha funzionato, grazie ancora :slight_smile:
Poi mi preparo una schedina apposita per fare questo...
Non so se posso proseguire quà o nella sezione software, ho caricato un programma di esempio della libreria EthernetESP32, in seriale controllando il debug risulta che non è stato trovato l'hardware (il modulo ethernet)

#include <EthernetESP32.h>
#include <NetworkClientSecure.h>

//W5500Driver driver;
//ENC28J60Driver driver;
EMACDriver driver(ETH_PHY_LAN8720);

char server[] = "arduino.tips";

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 1, 7);

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
NetworkClientSecure client;

void setup() {

  Serial.begin(115200);
  delay(500);
  while (!Serial);

  Ethernet.init(driver);

  // start the Ethernet connection:
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin() == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // Check for Ethernet hardware present
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
      while (true) {
        delay(1); // do nothing, no point running without Ethernet hardware
      }
    }
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
    // try to configure using IP address instead of DHCP:
    Ethernet.begin(ip);
  } else {
    Serial.print("  DHCP assigned IP ");
    Serial.println(Ethernet.localIP());
  }

  Serial.print("connecting to ");
  Serial.print(server);
  Serial.println("...");

  client.setInsecure(); // use only for a test!

  // if you get a connection, report back via serial:
  if (client.connect(server, 443)) {
    Serial.print("connected to ");
    Serial.println(client.remoteIP());
    // Make a HTTP request:
    client.println("GET /asciilogo.txt HTTP/1.1");
    client.print("Host: ");
    client.println(server);
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
  while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while (true) {
      delay(1);
    }
  }
}

Se non hai fretta, ci sono già fatte su Aliexpress. Non so se si trovano anche su Amazon.

Quel modulo comunica su bus SPI che non vedo inizializzato esplicitando i pin nel tuo sketch di esempio quindi significa che sta usando quelli di default.
Tu come hai connesso il modulo?

Allora prossimo ordine su ali, le cerco :slight_smile:

io non ho collegato nulla, la shield è già collegata, esp col modulo, tra l'altro mi pare di aver letto che c'è un bus particolare per il modulo lan8720

Non c'è una pagina di riferimento per la scheda che hai comprato?
Di solito mettono sempre degli sketch di test.

Ho controllato, ma non ho trovato granchè di + di quello che già avevo recuperato, ho questo datasheet:
ESP32 eth01 datasheet.pdf (666.8 KB)
Cercando in rete ho trovato queste spiegazioni, ma non sono arrivato a nulla, perchè non so nemmeno quali pin sono utilizzati e come sono collegati; visto che nell'esempio della libreria era riportato quel chip, pensavo fosse standard...
Cercherò altre info :slight_smile:

Ho trovato una libreria dedicata a questa shield, ora impazzisco un po' per farla compilare... :smiley:

Vedendo il datasheet usa il collegamento RM II con il modulo Ethernet ... collegamento che è documentato QUI dentro ... e che sembra avere pin fissi e NON modificabili :roll_eyes:

Guglielmo

Grazie Guglielmo, ho visto... Più cerco di semplificarmi le cose e più becco roba complicata e strana :smiley:
Devo utilizzare anche dei pin per comandi esterni che ho già collegato, verificherò che non siano quelli usati dalla shield :slight_smile:

Pensavo fosse un modulo esterno... in effetti non avevo guardato con attenzione la scheda, pardon.

Comunque, la libreria è già inclusa e integrata nel core e non serve andare a cercare altro.

In questo modo sei anche tranquillo riguardo le versioni del core stesso, perché le librerie esterne specifiche per ESP32 potrebbero non essere aggiornate alle nuove API introdotte con il core v3.x.x e una volta inizializzato correttamente l'hardware puoi anche fare riferimento agli innumerevoli esempi che si trovano.

Buongiorno,
con tutto quello che ho cercato, non avevo trovato questa info...
Naturalmente compila, ho caricato il progr, ma da seriale mi restituisce questi errori:
E (2106) esp.emac: emac_esp32_init(371): reset timeout
E (2106) esp_eth: esp_eth_driver_install(228): init mac failed

Provo a capirci qualcosa :slight_smile:
Grazie ancora Cotestatnt

Ciao,
ho modificato la parte iniziale dove vengono dichiarati i pin, ho fatto in questo modo:

// IMPORTANTE!! da definire prima di <ETH.h>
// affinchè ETH.begin() funzioni

#define ETH_PHY_TYPE ETH_PHY_LAN8720
#if CONFIG_IDF_TARGET_ESP32
#define ETH_PHY_ADDR  0
#define ETH_PHY_MDC   23
#define ETH_PHY_MDIO  18
#define ETH_PHY_POWER -1
#define ETH_CLK_MODE  ETH_CLOCK_GPIO0_IN
#endif

#include <ETH.h>

static bool eth_connected = false;

// WARNING: onEvent is called from a separate FreeRTOS task (thread)!
void onEvent(arduino_event_id_t event) {
  switch (event) {
    case ARDUINO_EVENT_ETH_START:
      Serial.println("ETH Started");
      // The hostname must be set after the interface is started, but needs
      // to be set before DHCP, so set it from the event handler thread.
      ETH.setHostname("esp32-ethernet");
      break;
    case ARDUINO_EVENT_ETH_CONNECTED: Serial.println("ETH Connected"); break;
    case ARDUINO_EVENT_ETH_GOT_IP:
      Serial.println("ETH Got IP");
      Serial.println(ETH);
      eth_connected = true;
      break;
    case ARDUINO_EVENT_ETH_LOST_IP:
      Serial.println("ETH Lost IP");
      eth_connected = false;
      break;
    case ARDUINO_EVENT_ETH_DISCONNECTED:
      Serial.println("ETH Disconnected");
      eth_connected = false;
      break;
    case ARDUINO_EVENT_ETH_STOP:
      Serial.println("ETH Stopped");
      eth_connected = false;
      break;
    default: break;
  }
}

void testClient(const char *host, uint16_t port) {
  Serial.print("\nconnecting to ");
  Serial.println(host);

  NetworkClient client;
  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }
  client.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
  while (client.connected() && !client.available());
  while (client.available()) {
    Serial.write(client.read());
  }

  Serial.println("closing connection\n");
  client.stop();
}

void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.println("Test LAN8720");
  Serial.println();
  delay(1000);
  Network.onEvent(onEvent);
  delay(1000);
  ETH.begin();
  delay(100);
  
}

void loop()
{
  if (eth_connected)
  {
    testClient("google.com", 80);
  }
  delay(10000);
}

basandomi su questo schema
WT32_ETH01 V2 schematic.pdf (278.0 KB)

sempre che sia corretto...
Sono cambiati i codici di errore, ma la definizione di errori è la solita:
E (3006) esp.emac: emac_esp32_init(371): reset timeout
E (3006) esp_eth: esp_eth_driver_install(228): init mac failed

Forse nessuno che ha letto ha ancora utilizzato questa shield :slight_smile:

Ciao,
dopo un giorno intero di smattamenti vari, il sistema ha iniziato a funzionare, ma non so bene il perchè e per come...
Comunque sia allego lo sketch funzionante usato come test, può essere utile a qualcuno.
La shield è una WT32-ETH01 V1.4


// IMPORTANTE!! da definire prima di <ETH.h>
// affinchè ETH.begin() funzioni

#ifndef ETH_PHY_MDC
#define ETH_PHY_TYPE ETH_PHY_LAN8720
#if CONFIG_IDF_TARGET_ESP32
#define ETH_PHY_ADDR  0
#define ETH_PHY_MDC   23
#define ETH_PHY_MDIO  18
#define ETH_PHY_POWER -1
#define ETH_CLK_MODE  ETH_CLOCK_GPIO0_IN
#elif CONFIG_IDF_TARGET_ESP32P4
#define ETH_PHY_ADDR  0
#define ETH_PHY_MDC   31
#define ETH_PHY_MDIO  52
#define ETH_PHY_POWER 51
#define ETH_CLK_MODE  EMAC_CLK_EXT_IN
#endif
#endif

#include <ETH.h>

static bool eth_connected = false;

// WARNING: onEvent is called from a separate FreeRTOS task (thread)!
void onEvent(arduino_event_id_t event)
{
  switch (event)
  {
    case ARDUINO_EVENT_ETH_START:
      Serial.println("ETH Started");
      /*
        Il nome host deve essere impostato dopo l'avvio dell'interfaccia, ma deve essere
        impostato prima di DHCP, quindi impostarlo dal thread del gestore eventi
      */
      ETH.setHostname("esp32-ethernet");
      break;
    case ARDUINO_EVENT_ETH_CONNECTED:
      Serial.println("ETH Connesso");
      break;
    case ARDUINO_EVENT_ETH_GOT_IP:
      Serial.println("ETH IP ricevuto");
      Serial.println(ETH);
      eth_connected = true;
      break;
    case ARDUINO_EVENT_ETH_LOST_IP:
      Serial.println("ETH IP perso");
      eth_connected = false;
      break;
    case ARDUINO_EVENT_ETH_DISCONNECTED:
      Serial.println("ETH Disconnesso");
      eth_connected = false;
      break;
    case ARDUINO_EVENT_ETH_STOP:
      Serial.println("ETH fermato");
      eth_connected = false;
      break;
    default: break;
  }
}

void testClient(const char *host, uint16_t port) {
  Serial.print("\nconnecting to ");
  Serial.println(host);

  NetworkClient client;
  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }
  client.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
  while (client.connected() && !client.available());
  while (client.available()) {
    Serial.write(client.read());
  }

  Serial.println("closing connection\n");
  client.stop();
}

void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.println("Test LAN8720");
  Serial.println();
  delay(250);
  Network.onEvent(onEvent);
  delay(250);
  ETH.begin();
  delay(100);
}

void loop()
{
}

E quà sotto le impostazioni della IDE arduino

Un ringraziamento a chi mi ha fatto arrivare fino quà :wink:

1 Like