Escolha uma Página

Ligando o Arduino à Rede Local através do módulo ENC28J60

18 mar - 2019

No Arduino você pode conectar sensores – que tem a função de medir o que acontece – e atuadores – para agir e controlar.  A filosofia básica do Arduino é, em linhas gerais, definir os sensores que irão medir o que acontece no ambiente, depois definir os atuadores que irão ligar, desligar e acionar, e finalmente, escrever um programa (sketch) que faça tudo isso funcionar. Além disso, tornando o Arduino ainda mais interessante, esse microcontrolador pode ser conectada às redes locais ou LANs (Local Area Network) através de módulos Ethernet – como o módulo ENC28J60 – permitindo, por exemplo, a criação de servidores de web básicos.

O objetivo desse texto não é explicar detalhadamente o funcionamento das redes Ethernet, embora isso não seja exatamente um problema, pois há muitos sites na Internet sobre redes de computadores que descrevem suas propriedades, técnicas de transmissão, topologias, interfaces e protocolos. Todavia, especialmente para aqueles que estão iniciando com o Arduino, vamos aproveitar para rever alguns conceitos fundamentais que nos auxiliarão a compreender os tópicos aqui apresentados.

Podemos dizer que Ethernet é uma arquitetura de interconexão para redes locais, com base no envio de pacotes (estruturas de transmissão de dados), que define cabeamento, sinais elétricos, formato de pacotes e protocolos de controle de acesso. Uma característica dos dispositivos Ethernet (computadores e outros) é que tem endereços próprios. De modo geral, quando há transmissão de dados na rede Ethernet, os pacotes enviados são vistos por todas as máquinas da rede.

No projeto que vamos apresentar, o Arduino mede a temperatura ambiente e a umidade relativa do ar usando um sensor DHT11 e disponibiliza os valores medidos na rede, através de um módulo ENC28J60 que opera como um servidor de rede básico.

Um servidor de rede é um computador que fornece serviços a uma rede de computadores chamados clientes. Por sua vez, o cliente é o computador que consome serviços do servidor. Os serviços fornecidos por um servidor podem ser de diferentes naturezas como, por exemplo, email, arquivos, bancos de dados, imagens, dentre outros.

Vejamos então como tudo isso funciona!

Componentes usados no projeto: 1 Arduino Uno, 1 sensor DHT11, 1 módulo Ethernet ENC28J60, 1 protoboard e cabos jumpers.

Figura 1: Arduino Uno com DHT11 conectado à Internet via ENC28J60

 

Figura 2: Detalhe da Montagem do Projeto no Protoboard

Módulo ENC28J60

Esse módulo, com dimensões de 55 mm x 36 mm, tem como elemento central o CI ENC28J60, um controlador Ethernet que opera com a interface SPI (Serial Peripheral Interface). Na placa desse módulo é possível observar um cristal de 25Mhz, um conector de 10 pinos para as ligações com o microcontrolador e um conector de rede do tipo RJ45 (HanRun HR911105A – 10/50).  A alimentação desse módulo é feita com 3,3 Volts.

Figura 3: Módulo ENC28J60

Nesse projeto vamos usar a biblioteca <UIPEthernet.h>, perfeitamente compatível com a biblioteca padrão Ethernet que faz parte do IDE (Integrated Development Environment) da plataforma Arduino. Para baixar essa blblioteca basta acessar …

<https://github.com/UIPEthernet/UIPEthernet>

O Arduino Uno será ligado a um sensor DHT11 para fazer medições da temperatura ambiente e da umidade relativa do ar. Usando a biblioteca <UIPEthernet.h> vamos ligar o Arduino ao módulo ENC28J60 e configurá-lo como “server” (servidor) para enviar esses valores da temperatura e umidade para um computador “client” (cliente) que acessar esse servidor (ENC28J60). Esse acesso será feito escrevendo no navegador (“browser”) de um computador ligado à rede local o endereço IP do módulo ENC28J60.

O sketch usado nesse projeto é uma adaptação de um dos exemplos da biblioteca <UIPEthernet.h> e pode ser encontrado na parte final desse artigo.

A montagem do projeto deve ser feita de forma cuidadosa, garantindo que todas as conexões estejam corretamente executadas.

Estamos considerando uma instalação que inclua um modem de acesso à Internet, geralmente fornecido pela empresa provedora de Internet, ligado a um roteador através do conector WAN (Wide Area Network). A esse roteador são ligados os dispositivos à rede (computadores, PCs, smart tvs, smartphones, impressoras, etc). Esse roteador tem, geralmente, 4 (quatro) conectores Ethernet, do tipo RJ45 fêmea e, como na maior parte das instalações de serviço de acesso à Internet em residências e empresas de pequeno porte, possui também capacidade de acesso sem fio (Wi-Fi).

Nesse ponto, é recomendado rever a figura 2 com os detalhes de montagem do projeto no protoboard. Conecte uma das extremidades do cabo de rede ao conector RJ45 do módulo ENC28J60 e a outra extremidade em uma porta LAN livre do seu roteador. Depois de concluída a montagem carregue o sketch do projeto.

Figura 4: Tela do Computador “Client”

Ligue um computador na rede LAN e abra o navegador (browser). Digite o endereço IP 192.168.0.120 (ou o endereço usado no seu sketch) e veja as informações surgirem na tela do seu computador.

Observações sobre o sktech!

As instruções iniciais do sketch incluem as bibliotecas <UIPEthernet.h>, responsável pela comunicação Ethernet, e a biblioteca <DHT.h>, referente ao sensor DHT11.

O pino de saída do sensor DHT11 é conectado ao pino analógico A5 do Arduino. O servidor foi configurado na porta 80 do roteador através da instrução …

EthernetServer server = EthernetServer(80);

Uma porta é um canal de acesso no qual pacotes de dados são transferidos. A porta 80 é uma porta padrão dos servidores web capaz de estabelecer conexões rápidas ou eficientes, dependendo da necessidade principal do envio do pacote de dados. Isso ocorre porque a porta 80 pode trabalhar alternando os protocolos TCP (Transmission Control Protocol, protocolo de controle de transmissão) e UDP (User Datagram Protocol, protocolo de datagrama de usuário). Trabalhando com o protocolo TCP (conexão eficiente) é possível enviar de dados dentro de uma sequência correta, sem erros e com garantia de entrega. Por sua vez, trabalhando com o protocolo UDP é possível o envio rápido de pacotes de dados. Vale lembrar que um datagrama é uma unidade de transferência básica associada a uma rede de comutação de pacotes em que a entrega, hora de chegada e a ordem não são garantidos.

No setup() do sketch temos, em primeiro lugar, a inicialização da interface serial através da instrução Serial.begin(9600);

Em seguida, são definidos os endereços mac e ip do módulo ENC28J60, sendo o servidor inicializado através de server.begin().

//Define o MAC da placa de rede. Nao eh necessario alterar

uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};

//Define o endereco IP da sua placa

IPAddress myIP(192,168,0,120);

Ethernet.begin(mac,myIP);

server.begin();

É importante entender que no módulo ENC28J60 o endereço mac e o endereço ip são definidos no sketch.

À rigor, o endereço mac (mac address, media access control address ou endereço de controle de acesso do meio) é um endereço físico e único associado à interface de comunicação (que é o tal meio de comunicação) que conecta um dispositivo à rede. Em computadores, tablets, smartphones, roteadores, impressoras e outros dispositivos de uma rede de computadores o endereço mac é gravado pelo fabricante para cada equipamento. No caso do módulo ENC28J60 não é assim. Já vi vários exemplos de sketches para o módulo ENC28J60 que rodam com um mesmo mac address como, por exemplo, o número usado em nosso sketch. Mas, se no futuro você desenvolver um projeto com duas placas ENC28J60, deverá ter um endereço mac diferente para cada uma delas.

O endereço IP (Internet Protocol, ou protocolo de Internet) é um número que identifica um dispositivo em uma rede e pode ser fixo (estático) ou dinâmico. O enderêço IP fixo (estático) será sempre o mesmo toda vez que o dispositivo/computador se conectar à rede. Por sua vez, o enderêço IP dinâmico é um número que é dado a um computador quando este se conecta à rede, mas que muda toda vez que há conexão.

A grande maioria dos provedores de Internet disponibiliza seus serviços para residências e pequenas empresas usando endereços IP dinâmicos. Como já dissemos anteriormente, tais instalações são configuradas, geralmente, com um modem que se conecta as máquinas/computadores do provedor de Internet, que é então conectado a um roteador via conector WAN (Wide Area Network). Este roteador, por sua vez, faz a conexão com os dispositivos/computadores na rede local (LAN) via conectores RJ45 (Ethernet) e/ou através do acesso sem fio Wi-Fi. Para distribuir os endereços IP para as máquinas na LAN é usado o protocolo DHCP (Dynamic Host Configuration Protocol, ou protocolo de configuração dinâmica de endereços de rede). Por meio do protocolo DHCP é feita a alocação automática de diferentes endereços de IP para os computadores/máquinas à medida que eles fazem a solicitação de conexão à rede. Essa alocação dos IPs é feita em intervalos pré-definidos e configuráveis. Sempre que uma das máquinas for desconectada o IP ficará livre para o uso em outro computador.

Dito isso, é também relevante saber que no caso do cliente (residência ou pequena empresa) solicitar um IP fixo para sua rede, a imensa maioria dos provedores de Internet cobram uma tarifa adicional sobre o valor da mensalidade, que varia de provedor para provedor, dependendo do tipo de acesso e da localização.

Bem, nesse ponto você já deve ter decidido usar o mesmo endereço mac do sketch para rodar na sua placa ENC28J60, mas deve estar se perguntando como escolher o endereço IP? Vamos partir do princípio que a sua rede local usa IP dinâmico e seguir alguns passos básicos.

Você deve abrir a tela de command prompt do sistema operacional (Windows) do seu computador PC. Para isso digite Windows key + X, depois Run, em seguida digite cmd na janela Open: e clique em OK. Com isso, uma tela preta deverá surgir com o seguinte texto:

c:\Users\asus pc >

Note que asus pc é apenas o nome do meu computador PC. O nome do seu computador deverá estar nessa linha de texto. Nesse ponto digite …

c:\Users\asus pc > ipconfig

Pronto, agora você tem as informações sobre o seu computador PC (os números nesse artigo valem para o meu computador) que incluem:

IPv4 Address … 192.168.0.6 que é o endereço IP que o DHCP atribuiu para o meu computador na rede (veja no seu caso).

Subnet Mask … 255.255.255.0

A Subnet Mask (ou máscara de sub-rede) é a identificação da subdivisão lógica da rede (ou identificação da sub-rede) usada para simplificar sua administração e melhorar seu desempenho.

Default Gateway … 192.168.0.1 que é o endereço do roteador da rede.

O roteador recebeu o endereço 192.168.0.1 e o computador recebeu o endereço IP 192.168.0.6. Geralmente, os outros computadores da rede recebem endereços IP acima do endereço atribuído ao roteador, entretanto de valores mais baixos como, por exemplo, 192.168.0.6 ou 192.168.0.10. Tendo isso mente, eu escolhi um endereço mais alto, acima de 192.168.0.99, para o projeto, mas ainda dentro da faixa de endereços possíveis, sendo o maior valor 192.168.0.254. Assim sendo, nesse projeto o endereço IP do módulo ENC28J60 é 192.168.0.120.

A parte do loop() inicia com as instruções que fazem a leitura do sensor DHT11 e imprimem os valores de temperatura e umidade relativa no ar na interface serial.

Depois disso o sketch precisa detectar se um “client” está conectado ao servidor (módulo ENC28J60) usando server.available(). Essa instrução retorna um objeto falso ou verdadeiro. No caso de não haver um “client” conectado para ler os dados do “server” o objeto retornado será falso. Então, a instrução …

if (EthernetClient client = server.available())

… interroga se existe um “client” conectado, e se isso for verdadeiro esse “client” poderá ler as informações disponíveis no “server”.

No caso de haver um computador cliente (“client”) disponível na rede LAN, o sketch imprimirá na tela do computador “client” a frase “ModuloEletronica”, a temperatura em graus Celsius e a umidade relativa do ar em %, através de instruções client.print() e cliente.println(). Finalmente, a conexão entre o “client” e o “server” é encerrada através da instrução client.stop().

*****************************************************************

Veja o sketch que faz tudo isso funcionar!

// Servidor de Internet
// Apresenta uma mensagem &amp;amp;amp;quot;...&amp;amp;amp;quot;
// Apresenta temperatura em graus C
// Apresenta Umidade relativa em %

#include &amp;amp;amp;lt;UIPEthernet.h&amp;amp;amp;gt;

#include &amp;amp;amp;lt;dht.h&amp;amp;amp;gt;
dht DHT;
#define DHT11_PINO A5
EthernetServer server = EthernetServer(80);

void setup()
{
Serial.begin(9600);
//Define o MAC da placa de rede. Nao eh necessario alterar
uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};

//Define o endereco IP da sua placa 
IPAddress myIP(192,168,0,120);

Ethernet.begin(mac,myIP);
server.begin();
}

void loop()
{
 // Leitura da temperatura no DHT11
     int leituras = DHT.read11(DHT11_PINO);
     Serial.print(&amp;amp;amp;quot;Temperatura = &amp;amp;amp;quot;);
     Serial.print(DHT.temperature);
     Serial.println();
     Serial.print(&amp;amp;amp;quot;Umidade = &amp;amp;amp;quot;);
     Serial.print(DHT.humidity);
     Serial.println();
     delay(2000); 
 size_t size;
 if (EthernetClient client = server.available())
 {
  while((size = client.available()) &amp;amp;amp;gt; 0)
 {
 uint8_t* msg = (uint8_t*)malloc(size);
 size = client.read(msg,size);
 Serial.write(msg,size);
 free(msg);
 }
  client.println(&amp;amp;amp;quot;&amp;amp;amp;lt;h1&amp;amp;amp;gt;ModuloEletronica&amp;amp;amp;lt;/h1&amp;amp;amp;gt;&amp;amp;amp;quot;);
  client.print(&amp;amp;amp;quot;&amp;amp;amp;lt;h1&amp;amp;amp;gt;Temperatura=&amp;amp;amp;lt;/h1&amp;amp;amp;gt;&amp;amp;amp;quot;);
  client.print(DHT.temperature); 
  client.print (&amp;amp;amp;quot;&amp;amp;amp;lt;h1&amp;amp;amp;gt;C&amp;amp;amp;lt;/h1&amp;amp;amp;gt;&amp;amp;amp;quot;);
  client.println();
  client.print (&amp;amp;amp;quot;&amp;amp;amp;lt;h1&amp;amp;amp;gt;Umidade=&amp;amp;amp;lt;/h1&amp;amp;amp;gt;&amp;amp;amp;quot;);
  client.print (DHT.humidity);
  client.print (&amp;amp;amp;quot;&amp;amp;amp;lt;h1&amp;amp;amp;gt;%&amp;amp;amp;lt;/h1&amp;amp;amp;gt;&amp;amp;amp;quot;);
  client.println();
  client.stop();
 }
}

 

Haroldo Mamede Coutinho Simões

Haroldo Mamede Coutinho Simões

Engenheiro de telecomunicações e pós-graduado em gerenciamento de negócios, tendo trabalhado em empresas de médio e grande porte por mais de 30 anos, atuando em diferentes projetos e departamentos. É instrutor de treinamento, tendo ministrado workshops em várias empresas, professor universitário em cursos MBA presenciais e tutor de cursos à distância. É apaixonado por tecnologia, especialmente pela plataforma Arduino e tudo de positivo que ela pode fazer pelas pessoas quando dela se aproximam.

0 comentários

Enviar um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Facebook

VEJA TAMBÉM

Regador automático de plantas com Arduino

Aprenda neste artigo, como automatizar a rega de suas plantas, utilizando o Arduino NANO. Este projeto, além do baixo custo, pode ser montado em menos de uma hora e irá garantir que as suas plantas sempre tenham água disponível, garantido um crescimento adequado e...

Fita de LEDs RGB endereçáveis WS2812B e a biblioteca fastLED

No post de hoje, vamos conhecer a fita de LEDs WS2812B endereçáveis e como utilizá-la com o Arduino UNO.  Essa fita de LEDs se destaca, em relação as outras do mercado, pelo fato de que seus LEDs podem ser controlados de maneira individual, permitindo que o...

NEWSLETTER

Assine nossa newsletter e receba as novidades.

ATENDIMENTO

(19) 3579-7189