Atualizando Firmware de comandos seriais AT no ESP8266
O objetivo deste tutorial é mostrar como realizar o procedimento de atualização do firmware de um microcontrolador ESP8266 para uma versão mais atual.
Motivo: ao comprar um ESP8266, normalmente seu uso tem como objetivo permitir que outros microcontroladores como o Arduino UNO, tenham acesso a uma rede WIFI. Porém por padrão o ESP8266 trabalha na velocidade de 115200 bits por segundo, velocidade essa que o Arduino UNO tem dificuldade de trocar informações principalmente quando ele utiliza bibliotecas que emulam portas Seriais, devido a limitação da própria placa possuir apenas uma interface serial. Neste ponto você pode estar se perguntado, não bastaria eu acessar o ESP8266, utilizando qualquer terminal serial, e através do manual de comandos AT do ESP8266 (download aqui), executar um comando para modificar a velocidade de comunicação serial? Sim, é exatamente esse o objetivo, mas o problema é que diversas versões do firmware do ESP8266 possuem um bug que impede que essa alteração seja gravada na memória FLASH do dispositivo. O que acaba criando o problema que essa alteração é totalmente perdida quando o dispositivo é desconectado da fonte de energia. Para resolver isso precisamos atualizar o firmware AT do ESP8266.
Lista de equipamentos necessários:
- ESP8266-01 512k
- Raspberry Pi qualquer versão
- Protoboard/jumpers
Esquema elétrico:
O objetivo desse esquema elétrico é conectar o ESP8266 à porta serial TX/RX do Rasbperry pi, além disso alimentá-lo com 3.3v, e conectar sua porta GPIO0 (ZERO) no terra GND, o que coloca o ESP8266 em estado de gravação de firmware.
ESP VCC -> Raspberry 3.3v – vermelho
ESP GND -> Raspberry GND – preto
ESP RXD -> Raspberry TX – verde
ESP TXD -> Raspberry RX – laranja
ESP CH_PD -> Raspberry 3.3v – vermelho
ESP GPIO0 -> Raspberry GND – preto
Após a conexão elétrica, você pode conectar seu Raspberry Pi à uma fonte de energia, será necessárias algumas configurações para permitir que a porta serial possa ser utilizada para comunicação com o ESP8266.
- Acesse a pasta /boot e edite o arquivo e retire esta parte do arquivo console=ttyAMA0,115200
- Execute o comando sudo raspi-config, no menu Interfacing Options, selecione a opção p6 Serial, e quando a aplicação perguntar sobre login pela porta serial selecione não e habilitar a porta serial selecione SIM.
- Reinicie o Raspberry pi
- Agora precisamos instalar alguns programas
- O primeiro é um cliente serial chamado minicom, para isso digite o comando sudo apt-get install minicom
- Precisamos também de um script Python que é o responsável por realizar o update do firmware do ESP8266, para isso, clone o seguinte repositório com o comando: git clone https://github.com/themadinventor/esptool.git
- Por fim precisamos baixar o arquivo contendo a imagem do novo firmware a ser instalado, para isso acesse o link https://www.espressif.com/en/support/download/at. Neste tutorial utilizamos a última versão: ESP8266 AT Bin V1.6.1 Dentro do arquivo zip uma lista de arquivos estarão disponíveis, esses arquivos devem ser copiados para dentro da pasta esptool que foi criada ao clonar o repositório git, no passo anterior. Para a versão ESP8266-01 de 512k vamos precisar dos arquivos:
- boot_v1.7.bin
- user1.1024.new.2.bin
- esp_init_data_default_v08.bin
- blank.bin
O primeiro passo é executar o comando abaixo para zerar a memória flash do ESP8266. Ao finalizar, desligue o cabo vermelho ligado ao VCC do ESP8266 e ligue novamente para resetar o dispositivo.
#limpar a memória do ESP8266
python esptool.py –port /dev/serial0 erase_flash
Em seguida precisamos construir o comando para atualizar o firmware, como ele é composto por vários arquivos, cada um deve ser gravado no endereço de memória correto, para que o dispositivo possa encontrar a sequencia de execução:
Endereço na memória Arquivo
0x7e000 blank.bin
0x7C000 esp_init_data_default_v08.bin
0x0 boot_v1.7.bin
0x1000 user1.1024.new.2.bin
O comando a ser executado para atualizar o firmware esta abaixo.
#gravar o novo firmware
python esptool.py – -port /dev/serial0 write_flash 0x7e000 blank.bin 0x7C000 esp_init_data_default_v08.bin 0x0 boot_v1.7.bin 0x1000 user1.1024.new.2.bin
Durante a atualização um log similar a esse será apresentado em tela, após a conclusão basta desconectar novamente o cabo vermelho VCC, para reiniciar o ESP8266:
root@raspberrypi:/home/pi/esptool# python esptool.py – -port /dev/serial0 write_flash 0x7e000 blank.bin 0x7C000 esp_init_data_default_v08.bin 0x0 boot_v1.7.bin 0x1000 user1.1024.new.2.bin
esptool.py v2.3.2-dev
Connecting….
Detecting chip type… ESP8266
Chip is ESP8266EX
Features: WiFi
Uploading stub…
Running stub…
Stub running…
Configuring flash size…
Auto-detected Flash size: 512KB
Compressed 4096 bytes to 26…
Wrote 4096 bytes (26 compressed) at 0x0007e000 in 0.0 seconds (effective 4912.0 kbit/s)…
Hash of data verified.
Compressed 128 bytes to 75…
Wrote 128 bytes (75 compressed) at 0x0007c000 in 0.0 seconds (effective 90.1 kbit/s)…
Hash of data verified.
Compressed 4080 bytes to 2936…
Wrote 4080 bytes (2936 compressed) at 0x00000000 in 0.3 seconds (effective 118.0 kbit/s)…
Hash of data verified.
Compressed 407796 bytes to 293036…
Wrote 407796 bytes (293036 compressed) at 0x00001000 in 27.2 seconds (effective 119.8 kbit/s)…
Hash of data verified.
Leaving…
Hard resetting via RTS pin…
Agora que o firmware esta atualizado, podemos acessar o ESP8266 utilizando o programa Minicom para modificar a velocidade de transmissão de dados. IMPORTANTE: DESCONECTE O CABO QUE ESTA LIGADO NA GPIO0 E REINICIE O ESP8266 DESCONECTANDO E RECONECTANDO O CABO VCC.
Para isso execute o comando:
root@raspberrypi:/home/pi/esptool# minicom -b 115200 -o -D /dev/serial0
Dentro do terminal serial digite o comando abaixo, e para confirmar tecle CTRL+M e em seguida CTRL+J
AT+UART_DEF=9600,8,1,0,0
A partir deste momento, você não conseguirá mais digitar comandos no minicom, tecle CTRL+A e depois a letra Q para sair do programa.
Execute novamente o programa minicom mas utilizando a velocidade de 9600 bits por segundo para testar a modificação:
root@raspberrypi:/home/pi/esptool# minicom -b 9600 -o -D /dev/serial0
Digite o comando AT e em seguida tecle CTRL + M e CTRL + J, voce deverá receber o retorno OK, confirmando que a modificação foi feita com sucesso.