sábado, 8 de agosto de 2015

Arduino Ethernet com ENC28J60 - Saga Chega ao Fim!

Bom dia pessoal!

É isso mesmo! A Saga do ENC28J60 está chegando ao fim! Não quero nem ver meus posts antigos sobre o assunto, pois eu sofri demais nesses últimos 4 anos lutando contra o hardware do ENC28J60; até que recentemente consegui vencê-lo!

Sim! Acabei com a raça dele! :)

No início desse ano de 2015 consegui finalmente implementar o Buffer de 8K de memória interna que o ENC28J60 possui; e estava lá sem fazer nada!

Para quem não acompanha a Saga: As outras bibliotecas do Arduino para ENC28J60 não utilizam 10% do poder de fogo desse chip. 

Essas bibliotecas, ao invés disso, penduram tudo na memória do Arduino, que deixa tudo mais complicado. Veja tabela comparativa entre as bibliotecas e o consumo de memória RAM:

https://github.com/renatoaloi/EtherEncLib/wiki/Comparsion-Table

Reparem por essa tabela acima que a EtherCard.h (http://jeelabs.org/ethercard), que é outra biblioteca para o ENC28J60, deixa apenas 760 bytes de memória livre no Arduino, para outras partes do programa.

Em resumo, a biblioteca EtherCard consome 80% dos recursos do Arduino e 10% dos recursos do ENC28J60. Não está certo né?

Foi com esse objetivo que desenvolvi a EtherEncLib (https://github.com/renatoaloi/EtherEncLib), que é a minha biblioteca para ENC28J60 que utiliza 90% do poder de fogo desse maravilhoso chip de Ethernet!

Deixando assim o Arduino 90% livre para fazer outras tarefas!

Repare, ainda pela tabela do link acima, que a biblioteca original do Ethernet Shield W5100 (https://www.arduino.cc/en/Main/ArduinoEthernetShield) ocupa apenas 350 bytes de memória (utilizando HTML de meus testes)!

Isso significa que a biblioteca oficial do Arduino é super leve e por isso todo mundo usa e acha maravilhoso! Todo mundo gosta de um programa que funciona e a gente nem percebe que ele está lá!

Agora veja também que a biblioteca EtherEncLib ocupa o segundo lugar (com honra!) gastando apenas 400 bytes de memória!

Isso mesmo, agora você pode utilizar o ENC28J60 como se fosse um W5100 e ainda achar melhor, pois o ENC28J60 é mais rápido que o W5100. Estou preparando uns testes que vão provar isso, principalmente com HTML's grandes, maiores de 2Kbytes.

Para finalizar a Saga, implementei UDP, que estava faltando e agora permite integração com a plataforma Homeseer.

E tivemos uma contribuição Russa do SKA, que implementou todo tratamento POST/GET.

Ontem eu finalizei os testes de desempenho e coloquei uma trava de segurança no caso de colisão de pacotes e o SKA tbém implementou melhoras na comunicação SPI.

Agora a biblioteca está a prova de fogo! Não trava mais e quando acontece por uma colisão de pacotes, em 1 segundo ela se reestabelece e volta a funcionar normalmente.

Essa colisão de pacotes é um problema que surgiu recentemente devida velocidade absurda de funcionamento da biblioteca. O cliente não dá conta de acompanhar e se atrapalha todo. Tive que reduzir a velocidade da biblioteca e adicionar um "fail-safe" baseado em tempo para resetar a conexão caso ela leve mais que 1 segundo.

Pelos testes que fiz, estou transmitindo 2.5Kbytes em 140ms. Na verdade são 2700 bytes em 136 milissegundos. Será que o W5100 consegue essa taxa de transferência?

Vou fazer o teste derradeiro carregando um HTML com uma imagem de 200Kbytes e vamos ver quem vai ganhar esse embate!

Depois posto notícias sobre os testes finais! Eu acho que o ENC28J60 vence! Estou há 4 anos preparando ele para esse confronto final!

Abraços,
Renato

5 comentários:

  1. Parabéns pelo belo trabalho. Estou usando a biblioteca UIPEthernet e estou enfrentando alguns problemas quanto a travamentos. Estou usando o ATMEGA1284 com ENC28J60. Vou testar sua biblioteca. Tem alguns exemplos? Implementa as mesmas APIs da biblioteca do Arduino, como a UIPEthernet?

    ResponderExcluir
  2. Boa noite Renato, execelente seu post e sua Library, fiz uso dela, muito show, recentemente comprei uma ENC28J60 e como sou novo em arduino estava esperando um bom exemplo para usar.
    Porém só consegui fazer rodar em uma placa Uno, é isso mesmo?
    Roda também em Mega 2560? quais os pinos que devo usar?
    grato,

    toda ajuda sempre é bem vidnda para quem esta começando.

    ResponderExcluir
  3. Grande Renato Aloi,

    Primeiramente parabéns pelo seu ótimo trabalho com módulo ENC28J60. Venho acompanhando sua luta contra esse módulo desde o início, em 2010, quando você disponibilizava vídeo aulas dos cursos Arduino no youtube. Inclusive foi a partir de suas aulas que aprendi a mexer um pouco com essa excelente plataforma que é o Arduino. Foi também assistindo essas aulas que aprendi a fazer placas de circuito impresso, muito obrigado por compartilhar seu conhecimento.

    Por um tempo tive a impressão de que você tinha desistido da luta contra o módulo ENC28J60 devido à parada de posts sobre o assunto, mas você é bom no que faz e está vencendo essa batalha. Não é à toa que sua biblioteca, a EtherEncLib, ocupa o segundo lugar em termos de uso de memória do Arduino, e com certeza ocupa o primeiro lugar em termos de desempenho.

    É de se admirar que utilizando o ENC28J60 você consiga enviar 200Kb para o Arduino! Atualmente temos que limitar ao máximo o nosso código, contendo scripts HTML, por motivo da pouca memória que fica disponível (em torno de 1,5 Kb). Se assim for em pouco tempo sua biblioteca será a mais utilizada no mundo Arduino.

    ResponderExcluir
  4. Renato, consigo usar sua LIB como CLIENT TCP para conectar uma aplicação SERVER no Windows ?

    Marcelo

    ResponderExcluir