Manual

do

Maker

.

com

Versão estável do MicroPython para ESP8266

Versão estável do MicroPython para ESP8266

Já faz umas duas semanas desde a data desse artigo, mas saiu uma versão estável do MicroPython para ESP8266 e desde então mantive a aba do repositório aberta como pendência de artigo. Bom, eu quero fechar essa aba do Chrome, na esperança de recuperar alguma memória RAM e unindo o útil ao agradável, mostrar essa versão com suporte completo ao GPIO virá bem a calhar. Mas invés de mostrar isso no ESP8266-01, o farei no Wemos D1, que possui o formato da board do Arduino, porém com um ESP8266-12.

É muito provável que você tenha aí um ESP8266-01 e nesse caso você precisará utilizar um FTDI para subir o firmware. O procedimento do wiring para o ESP8266-01 você vê nesse outro artigo. Se você não tiver um FTDI mas tiver Arduino UNO aí, pode adotar esse procedimento aqui.

Nesse outro artigo coloquei o MicroPython em uma ESP8266, mas era uma versão meio "prova de conceito", apenas para mostrar o procedimento. Instale todas as dependências conforme citado nesse post e volte a partir desse ponto.

***Baixe essa ferramenta para fazer o flashing do novo firmware***  LINK QUEBRADO ***    que instalaremos conforme o procedimento a seguir. Você também pode instalá-la via pip. Se for o modo desejado, instale os pacotes citados mais abaixo, posteriormente instale a ferramenta conforme citado na sequência dos pacotes a serem instalados, mais abaixo.

Características do firmware na versão atual

Apesar de já estável e funcional, a versão atual ainda é considerada experimental e as APIs poderão ser modificadas em um ou em muitos aspectos. Atualmente o firmware possui as seguintes características:

  • Prompt do Python sobre UART0 (REPL -Read Evaluate Print Loop)
  • Garbage collector e excessões (esse negócio de garbage collector me lembra Java. Eca)
  • Suporte a unicode
  • Módulos builtin como gc, array, collections, io, struct, sys, esp, network e vários outros
  • Inteiros (long) de precisão rechonchuda e floats de 30bits
  • Suporte ao WiFi (fundamental, hum?)
  • Sockets usando modlwip
  • Suporte a I²C, SPI e GPIO
  • OneWire e WS2812 (Neopixel)
  • Acesso ao sistema de arquivos que estiver utilizando a flash
  • WebREPL sobre WiFi a partir de um browser (client: https://github.com/micropython/webrepl)

O progresso e a documentação podem ser consultadas nesse link.

Gerar o firmware

Como citei mais acima, já escrevi um artigo sobre a construção do SDK do ESP8266, que será fundamental. Leia o post referenciado para entender o que você fará aqui. De qualquer modo, vou descrever rapidamente o processo apenas para não faltar informação.

Entre em um nível de diretório em que você garantidamente tenha espaço em disco. Eu montei em meu próprio home, por isso mais abaixo você verá o export indicando o meu home como path adicional. Vou preceder o exemplo com a instalação do git, caso você não o tenha:

cd
sudo apt-get install build-essential libreadline-dev libffi-dev git make unrar autoconf automake libtool gcc g++ gperf flex bison texinfo gawk ncurses-dev libexpat-dev python python-serial python-pip sed git unzip libtool-bin help2man
git clone https://github.com/pfalcon/esp-open-sdk.git
cd esp-open-sdk && make
export PATH=$(pwd)/xtensa-lx106-elf/bin:$PATH
git submodule update --init
git clone https://github.com/micropython/micropython.git
cd micropython/esp8266 
git submodule update --init
cd .. && make -C mpy-cross && cd -
make axtls && make

O firmware será construído dentro do subdiretório "build". Se ocorrer algum erro na instalação (provavelmente ocorrerá na ocasião de algum pacote já ter sido instalado anteriormente), corrija-o antes de seguir.

A recomendação é apagar a flash previamente à instalação do novo firmware, ou o mesmo em caso de instalar outro firmware depois. Se você não quis baixar a ferramenta citada no início do post por querer instalá-la via pip, faça isso agora:

pip install esptool

Se você copiou o esptool pelo git, restará adicioná-lo ao path do sistema. Você pode fazer de várias maneiras, vou citar apenas duas:

#link simbolico
sudo ln -s esptool-master/esptool.py /usr/bin/

#adicionando diretorio ao path
export PATH=$PATH:$(pwd)/esptool-master
echo "export PATH=$PATH:$(pwd)/esptool-master" >>/etc/profile

Instalar o novo firmware

Primeiro passo é sempre evitar futuros problemas, limpando a flash previamente.

esptool.py --port /dev/ttyXXX erase_flash

A parte mais legal desse procedimento é a transparência que foi criada para subir o firmware. Caso a porta padrão seja ttyACM0, basta digitar:

make deploy

Ou, supondo que seja ttyUSB0, apenas passe o parâmetro antes de 'deploy', dessa maneira:

make PORT=/dev/ttyUSB0 deploy

A imagem produzida é a 'combinada', de forma que bastará fazer flashing no endereço 0x00000, se for fazê-lo através da ferramenta de flashing. Se optar instalar diretamente pelo comando de flashing, faça o seguinte:

esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=8m 0 esp8266-2016-06-10-v2.0.bin

Acredito que não seja necessário citar, mas para desencargo de conciência; troque a porta e o nome do firmware pelos nomes corretos. Eventualmente pode ser necessário reduzir a velocidade também. Nesse caso, coloque-a em 115200.

Instalar o MicroPython no NodeMCU

Não é certeza que seja necessário, mas eu optaria de uma vez por esse processo para instalar o firmware em uma board NodeMCU:

esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=8m -fm dio 0 esp8266-AAA-DD-MM-vVa.Vb.bin

Primeiros passos após a instalação

Estou reproduzindo diversos passos da documentação atual, só pra deixar esse post mais completo, não se incomode com a 'similaridade', porque é proposital.

O prompt serial pode ser acessado pela UART na velocidade de 115200. O modo de operação inicial do WiFi é AP, com as seguintes características iniciais.

  • ESSID: MicroPython-xxxxxx, onde 'x' é repassado com parte do MAC
  • Senha: micropythonN (com 'N' maiúsculo)
  • IP da board: 192.168.4.1
  • DHCP server ativado.

Você pode mudar todas as configurações, obviamente, inclusive fazer o acesso pelo browser utilizando-se do WebREPL (não se esqueça do client nesse link). Para conectar-se à serial é bastante simples, apenas use algum programa para ler a porta serial, como GTKTerm, screen, picocom etc. Conectando-se ao términal, emita uma série de Enter para acessar ao prompt, que deverá exibir ">>>".

Assim como no Onion Omega, você pode acessar o prompt do sistema utilizando WiFi nas versões mais recentes do Firefox ou Chrome.

Na primeira conexão será necessário configurar a senha. Após isso, o ESP8266 iniciará um reboot. Se em 2 minutos o ESP8266 não reaparecer, faça um reset pelo botão.

Esse prompt do Python não é uma TTY do Linux, você não digitará 'ls' e deverá interagir com programação Python (obviamente).

Primeiro teste

O primeiro teste com o GPIO é quase sempre o acendimento de um LED. Vamos fazê-lo:

import machine
pin = machine.Pin(2, machine.Pin.OUT)
pin.high()
pin.low()

Mais recursos

A interação com o MicroPython é bastante agradável, uma vez que você pode interagir com o prompt utilizando as setas para caminha na linha de comando ou visitar o histórico (com até 8 entradas), ou Ctrl+A para o inicio de linha e Ctrl+E para o fim da linha.

Se você já é um Linuxer, vai gostar de saber que pode utilizar o Tab para auto-completar. E se você utiliza o bpython para programar em fluxo, vai amar saber que que o Tab após um '.' lhe dará a lista de funções disponíveis do objeto em questão. O auto-indent também é uma das características desse prompt. Para baixar o nível de volta, pressione enter algumas vezes até o ponto desejado; Ctrl+C ignorará todas as linhas do grupo de comandos.

Um teste bacana com LED um pouco mais elaborado pode ser feito com a utilização de toggle.

import time
while True:
...     toggle(pin)
...     time.sleep_ms(500)
...
...
...
>>>

Um Ctrl+C interromperá o programa.

Se você tiver feito o programa no desktop/notebook e quiser colar uma porção de código via REPL, utilize Ctrl+E e ao ver a mensagem a seguir, apenas combine Ctrl+D:

paste mode; Ctrl-C to cancel, Ctrl-D to finish
===

As funções do Tab e Backspace não funcionam em modo de cola, assim como Ctrl+A e Ctrl+D não funcionam no modo WebREPL.

O sistema de arquivos interno

Todo o espaço disponível além do firmware será utilizado como sistema de arquivos. Logo, quanto menor o firmware, menos recursos e mais espaço; quanto maior o firmware mais recursos e menos espaço.

Você pode criar arquivos no sistema de arquivos da maneira tradicional do Python, com a função open().

Para listar arquivos no sistema de arquivos você não utilizará um 'ls' (como já citado anteriormente), mas você pode utilizar a função listdir() da biblioteca os. Faça o import dessa biblioteca, use '.' e então Tab para ver os recursos disponíveis. Aliás, você pode fazer o mesmo processo para as demais bibliotecas, caso não conheça, não lembre ou tenha preguiça de digitar as funções.

Fazer programas de startup

Se você quer seu programa Python (e certamente quererá) iniciando juntamente com seu módulo ESP8266, existem 2 arquivos principais, sendo o 'boot.py' e o 'main.py'. Caso ele exista, o primeiro a ser executado é o 'boot.py' e sequencialmente o 'main.py'. Você poderá criá-los e colocar o código que quiser, mas lembre-se da experiência com o NodeMCU, onde alguns reflashings podem ser necessários até pegar o jeito da coisa.

Para evitar que sua board entre em um loop infinito por um erro de programa, você pode gravar o arquivo de programa e depois chamá-lo com import e por fim executá-lo. Se algo der errado a ponto de nem o Ctrl+C funcionar, bastará reiniciar o módulo.

Se quiser transferir arquivos para o arquivo de sistemas a partir do seu computador, você pode utilizar o client WebREPL e assim manter toda a programação no seu editor favorito.

Exemplo de controle 1-wire com DS18B20

Se você tem dificuldades com programação, eu acredito que esse exemplo o fará mudar de firmware para MicroPython hoje mesmo. No post específico sobre o sensor de temperatura DS18B20 eu mostrei a interação em C utilizando a IDE do Arduino para programar o Wemos D1. Dessa vez exemplificarei a mesma configuração, mas utilizando Python (código de exemplo pego da documentação - nem o trabalho de programar esse exemplo eu tive).

import time
import machine
import onewire

# the device is on GPIO12
dat = machine.Pin(12)

# create the onewire object
ds = onewire.DS18B20(onewire.OneWire(dat))

# scan for devices on the bus
roms = ds.scan()
print('found devices:', roms)

# loop 10 times and print all temperatures
for i in range(10):
    print('temperatures:', end=' ')
    ds.convert_temp()
    time.sleep_ms(750)
    for rom in roms:
        print(ds.read_temp(rom), end=' ')
    print()

Bibliotecas

Por fim, as bibliotecas disponíveis atualmente (e certamente se ampliarão em curto periodo):

gc –  garbage collector
math – funções matemáticas
sys – funções específicas do sistema
ubinascii – conversão de binário para ASCII
ucollections – coleção  e containers
uhashlib – algorítmos de hash
uheapq – heap queue
uio – streaming de input/output
ujson – json encode/decode
uos – serviços básicos do sistema operacional
ure – expressões regulares (s2)
usocket – sockets
ussl – ssl
ustruct – manipulação de tipos primitivos de dados
utime – time
uzlib – zlib

Além disso, tem as bibliotecas específicas do MicroPython:

machine — funções relacionadas à board
micropython – acesso e controle interno do MicroPython
network — configurações de rede
uctypes – acesso a estrutura de dados C

E a específica do MicroPython para ESP8266:

esp - funcões específicas do ESP8266

Enfim, são tantos recursos que dá pra se divertir por muito tempo. Espero que você possa se divertir o tanto que me divertirei com o novo sistema da minha Wemos D1; MicroPython para ESP8266, não esqueça. Sugiro também que inscreva-se em nosso canal do Youtube para acompanhar videos que faço à parte de artigos, porque farei um relacionado a outro artigo e já disponibilizarei uma apresentação do MicroPython.

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.