Como conectar seu Arduino UNO/Nano à internet usando o módulo Ethernet W5100
A maioria dos dispositivos IoT conectados hoje estão conectados à Internet por meio de uma conexão wi-fi. Embora uma conexão Wi-Fi permita o acesso remoto à Internet, ela tem suas próprias limitações. Por exemplo, na maioria das aplicações industriais para um dispositivo estacionário, a Ethernet geralmente é escolhida em vez da conexão Wi-Fi simplesmente porque é mais confiável e segura. Além disso, como a Ethernet é uma conexão com fio, ela oferece melhor velocidade e menor latência. Já trabalhamos em muitos projetos de IoT, a maioria dos quais foi construída em torno de ESP8266, ESP32 ou Raspberry Pi. Como sabemos, esses dispositivos têm um modem Wi-Fi embutido que permite que você se conecte à internet. Mas se você está trabalhando com uma humilde placa Arduino UNO ou Nano e deseja conectar seu Arduino à Internet, então você tem duas opções populares. Uma opção é usar um ESP8266 com Arduino e a segunda opção é conectar um módulo Ethernet com Arduino.
Neste projeto, vamos usar a última opção para controlar um LED pela Internet fazendo a interface do Arduino com o módulo Ethernet W5100. O módulo Ethernet é usado para estabelecer a comunicação entre o computador e o Arduino em uma LAN ou rede com fio. Este artigo foi escrito presumindo que o leitor tenha um conhecimento básico de rede de computadores, o que inclui o conhecimento de como conectar computadores ao hub/roteador com cabos RJ45, endereços IP e MAC, etc.
Conteudo
Módulo Ethernet W5100
Estamos usando o módulo Ethernet W5100. É um módulo habilitado para internet com um único chip e recursos completos para estabelecer uma conexão com a internet. Em termos simples, este módulo permite que a placa Arduino se conecte à Internet. Ao utilizar este módulo, podemos completar a ligação à internet sem o suporte de um Sistema Operacional. Ele também oferece suporte a protocolos TCP/IP com fio como TCP, PPPoE, Ethernet, UDP, ICMP, IPv4, etc. Ele oferece suporte aos modos de operação full-duplex e half-duplex. Ele suporta conexões ADSL e até quatro conexões de soquete simultâneas.
O módulo Ethernet também usa a biblioteca Arduino Ethernet para escrever esboços que se conectam à Internet usando este módulo. Ele se encaixa em todas as versões do Arduino como UNO, NANO, mega 1280, mega 2560 e outros. O funcionamento e a funcionalidade do módulo Ethernet W5100 são muito semelhantes aos de um escudo Ethernet Arduino, o que significa que você pode fazer tudo o que quiser com um escudo Ethernet Arduino. Como vantagem, custa metade do preço de um shield.
Diagrama de circuito para conectar o módulo Ethernet Arduino W5100
O circuito consiste em Arduino Nano e Módulo Ethernet W5100 (este projeto também seria possível com Ethernet Arduino Shield e Arduino UNO). A conexão entre os módulos Arduino e Ethernet é feita conforme mostrado no diagrama de circuito.
- Conecte os pinos 5V e GND do Arduino Nano aos pinos +5 e G do Módulo Ethernet, respectivamente (essas conexões fornecem energia para o Módulo Ethernet).
- Conecte os pinos 9, 10, 11,12 e 13 do Arduino a R, SS, MO, MI, CK do módulo Ethernet respectivamente (estes fazem a comunicação entre Arduino e Ethernet sobre SPI).
Código Arduino para obter dados do Módulo Ethernet W5100
O arquivo de cabeçalho SPI é incluído para usar os protocolos de comunicação com o módulo Ethernet.
#include <SPI.h>
O arquivo de cabeçalho Ethernet tem a biblioteca para rodar webclient/webserver sobre Ethernet.
#include <Ethernet.h>
O endereço físico Mac é definido para o módulo Ethernet.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
O número 192.168.0.12 é o endereço IP. Onde “0” depende do host (gateway padrão) da rede à qual você está conectado, verifique isso executando ipconfig no prompt de comando.
byte ip[] = { 192, 168, 0, 12 }; byte gateway[] = { 192, 168, 0, 12 }; byte subnet[] = { 255, 255, 255, 0 };
Apenas para referência, este gateway padrão de uma rede diferente é mostrado abaixo.
Isso cria um servidor local na porta 80 que pode ser acessado posteriormente pelos clientes.
EthernetServer server(80);
Isso lê a resposta do cliente quando o usuário acessa o servidor web.
String readString;
A função de configuração inicializa o pino do LED para saída e inicializa o módulo Ethernet com os parâmetros fornecidos (endereço Mac, endereço IP, gateway, máscara de sub-rede) e, finalmente, o servidor é iniciado pela função “server.begin()”
int ledPin = 2; void setup(){ pinMode(ledPin, OUTPUT); Ethernet.begin(mac, ip, gateway, subnet); server.begin(); }
Na função de loop, criamos uma conexão de cliente e verificamos se alguém está tentando acessar o endereço IP atribuído por meio de um navegador.
void loop(){ EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) {
Se conectado, continue verificando se o cliente está enviando alguma mensagem de volta ao servidor
char c = client.read();
Em seguida, leia a resposta HTTP caractere por caractere e armazene os caracteres na variável readString definida pelo usuário.
if (readString.length() < 100) { readString += c; }
Se a solicitação HTTP foi encerrada – 0x0D é Carriage Return \n ASCII
if (c == 0x0D) {
Assim que recebermos uma resposta OK, começamos a exibir a página da web, e abaixo está o código HTML.
client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<HTML>"); client.println("<HEAD>"); client.println("<TITLE> ARDUINO ETHERNET</TITLE>"); client.println("</HEAD>"); client.println("<BODY>"); client.println("<hr>"); client.println("<H1 style=\"color:green;text-align:center\">ARDUINO ETHERNET LED CONTROL</H1>"); client.println("<hr>"); client.println("<br>");
Quando o usuário clica no hiperlink LIGAR LED, ele/ela é redirecionado para a URL \?LEDON, que acende ainda mais o LED.
client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDON\"\">Ligar LED</a><br></H2>");
Semelhante ao código acima, isso redireciona o usuário para a URL “DESLIGAR LED”.
client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDOFF\"\">Turn Off LED</a><br></H2>");
Parte restante do código HTML-
client.println("<br>"); client.println("</BODY>"); client.println("</HTML>"); delay(10); client.stop();
Controle o pino do Arduino para ligar e desligar o LED dependendo da URL para a qual os usuários são redirecionados.
if(readString.indexOf("?LEDON") > -1) { digitalWrite(ledPin, HIGH); } else { if(readString.indexOf("?LEDOFF") > -1) { digitalWrite(ledPin, LOW); } }
limpar string para a próxima leitura
readString=""; } } } } }
Conectando o Arduino ao PC ou porta Ethernet do roteador
Para conectar os dois (PC e Arduino) juntos, precisamos de um cabo adequado (cabo cruzado CAT-6) se a porta Ethernet do PC não tiver sensor de direção automática. Caso o seu PC suporte detecção direta automática, basta conectar um cabo comum que vem com o roteador.
Neste cabo especial TX+/TX- e RX+/RX- são trocados.
Em qualquer caso, se você não tem uma porta Ethernet em seu PC ou não quer comprar um cabo especial, você pode seguir nosso método para conectar o módulo Ethernet a uma porta de rede LAN do roteador.
LED piscando na Internet usando o módulo Ethernet no Arduino
Depois de fazer as conexões acima, conecte-se ao roteador usando seu PC ou telefone celular. Em seguida, abra qualquer navegador da web e vá para este URL “http://192.168.0.12” (no seu caso, digite seu endereço IP Ethernet que você configurou no código). Agora, você pode controlar o LED por meio da página da web. Quando o usuário clica em “Ligar LED” na página da web, o LED acende no circuito. Quando “DESLIGAR LED” é clicado, o LED é DESLIGADO no circuito. Este comando é executado usando a conexão com fio do módulo Ethernet. A página do servidor web é mostrada na figura abaixo.
Espero que você tenha gostado do projeto e aprendido a usar o módulo Ethernet W5100 com Arduino para enviar e receber dados pela internet. Se você tiver alguma dúvida, deixe-as na seção de comentários abaixo ou use nosso fórum de Eletrônicos.
Código
#include <SPI.h> //protocolo para se comunicar com o módulo ethernet #include <Ethernet.h> //biblioteca para executar cliente/servidor web sobre ethernet byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //endereço mac físico definido para o módulo ethernet /*o número 0 no endereço IP depende do host da rede à qual você está conectado, verifique isso executando ipconfig no prompt de comando*/ byte ip[] = { 192, 168, 0, 12 }; // Endereço IP na LAN - precisa mudar de acordo com o seu endereço de rede byte gateway[] = { 192, 168, 0, 12 }; // acesso à internet via roteador byte subnet[] = { 255, 255, 255, 0 }; //máscara de sub-rede EthernetServer server(80); //porta onde o servidor pode ser acessado String readString; // para ler a resposta do usuário / cliente int ledPin = 2; // Led está conectado ao pino 2 void setup(){ pinMode(ledPin, OUTPUT); //pino selecionado para controlar //start Ethernet Ethernet.begin(mac, ip, gateway, subnet); //inicializar ethernet server.begin(); //inicie o servidor } void loop(){ // Crie uma conexão de cliente EthernetClient client = server.available(); // verifique se alguém tentou acessar o endereço IP atribuído em um navegador if (client) { // se conectado, continue verificando se o cliente está enviando alguma mensagem de volta ao servidor while (client.connected()) { if (client.available()) { char c = client.read(); // ler solicitação HTTP caractere por caractere if (readString.length() < 100) { // armazena caracteres em string readString += c; } //se a solicitação HTTP foi encerrada - 0x0D é Carriage Return \n ASCII if (c == 0x0D) { //exibir a página da web client.println("HTTP/1.1 200 OK"); //enviar nova página client.println("Content-Type: text/html"); client.println(); client.println("<HTML>"); client.println("<HEAD>"); client.println("<TITLE> ARDUINO ETHERNET</TITLE>"); client.println("</HEAD>"); client.println("<BODY>"); client.println("<hr>"); client.println("<H1 style=\"color:green;text-align:center\">ARDUINO ETHERNET LED CONTROL</H1>"); client.println("<hr>"); client.println("<br>"); //criando um link para redirecionar o usuário para ligar a luz client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDON\"\">Ligar o LED</a><br></H2>"); //criando um link para redirecionar o usuário para desligar a luz client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDOFF\"\">Desligue o LED</a><br></H2>"); client.println("<br>"); client.println("</BODY>"); client.println("</HTML>"); delay(10); // parando o cliente client.stop(); // controlar pin Arduino com URL if(readString.indexOf("?LEDON") > -1) // verifica o LEDON { digitalWrite(ledPin, HIGH); // definir o pino alto } else{ if(readString.indexOf("?LEDOFF") > -1) // verifica se há LEDOFF { digitalWrite(ledPin, LOW); // definir o pino baixo } } // limpar string para a próxima leitura readString=""; } } } } }