quarta-feira, 18 de setembro de 2013

ENC28J60 - A Reta Final!

Pessoal,

Bom, cá estou novamente as voltas com uma nova versão da biblioteca para o ENC28J60 que funcione satisfatoriamente no Arduino...

É fato que a primeira versão da EthernetSupENC28J60.h não resolveu o problema e ainda gerou novas dúvidas. Lancei então uma segunda versão do núcleo da biblioteca, chamado EtherEncLib.h, que também apresentou os mesmos problemas da primeira versão.

Resolvi então suspender a segunda versão do núcleo e comparar os datasheets do ENC28J60 com o do W5100. Foi aí que entendi o que se passava...

O W5100 tem internamente no chip, toda uma camada de aplicação já pronta. Além disso ele tem o dobro da memória do ENC28J60 e já lida automaticamente com a montagem, envio, recepção e desmontagem dos pacotes TCP. Tudo já está pronto no W5100! Isso não só para TCP, mas também para UDP e outros protocolos.

Não pára por aí. O W5100 tem 4 sockets independentes, controlados por registradores também independentes. Resumindo, tudo está resolvido no W5100, enquanto no ENC28J60 tudo tem que ser feito na unha!

Toda essa parte de sockets, buffers independentes, tratamento automático de pacotes e timers internos para controlar a resposta, simplesmente não existe no ENC28J60.

Foi então que tive outra idéia. Fui procurar o material existente sobre o ENC28J60, diretamente na fabricante, a Microchip. E achei! Um material muito completo e um SDK monstruoso para diversas versões de plataformas PIC. Segue o link:

http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en022889

Nesse link existem documentos técnicos, programas e ferramentas para desenvolvedores sobre o ENC28J60. Lógico que totalmente voltado para a plataforma PIC, também fabricado pela Microchip.

Após algum estudo, resolvi que o caminho era por aí. Bastava traduzir a programação para PIC em Arduino e a camada que eu precisava de aplicação já estava resolvida.

Comecei a estudar essa implementação e percebi que o trabalho seria imenso e que no final eu não saberia como colocar para funcionar. Empaquei de novo.

Foi aí que a idéia da Reta Final apareceu! Decidi utilizar a própria biblioteca do W5100 como base para essa minha nova biblioteca! Pois essa biblioteca eu tenho certeza que funciona e só preciso agora importar a programação que foi feita para o PIC e adicionar na biblioteca do W5100 para Arduino.

Mas o mais interessante dessa implementação é que estou criando um "conector" do ENC28J60 para a biblioteca oficial do Arduino para o W5100. Dessa forma, quem tem um programa já funcionando no Ethernet Shield W5100, bastará substituir alguns arquivos da biblioteca para compilar o mesmo código para o ENC28J60, totalmente transparente!!!

Já avancei bastante com essa Reta Final e agora falta finalizar a implementação que já está bem avançada. Até agora não encontrei nenhum problema impossível, nada que o W5100 que o ENC28J60 não possa fazer com uma camada a mais de aplicação.

Inclusive estou otimizando o uso dos 8K bytes do buffer do ENC28J60 para acomodar os 4 sockets que o W5100 implementa internamente. Separei a memória em 10 pequenos buffers, sendo 2 maiores de 2K bytes e 8 menores de 512 bytes.

O ENC28J60 tem uma funcionalidade muito legal que é a cópia DMA entre partes do buffer. Com isso pretendo copiar os dados de entrada/saida para os buffers independentes dos socketes, implementando exatamente a mesma funcionalidade que o W5100 possui internamente.

Outro detalhe que estou implementando e que não foi implementado em nenhuma outra versão de biblioteca para o ENC28J60 é a utilização da interrupção gerada na chegada de pacotes, para otimizar o desempenho.

Bom, é isso pessoal! Conto com a paciência de vocês para o amadurecimento desse projeto que é o Curso Arduino Automation. Não existe sentido em lançar uma solução parcial, que não atenda totalmente e que seja melhor continuar usando o W5100.

Mas porque não continuar utilizando o W5100? Por dois motivos bem simples: 1. porque ele é caro; 2. porque ele tem problemas de escalabilidade (vide: http://pt.wikipedia.org/wiki/Escalabilidade -- principalmente Carga de escalabilidade).

Para finalizar, essa nova Reta Final vai atender aqueles que esperam que eu faça modificações também na biblioteca EthernetSupW5100, pois agora com a integração da biblioteca oficial Ethernet.h, tudo isso ficará integrado e existirá apenas uma versão de EthernetSup no futuro, dependendo apenas de algumas configurações para funcionar em um modelo de Ethernet Shield ou noutro.

Abraços,
Renato

10 comentários:

  1. Olá Renato,
    vc falou no início do post que não encontrou nenhuma lib do ENC que funcione satifatóriamente, estou usando a lib Ethercard ( https://github.com/jcw/ethercard ) e posso dizer que ela até agora funcionou mto bem junto com meu Mega2560, o tempo de resposta para piscar um led por exemplo, é instantâneo. A única dificuldade que tive foi descobrir que o pino CS do ENC deve ser ligado ao pino 8 do Arduino e não no 53 como dizem alguns blogs. Boa sorte na empreitada, abraço!

    ResponderExcluir
    Respostas
    1. Bruno, obrigado pelo comentário! Dá uma olhada nesse outro post pra entender melhor os problemas que estou enfrentando com esse módulo: http://renatoaloi.blogspot.com.br/2013/04/atraso-do-curso-arduino-automation.html

      Excluir
  2. Legal o interesse, eu pra min o enc28j60 funcionou mas o maior problema é a capacidade de armazenamento que é muito pequena, tipo com uma placa de 8 reles eu consegui só acionar 3 pela capacidade.

    ResponderExcluir
    Respostas
    1. Opa! Obrigado pelo comentário! Estou resolvendo isso tbém! Valeu!

      Excluir
  3. Desde já agradeço o seu material amigo...
    Nossa, portabilidade de microcontroladores é um pouco complicada... ainda mais quando a camada de drivers não esta isolada do restante.
    Muita sorte e força para vc nessa batalha camarada !

    ResponderExcluir
    Respostas
    1. Valeu Rodolfo! Pra mim o pior está sendo organizar a conversa TCP. Nunca vi coisa mais complicada! Parece uma sala cheia de gente gritando ao mesmo tempo! :) Cada browser, cada sistema operacional trabalha com TCP de formas ligeiramente diferentes. Uma bagunça organizar tudo... Valeu pelo apoio!

      Excluir
  4. Renato, muito obrigado. O seu trabalho no blog e excelente e os cursos os melhores que já encontrei ate o momento. Estou ancioso para ter uma solução para esse problema e eu poder utilizar as bibliotecas EEPROM.h e EtherEncLib.h no mesmo código. Tenho dado umas mexidas tambem, porém não obtive sucesso ate o momento.
    Abraço
    Marcelo

    ResponderExcluir
    Respostas
    1. Marcelo, valeu pelo retorno! Esse é um problema que precisamos discutir no fórum, mas já foi erradicado! Já resolvi esse tbém! Valeu

      Excluir
  5. Ola Renato.
    Estou fazendo uma aplicação com o arduino e o shield Ethernet, lendo o código do webserver gostaria de saber se é possível receber uma string do client.read(). Pelo o que eu percebi o código char c = client.read(); recebe caracter por vez assim eu tenho que fazer uma concatenação. É possível eu ler um string diretamente??

    Pergunto isto porque as requisições para acender um led pelo site demora em torno de 1 segundo para o arduino responder, o que eu acho muito.

    Você já pensou em algo parecido?

    ResponderExcluir
    Respostas
    1. André, obrigado pela confiança! Esses assuntos tem que ser no fórum, fica difícil por aqui. Em breve estou terminando por aqui e vou voltar a interagir no fórum para ajudar todo mundo na migração. Valeu! Abraços, Renato

      Excluir