Arduino na rede WiFi do jeito fácil, com ESP8266 e o esp-link
O Arduino escreve com Serial.print e você lê no navegador: o ESP e o firmware esp-link fazem o meio de campo!
O esp-link faz o ESP8266 ficar conectado à sua rede WiFi existente e exibir em uma página web dinâmica, sem precisar de providências adicionais, o log de tudo que um Arduino que estiver plugado ao seu pino RX escrever via Serial.print (ou outros comandos da porta serial).
Ele tem várias outras funcionalidades, mas esta em particular é uma resposta às preces de quem tem projetos com Arduino1 em teste espalhados pelo laboratório, ou pela casa. Plugue neles um ESP-012 rodando o esp-link, aí cada projeto pode ficar discretamente no local mais adequado para o teste, registrando na serial o que quiser. Na hora de verificar, basta acessar via navegador o endereço correspondente ao esp-link de cada projeto, e ler o log.
As imagens acima mostram o terminal serial via navegador, uma das telas de configuração da conexão do esp-link, e a plaquinha (opcional) que eu montei para facilitar o uso dele, mas que mostra como são poucos os jumpers necessários para fazer ele funcionar com o Arduino3: 3V3, VCC, GND e TX.
Com um ESP-01 sozinho já é fácil, mas com uma plaquinha caseira fica mais fácil ainda.
Para mim o esp-link é tão útil que eu montei uma plaquinha específica4 para facilitar plugar o ESP01 ao Arduino que estiver precisando de uma dose de acompanhamento remoto, para que isso fique ainda mais simples: basta plugar jumpers dos pinos VCC, 3V3, GND e TX do Arduino aos pinos VCC, GND e RX do ESP, respectivamente5.
Você não precisa da plaquinha, pode usar o módulo ESP que já tem à mão, incluindo o humilde ESP-01 nosso de cada dia, sem modificações. Mas a plaquinha que eu fiz me traz algumas vantagens em projetos com Arduino, incluindo não só a facilidade de plugar diretamente numa protoboard (e com pinos claramente identificados), mas principalmente já incorporar um conversor de nível lógico em todos os pinos que eu uso, para não ter de me preocupar em compatibilizar os 5V do Arduino com os 3,3V do ESP8266 a cada vez, e ter um led indicativo do status da conexão WiFi do esp-link. Com ela à mão, de fato o uso passa a ser só plugar e conectar 4 jumpers.
O que é o esp-link
O esp-link nasceu para ser usado como acessório de desenvolvimento e depuração de projetos rodando em outros microcontroladores, e basicamente oferece formas de acessar via WiFi funções normalmente disponíveis pela serial (UART) local desses microcontroladores, incluindo a mais essencial delas: o acompanhamento de mensagens de diagnóstico.
O esp-link também é capaz de mediar o upload de novas versões de programas, permitindo fazer via WiFi aquilo que os usuários da IDE do Arduino estão acostumados a fazer via USB após cada compilação. Se você fizer as conexões específicas de pinos que constam na documentação, também é possível usar o esp-link para comandar remotamente um reset físico do Arduino conectado a ele.
O esp-link é um firmware open source e ativamente mantido, que transforma um módulo ESP8266 em uma ferramenta de apoio ao desenvolvimento.
Como funções complementares, ele oferece formas simples de o microcontrolador conectado a ele iniciar e manter conexões TCP (incluindo HTTP) e fazer chamadas REST. Na versão 2, em desenvolvimento, já é possível acompanhar como está ficando o suporte similar a MQTT.
Além disso, ele dispõe de uma interface de administração acessível pelo navegador web, que permite inclusive fazer uma configuração inicial de forma bem simples, após a instalação do esp-link no ESP8266: basta acessar, a partir de um computador ou smartphone, a rede sem fio temporária criada por ele (com um nome no estilo ESP_012ABC
, e sem senha), acessar por um navegador o endereço http://192.168.4.1/ e aí, navegando pelos menus, selecionar qual a rede sem fio à qual ele deve passar a se conectar como estação, e a senha dela. A partir daí, basta acessá-lo diretamente a partir dessa rede. A documentação tem os detalhes, naturalmente.
A funcionalidade que mais me interessa é o acesso assíncrono ao log do que o microcontrolador enviou para a serial, que fica permanentemente disponível na interface do esp-link por meio do menu µC Console ou, para quem for old school ou precisar de um protocolo mais leve, também pode ser obtido via telnet (ou netcat) para a porta 23 (TCP) do ESP8266.
O esp-link é cria de Thorsten von Eicken, com participação especial do holandês jcw, autor do site JeeLabs, responsável por versões avançadas de uma série de bibliotecas para o Arduino, e criador de uma série de projetos interessantes, incluindo os JeeNodes.
Instalar o esp-link no ESP8266
Instalar o esp-link pela serial não tem complexidade específica, embora não escape da complicação típica do processo de instalar qualquer outro firmware pela serial do ESP8266, e que já descrevi com detalhes em “ESP8266: Instalando o firmware NodeMCU e a linguagem Lua”.
É necessário usar um módulo USB-Serial, que tanto pode ser uma plaquinha dedicada (como os populares FTDI Basic) quanto um Arduino fazendo esse papel. Qualquer que seja a sua opção, ela deve ser capaz de alimentar o ESP-01 com 3,3V, e operar no nível lógico de 3,3V.
A primeira instalação do esp-link em um ESP8266 exige o procedimento via serial, mas as atualizações podem ser via WiFi.
Se você estiver usando um Arduino comum, pode alimentar o ESP-01 com o pino 3V3, mas precisará usar um adaptador de nível lógico entre o pino TX do Arduino e o RX do ESP-01. O adaptador de nível lógico mais simples de obter geralmente é o feito com um par de resistores; se você for usar com frequência, provavelmente compensa ter uma solução mais permanente sempre à mão.
Depois de instalado, é possível fazer atualizações de versão do esp-link pela comodidade da rede WiFI. Para a instalação inicial, entretanto, o procedimento tradicional pela porta serial é o caminho usual a seguir.
Como instalar o esp-link
No meu ESP-01 usado para este artigo, o procedimento de instalação do esp-link foi o que segue:
1) Fazer o download e descompactar o esp-link. Usei a versão 1.0.1 e baixei o arquivo esp-link-4MB.tgz6, seguindo as instruções do próprio site para descompactá-lo em uma pasta chamada esp-link.
2) Plugar o ESP-01 ao módulo USB-Serial, seguindo a pinagem a seguir:
USB-Serial | ESP-01 |
RXD | TXD |
TXD | RXD |
GND | GND e GPIO0 |
3V3 | 3V3 e CH_PD |
Após plugar, provoque um reset do ESP (ou desconecte e reconecte o jumper do 3V3), e ele entrará no modo especial de recepção de firmware.
Importante: ao final do procedimento, desconecte o jumper do GPIO0, caso contrário o ESP8266 sempre entrará no modo de recepção de firmware após cada reset.
3) Usar uma ferramenta de upload de firmware para enviar ao ESP-01 o conteúdo do esp-link. Preferi usar o popular esptool.py via linha de comando, mas há outras opções de ferramenta - pesquise por esp8266 flasher e você as encontrará.
Usando o esptool.py, basicamente precisei abrir um terminal, entrar na pasta esp-link criada no passo 1, e usar o comando que consta nas instruções do próprio esp-link: esptool.py --port /dev/tty.usbserial-A703TQT1 --baud 115200 write_flash 0x00000 boot_v1.4\(b1\).bin 0x1000 user1.bin 0x7e000 blank.bin
(o trecho em vermelho precisa ser substituído pela designação da porta serial que o seu módulo USB-serial estiver usando).
Como programar o Arduino para usar o esp-link como terminal serial
Não é necessário fazer nada de especial. Se o esp-link estiver configurado e ligado, e o pino TX do Arduino estiver plugado (com conversão de 5V para 3,3V, claro) ao pino RX do ESP8266, tudo o que for enviado com o comando Serial.print (ou outros comandos de saída da Serial) irá para o µC Console do esp-link.
O programa acima é o que gerou a tela de exemplo usada no início deste artigo. Note que ele inicia a serial normalmente, com Serial.begin
, e depois é só uma longa série de Serial.print
e Serial.println
.
Acessando pelo navegador, fica assim:
Simples, não?
O log do próprio esp-link
Além do log das mensagens do microcontrolador conectado a ele, o esp-link armazena também um log das suas próprias mensagens de diagnóstico.
Por default elas são enviadas via serial ao Arduino (que pode recebê-las no pino RX, com os comandos da Serial), e também ficam disponíveis pelo navegador, na opção Debug log.
Abaixo algumas linhas do log de uma inicialização do esp-link na minha rede de testes:
260> ** esp-link v1.0.1 - 2015-08-28 21:26:29 - b48614c
261> CONN led=0
263> SER led=14
265> Wifi init, mode=STA
267> Wifi uses DHCP, hostname=esp-link
283> Httpd init, conn=0x3fff20d8
286> Serbridge pins: reset=12 isp=13 swap=0
299> Reset cause: 6=external
302> ** esp-link ready
305> mode : sta(18:00:de:ad:be:ef)
3350> connected with brarduino, channel 11
3351> Wifi connected to ssid brarduino, ch 11
3351> dhcp client start...
4127> Wifi got ip:192.168.9.130,mask:255.255.255.0,gw:192.168.9.254
4128> ip:192.168.9.130,mask:255.255.255.0,gw:192.168.9.254
15281> Wifi check: mode=STA status=5
15281> Turning OFF uart log
Na configuração default, o esp-link suspende esse log quando completa a sua inicialização. Para auxiliar em diagnósticos, você pode modificar para ligá-lo a qualquer tempo, ou para mantê-lo desligado até mesmo durante o boot.
Bônus: minha plaquinha para o esp-link
A minha plaquinha tem um soquete pronto para receber os 8 pinos do ESP-01, e uma barra de 8 terminais para conexão a uma protoboard.
Apesar do mesmo número de pinos, a conexão entre eles não é direta, e nem todos os pinos do ESP estão disponíveis na barra de terminais.
A razão disso é a presença de um conversor de nível lógico (como este, comprado na brasileira Proesi) entre o ESP e os terminais – mais especificamente, entre os pinos RX, RST, CH_PD e GPIO0 do ESP-01 e os terminais correspondentes.
Os pinos VCC, TX e GND do ESP8266 estão conectados diretamente (nenhum deles precisa de conversão) aos terminais correspondentes.
Além disso, há um terminal conectado ao VCC do conversor de nível lógico, que precisa ser conectado ao VCC (5 volts) do Arduino. O pino GPIO2 do ESP-01 não está conectado a nenhum terminal.
Atenção: ao usar o diagrama acima, siga corretamente o posicionamento dos pinos GND e HV/LV (tensão de 5V e de 3,3V, respectivamente) da sua placa, pois eles podem variar.
Para completar, há 2 leds7, sendo um conectado ao GPIO0 e (por meio de um resistor de 330Ω) ao GND, e o outro conectado ao GPIO2 e (por meio de outro resistor de 330Ω) ao GND. O primeiro, na configuração default do esp-link, serve como indicador de status da conexão WiFi
- Ou com outros microcontroladores, ou qualquer coisa que se comunique via RX e TX clássicos. ↩
- Ou outro módulo ESP8266 compatível, claro. ↩
- Depois de configurado – durante a configuração precisa de mais algumas conexões, como veremos. ↩
- Na verdade, um pequeno subconjunto das funcionalidades do circuito oficial do esp-bridge. ↩
- Mas plugar no RX, e em pinos digitais conectados ao CH_PD, RST e nos GPIOs do ESP8266 tem utilidade também, claro. ↩
- Guardei uma cópia da versão que eu usei, mas recomendo que você use a versão que estiver disponível no site oficial. ↩
- Que não constam no diagrama de conexões, para não complicá-lo desnecessariamente. ↩
Comentar