Arduino + Módulo Ethernet ENC28J60

Recentemente comprei um módulo Ethernet ENC28J60, para conectar ao meu Arduino Uno, pensei que seria simples como foi ligar o drive para controle de motor de passo, mas não foi bem assim!

Para simplificar, vou me referir ao “Shield Ethernet” oficial do Arduino somente pelo nome shield, e o “Módulo Ethernet ENC28J60″ somente de módulo.

Como o módulo não era o “original” precisei adicionar novas bibliotecas no Arduino Software, alguns blogs falam pra deletar as libraries quem acompanham a ferramenta de desenvolvimento, como não gostei muito dessa idéia, continuei a estudar se teria um jeito mais simples e sem ter que deletar nada. Cheguei no passo a passo abaixo.

  1. Baixe a biblioteca desse link: Ethercard
  2. Adicione ao seu Arduino Software clicando em: Sketch -> Import Library -> Add Library e selecionando o arquivo Ethercard.zip baixado na passo anterior.
  3. Compile e faça o upload do programa abaixo para o seu Arduino:
    #include <EtherCard.h>
    
    // Caso queira definir um ip estático mude de 0 para 1
    #define STATIC 0 
    
    #if STATIC
    // Endereço IP estático a ser definido a interface Ethernet
    static byte myip[] = { 192,168,1,200 };
    // Endereço IP do Gateway da sua rede
    static byte gwip[] = { 192,168,1,1 };
    #endif
    
    // MAC Address da interface ethernet - deve ser único na sua rede local
    static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
    
    byte Ethernet::buffer[500];
    
    const char page[] PROGMEM =
       "HTTP/1.0 200 OK\r\n"
       "Content-Type: text/html\r\n"
       "Refresh: 5\r\n"
       "\r\n"
       "<html>"
       "   <head>"
       "      <title>Arduino Web Server</title>"
       "   </head>"
       "   <body>"
       "      <h3>Página resposta do seu Arduino.</h3>"
       "      <p><em>fabiotomio.com.br.<br />=D</em></p>"
       "   </body>"
       "</html>"
    ;
    
    void setup(){
       Serial.begin(57600);
       Serial.println("\n[webserver]");
    
       if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
          Serial.println( "Failed to access Ethernet controller");
       #if STATIC
          ether.staticSetup(myip, gwip);
       #else
          if (!ether.dhcpSetup())
             Serial.println("DHCP failed");
       #endif
    
       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);
       }
    }
    
  4. Após fazer o upload do programa para o Arduino, abra o “Serial Monitor”, deverá aparecer algo como na imagem abaixo:
  5. Agora é só acessar o endereço IP utilizando o seu navegador preferido:

Note que o texto que aparece é o HTML correspondente às linhas 19 a 31 do programa que compilamos e fizemos o upload pro Arduino!

Mas você deve estar se perguntando, quais pinos ligar onde, não é!?

A ligação do módulo é quase igual ao shield oficial descrito na imagem abaixo:

Pinos Shield Original - Arduino + Ethernet Module - Programa backSoon

encontrado nesse link: http://arduino.cc/en/reference/ethernet

A diferença fica no pino correspondente ao “SS for Ethernet controller“, que no Módulo Ethernet ENC28J60 é chamado de Pino CS, que é conectado no pino 8 ao invés do pino 10. Como o nosso módulo não contempla o leitor de cartões como o shield, o “SS for SD card” não tem nenhum pino correspondente no módulo, por motivos óbvios. Veja abaixo a tabela que correlacionando os pinos:

Módulo Ethernet Arduino UNO
Pino CS Pino 8
Pino SI Pino 11
Pino SO Pino 12
Pino SCK Pino 13
Pino VCC Pino 3.3V
Pino GND Pino GND

Segue uma imagem pra ilustrar a conexão do módulo com o Arduino que peguei na net.

Módulo conectado - Arduino + Ethernet Module - Programa backSoon

Claro que o meu não ficou tão bonito assim! ;)

Creio que é isso… Tenho umas idéias para o Arduino mais esse módulo Ethernet, vou postando aqui no blog os avanços!

Grande abraço a todos e qualquer dúvida é só entrar em contato!

Dica: Com a library, vieram alguns exemplos! lol O código que coloquei aqui é baseado em um dos exemplos! Tem coisas bacanas que você pode usar como referência para desenvolver o seu projeto, para acessar, entre no menu em: File -> Examples -> Ethercard e escolha um exemplo.

Referências:

http://www.geeetech.com/wiki/index.php/Arduino_ENC28J60_Ethernet_Module

http://nathanhein.com/2013/02/getting-arduino-online-with-an-enc28j60/

http://hofmannsven.com/2013/laboratory/arduino-ethernet-module/

http://stackoverflow.com/questions/8736791/arduino-dhcp-not-working

https://www.sparkfun.com/tutorials/409

http://helpdev.com.br/2013/07/07/arduino-criando-servico-web-com-ethernet-shield/

Repositório da biblioteca no github: https://github.com/jcw/ethercard

Gerenciador de projetos da biblioteca: http://jeelabs.net/projects/ethercard

Atualização 01: Mudei o conteúdo da pagina entregue pelo Arduino para um conteúdo mais amigável, atualizo as imagens na sequência. 07-05-2014
Atualização 02: Atualizei as imagens. 08-05-2014

  • Tiago Pasito Schultz

    Olá Fábio,

    Testei teu código. Executou, mas na serial monitor só aparece “[webserver]”.

    Tentei usar com ip estático e dhcp (mudando a STATIC).

    Estou usando a shield inc8j60 e o arduino mega 2560. Abaixo uma imagem deles.

    Gratidão pelo compartilhamento de informação :)

  • http://fabiotomio.com.br/blog Fábio Tomio

    Fala Thiago, o seu Shield trabalha de forma diferente, se for igual ao meu, experimente pegar o exemplo dentro do próprio programa do Arduino que ele vai funcionar.

  • http://fabiotomio.com.br/blog Fábio Tomio

    Encontrei uma referência bacana, dá um look no link: http://www.trollmaker.com/article11/arduino-1-0-with-enc28j60-ethernet-shield-v1-1

  • Rodrigo

    Olá, Fábio.
    Consegui fazer a minha placa funcionar conforme o exemplo.
    Preciso saber se é possível acessá-la de fora da rede local, afinal o ip informado para a placa não é acessado externamente.

    Obrigado.

  • Rafael

    Oi tudo bem? Queria saber se consigo fazer desse jeito so que com um programa de interface java? (seria um sistema que liga e desliga luzes remotamente)

  • Cludemir Felix
  • Cludemir Felix

    Ola gente aqui segue um link para ligar um dois led um rele fuciona em ! O código e parecido mais tem algumas mudançashttp://arduino-curiosidades.blogspot.com.br/2015/04/como-ligar-modulo-ethernet-enc28j60.html?m=1

  • Guilherme Oliveira Andrade

    podia fazer um turtorial explicando comando a comando, n adianta copiar se não saber o que fazer depois

  • http://fabiotomio.com.br/blog Fábio Tomio

    Concordo sobre a questão do copy -> paste, mas a idéia do post era focar no Módulo Ethernet mesmo, ficaria muito extenso abordando cada comando. Creio que antes de tentar fazer algo, seria bacana fazer um estudo da linguagem e suas características.

    Uma idéia seria dar uma olhada na documentação https://www.arduino.cc/en/Reference/HomePage ou dar uma olhada em alguns vídeos como https://www.youtube.com/watch?v=qcpSu73w7ss&index=4&list=PLK5hcI7ZkeMuOmSEzdokPXP8uMOf7wjhu para embasar os estudos.

    Obrigado pela dica.

  • Diego Di Souza

    Olá, tomara que não seja tarde demais!
    Para acessar externamente você vai precisar de um serviço de ddns, os roteadores atuais já trabalham nativamente com alguns serviços, o meu por exemplo trabalha com o no-ip, primeiramente você vai até a página do serviço de ddns se cadastra e lá cria um host name, no no-ip por exemplo você poderia criar minhacasa.no-ip.biz, esse endereço pode ser acessado de qualquer lugar do mundo através de um navegador, depois de criada a conta no serviço de Deus você deve acessar o seu roteador e logar com seu usuário e senha no serviço de ddns que ele disponibilzar pra você, assim o seu roteador constantemente e automaticamente vai enviar o endereço IP de ligação entre o roteador e o servidor de Internet que você está conectado,. Depois disso você terá que setar seu módulo Ethernet como IP fixo atribuir um IP disponível na rede e abrir uma porta no seu roteador direcionado para o IP do modulo Ethernet, depois disso basta digitar minhacasa.no-ip.biz:8080 que a página do módulo Ethernet se abrirá em um PC fora de sua casa, o endereço minhacasa.no-ip.biz te leva até o seu roteador e quando você adiciona o :8080 se configurado corretamente a porta irá direcionar você dá entrada do seu roteador até o IP que você definiu dentro do seu roteador

  • Daniel Farias

    Muito explicativo. Tive problemas para pra fazer a conexão com o arduino mega, mas depois de muito tentar eu consegui botar pra rodar. Sou novo em eletrônica e arduino, qual seria a programação pra leitura de um sensor de temperatura e um servo? tentei mas não consegui, na verdade tentei fazer adaptações, mas não obtive sucesso. Agradeço se puder ajudar.

  • Renato Souza

    Baixei essas bibliotecas, mas estão dando erro. Alguem está conseguindo usar hoje em 2016?

  • Emerson Luiz Antonio

    Oi renato baixei hoje e está rodando certinho

  • Eduardo Adams Wohlfahrt

    Para usar o exemplo no Arduino Mega adicione o parâmetro 53 neste trecho if (ether.begin(sizeof Ethernet::buffer, mymac, 53) == 0) como esta descrito no repositório da biblioteca https://github.com/jcw/ethercard

  • Lucas Mourão Lopes
  • http://fabiotomio.com.br/blog Fábio Tomio

    qual o ip da sua maquina?

  • Lucas Mourão Lopes
  • http://fabiotomio.com.br/blog Fábio Tomio

    Revisa as conexões do Arduino com o Módulo, parece não estar ok.
    O console tem que imprimir as linhas:
    IP:
    GW:
    DNS:

  • Lucas Mourão Lopes

    O nome dos terminais é um pouco diferente, achei num forum inglês, tem 12 pinos porque também funciona em 3.3v

    Arduino Module
    digital 12 SO
    digital 11 ST
    digital 13 SCK
    digital 8 CS
    5V 5V
    Gnd GND

    Está ligado segundo informado e com jumpers.
    https://uploads.disquscdn.com/images/b9691d89501774c9433442daacf44cf3fc47c08529dcbc1fa01c96b97710fb0c.png

  • Guilherme Ranzolin Piazzetta

    Tb estou utilizando esse tipo de módulo ethernet e estou tendo problemas. Quando rodo o código no arduino (nano) ele mostra:

    [WEBSERVER]

    e depois de um tempo ele diz que falhou o DHCP.

    Sabe o que poderia ser?

  • Lucas Mourão Lopes

    Quebrei muito a cabeça, fiz de tudo que você imaginar, mas no final das contas, em vez de energizar com 5v, tinha que ser 3.3v, ai funcionou.

    Pode ser seu cado também…

  • Rivanildo Soares

    O problema e a alimentação do modulo. Estava alimentando em 3.3V e nao funcionou. Troquei para 5V e funcionou.

  • Rivanildo Soares

    Lucas, valeu cara. Estava ligando em 3.3V e não funcionou. Então li seu comentário e resolvi trocar a alimentação para 5V. Funcionou perfeitamente em 5V!

    Valeuuu!

  • Vinicio Schmidt

    Olá, estou tendo erro com o IP… página é criada, tudo ok… Quando mais um dispositivo se conecta a rede, a página não é mais acessível. Alguém para ajudar?

  • Jefferson Luiz Silva

    como mostrar os valores dos senores no navegador, e a página hora acessa e hora não, o que pode ser?

  • marco lario

    No meu , esse código funciona perfeito. Como faria para comandar um relé?
    Já vou agradecendo amigos.