Vytváření složitých počítačových sítí již několik let neslouží pouze k propojování počítačů. Pokles cen a zvýšení výpočetního výkonu malých mikrokontrolérů zahájily prudký proces připojování k místním sítím Ethernet nebo dokonce i ke globální internetové síti, zařízení s nízkým výkonem, která plní především kontrolní, řídicí a měřicí funkce.
Tato řešení se navíc začala objevovat i v profesionálních průmyslových sítích a postupně vytěsňovat starší systémy a deriváty založené na RS232. Takto začala na počátku 21. století éra takzvaného internetu věcí (angl. Internet of Things – IoT). Přestože současnému trhu IoT dominují zařízení komunikující hlavně prostřednictvím bezdrátových sítí a standardů WiFi, ZigBee, BLE nebo Z-Wave, stále je v mnoha hardwarových řešeních (hlavně z takzvaného segmentu IIoT – Industrial Internet of Things), vyžadujících spolehlivý přenos a bezpečnost dat, jedním z populárnějších řešení síť Ethernet. Autoři platformy Arduino nezapomněli ani na poptávku vývojářů IIoT zařízení a rozšířili svou standardní nabídku modulů Arduino o shieldy Ethernet Shield 2 určené pro individuální uživatele, či Arduino MKR ETH SHIELD pro profesionální řešení založená na kontrolérech WIZnet W5100/W5200/W5500 a integrující systémy MAC a PHY do jednoho integrovaného obvodu. Tuto nabídku poměrně rychle rozšířili nezávislí výrobci o další a mnohem levnější moduly založené na oblíbených obvodech ENC28J60. Tento článek stručně popisuje obě řešení: oficiální, založené na systémech řady W5x00 a vyvíjené hlavně komunitou Open Source / Open Hardware řešení založené na modulech ENC28J60.
Komunikace pomocí modulů WIZnet W5x00 a knihovny Arduino Ethernet
Nepochybnou předností oficiálních modulů založených na systémech řady W5x00 (včetně jejich hardwarových ekvivalentů, např. shieldů OKYSTAR OKY2102 či DFROBOT DFR0125) je poskytování plné softwarové podpory v podobě vestavěné knihovny Ethernet ve stacku Arduino. Uživatel tak může začít vytvářet program hned po spuštění Arduino IDE, aniž by musel instalovat další softwarové balíčky.
Obrázek 1. Moduly OKY2102 (vlevo) a DFR0125 (vpravo) vybavené kontrolérem WIZnet W5100
V závislosti na variantě systému WIZnet a množství dostupné paměti RAM podporuje knihovna Ethernet maximálně čtyři (pro systém W5100 a paměť RAM <= 2 kB) nebo osm (systémy W5200 a W5500) paralelních příchozích/odchozích spojení. Softwarové rozhraní knihovny je rozděleno do pěti tříd, které seskupují jednotlivé funkce. Třída Ethernet je zodpovědná za inicializaci knihovny a konfiguraci nastavení sítě (včetně IP adresy, adresy podsítě nebo nastavení přístupové brány). Třída IPAddress byla vytvořena pro IP adresaci. Pro spuštění jednoduché serverové aplikace na straně Arduina bude nutné použit třídu EthernetServer, která umožňuje zapisovat a číst data ze všech připojených zařízení. Doplňkovou třídou je třída EthernetClient, která umožňuje pomocí několika jednoduchých vyvolání připravit funkčního síťového klienta, jenž provádí operace zápisu a čtení dat ze serveru. Pro účely UDP komunikace zpřístupňuje knihovna Ethernet třídu EthernetUDP. Úplný popis tříd včetně metod je k dispozici na adrese:
Přejděte na web Arduino
Pro platformu Arduino je charakteristické, že všechny složité programovací operace jsou implementovány přímo ve zpřístupněné knihovně – programátor má k dispozici omezenou, ale velmi funkční sadu API, takže proces vytváření aplikace je rychlý a nevyžaduje podrobné znalosti síťových zásobníků. Rozeberme si tedy strukturu nejjednodušší serverové aplikace dodávané s ethernetovou knihovnou, jejímž úkolem je naslouchat příchozím spojením od klienta protokolu Telnet.
Kód serverové aplikace začíná přidáním hlavičkových souborů nezbytných k navázání SPI komunikace (moduly WIZnet si vyměňují data s mikrokontrolérem pomocí tohoto protokolu) a hlavičkových souborů knihovny Ethernet:
#include <SPI.h>
#include <Ethernet.h>
Dalším krokem je konfigurace síťových parametrů (MAC adresy kontroléru, IP adresy přístupové brány a masky podsítě) a vytvoření naslouchajícího serveru na portu číslo 23 (výchozí port pro protokol Telnet):
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 0, 0);
EthernetServer server(23);
V těle funkce setup() je nutné provést inicializaci ethernetové knihovny a spustit proces naslouchání. Součástí je navíc také konfigurace sériového portu, kde se zobrazí zprávy o adrese serveru, připojení nového klienta a datech přijatých během navázané relace:
void setup() {
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
Serial.begin(9600);
while (!Serial) {
}
Serial.print("Chat server address:");
Serial.println(Ethernet.localIP());
}
Hlavní smyčka programu loop() čeká na připojení ze strany klienta a kontroluje dostupnost dat pro čtení. Pokud dostane data, odešle je klientovi v nezměněné podobě, čímž provede jednoduchou funkci ozvěny:
void loop() {
EthernetClient client = server.available();
if (client) {
if (!alreadyConnected) {
client.flush();
Serial.println("We have a new client");
client.println("Hello, client!");
alreadyConnected = true;
}
if (client.available() > 0) {
char thisChar = client.read();
server.write(thisChar);
Serial.write(thisChar);
}
}
}
Správnost fungování výše uvedené aplikace lze testovat pomocí libovolného klienta protokolu Telnet (např. program Putty v systému Windows nebo příkaz telnet v systému Linuxu) nebo pomocí další sady Arduino a třídy EthernetClient.
Komunikace pomocí modulů ENC28J60 a vnějších knihoven
Alternativním řešením pro oficiálně podporované systémy WIZnet W5x00 jsou moduly založené na kontroléru ENC28J60 (např. OKYSTAR OKY3486 nebo ETH CLICK](/cz/details/mikroe-971/plytki-rozszerzajace/mikroelektronika/eth-click/)). Díky nižší ceně a snadnější ruční montáži pouzdra (na rozdíl od systémů W5x00 umístěných v 80pinových pouzdrech LQFP je kontrolér ENC28J60 k dispozici v 28pinových pouzdrech typu SSOP, SOIC, QFN a v pouzdru pro osazování plošných spojů SPDIP je tento systém velmi oblíbený mezi nadšenci elektroniky.
Obrázek 2. Moduly OKY3486 (vlevo) a ETH CLICK (vpravo) vybavené kontrolérem ENC28J60
Přestože Arduino nemá oficiální podporu, mají programátoři k dispozici mnoho knihoven typu open source, které zajišťují rychlou integraci systémů ENC28J60 se softwarem. Zvláštní pozornost je třeba věnovat knihovně UIPEthernet a zpřístupněné na licenci GPLv2 knihovně EtherCard. Nespornou výhodou prvního z uvedených projektu je kompatibilita rozhraní API s oficiální knihovnou Arduino Ethernet, díky níž je proces vývoje aplikace nezávislý na provedené volbě mezi systémy W5x00 a ENC28J60 v hardwarové vrstvě. Druhý projekt – EtherCard – implementuje nezávislé programovací rozhraní, které se v závislosti na preferencích programátora může ukázat jako zajímavá alternativa. Stejně jako v případě knihovny Arduino Ethernet může být implementace poměrně složitých funkcí (např. implementace klienta DHCP) prováděna v několika řádcích kódu:
#include <EtherCard.h>
static byte mymac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte Ethernet::buffer[700];
void setup () {
Serial.begin(57600);
Serial.println(F("
[testDHCP]"));
if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
Serial.println(F("Failed to access Ethernet controller"));
Serial.println(F("Setting up DHCP"));
if (!ether.dhcpSetup())
Serial.println(F("DHCP failed"));
ether.printIp("My IP: ", ether.myip);
ether.printIp("Netmask: ", ether.netmask);
ether.printIp("GW IP: ", ether.gwip);
ether.printIp("DNS IP: ", ether.dnsip);
}
void loop () {
ether.packetLoop(ether.packetReceive());
}
https://www.tme.eu/cz/news/library-articles/page/43654/arduino-komunikace-pomoci-site-ethernet/