Arduino – kommunikáció Ethernet-hálózaton keresztül

Nézze meg, hogyan használható az Arduino platform IoT- és IIoT-hálózatban

2021. november 29., hétfő, 06:00

Címkék: Arduino Ethernet hálózat hálózatkezelés IIOT Internet of Things

A kiterjedt számítógépes hálózatok létrehozása évekig csupán a számítógépek összekapcsolására szolgált. Az árcsökkenés és a kis mikrovezérlők számítási teljesítményének növekedése megkezdte az alacsony fogyasztású, főként vezérlési és mérési funkciókat ellátó eszközök helyi Ethernet-hálózatokhoz vagy akár a globális internetes hálózathoz történő csatlakoztatásának gyors folyamatát.

Sőt, ezek a megoldások a professzionális ipari hálózatokban is kezdtek megjelenni, fokozatosan felváltva a régebbi, RS232 alapú rendszereket és származékaikat. Így a huszonegyedik század elején már elindult az úgynevezett tárgyak internetének (IoT) korszaka. Bár a jelenlegi IoT-piacot elsősorban a vezeték nélküli hálózatokon és a Wi-Fi, ZigBee, BLE vagy Z-Wave szabványokon keresztül kommunikáló eszközök dominálják, még mindig sok hardveres megoldásnál (főleg az úgynevezett IIoT – Ipari tárgyak internete), amely megbízható átvitelt és adatbiztonságot igényel, az Ethernet-hálózat továbbra is az egyik legnépszerűbb megoldás. Az Arduino platform készítői nem hagyták megválaszolatlanul az IIoT-eszközök tervezőinek igényét, és kibővítették az Arduino modulok szabványos választékát az egyéni felhasználóknak címzett Ethernet Shield 2-vel, vagy a professzionális megoldásokhoz szükséges Arduino MKR ETH SHIELD-del, a WIZnet vezérlőkön W5100/W5200/W5500 és integrált MAC and PHY áramkörök integrálásán alapuló áramkörrel. Ezt az ajánlatot a független gyártók gyorsan kibővítették, és új és sokkal olcsóbb modulokat adtak hozzá a népszerű ENC28J60 alapján. Ez a cikk mindkét megoldás rövid leírását tartalmazza: a hivatalos, amely a W5x00 sorozat csipjein alapszik, és főleg a közösség által fejlesztett nyílt forráskódú/nyílt hardveres megoldás, amelyek ENC28J60 modulokon alapulnak.

Kommunikáció WIZnet W5x00 modulok és az Arduino Ethernet könyvtár segítségével

Fontos előnye a W5x00 sorozatú rendszereken alapuló hivatalos moduloknak (beleértve a hardver megfelelőiket is, például az OKYSTAR OKY2102 vagy DFROBOT DFR0125 overlay), hogy teljes szoftveres támogatást nyújtanak az Arduino verembe ágyazott Ethernet könyvtár formájában. Így a felhasználó az Arduino IDE elindítása után megkezdheti a program létrehozását anélkül, hogy további szoftvercsomagokat kellene telepítenie.

OKY2102 (fent) és DFR0125 (lent) modulok, WIZnet W5100 vezérlővel felszerelve

A WIZnet rendszer változatától és a rendelkezésre álló RAM mennyiségétől függően az Ethernet könyvtár legfeljebb négy (a W5100 csip és RAM <= 2 kB esetén) vagy nyolc (W5200 és W5500 rendszer) párhuzamos kimenő/bejövő kapcsolatot támogat. A könyvtár szoftveres felületét öt osztályra osztották, az egyes funkciókat csoportosítva. Az Ethernet osztály felelős a könyvtár inicializálásáért és a hálózati beállítások konfigurálásáért (beleértve az IP-címet, az alhálózati címet vagy a hozzáférési átjáró beállításait). Létrehoztak egy IP-cím osztályt az IP-címzéshez. Egy egyszerű szerveralkalmazás futtatásához az Arduino oldalon szükség lesz az EthernetServer osztály használatára, amely lehetővé teszi az adatok rögzítését és olvasását az összes csatlakoztatott eszközről. Az EthernetClient a kiegészítő osztály, amely néhány egyszerű hívás során lehetővé teszi egy funkcionális hálózati kliens előkészítését, amely a szerverről hajt végre adatírási és -olvasási műveleteket. Az UDP kommunikációhoz az Ethernet könyvtár EthernetUDP osztályt biztosít. Az osztályok teljes leírása a megfelelő módszerekkel a következő címen érhető el: https://www.arduino.cc/en/Reference/Ethernet

Amint az az Arduino platformra jellemző, a program összes összetett művelete közvetlenül a mellékelt könyvtárban valósul meg – a fejlesztő korlátozott, de nagyon funkcionális API-kat kap, így a fejlesztési folyamat gyors, és nem szükséges a hálózati halmok részletes ismerete. Éppen ezért elemezzük az Ethernet könyvtárral ellátott legegyszerűbb kiszolgáló alkalmazás felépítését, amelynek feladata a Telnet protokoll kliensről érkező kapcsolatok meghallgatása. A szerveralkalmazás kódja megkezdi az SPI kommunikáció létrehozásához szükséges fejlécfájlok hozzáadását (a WIZnet modulok adatokat cserélnek a mikrovezérlővel ennek a protokollnak a segítségével) és az Ethernet könyvtár fejlécfájljait:

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

A következő lépés a hálózati paraméterek konfigurálása (a vezérlő MAC-címe, a hozzáférési átjáró IP-címe és az alhálózati maszk), és egy figyelő kiszolgáló létrehozása a 23. számú porton (a Telnet protokoll alapértelmezett portja):

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);

A setup() függvény törzsében szükség van az Ethernet könyvtár inicializálására és a hallgatási folyamat elindítására. Ezenkívül elérhető a soros port konfigurációja, amelynek köszönhetően a kiszolgáló címéről, az új ügyfélkapcsolatról és a létrehozott munkamenet során kapott adatokról üzeneteket lehet megjeleníteni:

void setup() {  Ethernet.begin(mac, ip, gateway, subnet);  server.begin();  Serial.begin(9600);   while (!Serial) {  }  Serial.print("Chat server address:");  Serial.println(Ethernet.localIP());}

A loop() program fő ciklusa megvárja a kapcsolatot az ügyféltől, és ellenőrzi az olvasható adatokat. Adatok fogadásakor ezeket az adatokat változatlanul visszaküldi az ügyfélnek, így egyszerű visszhangfunkciót hajt végre:

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);    }  }}

A fenti alkalmazás helyes működését bármely Telnet protokollkliens (pl. Putty in Windows vagy telnet parancs Linux alatt) vagy egy másik Arduino készlet és az EthernetClient osztály használatával tesztelhetjük.

Kommunikáció ENC28J60 modulok és külső könyvtárak használatával

Alternatív megoldásként a hivatalosan támogatott WIZnet W5x00 rendszerek helyett az ENC28J60 vezérlőn alapuló modulok (pl. OKYSTAR OKY3486 vagy ETH CLICK) használhatók. Alacsonyabb áron és manuálisan könnyebben telepíthető csomaggal (szemben a W5x00 80-pin LQFP csomagokban található áramkörökkel) az ENC28J60 vezérlő 28 pines SSOP, SOIC, QFN csomagokban érhető el, valamint a furatszerelt beépítésre szánt SPDIP csomagban ez az áramkör nagyon népszerű a hobbisták körében.

OKY3486 (fent) és ETH CLICK (lent) modulok ENC28J60 vezérlővel felszerelve

Az Arduino hivatalos támogatásának hiánya ellenére sok nyílt forráskódú könyvtárat bocsátottak a programozók rendelkezésére, biztosítva az ENC28J60 csipek gyors integrálását a szoftverrel. Különös figyelmet kell fordítani az UIPEthernet és az EtherCard könyvtárakra, az utóbbi a GPLv2 licenc alatt áll rendelkezésre. Az előbbi kétségtelen előnye az API interfész kompatibilitása a hivatalos Arduino Ethernet könyvtárral, amelynek köszönhetően az alkalmazásfejlesztési folyamat független lehet a hardverben a W5x00 rendszerek és az ENC28J60 rendszerek közötti választástól. A másik projekt – EtherCard – egy független programozási felületet valósít meg, amely a programozó preferenciáitól függően érdekes alternatívának bizonyulhat. Csakúgy, mint az Arduino Ethernet könyvtár esetében, a meglehetősen összetett funkcionalitás (például a DHCP kliens megvalósítása) csupán néhány kódsorban megvalósítható:

#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());}

A cikk forrása:

www.tme.eu

Keresés
Bejelentkezés / Regisztráció
BESZÁLLÍTÓI KAPCSOLATOK

Itt a lehetőség tajvani kapcsolatokat építeni!

Média Partnerek