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


quinta-feira, 21 de maio de 2015

Eu, Eu Mesmo e o Android

Bom dia Arduineiros, Androideiros, Raspizeiros!

Venho por meio desta declarar que prefiro programar em Objective-C do que configurar um aparelho Android!

Quem conhece Objective-C, sabe do que estou falando. O pessoal da Apple pegou o C++ virou de ponta-cabeça!

Nesse quesito ponto para o Android que se baseou no Java em vez de criar uma linguagem nova.

Mas essa questão das versões do Android é de matar!

Para resumir as experiências desde meu último post frustrado, vejam se eu não tenho razão em estar frustrado:

0. Tentei instalar o AI2 Companion e o Android disse que não havia espaço...
1. Resetei o aparelho Andoid Gingerbread 2.3.6
2. Perdi todas as informações do SD Card
3. Formatei o SD Card com 2 partições para usar o Link2SD
4. Resetei o aparelho de novo e ele formatou o SD Card com 1 partição
5. Formatei de novo o SD card com 2 partições
6. Acessei o Playstore e tive que acessar com a conta do Google
7. Levei 2 horas para recuperar a senha da minha conta do Google
8. Ao tentar logar na PlayStore ficava dando erro dizendo que minha conexão não era fidedigna
9. Percebi uma série de problemas de autenticação de certificado na hora de navegar em qqer site.
10. Gerei uma palavra-chave nova, registrei no SDCard e depois resetei as chaves de segurança
11. Formatei o Android tudo de novo.
12. Finalmente consegui logar na minha conta do google!
13. Consegui baixar o Link2SD e configurei ele na segunda partição do SDCard.
14. Baixei o QRCode reader
15. Acessei o AI2 e apontei para o QRCode, que me levou direto para o link de Download do AI2 Companion.
16. Descobri que o AI2 Companion não instala no Android Gingerbread...
17. Vou ter que começar tudo de novo, mas agora com o APPInventor1, ao invés do 2. Pois o AppInventor 1 acredito que funciona no meu Android 2.3.6

Bom, vcs devem estar se perguntando: puxa Renato, mas você não verificou se funcionava no Android Gingerbread? Esse é o pior, eu verifiquei e apostei minhas fichas nisso!

Leiam a ultima linha dessa página:
http://appinventor.mit.edu/explore/ai2/setup.html

Agora, depois de ver no documento oficial deles que o requisito mínimo de hardware é um Android Gingerbread 2.3.

Só pra lembrar o meu é um Android Gingerbread 2.3.6, então...

Enfim, as aulas sobre AppInventor vão demorar mais um pouco. E se alguém quiser doar um tablet/celular com Android KitKat, eu ficaria muito feliz!

Infelizmente não tenho dinheiro nem pra comprar uma versão mais atual para testes.

Ah! Uma última coisa: não dá pra usar o emulador, pois ele não tem bluetooth para comunicar com o Arduino.

Se alguém tiver alguma ideia sobre usar o emulador eu ficaria mais feliz ainda!

Abraços
Renato

quarta-feira, 20 de maio de 2015

Android, App Inventor & Arduino

Pessoal, bom dia!

Estou fazendo um trabalho para um cliente em que o programa funciona via App Inventor 2.

Alguns meses atrás, eu gravei uma série de aulas (acho que foram duas aulas em 3 partes), sobre programação Android para comunicar via bluetooth com o Arduino.

Essas aulas podem ser vistas no http://youtube.com/cursoarduino e fazem parte de um especial feito para o Curso Arduino Express.

Essas aulas podem ser assistidas também em melhor qualidade através dos DVD's do Curso Arduino Express, já lançado! Mas atualmente só vendido pelo email renato.aloi@gmail.com (estou apostando nos meus produtos para resolver o problema financeiro da Loja do Curso Arduino).

Mas eu sinceramente não sei mais o que fazer sobre esse Android. Estou a ponto de desistir. Já criei o canal sobre o Curso Android, mas não consigo fechar uma linha de material para criar as video-aulas...

Tentei com as aulas citadas acima, mostrar como fazer na programação Java para ativar e usar o Bluetooth, mas se vocês assistirem as aulas agora, verão que nada bate com nada, pois mudou tudo de lá prá cá!

A mesma coisa com o AppInventor, já mudou tudo para o AppInventor2.

Até agora não consegui instalar e usar o AppInventor2. Meu telefone Android diz que não possui espaço na memória para instalar. Aquele velho problema de falta de espaço na memória interna, grande vilã nos aparelhos Samsung e LG.

Não me espanta que grandes empresas como Samsung e LG não consigam lançar plataformas decentes para suportar o Android. Ninguém suporta o Android!

Nenhum desenvolvedor consegue suportar a quantidade de versões do Java e do Android. Impossível de acompanhar e de criar material de estudo... Estou entregando os pontos...

Não acho que o Android seja uma plataforma confiável e funcional. Simplesmente não funciona! Talvez para acessar Facebook e Redes Sociais. Mas para aplicativos de verdade, do mundo real, não consegui nenhum resultado até agora.

Talvez seja incompetência minha, ou falta de recursos para gastar míseros R$ 5 mil com um Samsung novo.

Prefiro pensar que é incompetência minha, porque ainda consegui acreditar que o novo Samsung custa R$ 5 mil!!!

Desculpem a frustração com esse sistema que deve ser maravilhoso, mas hoje estou a ponto de jogar o aparelho celular na parede!

Mas e o Arduino? Onde entra nessa história? Não entra, pois não consigo usar o aparelho Android, quiçá conseguir comunicar com o Arduino!

Abraços,
Renato