sexta-feira, 22 de maio de 2015

EtherEncLib - A Biblioteca do ENC28J60 Para Arduino

Ok! Ainda não é exatamente oficial, mas a nova versão da biblioteca EtherEncLib.h para Arduino, já está consolidada no branch "enc28coremerge", conforme link abaixo:

https://github.com/renatoaloi/EtherEncLib/tree/enc28coremerge

Em breve farei o "merge" para o ramo principal "master".

Verifiquem as páginas do Wiki (em inglês):

https://github.com/renatoaloi/EtherEncLib/wiki

Venho trabalhando há dois anos para consolidar uma biblioteca do Módulo Ethernet ENC28J60 para Arduino.

Quem acompanha aqui pelo blog já pode testemunhar meu sofrimento com os revezes do desenvolvimento.

Mas agora é definitivo! Essa nova versão da biblioteca EtherEncLib.h para Arduino foi entalhada a mão e faz uso da Memória RAM interna do ENC28J60, aliviando e liberando mais memória para o Arduino!

Um dos grandes desafios de se ligar um Arduino UNO na Rede Local (Ethernet) é sua Memória RAM estreita. Essa versão em particular do Arduino possui apenas 2Kb de espaço na RAM e qualquer biblioteca que ocupe mais que 500 bytes é muito grande e com certeza faltará espaço na memória para o código principal da aplicação...

Afinal de contas a biblioteca está ali para ajudar e não para ocupar espaço na RAM e atrapalhar o programa principal!

E foi isso que me motivou durante esses dois anos a continuar esse trabalho, mesmo tendo a impressão todo dia de estar "reinventando a roda".

Mas eu sabia que não estava e os motivos eram bem claros!

1. O principal motivo é que o código "oficial" do Arduino que controla Ethernet só funciona para o Arduino Ethernet Shield (aka. W5100)
2. Não existe biblioteca oficial para o Módulo ENC28J60
3. As bibliotecas que existem para o Módulo ENC28J60 são implementações muito cruas e superficiais.

O grande problema do cenário aqui é controlar uma comunicação com a Rede Local. Em termos de programação, isso chama-se: "Controlar um TCP-Stack".

Na verdade 99% dos sistemas possuem já TCP-Stack implementados. Podemos ver na AN833 da Microchip uma solução pronta para TCP, UDP etc.

http://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en011993

Neste link acima é possível baixar todo código que pode ser compilado e carregado em um PIC (na verdade esse código é compatível com uma paulada de modelos de PIC's).

Mas porque o Arduino não tem um TCP-Stack? Programadores C++ escrevem do zero ou fazem adaptações em Stack's de vários protocolos toda hora... Qual o problema?

Lembra da Memória RAM do Arduino UNO: 2Kb? Pois é...

Bom, mas você deve estar se perguntando, como a equipe italiana que criou o Arduino resolveu isso?

Eles resolveram de uma forma bem simples: delegando a tarefa para outro chip! Eles passaram a mão no telefone e ligaram para a WizNet e disseram: viu, sabe esse chip milagroso de vocês chamado W5100? Nós queremos no nosso projeto chamado Arduino...

Resumo: o TCP-Stack do Arduino na verdade está dentro do chip da WizNet, fechado, trancado... Filosofia de código aberto meio estranha essa né?

Eu não posso tirar o mérito não! Esse W5100 é uma obra de arte mesmo! Ele tem 4 FIFO's independentes de 2Kb capazes de controlar 4 fluxos de Sockets ao mesmo tempo! Ultra rápido e só tem um defeito: precisa de muitos componentes externos.

Mas ele (W5100) controla pilhas de TCP, UDP, já possui buffers pré-programados e buffers separados para as respostas. Ele realmente é muito bom!

Mas...

Não tem mas, é isso! Você pode se perguntar o quanto você quiser onde o ENC28J60 entra nessa história, mas não entra!

O ENC28J60 não é concorrente para o Arduino Ethernet Shield W5100 por vários motivos:

- Ele é um chip desenvolvido pela principal concorrente da Atmel, a Microchip
- Ninguém da equipe do Arduino se propôs a escrever código para um chip da concorrente
- Muitos já tentaram, mas até agora a melhor proposta, que é a EtherCard, tem um buffer limitado de 700 bytes e faz apenas um envio por vez. Essa biblioteca é tão grande que ocupa 75% da Memória RAM do Arduino, por volta de 1.5K!!!

Enfim, a EtherEncLib veio finalmente resolver essa lacuna nas opções de Módulos Ethernet, quando o assunto é Arduino!

Essa biblioteca faz uso de todo potencial do ENC28J60 e toda extensão de sua Memória RAM de 8Kb! Isso mesmo, esse chip possui uma memória interna de mais de 8 mil bytes nunca antes usada!

Mas agora todo esse potencial foi liberado e a biblioteca inteira consome apenas 400 bytes de memória RAM e envia pacotes TCP de 1024 bytes várias vezes na mesma requisição.

Com essas novas características a biblioteca EtherEncLib emparelha, focinho a focinho com a biblioteca oficial de Ethernet do Arduino! Veja a tabela abaixo:



Biblioteca RAM Livre Arduino UNO Estimativa de Consumo Tamanho do Sketch Plataforma
Ethernet.h (oficial) 1444 350 12000 W5100
EtherEncLib.h 1401 400 13000 ENC28J60
EtherCard.h 760 1200 9500 ENC28J60

Todos os valores estão em bytes



Valores aproximados, teste padronizado


3 comentários:

  1. RENATO, BELO TRABALHO.
    A SENSAÇÃO XE REIVENTAR A RODA, NAO DESANIMA AOS QUE PERSEVERAM.
    VC QDO TEM UM OBJETIVO, PERSEGUE ELE, QDO O ALCANÇA, A SATISFAÇÃO É UMA COISA INTRINSICAMENTE DOCIL E COMPENSADORA.
    NUNCA DESANIME !
    PARABENS GUERREIRO.

    ResponderExcluir
  2. RENATO ADMIRO SEU TRABALHO E ESFORÇO, ESPERO QUE QUE TE RECUPERES DA CRISE E VOLTE COM A LOJA, VC FAZ FALTA POR SEU CONHECIMENTO E SUA DIDÁTICA E TAMANHA BOA VONTADE.

    VIDE O ESFORÇO COM ESSA BIBLIOTECA , QUE TANTOS FIOS DE CABELO LHE FEZ PERDER.
    PARABÉNS. ..FORÇA...SÓ COM EMPENHO PODEMOS OBTER A RECOMPENSA.
    PRA FENTE MESTRE
    LUIZ
    Eng. Eletricista/Telecomunicações

    ResponderExcluir
  3. Parabens Renato, pioneiro no BRASIL!!!!

    ResponderExcluir