ARDUINO, COMUNICARE FOLOSIND RETEAUA ETHERNET

De aproximativ doisprezece ani, rețelele complexe de calculatoare au încetat să mai fie folosite doar pentru a conecta calculatoare. Scăderea prețurilor și creșterea puterii de calcul a micilor microcontrolere au dat startul unui proces rapid de conectare a dispozitivelor de mică putere, care îndeplinesc în principal funcții de control, dirijare și măsurare, la rețelele Ethernet locale sau chiar la internetul global. În plus, aceste soluții au început să apară și în rețelele industriale profesionale, înlocuind treptat sistemele mai vechi bazate pe RS232 și derivate. Astfel, la începutul secolului XXI a început era așa-numitului Internet al lucrurilor (în engleză Internet of Things – IoT).

Deși piața actuală IoT este dominată de dispozitive care comunică în principal prin intermediul rețelelor fără fir și al standardelor WiFi, ZigBee, BLE sau Z-Wave, totuși, în multe soluții hardware (în principal din așa-numitul segment IIoT – Industrial Internet of Things), care necesită o transmisie fiabilă și securitatea datelor, una dintre cele mai populare soluții este încă Ethernet. Dezvoltatorii platformei Arduino nu au lăsat în urmă cererea din partea constructorilor de dispozitive IIoT și au extins oferta de module Arduino standard cu suprapuneri Ethernet Shield 2, destinate utilizatorilor individuali, sau Arduino MKR ETH SHIELD pentru soluții profesionale, bazate pe controlerul WIZnet W5100/W5200/W5500 și care integrează MAC și PHY pe un singur cip. Această ofertă a fost extinsă rapid de către producătorii independenți cu module suplimentare și mult mai ieftine, bazate pe popularele cipuri ENC28J60. Acest articol descrie pe scurt ambele soluții: cea oficială, bazată pe cipuri din seria W5x00, și soluțiile dezvoltate în principal de comunitatea Open Source/Open Hardware, bazate pe modulele ENC28J60.

Comunicare folosind modulele WIZnet W5x00 și biblioteca Arduino Ethernet

Un avantaj incontestabil al modulelor oficiale bazate pe cipuri din seria W5x00 (inclusiv echivalentele lor hardware, de ex. OKYSTAR OKY2102 sau DFROBOT DFR0125) este un suport software complet sub forma unei biblioteci Ethernet integrate. Astfel, utilizatorul poate începe să creeze un program imediat după pornirea Arduino IDE fără a fi nevoie să instaleze pachete software suplimentare.

În funcție de varianta de cip WIZnet și de cantitatea de memorie RAM disponibilă, biblioteca Ethernet suportă până la patru (pentru cipul W5100 și RAM <= 2 kB) sau opt (cipurile W5200 și W5500) conexiuni paralele de ieșire/ieșire. Interfața software a bibliotecii este împărțită în cinci clase, care grupează funcționalități individuale. Clasa Ethernet este responsabilă de inițializarea bibliotecii și de configurarea setărilor de rețea (inclusiv adresa IP, adresa de subrețea sau setările gateway-ului de acces). În scopul adresării IP, a fost creată clasa IPAddress. Pentru a rula o aplicație server simplă pe partea Arduino, va fi necesar să se utilizeze clasa EthernetServer, care permite scrierea și citirea datelor de la toate dispozitivele conectate. O clasă complementară este clasa EthernetClient, care permite, prin câteva apeluri simple, pregătirea unui client de rețea funcțional, efectuând operațiuni de scriere și citire a datelor de la server. Pentru comunicarea UDP, biblioteca Ethernet oferă clasa EthernetUDP. O descriere completă a claselor, inclusiv a metodelor, a fost pusă la dispoziție la adresa:

Într-un mod caracteristic pentru platforma Arduino, toate operațiile complexe de programare au fost implementate direct în biblioteca furnizată – programatorul are la dispoziție un set limitat, dar foarte funcțional de API-uri, ceea ce face ca procesul de dezvoltare a aplicației să fie rapid și să nu necesite cunoștințe detaliate despre stivele de rețea. Să analizăm structura celei mai simple aplicații server, furnizată cu biblioteca Ethernet, a cărei sarcină este de a asculta conexiunile primite de la clientul protocolului Telnet.

Codul aplicației server începe cu adăugarea fișierelor de antet necesare pentru stabilirea comunicării SPI (modulele WIZnet fac schimb de date cu microcontrolerul folosind acest protocol) și a fișierelor de antet ale bibliotecii Ethernet: 

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

Următorul pas este configurarea parametrilor de rețea (adresa MAC a controlerului, adresa IP a gateway-ului de acces și masca de subrețea) și crearea unui server de ascultare pe portul 23 (portul implicit pentru protocolul 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);

În corpul funcției setup(), este necesar să se inițializeze biblioteca Ethernet și să se înceapă procesul de ascultare. În plus, este inclusă și configurarea portului serial, care va afișa mesaje despre adresa serverului, conectarea unui nou client și datele primite în timpul sesiunii stabilite: 

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

Bucla principală a programului loop() așteaptă o conexiune din partea clientului și verifică disponibilitatea datelor de citit. În cazul în care primește date, le trimite înapoi la client fără a le modifica, îndeplinind astfel o simplă funcție de ecou: 

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

Corectitudinea aplicației de mai sus poate fi testată folosind orice client al protocolului Telnet (de exemplu, programul Putty pe Windows sau comanda telnet pe Linux) sau folosind un alt kit Arduino și clasa EthernetClient.

Comunicare folosind modulele ENC28J60 și bibliotecile externe

O soluție alternativă pentru chipset-urile WIZnetW5x00  suportate oficial sunt modulele bazate pe controlerul ENC28J60 (de exemplu, OKYSTAR OKY3486 sau ETH CLICK). Datorită prețului său mai mic și asamblării manuale mai ușoare (spre deosebire de cipurile W5x00 conținute în pachete LQFP de 80 de pini, controlerul ENC28J60 este disponibil în pachete SSOP de 28 de pini, SOIC, QFN și în pachet SPDIP, cu montare cronică), cipul este popular printre inginerii electroniști amatori.

În pofida lipsei de suport oficial din partea Arduino, multe biblioteci open source au fost puse la dispoziția dezvoltatorilor pentru a asigura integrarea rapidă a cipurilor ENC28J60 în software. O atenție deosebită trebuie acordată bibliotecii UIPEthernet și pusă la dispoziție sub licența GPLv2, bibliotecii EtherCard. Avantajul incontestabil al primului proiect este compatibilitatea API cu biblioteca oficială Arduino Ethernet, ceea ce face ca procesul de dezvoltare a aplicației să fie independent de alegerile făcute între cipurile W5x00 și ENC28J60 în stratul hardware. Al doilea proiect, EtherCard, implementează o interfață de programare independentă care, în funcție de preferințele programatorului, se poate dovedi a fi o alternativă interesantă. Similar cu biblioteca Arduino Ethernet, implementarea unei funcționalități destul de complexe (de exemplu, implementarea unui client DHCP) poate fi realizată în câteva linii de cod:

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

Text elaborat de Transfer Multisort Elektronik Sp. z o.o.

The original source of text: https://www.tme.eu/ro/news/library-articles/page/43654/Arduino-comunicare-folosind-reteaua-Ethernet/