May 22 2012

Exemplo do Ethernet Shield ENC28J60 com Arduino

Nessa publicação irei mostrar como ligar o seu Arduino em Rede, mas antes vou abordar uma breve e simples introdução de como é uma Rede.

Uma rede pode ser divida em 5 camadas básicas (modelo OSI/ISO são 7 camadas) como mostrada na figura abaixo:

  • A camada de aplicação suporta todas as aplicações da rede, como por exemplo, os protocolos FTP, SMTP, HTTP e etc. O conteúdo dessa camada é desenvolvido pelo projetista do software.
  • A camada de transporte pela transferência dos dados hospedeio-hospedeiro, normalmente usa os protocolos TCP ou UDP. TCP garante que todos os dados cheguem corretamente, já o UDP não da essa garantia. Essa camada normalmente já esta implementada em alguma biblioteca.
  • A camada de rede é a responsável pelo roteamento do dos datagramas da origem ao destino. O protocolo utilizado é o protocolo IP
  • A camada de enlace é a responsável pela transferência de dados entre elementos vizinhos da rede. Utiliza-se o protocolo Ethernet.
  • A camada física é simplesmente o hardware, no nosso caso o Ethernet Shield.

 

Trabalhar em rede não é uma tarefa muito fácil como muitos pensam, e essa Shield facilita muito o trabalho para uma conexão de um Arduino na rede, pois não é necessário o computador  para fazer o papel de servidor. Me lembro que a primeira vez que fui conectar meu Arduino na rede para acionar um relé via browser, tive que escrever um programa complicadíssimo em C/Linux.

 

Nosso projeto consistira em fazer uma leitura da temperatura ambiente, essa leitura será processada e enviada para a rede (através da Shield) onde por um browser executado em um computador ou tablet ligados à rede poderá ser visualizada.

Obs. Para fazer a leitura do termômetro utilizarei o mesmo algoritimo feito no post Arduino + LM35 – Como montar um termometro

Materiais Utilizados:

Quem estiver interessado em ver o esquema elétrico do Ethernet Shield a WebTronico fornece o PDF clicando aqui

O segredo da Shield que estamos trabalhando é o Circuito Integrado ENC28J60 da Microchip que é o controlador Ethernet que nos permitirá fazer o acesso nossa rede. A figura abaixo esclarece um pouco seus níveis de abstração.

O propósito desse artigo não é abordar o circuito integrado e sim sua funcionalidade, então para mais informações sobre o controlador Ethernet ENC28J60 acesse seu DataSheet clicando aqui

Primeiramente iremos fazer as conexões do sensor de temperatura LM35 nos terminais da Shield, que por consequência estarão ligados aos do Arduino. Abaixo figura que representa as ligações no Arduino, mas lembre-se essas mesmas ligações devem ser feitas na SHIELD:

Como o LM35 é um sensor analógico, ele deve ser ligado em uma das 6 portas analógicas, seu VCC ligado em 5V e seu terra ligado no GND.

Dica: Não inverta o VCC com o GND, isso irá esquentar demais o sensor podendo causar a inutilização do equipamento.

Pronto primeira parte do projeto está OK, o sensor ja esta ligado na Shield, agora vem a parte que nos interessa. Como fazer essa captura e coloca-la na rede para podermos acessar via browser ou qualquer outro cliente HTTP?

Apos ligar o sensor, você deverá instalar a biblioteca que controla o ENC28J60 pois não é a mesma que vem como padrão no Arduino, você deverá fazer o download desse biblioteca clicando aqui, após feito o download a biblioteca devera ser descompactada na pasta libraries . OBS. É extremamente necessario o download dessa biblioteca ou o projeto não irá funcionar.

Após a conclusão da instalação da biblioteca, vamos ao que realmente interessa nesse momento, que é o código necessário para podermos executar nosso Ethernet Shield na rede.

//Ethernet Shield para medir temperatura exemplo criado para o site WebTronico.

#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   //Endereço MAC - Camada de Enlace                                                        
static uint8_t ip[4] = {192, 168, 0,15}; //Endereço IP - Camada de Rede
static uint16_t port = 80; //Porta padrão protocolo HTTP

ETHER_28J60 e;

int analog;
float temperatura;

void setup()
{
  e.setup(mac, ip, port);
}

void loop()
{
  if (e.serviceRequest())
  {
    e.print("<html><head><title>WebServer Simples</title></head><body>");//Instruções HTML.
    e.print("<H1>Temperatura</H1><br/>");
    e.print("Temperatura em Celsius: ");
    analog = analogRead(0);
    temperatura = (analog * 0.00488);  // 5V / 1023 = 0.00488 (precisão do A/D)
    temperatura = temperatura * 100; //Converte milivolts para graus celcius, lembrando que a cada 10mV equi
    e.print(temperatura);
    e.print("<br><br><b>Desenvolvido por Allan Romanato</b></body></html>");
    e.respond();
  }
  delay(100);
}

A execução desse código nos mostrará o resultado exibido na figura abaixo.

 

Nesse post pode-se concluir que não existe dificuldade em colocar seu Arduino na rede, o código é relativamente simples, e os resultados são muito interessantes, pode-se fazer várias coisas com um Arduino em rede, como por exemplo controlar sua casa a longa distância.

Espero que tenham gostado.

Allan Romanato.

17 Comments

  • By André Gadelha, July 27, 2012 @ 11:47 pm

    Gostaria de relatar um erro que ocorreu na instalação da biblioteca (ENC28J60). Erro: sketch_jul27a.cpp:3:25: error: etherShield.h: No such file or directory.
    Pois bem, resolvi o erro trocando uma letra no código:
    onde está > #include “etherShield.h”
    deve-se ter > #include “EtherShield.h”
    Resolvido

  • By eglecio, November 5, 2012 @ 9:58 am

    Olá Allan, primeiramente parabéns pelo seu blog e pelo exemplo, realmente muito útil e muito bem feito e apresentado seu exemplo.
    Gostaria de lhe pedir se vc sabe se é possível fazer o mesmo exemplo, (sem complicações é claro), com o adaptador wireless para arduino, como no endereço http://dx.com/p/jy-mcu-arduino-bluetooth-wireless-serial-port-module-104299?item=10 . Pergunto isso porque não sei se estas bibliotecas se comportam da mesma maneira, e estou pensando em adquirir um para colocar meu arduino em rede.

    Grato de sua colaboração.
    Eglecio

  • By Leandro, December 3, 2012 @ 8:52 am

    Allan, parabéns pelo tutorial, também estou fazendo um projeto com o Ethernet Shield ENC28J60 e o Arduino UNO onde controlamos um sensor de cor feito com LED’s e LDR e os relatórios gerados (como por exemplo, qtd de caixas selecionadas, percent de cada cor…) são publicados na web, porém qdo adiciono vários comandos pro e.print o servidor embarcado para de responder e não pinga mais o ip da shield… Você saberia o pq que isso acontece? E como pode ser solucionado? Segue parte do meu código, Obg!

    void loop(){

    char* params;

    if(params = server.serviceRequest()) {

            server.print(“Gerenciamento Esteira Seletora por Cor”);

            server.print(“Servidor Web Embarcado“);

            server.print(“”);
            
            server.print(“”);
     
            server.print(“”);
     

    if(strcmp(params,”?Esteira=10″) == 0) //Ligar esteira, rele ativado
    {
       digitalWrite(pinoRele,HIGH);
    }
    else if(strcmp(params,”?Esteira=01″) == 0) // Desligar esteira, rele desativado
    {
        digitalWrite(pinoRele,LOW);
       
    //Relatórios serão enviados quando desativar o motor da esteira

      server.print(“Quantidade de caixas selecionadas: Caixas Vermelhas: “);
    server.print(qtdRed);
    server.print(“Caixas Verdes: “);
    server.print(qtdGreen);
    server.print(“Caixas Azuis: “);
    server.print(qtdBlue);

    //Quando adiciono mais codigo p/ relatorio aqui o arduino para de responder e o shield não pinga

       server.print(“”);

    }

       server.respond();

    }

  • By visitante, January 7, 2013 @ 10:34 am

    Parabéns pelo blog
    Comprei este módulo ethernet e fiquei dias até consguir fazer um simples ping. A biblioteca dele não é/era suportada oficialmente pelo arduino. No fim usei a biblioteca do turicas e funcionou.

  • By Reginaldo Padilha, June 4, 2013 @ 11:28 pm

    E necessario o Arduino ou ela se liga sozinha na rede?

  • By Webtronico, June 5, 2013 @ 7:29 am

    Riginaldo, é necessário o Arduino.

  • By Jorge Emil, January 2, 2014 @ 10:14 pm

    Prezados boa noite… Alguém sabe me informar se a referida biblioteca funciona também com PIC? Se não, alguém sabe que biblioteca poderia usar e se tem algum exemplo na net, pois só encontrei projetos com Arduino. Grato. dsd,

  • By ilgner, January 21, 2014 @ 8:29 pm

    Quais sao os pinos que irão ser ligados?

  • By rafael, June 23, 2014 @ 6:29 pm

    estou tentando usar o modulo enc28j60 como cliente so tenho que enviar e receber uma string

  • By rafael, June 23, 2014 @ 6:31 pm

    estou tentando usar o modulo enc28j60 como cliente so tenho que enviar e receber uma string para um servidor local estou usando a lib ethercard-master
    mais nao estou conseguindo nada alguem pode me ajudar

  • By rafael, June 23, 2014 @ 6:41 pm

    estou tentando usar o modulo enc28j60 como cliente so tenho que enviar e receber uma string para um servidor local estou usando a lib ethercard-master
    mais nao estou conseguindo nada alguem pode me ajudar

  • By Anderson, June 21, 2015 @ 4:25 pm

    Ola, utilizei o código publicado pelo autor e deu tudo certo, agradeço pela colaboração..

  • By TourAdd, September 24, 2016 @ 12:00 pm

    Хочешь знать какой он призрак замка Обязательно зайди к нам и читай все про призрак лувра Только на нашем портале самые рабочие рассказы, про фантом призрак легко и просто. И так – зайди на http://www.mystictourism.com

  • By Somov, October 23, 2016 @ 3:03 am

    Если хочешь сделать талисман своими руками то зайди к нам и мы расскажем как создать талисман для денег Только на нашем блоге самые правильные конструкции, и ты сможешь сделать денежный талисман легко и просто. И так – загляни на http://www.mystictourism.com

  • By Vinicio, March 9, 2017 @ 3:41 pm

    Olá, parabéns pelo blog. É possível estabelecer uma conexão HTTP e poder acessar esta página em qualquer local do globo?
    Desde já agradeço…

  • By Giovani De Carli, August 8, 2017 @ 4:17 pm

    Allan, Estou com um problemão. Comprei a placa a muito tempo e agora que fui rodar o programa dá um erro dizendo:

    C:\Program Files x86)\Arduino\libraries\ETHER_28J60\ETHER_28J60v0.cpp:26:38: fatal error: WProgram.h: No such file or directory

    #include “WProgram.h” // Arduino 0.23

    ^

    compilation terminated.

    exit status 1
    Erro compilando para a placa Arduino Duemilanove or Diecimila

    Pelo que entendi falta uma biblioteca chamada WProgram.h que deve ser usada em algum ponto das outras bibliotecas.

    Onde acho ela?

  • By wender, September 13, 2017 @ 9:46 pm

    Gostaria de alguma orientação de como alterar o programa para que o arduino possa receber o valor de uma entrada analogica de outro microcontrolador (escravo) e repassar esse valor para o enc28j60.

    Grato

    Wender

Other Links to this Post

RSS feed for comments on this post. TrackBack URI

Leave a comment