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