Impossible to connect Arduino to Ethernet

I apologize for the basic question, but I am getting mad :
I am trying to set up an Ethernet connection and it doesn't work.
I have tried with 4 different shields (W5100, 2 different W5500, CH9121)
3 different boards (Pico Pi, Arduino Uno, Teensy LC)
3 different languages (Arduino, Micropython, Circuitpyhon)
3 different computers (Macbook & Windows)
3 different Ethernet routers (USB to Ethernet type).

With none of these combinations do I get a valid ip address, or see my device somewhere on the network.

Here is the basic Arduino code I'm using

#include <Ethernet.h>

byte mac[] = {  0xDE, 0x01, 0x03, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 94);//My computer ethernet ip adress 
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

void setup() {
  Serial.begin(9600);
  while (!Serial );
  Ethernet.begin(mac, ip, gateway, subnet);
  Serial.println("Starting w5500");
  while(!Ethernet.begin(mac))
  {
    Serial.println("error");
  }

  Serial.println(Ethernet.localIP());
}

void loop() {
}

I always get an error message after some time.
I have double and triple checked my wires.

I'm clueless, yet I feel it's something very obvious that I'm doing wrong.
Any idea ?

IPAddress ip(192, 168, 1, 94);//My computer ethernet ip adress 

What exactly is that the IP address of ?

Your PC, perhaps, or the IP address that you want the Arduino to have ?

Same question with the MAC address

This is a random ip address. I expect the device to use DHCP to connect, and use this ip address in case DHCP fails.
Same with the mac address, it's random.

This is probably where I'm missing something obvious (although I tried to find answers...)

Is that Ip even in your local subnet?

If you want DHCP, don’t provide an IP, just say Ethernet.begin(mac);

The first thing to do is to choose a combination of board and Ethernet shield

If you want advice here I would stick with the Uno and one of its shields and to program it the Arduino IDE to get maximum help here

Use the Ethernet library and upload one of the simple examples such as WebServer and report back here as to what happens

I recommend the Ethernet library's WiFiClient example. it has enhanced diagnostics

192.168 .1. 69 is my Wifi network.
The router on which my device's ethernet cable is connected to has ip 169.254.240.198

Say I have the following :
Computer <-> USB to Ethernet hub <-> Arduino device
I understand the computer is handling the DHCP process. Is it going to assign it an address that looks like 169.254.x.x ?
Am I supposed to do something to help the DHCP process ?

If I do that, I don't even past the line

Ethernet.begin(mac, ip, gateway, subnet);

the Arduino device gets stuck

Probably not
Your computer got its IP likely from the DHCP server that is in your network somewhere.

Can you describe the network ? Do you have an internet access box somewhere ?

Yes I have a network box and my computer is connected via wifi to it (ip 192.168.1.69 as of now).
There are several devices connected via wifi to the box (printer, Alexa, light bulbs etc)
On the computer side I have a USB-C hub that has an Ethernet port on which I connect my Arduino board (the hub has the ip 169.254.240.198).

Does the computer reshare its WiFi connection over the Ethernet port? If not no routing will happen…

You would need to attach the arduino to the WiFi box Ethernet port for a simple setup

I just tried that (Arduino Une, Ethernet shield v1 with a W5100), and the Ethernet Webserver Example below


/*
 Web Server

 A simple web server that shows the value of the analog input pins.
 using an Arduino WIZnet Ethernet shield.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 modified 02 Sept 2015
 by Arturo Guadalupi
 
 */

#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
  //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
    bool 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("<br />");
          }
          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");
  }
}

The serial looks like this :


Ethernet WebServer Example
server is at 192.168.1.177

and that's all I have after 15mn+

Your network layout needs fixing…

But I don't want to use the Ethernet connection to connect my device to the Internet, just to have a local network between my computer and the arduino device.
Maybe that's what's confusing me...

What were you expecting ?

If your network is configured properly then you should be able to connect a browser to that address

You still need someone to do the routing….

The Ethernet plug on your USB C adapter is expected to be a way to provide an Ethernet link to your computer, not to create a network.

Ok, maybe I need to explain what I'm trying to do :
I want to plug my self powered Arduino device to a computer with an Ethernet cable, and exchange UDP messages with it (it's for OSC messages in case you're interested).
It won't necessarily be connected to MY computer, and the computer may or may not be connected to another network.
So this has to be independent from any box or other hardware.

And by the way, thank you all for your messages, I feel a little bit stupid, but I haven't found a clear explanation on this routing anywhere.

Basically it’s not because you have an Ethernet cable between two computers that the network is operational

It might - if some IP services recognize the ad hoc network but is not a given (and I don’t know enough about PCs if this is what you have to provide more color on this)

If you want to connect your arduino to a computer, may be you’ll be better off to use the Serial connection ?

Ok, I finally managed to get my Arduino to send and receive UDP messages !
The trick was on my mac to activate Internet sharing, as explained here

I am not done with what I want to achieve, but at least I can have my Arduino device and my computer talk to each other !

Thanks J-M-L and everyone, speaking with you definitely helped !

Yes if it’s a Mac it’s easy to reshare the IP network over an additional Ethernet interface :slight_smile:

Then everyone is in the same network, you get the DHCP of your internet box

Yes, next step will be to connect without the box. But well, I’ll see.
Talk to you soon :wink: