segunda-feira, 28 de setembro de 2015

Webserver com o módulo ENC28J60 e o Arduino

A capacidade de ligação com a internet ou uma intranet ou rede local permite abrir uma série de possibilidades aplicacionais para os nossos sistemas.

Esta capacidade vem permitir a ligação do nosso sistema uma rede computadores permitindo, que possamos aceder ao primeiro através de um computador ou qualquer outro dispositivo ligar à rede e que permita o cesso a um browser web.
Dotando assim o nosso sistema das capacidades de realizarão de leituras de sensores e de controlar ou ser controlado através da rede, permitindo desta forma reduzir custos e aumentar as capacidades dos sistemas.


Material necessário
  • Arduino Duemilanove ou outra versão;
  • Módulo Ethernet ENC28J60;
  • Vários jumpers (fios condutores para as ligações).
Outros
  • Cabo USB;
  • Cabo de rede com terminais RJ45;
  • Router (este pode ser o da internet lá de casa).


Ensaio Pratico
O objetivo deste ensaio é de aceder a uma pagina web alojada no nosso sistema através de uma rede IP, ou seja com o módulo Ethernet ENC28J60 vamos simular um simples servidor de paginas web numa intranet ou rede local, sendo possível aceder a esta pagina a partir de um sistema informático ligado a mesma rede bastando para isto conhecer o endereço IP do sistema.

O código implementado tem a particularidade de permitir a utilização de um endereço de IP estático definido pelo utilizado ou dinâmico atribuído automaticamente pela rede em causa.
Para se escolher entre IP dinâmico ou estático temos simplesmente que alterar o valor da "1" para "0" ou vice-versa na linha "#define STATIC 1", sendo que "0" significa que vai ser atribuído um IP automaticamente ao nosso sistema e "1" que temos de definir obrigatoriamente um endereço IP para podermos aceder ao sistema via rede IP.

Não sendo este módulo ethernet um módulo oficial, teremos de importar para o nosso software de trabalho com o arduino uma nova biblioteca que nos vais permitir trabalhar com o módulo.

Ensaio Pratico passo a passo:
É importante frisar bem os passos necessários para a elaboração do ensaio, garantindo assim o bom funcionamento  do sistema.
  1. Fazer download biblioteca "Ethercard" deste link: Ethercard
  2. Adicione esta nova biblioteca ao Software de trabalho com o  Arduino clicando em:          Sketch -> Import Library -> Add Library e selecionar o ficheiro Ethercard.zip e finalizar
  3. Realizar a montagem de acordo com o esquema de montagem abaixo:
  4. Compilar e fazer o upload do código abaixo para o nosso Arduino:
  5. Após upload do programa para o nosso Arduino, abrir o “Serial Monitor”  para verificar os paramentos da rede.
  6. Por fim podemos aceder a página bastando para isso introduzir o endereço IP definido ou atribuído no nosso browser preferido.

Esquema de montagem
Para o ensaio, foi elaborado um esquema muito simples formado pelo módulo ENC28J60 e pelo arduino, este em conjunto com o bloco de código desenvolvido vai permitir realizar a comunicação entre o nosso sistema e um sistema informático ligado  na mesma  rede.

Atenção a montagem dos componentes deve ser feita de acordo com o esquema seguinte:



Nota: Muito cuidado ao ligar o módulo Ethernet ENC28J60, se este for ligado de forma incorreta, ou se for alimentado por uma uma tenção superior a de 3,3V pode ficar irreversivelmente danificado.


Durante  a montagem temos de ter sempre em atenção todas as ligações, efectuando as mesmas tendo por base o quadro anterior, note que de acordo com a biblioteca utilizada também os pinos de ligação no arduino podem mudar.



Código Fonte
Código desenvolvido e com o qual iremos programar o nosso arduino, este é o responsável pelo funcionamento do sistema de acordo com o pretendido.


#include <EtherCard.h>
#define STATIC 1                              //Para definir um IP estático mudar de 0 para 1
                                                       //To set a static IP change from 0 to 1
#if STATIC
static byte myip[] = { 192,168,2,70 };   //Definição do IP estático/Setting the static IP
static byte gwip[] = { 192,168,2,1 };     //Endereço IP do Gateway da rede/Gateway IP address of the network 
#endif
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; //*MAC Address 
                                                                 //*MAC Address da interface ethernet - Tem de ser único na sua rede 
                                                          //*MAC Address of the Ethernet interface - must be unique in your network
byte Ethernet::buffer[500];

const char page[] PROGMEM =  //Página HTML/HTML page
   "HTTP/1.0 200 OK\r\n"
   "Content-Type: text/html\r\n"
   "Refresh: 5\r\n"
   "\r\n"
   "<html>"
   "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>"
   "   <head>"
   "      <title>Arduino WebServer</title>"
   "   </head>"
   "   <body>"
   "  <center>"
   "  <h1>Módulo Ethernet ENC28J60</h1>"
   "  <hr>"
   "      <h3>Página de resposta do nosso Arduino.</h3>"
   "      <h4>Para mais informações visite o blogue TecnoDomos.</h4>"
   "  <a href='http://www.tecnodomos.blogspot.com'>TecnoDomos</a>"
   "  <hr>"
   "  </center>"
   "   </body>"
   "</html>"
;
void setup(){
   Serial.begin(57600);
   Serial.println( "Modulo Ethernet ENC28J60/ENC28J60 Ethernet module");
   Serial.println("\n[webserver]");

   if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
      Serial.println( "Falha ao aceder ao controlador Ethernet/Failed to access Ethernet controller");

      #if STATIC
          ether.staticSetup(myip, gwip);
      #else
          if (!ether.dhcpSetup())
              Serial.println("DHCP falhou / DHCP failed");
      #endif

   Serial.println("Parametros da rede / Network parameters");
   ether.printIp("IP: ", ether.myip);
   ether.printIp("GW: ", ether.gwip);
   ether.printIp("DNS: ", ether.dnsip);
}

void loop(){
   if (ether.packetLoop(ether.packetReceive())) {
      memcpy_P(ether.tcpOffset(), page, sizeof page);
      ether.httpServerReply(sizeof page - 1);
   }
}

O código html a baixo é o código da nossa página web que aparece entre as linhas  17 a 32 do código a carregar para o nosso arduino.

Este representa uma pagina html muito básica mas que servira para demonstrar o funcionamento do nosso sistema como servidor de páginas web.  


<html>
     <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
     <head>
          <title>Arduino WebServer</title>
          </head>
     <body>
          <center>
          <h1>Módulo Ethernet ENC28J60</h1>
          <hr>
          <h3>Página de resposta do nosso Arduino.</h3>
          <h4>Para mais informações visite o blogue TecnoDomos.</h4>
          <a href='http://www.tecnodomos.blogspot.com'>TecnoDomos</a>
          <hr>
          </center>
     </body>
</html>

Após a realização da montagem e compridos todos os passos relevantes podemos facilmente confirmar os parâmetros de rede como IP, GW e DNS através do "Serial Monitor”.
 
IP Estático:
Após fazer-mos o upload do programa para o nosso Arduino, podemos abrir o “Serial Monitor”, onde podemos ver os paramentos de rede do nosso sistema .



Para testar o sistema temos de abrir o browser e inserir o IP 192.168.2.70 que neste caso foi definido no código.


IP Dinâmico:
Alterando agora o código para IP dinâmico e voltando a fazer o upload do programa para o nosso Arduino, podemos abrir o “Serial Monitor”,  onde podemos ver os paramentos de rede do nosso sistema .


Por fim para testar o sistema temos de abrir o browser e inserir o IP 192.168.2.5 que foi atribuído dinamicamente pela nossa rede ao nosso sistema.



Links úteis

Ficheiros para Download
Considerações Finais
O módulo Ethernet ENC28J60 tem uma ampla aplicabilidade em montagens nas áreas da Domótica, Robótica e muitas mais, este apresentasse como um módulo que apesar do seu custo reduzido, consegue oferecer grande fiabilidade, robustez e estabilidade e que graças as suas dimensões reduzidas pode ser facilmente integrado em muitos projetos.

Este pode ser facilmente utilizado em conjunto com o arduino ou com qualquer outro microcontrolador desde que este permita a comunicação através da interface SPI -Serial Peripheral Interface .

Após a elaboração do ensaio podemos concluir que a utilização módulo é simples, bastando para tal termos as bibliotecas adequadas e realizar correctamente todas as ligações.
Futuramente serão realizados mais ensaio como módulo ENC28J60 onde iremos realizar a ligação via rede IP mas iremos permitir o acesso ao nosso sistema através da Internet e não apenas numa rede local.


Esperamos que este artigo tenha sido útil e se gostaram comentem e partilhem. Alguma dúvida ou questão deixem em comentário ou utilizem o formulário de contatos.


Um bom dia em nome da TecnoDomos.


Conteúdo redigido ao abrigo do novo Acordo Ortográfico.

7 comentários:

  1. Olá, postagem informativa. Há sempre uma grande comparação entre o módulo ENC28j60 e o Ethernet W5100. Só que estou querendo fazer um projeto de automação residencial e gostaria de fazer o monitoramento e controle da residência de onde quer que eu esteja, tudo via internet. Online e em tempo real, por meio do celular ou tablet. Minha pergunta é: o ENC28j60 possibilita a ligação com a internet para que eu possa fazer isso?

    Desde já, agradeço.

    Att.,
    Yago Gomes

    ResponderEliminar
    Respostas
    1. Bom dia
      Peço desculpas pela demora na resposta.
      A resposta à sua questão é Sim.
      O módulo ENC28j60 permite ligar o nosso Arduino à Internet, no entanto teremos que realizar algumas configurações ao nível do nosso Router de acesso à Internet.
      Para podermos aceder ao nosso sistema (Arduino + eletrónica) a partir de um local fora da nossa residência (da nossa rede local) temos de ter em atenção o endereço IP do nosso sistema, o porto de comunicação com a Internet e o endereço IP do nosso Router.
      Vai ser publicado aqui no Blogue brevemente uma nova publicação onde, iremos de forma completa e detalhada, explicar como realizar todas as configurações necessárias ao nível do nosso Router para, conseguirmos comunicar com o nosso sistema a partir de qualquer parte do globo.

      Sempre disponíveis.

      Em meu nome e em nome da TecnoDomos agradeço o seu contacto.
      Um bom dia

      Eliminar
    2. Esse post já está disponível? Estou precisando receber dados do Arduino... Obrigado!

      Eliminar
  2. Boa Noite

    Gostaria de uma ajuda, estou iniciando com automação com arduino, e estou tendo uma dificuldade, copie este codigo que voce dispobinilizou aqui no site, mas eu estou conseguindo acessar apenas uma vez o ip, depois nao acesso mais.. tem alguma coisa a ser feita para corrigir isso..

    atenciosamento

    Jroque

    ResponderEliminar
    Respostas
    1. Bom dia

      Antes de mais o que está a acontecer é que o seu Router passado algum tempo atribui um novo endereço IP ao seu Arduino, deixando este de estar acessível.
      Isto acontece pelo simples facto dos endereços IP serem dinâmicos, para evitar esta situação terá de definir um endereço IP estático com base no Mac Address do Arduino, garantindo assim que este nunca muda.

      Como refiro atrás irei publicar brevemente uma nova publicação onde explico esta e outras configurações necessárias para aceder aos nosso sistema a de qualquer local fora da nossa rede local.

      Sempre disponíveis.

      Em meu nome e em nome da TecnoDomos agradeço o seu contacto.
      Um bom dia

      Eliminar
  3. Senhores,

    observei o projeto de voces e achei muito interessante, pois é algo que etou procurando, porem uso uma biblioteca diferente de vocês:
    #include "etherShield.h"
    #include "ETHER_28J60.h"

    Na parte de carregar o HTML atraves do PROGMEM é bem interessante, porem após eu carregar como posso ter uma iteracao de botoes?
    iria gastar uma grande quantidade de memoria do mesmo jeito?
    tem outra maneira de haver essa intereação sem que o arduino esgote sua memória?

    obrigado.

    ResponderEliminar
    Respostas
    1. Bom dia
      Existe muitas maneiras de implementar os códigos, a questão da memória é sempre uma razão para se tentar otimizar ao máximo o código a carregar no nosso Arduino.
      Eu assim que poder irei publicar um tópico a explicar uma solução.
      Por questões profissionais e familiares sei não tenho tido tempo para me dedicar ao blogue, e sei que estou em falta para com todos os leitores do TecnoDomos mas prometo arranjar um tempinho para publicar novos projetos e análises de sensores e módulos.
      O meu muito obrigado a todos os leitores.

      Eliminar