zurück zur Übersicht...
23.06.2018

Ethernet Shield W5100 und Arduino

Das von mir bestellte AZDelivery W5100 ist ein für den Arduino Uno und Mega konzipiertes Ethernet-Shield, welches sich über ein LAN-Kabel (RJ-Steckverbindung) mit dem Internet verbinden lässt. Das Board basiert auf dem Wiznet W5100 ethernet chip, welches ein Netzwerk stack (IP) für TCP und UDP zur Verfügung stellt. Es unterstützt bis zu 4 simultane Socket-Verbindungen. Darüber hinaus besitzt es einen SD-Kartenslot.
Die folgenden beiden Basis-Experimente stellen nur die Grundfunktionalität sicher und können mit den Beispiel-Sketches der Arduino-IDE für "Ethernet" ausprobiert werden. Hier habe ich diese Beispiele etwas für meine Bedürnisse angepasst.

AZDelivery Ethernet Shield W5100
Abb.: AZDelivery Ethernet Shield W5100
Download Datasheet für W5100 (eng.) [1476 kB]

Anschlüsse

Anschlüsse des W1500 am Arduino UNO
Abb.: Anschlüsse des W1500 am Arduino UNO
Anschlüsse des Ethernet Shield W5100
Abb.: Anschlüsse des Ethernet Shield W5100

Der Aufbau zusammen mit dem Arduino ist sehr einfach, denn das Shield muss einfach nur auf den Arduino gesteckt werden. Ein RJ-Steckverbinder wird nun in eine freie "LAN"-Buchse des Routers gesteckt und das USB-Kabel in den PC zum Upload des Sketches und der Stromversorgung.

Verwendete Bauteile

Experiment I: Web-Client

In diesem Versuch verbinden wir den Arduino mittels des W5100 über Ethernet mit dem WWW und laden uns den Inhalt einer Webseite herunter und zeigen diese in der seriellen Konsole an.

/**
 * Ethernet shield attached to pins 10, 11, 12, 13
 */

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

// MAC address (printed on a sticker on the shield)
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

// IPAddress server(74, 125, 232, 128);  // numeric IP (no DNS = reduce sketch size)
char server[] = "elektro.turanis.de";    // name address (using DNS)

// Static IP address to use if the DHCP fails to assign (find out in your router)
IPAddress ip(192, 168, 0, 177);
EthernetClient client;

void setup()
{
    Serial.begin(9600);

    if (Ethernet.begin(mac) == 0) {
        Serial.println("Failed to configure Ethernet using DHCP");
        // try to congifure using IP address instead of DHCP:
        Ethernet.begin(mac, ip);
    }

    // waiting for initialize
    delay(1000);
    Serial.println("Connecting...");

    if (client.connect(server, 80)) {
        Serial.println("OK");
        client.println("GET / HTTP/1.1");
        client.println("Host: " + String(server));
        client.println("Connection: close");
        client.println();
    } else {
        // if you didn't get a connection to the server:
        Serial.println("FAILED!");
    }
}

void loop()
{
    // available incoming bytes from the server
    if (client.available()) {
        char c = client.read();
        Serial.print(c);
    }

    // if the server is disconnected, stop the client
    if (!client.connected()) {
        Serial.println();
        Serial.println("disconnecting.");
        client.stop();
        while (true);
    }
}

Experiment II: Web-Server

In diesem zweiten Versuch erstellen wir einen rudimentären Web-Server mit dem W5100 und greifen über einen Browser darauf, um die zu Verfügung stehenden Inhalte anzusehen.

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

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

// MAC address (printed on a sticker on the shield)
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 177);
EthernetServer server(80); // (port 80 is default for HTTP)

void setup()
{
    Serial.begin(9600);

    Ethernet.begin(mac, ip);
    server.begin();
    Serial.print("Server IP:" + String(Ethernet.localIP()));
}

void loop()
{
    // listen for incoming clients
    EthernetClient client = server.available();

    if (client) {
        Serial.println("New client");
        boolean currentLineIsBlank = true; // an http request ends with a blank line

        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><head><title>Arduino Webserver</title><meta charset=\"UTF-8\" /></head>");
                    client.println("<body><h1>Arduino Webserver</h1><ul>");

                    for (byte pin = 0; pin < 6; pin++) {
                        client.println("<li>A" + String(pin) + " = " + String(analogRead(pin)) + "</li>");
                    }

                    client.println("</ul></body></html>");
                    break;
                }

                if (c == '\n') {
                    currentLineIsBlank = true; // you're starting a new line
                } else if (c != '\r') {
                    currentLineIsBlank = false; // you've gotten a character on the current line
                }
            }
        }

        // give the web browser time to receive the data
        delay(100); // 1?

        client.stop();
        Serial.println("disconnected.");
    }
}