domingo, 8 de dezembro de 2013

Arduino Esplora, Por Onde Começar?

O Arduino Esplora é um dispositivo que possui um pequeno computador de bordo, chamado microcontrolador, que por sua vez, possui uma série de portas de entrada e saída. Como entrada, temos dispositivos tipo joystick, quatro “buttons”, um sensor de luminosidade (LDR), um “slider”, um microfone, um sensor de temperatura, e um acelerômetro. Como saídas, temos um buzzer e um LED de três cores (RGB). A primeira vista, parece um controle de video-game.

Com o Esplora, você pode escrever programas que tiram proveito das informações que chegam às portas de entrada (input) e as usam para controlar as saídas (ouput), da placa. Ou ainda, controlar seu computador como um mouse ou um teclado.

O Esplora é diferente de todas as placas anteriores do Arduino. Isso quer dizer que ele tem entradas e saídas já conectadas na placa, sendo que você não precisa saber como ligar os sensores eletrônicos ou atuadores, para usá-los. Como resultado, a programação para ele é um pouco diferente do que outras versões do Arduino. Ele tem sua própria biblioteca, que facilita leitura de sensores e acionamento de atuadores. Você verá como utilizar a biblioteca do Esplora neste guia e também pode acessar as páginas de referência (link).

Este guia o ajudará durante o processo de conexão do Esplora no seu computador, e do carregamento de um programa do Arduino, que é chamado de sketch.

·      1 | Adquirindo um  Arduino Esplora e cabo USB

·      2 | Faça Download do Arduino IDE

·      3 | Conecte a placa

·      4 | Instalando os drivers

      • Instruções para Mac OS X
      • Instruções para Windows
      • Instruções para Linux

·      5 | Programando a placa

      • Abrindo o exemplo Esplora blink
      • Configure o Arduino para Esplora
      • Selecione a porta USB
      • Carregando o programa

·      6 | Mudando o RGB LED

·      7 | Entradas atuando sobre Saídas

·      8 | Próximos passos

1 | Adquirindo um  Arduino Esplora e cabo USB

Este tutorial é para o Arduino Esplora. Se você possui outra placa leia o guia certo para a sua versão (link).

Você também vai precisar de um cabo Micro-USB (tipo "A" para "Micro-B"). Alguns telefones celulares ou MP3 usam este tipo de cabo para transferir dados de/para o computador, talvez você já tenha um cabo desses. Este conector é diferente do USB Mini, pois ele é mais fino. Você pode ver as diferenças clicando neste link (o conector que você vai precisar é o da esquerda na foto).

2 | Faça Download do Arduino IDE

Faça o download da versão mais atual do IDE do Arduino através da página de download. Você vai precisar da versão 1.0.3 ou posterior.

Quando o download acabar, descompacte o arquivo baixado em qualquer diretório. Não altere a estrutura de pastas do arquivo compactado, apenas clique duas vezes na pasta para abri-la. Devem existir alguns arquivos e sub-pastas dentro. Se você estiver no Mac, a pasta zip conterá apenas a aplicação.

3 | Conecte a placa

Conecte a placa do Arduino no seu computador, usando o cabo USB. O LED indicativo de energia, verde (escrito ON), deve ligar e o LED amarelo, marcado “L”, deve começar a brilhar. Depois de 8 segundos este LED amarelo começará a piscar.

4 | Instalando os drivers

Instruções para Mac OS X

·      A primeira vez que você conecta um Esplora em um Mac, o "Keyboard Setup Assistant" será lançado. Não existe nada para ser configurado com o Esplora, então você pode fechar a caixa de diálogo clicando no botão vermelho, no canto superior esquerdo da janela.

http://arduino.cc/en/uploads/Guide/OSXKeyboardNotification.png

Instruções para Windows

As instruções a seguir são para o Windows 7. Elas são válidas também para o Windows XP, considerando algumas pequenas diferenças entre as janelas de diálogo.

·      Conecte a sua placa e espere pelo Windows começar o processo de instalação dos drivers. Caso o instalador não inicie automaticamente, navegue até o Windows Device Manager (Start>Control Panel>Hardware) e encontre o Arduino Esplora na listagem de dispositivos. Clique com o botão direito e escolha Update driver.

http://arduino.cc/en/uploads/Guide/EsploraWindowsDrivers0.png

·      Na próxima tela, escolha "Browse my computer for driver software", e clique em Next.

http://arduino.cc/en/uploads/Guide/EsploraWindowsDrivers1.png

·      Clique no botão Browse... . Outra caixa de diálogo aparece: navegue até a pasta do Arduino que você acabou de fazer o download. Selecione a pasta drivers e clique OK, então clique em Next.

http://arduino.cc/en/uploads/Guide/EsploraWindowsDrivers2.png

·      Você receberá uma notificação de que a placa não passou no teste Windows Logo. Clique no botão Continue Anyway.

http://arduino.cc/en/uploads/Guide/EsploraWindowsDrivers3.png

·      Depois de alguns momentos, uma janela irá te informar que o wizard terminou a instalação do Arduino Esplora. Pressione o botão Close.

Instruções para Linux

Não existe a necessidade de instalar drivers para Ubuntu 12.04.

5 | Programando a placa

Duplo clique no ícone do Arduino. (Nota: se o Arduino carregar na linguagem errada, você pode mudar isso no menu File > Preferences).

Abrindo o exemplo Esplora blink

Abra o exemplo LED Blink sketch: File > Examples > Esplora > Beginners > EsploraBlink.

Nota: Se Você não ver o exemplo Esplora Blink, você precisará atualizar a biblioteca Esplora. Para fazer isso, saia do Arduino IDE e faça o download deste arquivo zip. Quando você descompactá-lo, você terá uma pasta chamada Esplora. Procure na sua pasta Documents (no OSX ou Ubuntu) ou My Documents (no Windows), pela pasta de sketchs do Arduino. Ela é chamada “Arduino” e deverá ser uma pasta dentro de outra chamada “Libraries”. Caso contrário, crie a pasta Libraries dento da sua pasta de sketch. Mova a pasta Esplora para dentro da pasta Libraries. Então inicie novamente o Arduino IDE. Agora você deve ser capaz de abrir o exemplo EsploraBlink, conforme descrito acima.

Configure o Arduino para Esplora

Precisamos configurar ao Arduino IDE para trabalhar com o Esplora. Abra o menu Tools > Board e escolha o menu Arduino Esplora.

Selecione a porta USB

O Arduino IDE precisa saber qual porta USB o Esplora foi conectado. O menu Tools > Serial lista as portas disponíveis:

·      se apenas um item é apresentado, clique nele;

·      se dois ou mais itens são apresentados, você pode desconectar o Esplora e reabrir o menu; o item que desaparecer do menu deve ser a porta USB do Esplora. Reconecte a placa e selecione aquela porta serial.

Carregando o programa

Agora, simplesmente clique no botão "Upload". Espere alguns segundos - você deve ver os LEDS RX e TX piscando. Se o upload der certo a mensagem do "Done uploading." aparecerá na barra de status da IDE.

Poucos segundos depois do upload terminar, você deverá ver o LED RGB amarelo da placa começar a piscar, mudando a cor de vermelho para verde passando por azul, amarelo, ciano, magenta, até branco. Se ele o assim fizer, parabéns! O seu Esplora está funcionando.

6 | Mudando o RGB LED

Agora que você verificou que o Esplora está conectado ao computador e o processo de upload funciona, é tempo de experimentar algumas de suas funcionalidades. O Esplora possui sensores de entrada, dos quais você pode obter informações deles utilizando o comando de leitura (read). E você também pode acionar atuadores, que são controlados usando comando de escrita (write). O LED RGB e o buzzer são dois dos principais atuadores. O joystick, potenciômetro linear (slider), microfone, acelerômetro, sensor de temperatura e pushbuttons são os sensores de entrada. Você pode também adicionar os seus próprios dispositivos de entrada/saída, usando os conectores TinkerKit.

Neste exemplo, veremos como piscar o LED RGB cada uma de suas cores separadamente, então veremos como acender as três cores ao mesmo tempo. A biblioteca Esplora, incluída no início do sketch, possui um número de métodos que facilitará o código a ser escrito.

O sketch abaixo é similar ao exemplo EsploraBlink, mas controla o LED de uma maneira um pouco diferente. Você pode também usar o comando Esplora.writeRGB() e configurá-lo vermelho, verde, e azul da seguinte forma:

Esplora.writeRGB(255, 255, 255);  // configura vermelho, verde, e azul com total intensidade

Ou então você pode acender as cores individualmente através dos comandos Esplora.writeRed(), Esplora.writeGreen(), e Esplora.writeBlue(), como veremos abaixo.

Copie o código abaixo e cole-o no Arduino IDE. Tenha certeza que você configurou corretamente a porta serial, e a placa Esplora, conforme vimos anteriormente. Conecte sua placa então carregue o código. Uma vez que o código estiver carregado, você deve ver o LED RGB piscando.

// include the Esplora library
#include <Esplora.h>

void setup() {
 
 // nada no setup 
}

void loop() {

 
 // escreve nivel de luminosidade para o LED vermelho
 
 // 0 siginifica que o LED está desligado, 255 para brilho total
  Esplora.
writeRed(255);

 
 // adiciona um atraso para manter o LED aceso por um tempo
 
 // 1000 milissegundos (1 segundo)
 
 delay(1000);

 
 // desliga o LED vermelho e liga o verde
  Esplora.
writeRed(0);
  Esplora.
writeGreen(255);

 
 // atraso de 1 seg.
 
 delay(1000);

 
 // desliga o LED verde e liga o azul
  Esplora.
writeGreen(0);
  Esplora.
writeBlue(255);

 
 // atraso de 1 seg.  
 
 delay(1000);

 
 // liga todos os LEDs
  Esplora.
writeRGB(255, 255, 255);

 
 // atraso de 1 seg. 
 
 delay(1000);

 
 // desliga todos os LEDs
  Esplora.
writeRGB(0, 0, 0);

 
 // atraso de 1 seg. 
 
 delay(1000);
}

7 | Entradas atuando sobre Saídas

O Esplora tem alguns sensores na sua superfície. Neste exemplo veremos como usar o potenciômetro (o slider na parte debaixo da placa) para mudar o brilho do LED RGB.

As entradas do Esplora geraram valores entre 0 e 1023, exceto os pushbuttons, que geraram valores 0 ou 1. Saídas não possuem a mesma faixa de valores. A saída do LED varia entre 0 e 255. Para obter valores de entrada escalares aos valores de saída você divide o valor de entrada por 4. Este novo número gerado será o resultado do nível de brilho do LED.

Copie o código abaixo e faça o upload como fizemos no exemplo anterior. Uma vez feito o upload, movimente o slider para um lado e para o outro. Você verá a luz vermelha do LED RGB mudar o seu brilho.

// include the Esplora library
#include <Esplora.h>

void setup() {
// nada no setup
}

void loop() {
 
 // leitura do sensor em uma variavel
 
 int slider = Esplora.readSlider()/4;

 
 // converte a leitura do sensor em niveis de luminosidade do LED
 
 byte bright  slider/4;

 
 // escreve o nivel de brilho no LED vermelho
  Esplora.
writeRed(bright);

 
 // adicionando atraso para o LED não ficar tremeluzindo:
 
 delay(10);
}

8 | Próximos passos

Existem alguns exemplos no menu File -> Examples -> Esplora que demonstram o que mais pode ser feito com o seu Esplora. Eles são divididos entre exemplos para programadores iniciantes e avançados. Se você está apenas começando, ou deseja conhecer as funcionalidades básicas, comece com os exemplos Beginners. Se Você é um programador experiente então os exemplos Advanced lhe ajudarão com algumas ideias.

Se você nunca programou na vida, existem alguns exemplos incluídos na IDE para lhe apresentar alguns conceitos de programação básica. Note que esses exemplos precisarão ser modificados um pouco para funcionarem com o Esplora. Você precisará incluir a biblioteca Esplora escolhendo o menu Tools> Import library... , e você precisará mudar o mapeamento de portas do Arduino para o Esplora. Para saber mais veja o Guide to using Esplora with the Arduino Examples

 

Você deve pesquisar as páginas de referência da biblioteca Esplora (link), para conhecer os diversos tipos de sensores e atuadores da biblioteca Esplora. Você pode ver mais exemplos na página de exemplos (link).

Se você tiver problemas, acesse o link troubleshooting suggestions.

Traduzido por Renato Aloi do original “Getting started with Arduino Esplora” (link).

quarta-feira, 4 de dezembro de 2013

Função map() do Arduino

map(value, fromLow, fromHigh, toLow, toHigh)
Descrição
Remapeia um número a partir de uma faixa, para outra. Ou seja, acompanhando a assinatura da função acima, temos:


Um value de fromLow mapeado para toLow, um valor de fromHigh para toHigh, e valores intermediários.
Não restringe valores a uma única faixa, pois valores fora da faixa são normais e às vezes até úteis. A função constrain() deve ser usada antes e depois dessa função, se limites de faixa são desejados.
Repare que o “valor mínimo” da faixa de números deve ser maior ou menor que o “valor máximo”, para que a função map() possa ser usada de forma direta ou reversa, por exemplo:
y = map(x, 1, 50, 50, 1);
A função também lida com números negativos, veja um exemplo:
y = map(x, 1, 50, 50, -100);
que também é válido e funciona.
A função map() usa matemática de inteiros para não gerar frações, quando a matemática pede por frações, nesse caso. Mas restos de frações são truncados e não arredondados ou amortizados.
Parâmetros
value: o valor a ser mapeado
fromLow: o menor valor da faixa corrente
fromHigh: o maior valor da faixa corrente
toLow: o menor valor da faixa de destino
toHigh: o maior valor da faixa de destino
Retorna
O valor mapeado.
Exemplo
/* Mapeia um valor analogico para 8 bits (0 to 255) */
void setup() {}

void loop()
{
 
 int val = analogRead(0);
  val
 = map(val, 0, 1023, 0, 255);
 
 analogWrite(9, val);
}
Apêndice
Para quem gosta de matemática, segue o código-fonte da função:
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

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