Problemas en mis primeros pasos con Ethernet

Buenas,

Ya me he presentado como novatísimo en otros hilos…

En primer lugar, disculpad porque no tengo claro si este tema corresponde a software o a hardware

Sigo haciendo prácticas con una placa UNO. Recientemente adquirí un Ethernet Shield con el chip Wiznet W5100 compatible con mi placa.

Estoy probando con el ejemplo WebServer de la libreria Ethernet.h y no he conseguido resultados que muestren que funciona.

No sé por dónde pueden ir los tiros.
La dirección MAC he dejado la que viene por defecto en el ejemplo (entiendo que la shield no tiene una mac definida, pues no viene escrita en ninguna parte).

He probado con varias direcciones IP (en general, direcciones 192.168.1.XXX, jugando con los últimos 3 números)
He “descomentado” la línea en la que se selecciona el PIN 10 como CS

Aunque el código lo podéis tener en el IDE (es de los ejemplos que vienen con la librería), os lo pongo:

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  // You can use Ethernet.init(pin) to configure the CS pin
  Ethernet.init(10);  // Most Arduino shields AQUÌ HE SELECCIONADO ESTA OPCIÓN PARA EL UNO
  //Ethernet.init(5);   // MKR ETH shield
  //Ethernet.init(0);   // Teensy 2.0
  //Ethernet.init(20);  // Teensy++ 2.0
  //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
  //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet

  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Ethernet WebServer Example");

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);

  // 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.");
  }

  // start the server
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("
");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

Tras compilar y subir el sketch a la placa UNO, en el monitor serie me indica que el servidor está conectado en la dirección IP especificada.

Es posible que el problema está en que no pillo cómo se usa este ejemplo. Lo que hago es escribir la dirección IP en el navegador web (el PC está conectado por cable al ethernet shield), pero no obtengo respuesta. También he probado escribir el nº de puerto (80) tras la IP (separado con ‘:’).

Cualquier ayuda a nivel de niño de 10 años sería de agradecer.

saludos

Me acabo de dar cuenta que estas usando una Ethernet 2.0 y yo estoy con la anterior que no tenías estas inicializaciones.
La pruebo y te digo

EDITO:
Acabo de probarlo con

Ethernet.init(10) y funcionó perfectamente con mi Shield 1.0

Gracias por responder,

Para probarla con el ejemplo que he enlazado, ¿Debería bastar con escribir la IP asignada en la barra de un navegador con el arduino+shield conectados por cable ethernet?
No obtengo respuesta.

La placa no es una original de arduino, sino ésta de HiLetgo (China)

Yo tengo una placa original.
Dejen de pensar que porque es China no funciona. Yo tengo todo comprado de China y no he tenido problemas, pero no le compro a cualquier, le compro siempre al que tiene muchas ventas.

Para probarla con el ejemplo que he enlazado, ¿Debería bastar con escribir la IP asignada en la barra de un navegador con el arduino+shield conectados por cable ethernet?

Es lo que yo hice y funciona sin problemas.

Has probado todos los ejemplos disponibles con la Ethernet?

Hola!

Refloto este hilo, porque he retomado el intento usando otro dispositivo, en esta ocasión con Ethernet2.h y sigo sin poder establecer la conexión.

¿Es posible que sea algo que tenga que configurar desde el PC?

He probado con distintos ejemplos, los cuales compilan sin problema, pero al probarlos no tengo ninguna respuesta.

Entre otros, he probado tal cual con el ejemplo que me venía con la libería ethernet2.h:

#include <SPI.h>
#include <Ethernet2.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("
");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

El único resultado que tengo es que en el monitor serie de ArduinoIDE se muestra “server is at 192.168.1.177”

Si introduzco es dirección IP en la barra de direcciones del navegador, no ocurre nada (el navegador dice que no encuentra el sitio). He probado con varias direcciones IP. ¿Dónde está el fallo?

Gracias y un saludo

Hola de nuevo,

Actualizo mi anterior post.
He estado probando usar MQTT para interactuar con el Arduino (para ser más exacto, estoy usando un “PLC basado en Arduino” de Industrial Shields, modelo M-Duino 21+), y en principio obtenía el mismo resultado: el Arduino no conecta (en este caso no conecta con el broker Mosquitto en mi PC).

Se me ha ocurrido desconectar el Arduino de mi PC y conectarlo al Router al cual está mi PC vía WiFi, y en la sketch de Arduino he cambiado la dirección IP “local host” (la que me aparece al arrancar Node-Red) por la dirección IP que mi PC tiene asignada en la red local del router. Y a partir de ahí, Arduino ha conectado con el broker y he podido interactuar con él a través NodeRED.

A partir de ahí, mis dudas son las siguientes:

  • ¿Cómo encaja el Arduino como servidor en este montaje? (para ModbusTCP esclavo, o para webserver)
  • ¿Cómo puedo conectar Arduino y PC directamente saltándome la red local?

Gracias y un saludo,

**Moderador:**Si vas a preguntar lo mismo que el otro hilo entonces ciérralo porque veo similitud en lo que estas consultando.
Este hilo estaba abandonado pero al reflotarlo incurres en doble posteo.

Mir tus consultas finales, son las mismas del otro hilo.

Cierro este para evitar doble posteo.