sábado, 30 de novembro de 2013

Novidades sobre o ENC28J60!

Pessoal,

Estou a ponto de lançar a terceira aula do Curso Arduino Automation. Mas a cada aula faço estudos e revisões na biblioteca do ENC28J60. Até mesmo porque está ruim de utilizar e até de gravar a aula. A instabilidade do funcionamento da biblioteca Enc28CoreLib.h compromete todo o projeto!

Off-Topic: Consegui alguns avanços também na utilização do Ethernet Shield W5100 com a plataforma Supervisório. O problema é que o Shield Supervisório (link) não é compatível com o W5100, mas estou a ponto de conseguir contornar esse problema também.

Bom, mas o assunto continua o problemático ENC28J60! De tempos em tempos acompanho o trabalho de outros desenvolvedores, pelo mundo, que também contribuem com bibliotecas para essa plataforma.

Existem projetos como o do Turicas, chamado Ethernet_ENC28J60 (link) que foram abandonados e não são atualizados há mais de 2 anos, mas existem projetos como o EtherCard (link) que estão em pleno desenvolvimento! Além, lógico do meu próprio projeto chamado Enc28CoreLib (link), que também está em pleno desenvolvimento!

Foi então que achei uma ponta solta de um novelo e agora estou desenrolando ele. Vamos aos fatos.

  1. Sem querer, descobri que há quatro meses houve uma atualização grande e importante na biblioteca EtherCard
  2. Percebi que a plataforma estava bem madura
  3. Mas não, infelizmente eles ainda não resolveram o problema da segmentação de TCP
  4. Descobri também que eles ainda não sabem usar o DMA Copy do ENC28J60 (link), que já descobri ser uma mão na roda.
  5. Entretanto descobri onde fica a documentação (link)
  6. E também descobri onde fica a lista de BUGs conhecidos (link)
  7. Foi então que vasculhando as "issues", que são as "coisas" ou "acontecimentos" relatados pelos usuários, descobri a Issue #71 (link), que trata exatamente do ENC28J60 agindo como um Web Server e citando a limitação da segmentação TCP.
  8. Muito bem, existe um desenvolvedor apelido "fredycpu" que na Issue #68 (link) conseguiu em 15 de Julho de 2013 uma versão funcional do que ele chama de "Páginas Http Multi-Pacotes para/com Arduino" (original: Multi packets http pages with the arduino)
Concluindo, fredycpu finalmente implementou a funcionalidade de fragmentação TCP em cima da biblioteca EtherCard. Tudo o que eu precisava para finalmente consolidar a base da biblioteca EthernetSup (link).

Mas como nem tudo são rosas, existem problemas. Na verdade, estou em um empasse. O que acontece é que a EtherCard, como 99,99% das bibliotecas Ethernet para o ENC28J60, foi desenvolvido em cima do código do Guido Socher e Pascal Stang.

Já a minha biblioteca Enc28CoreLib é uma implementação do TCP/IP Stack da própria Microchip, desenvolvida originalmente por Howard Schlunder. Além disso, ainda adaptei o código para rodar em baixo da biblioteca Ethernet.h (original do Arduino), como podemos ver na segunda aula do Curso Arduino Automation (link).

Resumindo, tenho duas opções agora:
  1. Abandonar meu trabalho e ajustar a implementação da EtherCard com as modificações da Issue #68
  2. Fazer uma engenharia reversa na opção 1 e ajustar minha biblioteca.
A opção 1 acho que é a melhor, mas só tem um problema. Vamos perder a funcionalidade da biblioteca Enc28CoreLib de funcionar sob a Ethernet.h (original do Arduino).

E o problema com a opção 2 é que é mais demorado de implementar e o Curso Arduino Automation já está muito atrasado! 

Acredito que vou fazer uma implementação parcial para meu funcionamento e no lançamento da quarta aula, lanço uma versão nova oficial da Enc28CoreLib.

É isso aí pessoal, a batalha continua!

P.S.: Quase esqueci! Aprendi um termo novo hoje: "Zero-Copy" (wiki). Eu vi esse termo em uma discussão sobre uma memória DMA para o ENC28J60. O estranho é que o ENC28J60 tem isso através do DMA Copy. Como eles não viram isso?

Abraços,
Renato

sábado, 9 de novembro de 2013

Plataforma Wireless do Curso Arduino Automation

Pessoal,
 
  Estou fechando aqui a plataforma Wireless (sem fio) que será utilizada no Curso Arduino Automation. Muita gente me questionou sobre a utilização de Xbee e Relês para ativação a distância, sem fios...
 
  Na verdade esse tópico nem fazia parte do contexto original do Curso Arduino Automation, mas devida a necessidade de implementação em uma casa completa e não apenas em um "Quartinho", não dá pra ficar passando fio pela casa toda. E a plataforma Xbee é muito cara!
 
  Há muito tempo venho estudando uma plataforma mais barata. Infelizmente sempre trombamos no problema do alcance. Essas plataformas mais baratas de rádio são AM e utilizam um protocolo baseado na portadora, que pode ser confundido com qualquer outro sinal na mesma frequência.
 
  Por esse motivo ainda não lancei o Raduino, que é essa plataforma de Rádio para o Arduino (daí o nome). Existe até um manifesto sobre o assunto, que não pode ser divulgado, por problemas jurídicos, mas eu não me preocupo, pois ninguém ainda resolveu essa questão. Dá muito trabalho!
 
  O mesmo acontece com o ENC28J60, que vocês acompanharam o dilema em meus posts (e que ainda nem está perto de terminar)...
 
  Felizmente, o Raduino já está bem avançado e tem na bagagem quase 4 anos de estudos em todos os tipos de front-ends de rádio, bem como todos os tipos de encoders, antenas e amplificadores de sinal.
 
  Portanto vou lançar em breve os kits do Raduino, com código-fonte e hardware abertos, claro; e estou trabalhando em versões com Atmega8 SMD, sem cristal. O circuito é tão simples que qualquer um poderá fazer utilizando um ATMega8 e um kit Wiress 433Mhz. Não precisa de nenhum componente externo!
 
  Versões futuras do Raduino trabalharão com rádios de 2.4Ghz e também estou trabalhando em um front-end de rádio, do tipo "faça você mesmo" de 27Mhz que vai resolver o problema de 80% dos casos sem utilizar nenhum chip! Redução de custo ao máximo!
 
  Vou ver se consigo montar uma library no Eagle para implementação dessa plataforma em placas de plataformas de terceiros. Hummm! Ideias!
 
  Abraços, Pessoal!
 
  Ah! Semana que vem será cheia! Não deixem de verificar a última aula sobre Atmel Studio! Tem tudo a ver com o Raduino, pois eu preciso enfiar um elefante pela fechadura de um Atmega8!
 
  Parte 1 de 2 http://www.youtube.com/watch?v=ECkvuiXLxrM
 
  Parte 2 de 2 http://www.youtube.com/watch?v=kJ8F74CJiRc
 
  PS: Vou lançar um boletim em breve!
 
  Abraços, Renato Aloi

terça-feira, 22 de outubro de 2013

Aula 2 - Curso Arduino Automation

Pessoal,

Segue o link do vídeo da Aula 2 do Curso Arduino Automation!

Valeu pela paciência e pelo apoio de todos!


sexta-feira, 18 de outubro de 2013

Lançamento da Aula 2 do Curso Arduino Automation!

Pessoal!

Agora finalmente está saindo a segunda aula do Curso Arduino Automation. Acredito que a partir de agora não teremos mais atrasos como dessas duas primeiras aulas do Curso Automation.

Consegui chegar a uma solução bem interessante! Mas vamos voltar um pouco para organizar as coisas. Primeiro, vale a pena conferir a seqüência certa de posts que culminaram no atraso do lançamento deste curso:


Este então é o último post desta série e também o de lançamento das bibliotecas EthernetSup.h (rev3) e Enc28CoreLib.h

Agora não teremos mais versões separadas para o Ethernet Shield W5100 e para o Módulo Ethernet ENC28J60. Pra isso eu criei um "adaptador" que é a biblioteca Enc28CoreLib.h para ser instalado na biblioteca oficial do Arduino.

Dessa forma, quem já possui um código funcionando para o W5100, basta trocar alguns arquivos para compilar o mesmo código para ENC28J60! 

Isso mesmo! agora acabou o martírio de ter que fazer um código para o ENC28J60 e outro para o W5100. Ambos agora podem ser implementados através da biblioteca Ethernet oficial do Arduino! Por isso agora teremos uma única versão da EthernetSup.h! 

Optei por essa abordagem por dois motivos: a) para quem quiser utilizar a biblioteca sem ter que modificar o código existente seja para W5100 ou ENC28J60; b) para unificar uma versão da EthernetSup.h

Instruções de Instalação EthernetSup

  1. Faça download da biblioteca EthernetSup.h (clique aqui)
  2. Efetue a cópia dos arquivos para a pasta libraries
    No Windows: Meus Documentos\Arduino\Libraries
    No MAC/Linux: /Users/nome_do_usuario/Documents/Arduino/libraries

Para quem utiliza o Ethernet Shield W5100 não precisa fazer mais nada. Para quem utiliza o ENC28J60, precisa também instalar a biblioteca Enc28CoreLib.h


Instruções de Instalação Enc28CoreLib


  1. Faça download da biblioteca Enc28CoreLib (clique aqui)
  2. Faça backup  da pasta Ethernet que fica dentro da pasta libraries, sob o diretório de instalação do Arduino
    No Windows: C:\Arquivos de Programas\Arduino\libraries\Ethernet
    No MAC: /Applications/Arduino.app/Contents/Resources/Java/libraries/Ethernet
    (clique em "mostrar conteúdo do pacote" no aplicativo Arduino) 
  3. Copie os arquivos da biblioteca Enc28CoreLib para a pasta utility
    No Windows: C:\Arquivos de Programas\Arduino\libraries\Ethernet\utility
    No MAC: /Applications/Arduino.app/Contents/Resources/Java/libraries/Ethernet/utility
    (clique em "mostrar conteúdo do pacote" no aplicativo Arduino)
  4. Apague os arquivos w5100.cpp e w5100.h (não renomeie, delete mesmo!)
  5. Agora renomeie o arquivo enc28.h para w5100.h
  6. Abra os arquivos w5100.h e enc28.cpp
  7. Efetue as modificações indicadas abaixo
  8. Abra o código do Arduino que você deseja compilar novamente para ENC28J60 e clique em Carregar (Upload).
  9. Apenas conecte o ENC28J60 no seu Arduino e você está pronto!

Modificações nos Arquivos


  • w5100.h (old enc28.h)
    • Line: 112
      • From: extern ENC28Class ENC28;
      • To: extern ENC28Class W5100;
  • enc28.cpp
    • Line: 11
      • From: #include "enc28.h"
      • To: #include "w5100.h"
    • Line: 23
      • From: ENC28Class ENC28;
      • To: ENC28Class W5100;

É isso aí pessoal! Vou explicar melhor essa instalação na aula que estará em breve no ar! Acompanhe!

Abraços,
Renato

segunda-feira, 14 de outubro de 2013

ENC28J60 - Ativando Super Poderes!

Pessoal,

Ainda estou no calabouço, mas agora vai sair alguma coisa interessante desse meu trabalho. Infelizmente não tem muito jeito. É um trabalho que não consigo dividir com outras pessoas e acho que ninguém acredita muito no ENC28J60, mas algo me dizia que era errado descartar essa opção...

Vi alguns comentários de pessoas dizendo que utilizam as bibliotecas atuais do ENC28J60 sem problemas. É verdade, a maioria delas funciona satisfatoriamente. Eu nem gosto de escrever essa palavra. Ninguém paga mais caro no W5100 porque ele é satisfatório! As pessoas preferem pagar mais caro pelo W5100 porque ele é completo e não requer esforços para instalação da biblioteca. Isso vale o preço. (vide primeiro post sobre o assunto)

Mas eu fui estudar um pouco as origens do ENC28J60 para entender seus conflitos e porque seus super poderes ainda não haviam aparecido, ou se existiam mesmo...

Descobri então que ele é a obra prima da Microchip. Isso não é exatamente um termo bom. Aqui no Brasil temos o termo "obra prima" como algo de superior qualidade, mas o termo realmente significa outra coisa: "Primeira Obra". Ou seja, o primeiro trabalho como profissional do artista ou da empresa. Profissional no sentido que o artista ou criador já passou do nível amador; estudou o suficiente sobre o assunto e aprimorou suas técnicas para o nível profissional.

No sentido real, obra prima significa o primeiro trabalho de uma empresa sobre determinado assunto, lançado comercialmente no mercado. Por esse motivo o ENC28J60 é cheio de BUGs e tem vários documentos de ERRATA.

Não muito tempo depois a Microchip amadureceu seu produto e lançou outros módulos Ethernet bem superiores, são eles o ENC424J600 e o ENC624J600.

Mas o ENC28J60, apesar de seus BUGs, de suas limitações, da falta de bibliotecas por parte da comunidade (nota: não existe biblioteca UDP para ele no ambiente do Arduino); ele ainda sim tem super poderes! Vamos ver alguns:


  • Preço baixo
  • Necessita poucos componentes externos
  • Encapsulamento DIP
  • Checksum auxiliado por hardware (ainda não consegui usar esse, por conflito)
  • Cópia de dados DMA entre endereços do buffer (super poder!)
  • Buffer FIFO cíclico de 8K bytes
  • Liberdade total para programação da camada de aplicação!

Comentando os itens acima, sobre o preço nem precisa falar nada, né? Existem módulos prontos a preços bem acessíveis.

Inclusive esses módulos Ethernet com o ENC28J60 estão ficando cada vez menores! Isso sem falar que existe o encapsulamento DIP, que facilita na hora de projetar com ele. É possível comprar um ENC28J60 que pode ser "espetado" na protoboard. Isso facilita muito o projetista que deseja embarcar essa tecnologia em sua placa.

Sobre as outras características, as principais que descobri são sobre o Buffer de 8K que estava lá sem fazer nada e sobre a cópia DMA que nos permite copiar partes da memória do ENC28J60, oferecendo uma solução de memória adicional ao Arduino.

Ou seja, não preciso utilizar a memória do Arduino para acumular os pacotes TCP a serem enviados. Eu posso simplesmente copiar os bytes para uma área da memória do ENC28J60 e depois fazer um DMACopy para copiar aquele pacote para a área de transmissão, e então transmitir o pacote.

É um caminho mais árduo, mas elimina o limite da memória do Arduino que é de apenas 2K bytes na versão UNO e 4K bytes no MEGA.

O ENC28J60 tem 8K bytes!!! Ele tem o mesmo de memória que dois Arduinos MEGA juntos! É um absurdo de memória que até agora não havia sido utilizada! Consegui resolver isso também!

Ufa! É isso, é pau, é pedra, é o fim do caminho.

Meu objetivo com esse trabalho é que os criadores do Arduino reconheçam essa biblioteca como digna de fazer parte da IDE do Arduino (leia-se: do pacote de instalação original do Arduino). Assim a biblioteca seria distribuída de forma integrada com o Arduino e não mais seria uma ovelha negra perante a comunidade e principalmente, os iniciantes.

Abraços,
Renato

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

quarta-feira, 4 de setembro de 2013

Dilema do ENC28J60 - Parte 2

Pessoal,

Boa noite! Estou de volta após alguns contratempos! Infelizmente não dá para fazer projetos de clientes e criar aulas do Curso Arduino. Tive que escolher um e optei pelo último!

Mas para a segunda aula do Curso Arduino Automation, um amadurecimento da biblioteca EthernetSupENC28J60.h, lançada na primeira aula, era necessário.

O problema nem era a biblioteca em si, mas o núcleo dela que tinha alguns BUGs sérios e que comprometiam o funcionamento e a velocidade.

O principal BUG que me fez rescrever totalmente o núcleo, ao invés de apenas arrumá-lo, é um que reinicia o Arduino a cada request, forçando a biblioteca utilizar EEPROM para manter o estado entre os reinícios. Além de comprometer a EEPROM do Arduino, ainda existe o problema do reinício que é ruim por si só.

Por esse e outros problemas, causados principalmente pela pressa que fiz a primeira versão, mudei um pouco a abordagem nesse novo núcleo e o compilei separadamente em uma biblioteca chamada EtherEncLib.h, que acabei de publicar no GitHub, conforme segue o link:

https://github.com/renatoaloi/EtherEncLib

Essa biblioteca é independente e não necessita da EthernetSupENC28J60.h (ainda a ser lançada) para funcionar. Acompanha exemplos de funcionamento. Um deles inclusive apresenta todas as portas digitais disponíveis no Arduino UNO para acionamento, em links numa página HTML.

Para finalizar, devo acrescentar que o desafio dessa vez foi organizar todo o código. São mais de 1500 linhas de funções que não seguem um funcionamento linear. A função available() por exemplo não apenas avisa a chegada de um request, mas também efetua a conversação inicial (handshaking) e alimenta o buffer de parâmetros do GET. Obs: POST ainda não foi implementado

Outra modificação importante foi a separação de parte do código no arquivo enc28j60.c para o arquivo socket.c, isolando de vez as funções de hardware.

Para os mais avançados, vale a pena dar uma olhada nas funções de macros do arquivo net.h, utilizadas no arquivo EtherEncLib.c; e foram isoladas dessa forma para caracterizar funções de leitura e escrita dos buffers.

É isso aí pessoal! A segunda aula já está saindo!

Ah! Pessoal, sobre dúvidas, sugestões sobre este tópico, principalmente as técnicas, participem do:

Fórum do Curso Arduino
http://www.seriallink.com.br/forum

Abraços,
Renato