Além disso, estas soluções começaram também a surgir nas redes industriais profissionais, substituindo gradualmente os sistemas mais antigos baseados no RS232 e seus derivados. Assim, no início do século XXI, iniciou-se a era da chamada Internet das Coisas (IoT). Embora o mercado atual de IoT seja dominado por dispositivos que comunicam principalmente através de redes sem fios e normas como WiFi, ZigBee, BLE ou Z-Wave, o Ethernet continua a ser uma das soluções mais populares em muitas soluções de hardware (principalmente as da chamada IIoT - Internet Industrial das Coisas), que exigem uma transmissão fiável e segurança de dados. Os criadores da plataforma Arduino responderam às exigências dos designers de dispositivos IIoT e expandiram a oferta de módulos Arduino standard com overlays como o Ethernet Shield 2, destinado a utilizadores individuais, e o Arduino MKR ETH SHIELD para soluções profissionais, baseado nos controladores WIZnet W5100/W5200/W5500 e integrando circuitos MAC e PHY num único circuito integrado. Esta oferta foi rapidamente expandida por fabricantes independentes com novos módulos muito mais acessíveis baseados no popular sistema ENC28J60. Este artigo descreve brevemente ambas as soluções: a oficial, baseada na série W5x00, e as soluções baseadas principalmente em hardware aberto/código aberto utilizando módulos ENC28J60.
Comunicação utilizando módulos WIZnet W5x00 e a biblioteca Ethernet do Arduino.
A inegável vantagem dos módulos oficiais baseados em circuitos da série W5x00 (incluindo os seus equivalentes de hardware, como os overlays OKYSTAR OKY2102 ou DFROBOT DFR0125) é o suporte de software abrangente sob a forma de uma biblioteca Ethernet integrada no Arduino. Assim sendo, o utilizador pode começar a criar o programa imediatamente após abrir o IDE do Arduino, sem ter de instalar qualquer pacote de software adicional.
Figura 1. Módulos OKY2102 (esquerda) e DFR0125 (direita), equipados com o controlador WIZnet W5100.
Dependendo da variante do sistema WIZnet e da quantidade de RAM disponível, a biblioteca Ethernet suporta um máximo de quatro (para o chip W5100 e RAM <= 2 kB) ou oito (para os sistemas W5200 e W5500) ligações paralelas de entrada/saída. A interface de software da biblioteca está dividida em cinco classes, agrupando funcionalidades individuais. A classe Ethernet é responsável pela inicialização da biblioteca e pela configuração da rede (incluindo o endereço IP, o endereço de sub-rede e as definições da gateway de acesso). Foi criada uma classe IPAddress para endereçamento IP. Para executar uma aplicação servidor simples no Arduino, é necessária a classe EthernetServer, que permite a leitura e escrita de dados de todos os dispositivos ligados. Uma classe complementar é a EthernetClient, que permite, com algumas chamadas simples, a criação de um cliente de rede funcional que realiza operações de leitura e escrita de dados do servidor. Para a comunicação UDP, a biblioteca Ethernet disponibiliza a classe EthernetUDP. Uma descrição completa das classes e dos seus métodos está disponível em:
De forma característica da plataforma Arduino, todas as operações complexas do programa são implementadas directamente na biblioteca disponibilizada: o programador tem à sua disposição um conjunto limitado, mas altamente funcional, de APIs, tornando o processo de desenvolvimento de aplicações rápido e eliminando a necessidade de conhecimento aprofundado de protocolos de rede. Assim sendo, vamos analisar a construção da aplicação servidora mais simples, fornecida com a biblioteca Ethernet, cuja tarefa é escutar as ligações dos clientes Telnet.
O código da aplicação servidor começa por adicionar os ficheiros de cabeçalho necessários para estabelecer a comunicação SPI (os módulos WIZnet trocam dados com o microcontrolador utilizando este protocolo) e os ficheiros de cabeçalho da biblioteca Ethernet:
#include
#incluir
O passo seguinte é configurar os parâmetros de rede (endereço MAC do controlador, endereço IP do gateway de acesso e máscara de sub-rede) e criar um listener na porta 23 (a porta padrão para o protocolo 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);
Servidor EthernetServer(23);
No corpo da função `setup()`, é necessário inicializar a biblioteca Ethernet e iniciar o processo de escuta. Além disso, a configuração da porta série também é incluída, exibindo mensagens sobre o endereço do servidor, a ligação do novo cliente e os dados recebidos durante a sessão estabelecida: `
void setup() {
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
Serial. begin(9600);
while (!Serial) {
}
Serial.print("Endereço do servidor de chat:");
Serial. println(Ethernet. localIP());
}`
O ciclo principal do programa, `loop()`, aguarda uma ligação do cliente e verifica se existem dados legíveis. Ao receber os dados, envia-os de volta para o cliente sem alterações, executando assim uma função de eco simples:
`void loop() {
EthernetClient client = server.available();
if (cliente) {
if (!alreadyConnected) {
cliente. flush();
Serial. println("Temos um novo cliente");
client.println("Olá, cliente!");
alreadyConnected = true;
}
if (cliente. available() > 0) {
char thisChar = cliente. read();
server.write(thisChar);
Serial.write(thisChar);
}
}
}
O funcionamento correcto da aplicação acima pode ser testado utilizando qualquer cliente de protocolo Telnet (por exemplo, PuTTY no Windows ou o comando telnet no Linux) ou com a utilização de outra placa Arduino e classe EthernetClient.
Comunicação utilizando módulos ENC28J60 e bibliotecas externas
Uma solução alternativa às placas WIZnet W5x00 oficialmente suportadas são os módulos baseados em controladores ENC28J60 (por exemplo, OKYSTAR, OKY3486 ou ETH CLICK). Devido ao seu preço mais baixo e à facilidade de instalação manual (ao contrário dos sistemas W5x00 contidos em encapsulamentos LQFP de 80 pinos, o driver ENC28J60 está disponível em encapsulamentos SSOP, SOIC, QFN de 28 pinos e num encapsulamento SPDIP com furos sobrepostos), este circuito é muito popular entre os entusiastas da eletrónica amadora.
Figura 2. Módulos OKY3486 (esquerda) e ETH CLICK (direita) equipados com o controlador ENC28J60
Apesar da falta de suporte oficial do Arduino, muitas bibliotecas de código aberto foram disponibilizadas aos programadores, garantindo a rápida integração dos chips ENC28J60 com o software. Merecem destaque a biblioteca UIPEthernet e, disponível sob a licença GPLv2, a biblioteca EtherCard. A inegável vantagem da primeira é a compatibilidade da sua API com a biblioteca Ethernet oficial do Arduino, permitindo que o processo de desenvolvimento de aplicações seja independente da escolha entre os sistemas W5x00 e ENC28J60 na camada de hardware. A segunda, EtherCard, implementa uma interface de programação separada que, dependendo das preferências do programador, pode revelar-se uma alternativa interessante.
Tal como acontece com a biblioteca Ethernet do Arduino, a implementação de uma função bastante complexa (por exemplo, implementar o cliente DHCP) pode ser feita em poucas linhas de código:
#include
static byte mymac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte Ethernet::buffer[700];
void setup () {
Serial. begin(57600);
Serial. println(F("\n[testeDHCP]"));
if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
Serial.println(F("Falha ao aceder ao controlador Ethernet"));
Serial. println(F("Configurando o DHCP"));
if (!ether.dhcpSetup())
Serial.println(F("Falha no DHCP"));
ether.printIp("O meu IP: ", ether.myip);
ether.printIp("Máscara de rede: ", ether.netmask);
ether.printIp("IP do gateway: ", ether.gwip);
ether.printIp("DNS IP: ", ether.dnsip);
}
void loop () {
ether.packetLoop(ether.packetReceive());
}
Conteúdo preparado por Transfer Multisort Elektronik Sp. z oo
