Arduino Ethernet Shield ENC28J60

Arduino Ethernet Shield obsahuje integrovaný obvod ENC28J60. Tento šikovný obvod od firmy Microchip umožňuje připojit Arduino k domácí síti, potažmo Internetu. Samotný Shield obsahuje kromě obvodu ENC také konektor RJ45 pro připojení síťového kabelu. Shield lze používat s různými typy desek, jako například Uno, Leonardo či Mega. Výhodou je také vyvedené tlačítko pro Reset na Shieldu. Pro jednoduchou kontrolu činnosti LAN portu jsou umístěný přímo v konektoru také indikační LED diody. Obvod ENC zvládá práci s adresami typu IPv4 a komunikuje rychlostí 10 Mb/s. S Arduinem probíhá komunikace pomocí protokolu SPI.

Pro úspěšné propojení Ethernet Shieldu s Arduinem tedy stačí do desky Arduino Uno (nebo jiné) zapojit Shield a propojit Shield síťovým kabelem RJ45 s routerem či switchem. Výhodou tohoto Shieldu je také to, že se na něm nachází průchozí konektory a my tedy můžeme zapojit nevyužité piny Arduina s jinými zařízeními. Ethernet Shield využívá piny 11, 12 a 13 pro SPI a pin 10 pro CS signál.

Pro správnou funkci uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu UIPEthernet, návod jak na to je uveden zde. Výhodou použité knihovny je to, že její funkce jsou kompatibilní s originální knihovnou Ethernet pro obvod W5100. Ukázkový kód s web serverem obsahuje na svém začátku připojení potřebných knihoven a nastavení čísla propojovacího pinu pro LED diodu. Jako další si nastavíme vlastní MAC adresu, přičemž tuto adresu musí mít každé zařízení unikátní, a poté nastavíme IP adresu, která musí být přidělitelná DHCP serverem či nastavena routerem ručně. Použitý rozsah můžeme jednoduše zjistit tak, že na libovolném počítači připojeném ke stejné síti zjistíme IP adresu (např. 192.168.1.2) a poté nastavíme pro Arduino IP adresu o několik adres větší (např. 192.168.1.55). Poté stačí už jen inicializovat Ethernet Shield do módu server se standardním portem 80. A jako poslední je zde vytvořena proměnná typu String pro ukládání odpovědi od uživatele. Podprogram setup obsahuje nastavení komunikace po sériové lince, po kterém následuje nastavení pinu s LED diodou jako výstup. Poté provedeme zapnutí komunikace s Ethernet Shieldem a výpis nastavené IP adresy. Nekonečná smyčka loop na svém začátku jako první načte připojené klienty do proměnné klient a poté zkontroluje, zda máme nějakého klienta. V případě, že je klient připojen, vytiskneme si informaci na sériovou linku, načteme si prvních 100 znaků odpovědi do proměnné a následně mu pošleme všechna data. Jako první tedy pošleme standardní http odezvu, kde můžeme nastavit u příkazu „Refresh: 5“ počet vteřin, po kterých se provede u klienta znovunačtení stránky. Dále je pro nás důležité místo pro tištění vlastních údajů, kde v tomto programu vytiskneme čas od spuštění Arduina, poté pomocí for smyčky informace ze všech analogových vstupů a na konci dvě tlačítka formou odkazu. Poté co je vytištěna celá odezva, uzavřeme spojení a vyhodnotíme stav tlačítek. Pokud byla detekována nějaká zpráva, je převedena na akci, tedy zapnutí nebo vypnutí LED diody. Následně vymažeme obsah odpovědi pro nový běh a smyčka loop se opakuje.

// Ethernet Shield - web server

// připojení potřebných knihoven
#include <SPI.h>
#include <UIPEthernet.h>

// nastavení čísla pinu pro LED diodu
#define led 4

// nastavení MAC adresy
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// nastavení IP adresy - musí být přidělitelná DHCP serverem,
// tedy ve správném rozsahu, případně přidělena routerem ručně
IPAddress ip(192, 168, 1, 55);
// inicializace serveru na portu 80
EthernetServer server(80);
// proměnná pro ukládání odpovědi od uživatele
String nactiOdpoved;

void setup() {
  // komunikace po sériové lince rychlostí 9600 baud
  Serial.begin(9600);
  // nastavení LED pinu jako výstup
  pinMode(led, OUTPUT);
  // zapnutí komunikace s Ethernet Shieldem
  Ethernet.begin(mac, ip);
  server.begin();
  // výpis informace o nastavené IP adrese
  Serial.print("Server je na IP adrese: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // načtení připojených klientů
  EthernetClient klient = server.available();
  // pokud se připojí nějaký klient, provedeme následující
  if (klient) {
    Serial.println("Novy klient:");
    // http request končí prázdným řádkem
    boolean aktualniRadkaPrazdna = true;
    // pokud je klient připojen a k dispozici,
    // vytiskneme mu dostupná data
    while (klient.connected()) {
      if (klient.available()) {
        // načtení a vytištění informace o klientovi
        char c = klient.read();
        Serial.write(c);
        // pro prvních 100 znaků načteme postupně odpověď do proměnné
        if (nactiOdpoved.length() < 100) {
          nactiOdpoved += c;
        }
        // pokud se dostaneme na konec řádku a následující je prázdný,
        // byl ukončen request a my můžeme poslat odezvu
        if (c == '\n' && aktualniRadkaPrazdna) {
          // nejprve pošleme standardní http odezvu
          klient.println("HTTP/1.1 200 OK");
          klient.println("Content-Type: text/html;charset=utf-8");
          klient.println("Connection: close");
          // nastavení automatické obnovy stránky po 5 vteřinách
          klient.println("Refresh: 5");
          klient.println();
          klient.println("<!DOCTYPE HTML>");
          klient.println("<html>");
          // místo pro tištění vlastních údajů
          klient.print("Čas od spuštění: ");
          klient.print(millis() / 1000);
          klient.print(" vterin.<br />");
          klient.println("<H2>Analogové piny</H2>");
          // ukázka výpisu dat ze všech analogových vstupů
          for (int analogPin = 0; analogPin < 6; analogPin++) {
            int analogData = analogRead(analogPin);
            klient.print("A");
            klient.print(analogPin);
            klient.print(": ");
            klient.print(analogData);
            // příkaz "<br />" funguje jako krok na další řádek
            klient.println("<br />");
          }
          klient.println("<H2>Ovládání LED diody</H2>");
          klient.println("<br />");
          // vytištění tlačítek pro zapínání a vypínání LED diody,
          // při stisku tlačítka se jako zpráva pro Arduino nastaví
          // příslušná zpráva - zapni nebo vypni
          klient.println("<a href=\"/?zapni\"\">Zapnout LED</a>");
          klient.println("<br /><br />");
          klient.println("<a href=\"/?vypni\"\">Vypnout LED</a><br />");
          klient.println("</html>");
          break;
        }
        // začátek nové řádky
        if (c == '\n') {
          aktualniRadkaPrazdna = true;
          // detekce znaku na nové řádce
        } else if (c != '\r') {
          aktualniRadkaPrazdna = false;
        }
      }
    }
    // pauza pro prohlížeč, aby stihl zpracovat všechny data
    delay(1);
    // uzavření spojení
    klient.stop();
    Serial.println("Klient odpojen.");
    Serial.println("---------------------");
    // pokud odpověď od klienta obsahuje příkaz pro LED,
    // tak ji zapneme nebo vypneme a současně vypíšeme
    // informaci po sériové lince
    if (nactiOdpoved.indexOf("?zapni") > 0) {
      digitalWrite(led, HIGH);
      Serial.println("LED zapnuta!");
    }
    if (nactiOdpoved.indexOf("?vypni") > 0) {
      digitalWrite(led, LOW);
      Serial.println("LED vypnuta!");
    }
    // vymázání proměnné pro další běh
    nactiOdpoved = "";
  }
}

Po nahrání ukázkového kódu do Arduino desky s připojeným Ethernet Shieldem dostaneme například tento výsledek:

Arduino Ethernet Shield je zajímavým síťovým prvkem, který nám umožňuje připojit Arduino do naší domácí sítě. Po připojení můžeme sledovat naměřené údaje z libovolného zařízení (např. počítač či chytrý telefon), které se nachází ve stejné síti a zároveň ovládat různé prvky připojené k Arduinu skrze tlačítka na webové stránce. Tento Ethernet Shield tedy můžeme využít jako měřící a zároveň ovládací zařízení v části domu, kde je rozvedena LAN síť.

 

Seznam použitých komponent:

https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

 

Prodej shieldu na obrázcích byl ukončen, náhrada má navíc propojovací plošky na shieldu:

https://dratek.cz/arduino/1590-ethernet-shield-enc28j60-s-univerzalni-casti-dps-1495196653.html

Další podobné články