+1 500 000 produtos na nossa oferta

7000 encomendas enviadas diariamente

+300 000 clientes de 150 países

QuickBuy Favoritos
Carrinho

Arduino – comunicação usando a rede Ethernet

Data de publicação: 29-06-2021 Data de atualização: 10-04-2026 🕒 6 min de leitura

Desde há vários anos, a criação de extensas redes informáticas deixou de servir unicamente para conectar computadores. A queda dos preços e o aumento da potência informática dos pequenos microcontroladores iniciou o rápido processo de ligação às redes locais Ethernet ou até à rede global de Internet, dispositivos de baixo consumo, que desempenham principalmente funções de controlo e medição. Além disso, estas soluções começaram a aparecer também em redes industriais profissionais, substituindo gradualmente os sistemas mais antigos baseados ​​em RS232 e derivados. Assim, em inícios do século XXI, entrámos na era da chamada Internet das Coisas (do inglês, Internet of Things – IoT). Embora o mercado atual de IoT seja dominado por dispositivos que comunicam principalmente através de redes sem fios e padrões Wi-Fi, ZigBee, BLE ou Z-Wave, ainda há muitas soluções de hardware (principalmente da chamada IIoT – Internet das Coisas Industrial), que requerem uma transmissão confiável e segurança de dados, em que uma das soluções mais populares continua a ser a rede Ethernet. Os criadores da plataforma Arduino não deixaram os criadores de dispositivos IIoT sem resposta e estenderam a oferta padrão de módulos Arduino com sobreposições tipo Ethernet Shield 2, destinados a utilizadores individuais, ou Arduino MKR ETH SHIELD para soluções profissionais, com base em controladores WIZnet W5100/W5200/W5500 e incorporando circuitos MAC e PHY num circuito integrado. Esta oferta foi rapidamente alargada por produtores independentes com módulos novos e muito mais económicos baseados ​​em sistemas populares ENC28J60. Este artigo descreve brevemente ambas as soluções: a oficial, baseada na série W5x00, e as soluções baseadas principalmente em Open Source/Open Hardware, em módulos ENC28J60.

Comunicação com módulos WIZnet W5x00 e a biblioteca Arduino Ethernet

A inegável vantagem dos módulos oficiais baseados ​​em circuitos da série W5x00 (incluindo os seus equivalentes de hardware, por exemplo, sobreposições OKYSTAR OKY2102 ou DFROBOT DFR0125) é oferecer um suporte de software completo na forma de uma biblioteca Ethernet incorporada na pilha Arduino. Portanto, o utilizador pode começar a criar o programa imediatamente após executar o Arduino IDE, sem a necessidade de instalar pacotes de software adicionais.

Figura 1. Módulos OKY2102 (esquerda) e DFR0125 (direita), equipados com controlador WIZnet W5100

Consoante a variante do sistema WIZnet e a quantidade de RAM disponível, a biblioteca Ethernet suporta um máximo de quatro (para o chip W5100 e RAM <= 2 kB) ou oito (sistemas W5200 e W5500) ligações de entrada/saída paralelas. A interface de software da biblioteca foi 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 ou a configuração do gateway de acesso). Foi criada uma classe IPAddress para o direcionamento IP. Para executar uma aplicação de servidor simples do lado da Arduino, será necessário usar a classe EthernetServer, que permite escrever e ler dados de todos os dispositivos conectados. Uma classe complementar é a classe EthernetClient, que permite, em poucas chamadas simples, preparar um cliente de rede funcional que realiza operações de escrita e leitura de dados a partir do servidor. Para a comunicação UDP, a biblioteca Ethernet oferece a classe EthernetUDP. Esta disponível uma descrição completa das classes com métodos em:

Ir para a página da Arduino

De uma forma característica da plataforma Arduino, todas as operações complexas do programa foram implementadas diretamente na biblioteca disponibilizada: o programador tem um conjunto limitado mas muito funcional de API à sua disposição, graças ao qual o processo de desenvolvimento da aplicação é rápido e não requer um conhecimento detalhado das pilhas de redes. Analisemos, portanto, a construção da aplicação de servidor mais simples, entregue com a biblioteca Ethernet, cuja tarefa é escutar as ligações de entrada do cliente do protocolo Telnet.

O código da aplicação do servidor começa a adicionar os arquivos de cabeçalho necessários para estabelecer a comunicação SPI (os módulos WIZnet trocam dados com o microcontrolador usando este protocolo) e os arquivos de cabeçalho da biblioteca Ethernet:

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

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 servidor de escuta na porta número 23 (a porta predefinida 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);

EthernetServer server(23);

No corpo da função setup(), é necessário iniciar a biblioteca Ethernet e iniciar o processo de escuta. Adicionalmente, também foi colocada a configuração da porta serial, na qual serão exibidas as 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("Chat server address:");
  Serial.println(Ethernet.localIP());
}

O loop principal do programa espera uma ligação do cliente e verifica os dados legíveis. Ao receber os dados, envia-os de volta ao cliente sem alterações, realizando assim uma função de eco simples:

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

O correto funcionamento da aplicação anterior pode ser testado usando qualquer cliente de protocolo Telnet (por exemplo, Putty no Windows ou comando telnet no Linux) ou outro conjunto Arduino e classe EthernetClient.

Comunicação com módulos ENC28J60 e bibliotecas externas

Uma solução alternativa para os conjuntos de circuitos WIZnet W5x00 oficialmente suportados são módulos baseados ​​em controladores ENC28J60 (p. ex., OKYSTAR OKY3486 ou ETH CLICK). Graças ao seu preço mais baixo e à maior facilidade de instalação à mão (ao contrário dos sistemas W5x00 encerrados em carcaças de 80 pinos LQFP, o controlador ENC28J60 está disponível em carcaças SSOP, SOIC, QFN de 28 pinos e uma carcaça de orifício SPDIP), este circuito é muito popular entre os entusiastas da eletrónica.

Figura 2. Módulos OKY3486 (esquerda) e ETH CLICK (direita), equipados com controlador ENC28J60

Apesar da ausência de apoio oficial da Arduino, muitas bibliotecas de código aberto foram colocadas à disposição dos programadores, o que garante uma rápida integração dos chips ENC28J60 com o software. Deve prestar especial atenção à biblioteca UIPEthernet e, disponível mediante licença GPLv2, à biblioteca EtherCard. A vantagem inegável do primeiro destes projetos é a compatibilidade da interface API com a biblioteca Ethernet oficial da Arduino, o que permite que o processo de desenvolvimento da aplicação seja independente das escolhas realizadas entre os sistemas W5x00 e o sistema ENC28J60 na camada de hardware. O segundo projeto – EtherCard – implementa uma interface de programação independente que, consoante as preferências do programador, pode revelar-se uma alternativa interessante. Tal como no caso da biblioteca Arduino Ethernet, a implementação de uma funcionalidade bastante complexa (por exemplo, implementação do cliente DHCP) pode ser realizada em várias linhas de código:

#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 Transfer Multisort Elektronik (TME) é um dos maiores distribuidores globais de componentes eletrônicos, peças eletrotécnicas, equipamentos de oficina e automação industrial. O catálogo inclui mais de 1.500.000 de produtos de 1.300 fabricantes líderes. Os modernos centros logísticos da TME em Łódź e Rzgów (Polónia), com uma área total superior a 40.000 m², enviam quase 6.000 pacotes diariamente para clientes em mais de 150 países.

A TME também investe no desenvolvimento do conhecimento e das competências de jovens engenheiros e entusiastas da eletrónica através do projeto TME Education e apoia a comunidade tecnológica organizando a série de eventos TechMasterEvent, promovendo a inovação e a troca de experiências.

rightColumnPicture rightColumnPicture

CONSULTE TAMBÉM