quarta-feira, 12 de julho de 2017

Usando o ESP8266-Pro da RobotDyn



Você já deve ter visto algumas placas diferentes com o ESP8266 rolando por aí (como o módulo wifi-serial de 8 pinos, os módulos como o ESP12-E que devem ser soldados em uma PCI, o WeMos, NodeMCU e variantes). Esse é um deles. No começo ele parece esquisito, porque passa a impressão de que bastaria ligar um adaptador USB-Serial e começar a usar, mas aí você solda os pinos, conecta o USB-Serial e... nada. Nenhum sinal de vida. Você tira outro da embalagem pra ver se só pegou um ruim, e o resultado é o mesmo: nenhum sinal de vida.


O fato é que o mais provável é que ele esteja funcionando perfeitamente bem. Apesar de parecer um arduino pro ou coisa parecida, é certos pinos precisam estar em níveis lógicos determinados antes que ele comece a funcionar, assim como um ESP12-E. Se você pesquisar a respeito, descobrirá que o ESP8266 tem mais de um modo de boot: em um deles ele aceita ser programado via serial, em um deles ele roda o programa gravado na memória flash e em outro ele roda um programa armazenado em um cartão SD ou coisa do tipo. Ainda não descobri se é possível fazer essa plaquinha bootar de um cartão SD, então vou deixar aqui apenas como colocá-la no modo de programação via serial e no de execução normal do firmware.

Execução normal do programa:
EN: HIGH (resistor de 1-10k)
IO15: LOW ( resistor de 1-10k)
IO0: HIGH ( resistor de 1-10k)
IO2: HIGH ( resistor de 1-10k)
Execução do bootloader serial (modo de programação do firmware):
EN: HIGH (resistor de 1-10k)
IO15: LOW ( resistor de 1-10k)
IO0: LOW
IO2: HIGH ( resistor de 1-10k)

É basicamente isso. Vou mostrar aqui como gravar o firmware NodeMCU na dita cuja. Ela tem 1mb de memória, o que é o bastante para o próprio firmware (que ocupa cerca de 500 kbytes) e para os arquivos (scripts, páginas leves em html, etc).


Eu já tinha uma aplicação em mente: um monitor climático que publicasse os dados na Internet. Solicitei uma build personalizada apenas com alguns módulos (GPIO, HTTP e DHT, além dos padrões) e, enquanto esperava o arquivo estar disponível para download, preparei o ESP8266 para receber o programa. A primeira coisa que fiz foi apagar a memória flash usando o esptool.py e o comando erase_flash. Esse passo serve para apagar configurações que podem provocar ciclos infinitos de wdt resets inexplicáveis, e também é uma forma de constatar que está tudo funcionando normalmente. Para apagar a memória flash, primeiro coloca-se o esp8266 para rodar o bootloader serial colocando o pino IO0 em LOW e resetando o mesmo. O nodemcu possui um circuito para resetá-lo utilizando o dtr e o rts do usb-serial embutido, mas como esta plaquinha não possui esta parte é preciso resetá-la manualmente, apertando no botãozinho de reset.


 Depois que a memória flash está apagada e você já tem o arquivo do firmware, é hora de gravá-lo na memória da plaquinha usando o ESP8266 Flasher. Mais uma vez você coloca a placa em modo de programação serial (pino IO0 em low + botão de reset). No ESP8266 Flasher você escolhe a opção de memória adequada (no caso é 1mb) e começa a fazer o upload.





Pronto. Agora é possível programar a plaquinha em Lua pelo Esplorer.






Pra facilitar a minha vida, construí uma placa de circuito impresso para encaixar o ESP8266-Pro e  um display de OLED, que ainda estou esperando receber. Usei um DHT22 normal e dois leds para indicar o que o ESP8266 está fazendo em uma mini-protoboard em uma base de acrílico. Usei o IFTTT com o applet Maker Webhooks para publicar as leituras em uma conta do Twitter (@aroldorosenberg, que não uso para nada além de exibir as leituras). O IFTTT aceita uma requisição POST e faz alguma coisa, dependendo de qual ela for, aceitando alguns parâmetros. Poderia servir para avisar quando seu gato usa a caixa de areia (com um sensor PIR), quando alguém abre uma porta, um armário e por aí vai.



E é só isso! Obviamente também é possível programar a placa pela IDE Arduino, respeitando o tamanho da memória flash, mas pela minha experiência ele fica muito mais estável com o firmware NodeMCU, muito provavelmente porque eu não tenho tanta familiaridade assim com a API do ESP8266 para programar do jeito certo.