Pesquisa de site

Desenvolva aplicativos de rede para ESP8266 usando Mongoose no Linux


Nesta página

  1. Quem é quem
    1. ESP8266
    2. Mangusto
    3. Linux

    1. NodeMCU
    2. Conexão com conversor UART-USB externo

    1. Verificando conexão
    2. Corrigindo o erro \Acesso negado

    Vamos discutir como começar a desenvolver aplicativos de rede para o chip ESP8266 usando o Mongoose Embedded Web Server no Linux. Vou usar o Ubuntu, mas tudo pode ser facilmente adaptado para qualquer distribuição Linux.

    Quem é quem

    Desde que você começou a ler este artigo, presumo que você conheça Linux, ESP8266 e Mongoose. Portanto, apenas uma breve introdução.

    ESP8266

    Chip barato com WiFi integrado, desenvolvido pela Expressif. Se você quiser mergulhar em mais detalhes, confira o site oficial.

    Mangusto

    Mongoose é uma biblioteca multi-protocolo completa com um núcleo de menos de 40kB desenvolvida pela Cesanta. Encontre informações sobre o modo no site da Cesanta.

    Linux

    Realmente? :-)

    Conectando o ESP8266 ao seu computador

    Ok, primeiro precisamos conectar o chip ESP8266 ao seu computador. Você pode fazer isso de várias maneiras.

    NodeMCU

    Se você tiver um módulo NodeMCU, com conversor UART para USB integrado, tudo o que você precisa fazer é conectar o módulo ao computador via USB. BEIJO!

    Conexão com conversor UART-USB externo

    Se o seu módulo ESP não tiver um conversor UART-USB interno, você precisará de um externo. Existem muitos deles - basta pesquisar no Google.

    Selecione um que funcione com Linux (basicamente, a maioria deles) e tenha um pino de 3,3V e lembre-se: a maioria dos conversores UART-USB tem pinos para 3,3V e 5V, mas você não deve conectar o ESP aos pinos de 5V. Este dispositivo não é tolerante à tensão e é possível queimar seu módulo.

    Agora conecte (ESP -> Conversor):

    VCC -> 3,3V

    GND -> GND

    RX0 -> TX (não RX)

    TX0 -> RX

    CH_PD -> 3,3V

    Conectando com Arduino

    Se você não possui um conversor UART-USB, mas possui um Arduino com pinos de 3,3V, pode usá-lo facilmente para conectar o ESP:

    1. Conecte o Arduino ao computador via USB
    2. Conecte o RESET do Arduino ao seu GND: é necessário desabilitar o processador host, pois precisamos apenas do módulo UART-USB
    3. Conecte o ESP (ESP -> Arduino)
      1. VCC -> 3,3V
      2. GND -> GND
      3. RX0 -> RX0 (não TX)
      4. TX0 -> TX
      5. CH_PD -> 3,3V

      Verificando conexão

      Se sua conexão estiver correta, o ESP deve aparecer como um novo dispositivo tty. Normalmente, NodeMCU e ESP conectados via conversor UART-USB aparecem como /dev/ttyUSBx (x=0, 1, 2 etc) e a versão do Arduino aparece como /dev/ttyACMx (x=0, 1, 2 etc)

      Você pode usar o comando dmesg | grep usb para encontrar seu dispositivo.

      Por exemplo, após a conexão do NodeMCU você verá algo assim:

      [  1496.765417] usb 2-3.3: new full-speed USB device number 15 using xhci_hcd
      [ 1496.867729] usb 2-3.3: New USB device found, idVendor=10c4, idProduct=ea60
      [ 1496.867736] usb 2-3.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
      [ 1496.867740] usb 2-3.3: Product: CP2102 USB to UART Bridge Controller
      [ 1496.867743] usb 2-3.3: Manufacturer: Silicon Labs
      [ 1496.867745] usb 2-3.3: SerialNumber: 4202
      [ 1497.900384] usbcore: registered new interface driver usbserial
      [ 1497.900423] usbcore: registered new interface driver usbserial_generic
      [ 1497.900457] usbserial: USB Serial support registered for generic
      [ 1497.903897] usbcore: registered new interface driver cp210x
      [ 1497.903989] usbserial: USB Serial support registered for cp210x
      [ 1497.904382] usb 2-3.3: cp210x converter now attached to ttyUSB0

      Como você pode ver, o NodeMCU agora está disponível como /dev/ttyUSB0.

      Como verificação final, use qualquer terminal para se conectar a um novo dispositivo; Vou usar o picocom. Este é um terminal leve. No Ubuntu pode ser instalado com:

      sudo apt install picocom

      Tentando:

      picocom /dev/ttyUSB0 -b 115200

      Se tudo estiver ok, você deve ver \Terminal pronto na saída do picocom.

      Corrigindo o erro Acesso negado

      Se o picocom disser \Acesso negado“, isso geralmente significa que o usuário atual não é membro do grupo dialout: no Linux, para acessar as portas seriais, o usuário deve ser um membro deste grupo.

      Correr:

      sudo usermod -aG docker $USER

      comando, saia, entre novamente e tente conectar o ESP novamente. \Acesso negado deve ter desaparecido.

      construção de mangusto

      Baixe a versão mais recente do Mongoose aqui.

      O Mongoose é enviado com um exemplo para ESP8266 e RTOS SDK. Turorial e código de amostra para ele estão localizados aqui.

      Observação: o ESP8266 possui duas versões do SDK. O primeiro não é um sistema operacional e o segundo é baseado em RTOS. Neste artigo, usarei o último. Para encontrar as diferenças entre eles, pesquise no Google ou leia esta resposta no fórum oficial.

      Para construir o exemplo você tem duas opções:

      1. Use docker e imagens de docker prontas para uso
      2. Instale o SDK e a cadeia de ferramentas em seu computador

      Usando o Docker

      Isso é mais simples e acredito que seja a melhor maneira. As imagens do docker do Cesanta contêm tudo o que você precisa para construir o Mongoose for ESP (e não apenas o Mongoose - qualquer aplicativo ESP). Portanto, você não precisa instalar nada localmente e pode facilmente compartilhar seu código com amigos e colegas para que eles possam construir seu firmware e obter exatamente o mesmo resultado.

      O guia de instalação do docker está disponível aqui. Tente, é muito simples, você só precisa adicionar o repositório docker ao seu Linux e instalá-lo como um programa normal com apt.

      Depois que o docker estiver instalado, vá para a pasta mongoose/examples/ESP8266_RTOS e execute build.sh

      Na primeira janela de encaixe de compilação, será feito o download da imagem necessária. Pode demorar um pouco, dependendo do seu canal de internet. Mas, assim que o build.sh for concluído na pasta ./bin, você encontrará dois arquivos .bin.

      Esse é o firmware. Você fez isso!

      Usando o SDK local

      Se o docker for muito simples para você ou por qualquer motivo você deseja usar ferramentas instaladas localmente, você também pode fazer isso.

      É um pouco mais difícil e chato, mas nada muito complicado. Principalmente porque a Cesanta construiu algumas ferramentas para você e você não precisa criá-las a partir do código-fonte.

      É assim que funciona:

      1. Clone ESP RTOS SDK deste repositório. O makefile de exemplo o procura na pasta /opt/ESP8266_RTOS_SDK, portanto, você pode colocar um repositório clonado nessa pasta ou modificar o caminho para ele antes de criar o exemplo (veja abaixo).
      2. Baixe xtensa-lx106-elf.tar.bz2 desta pasta pública.
      3. Descompacte o arquivo xtensa-lx106-elf.tar.bz2. Por exemplo, para a pasta /opt:

        sudo tar -xvf xtensa-lx106-elf.tar.bz2 -C /opt

      4. Modifique sua variável PATH, por exemplo, se você descompactou a cadeia de ferramentas para a pasta /opt, use o seguinte comando:

        export PATH=/opt/xtensa-lx106- elf/bin:PATH

      (também recomendo adicionar este comando às suas pastas .bashrc ou .profile, para manter as alterações após a reinicialização do sistema)

      Agora execute:

      $ export SDK_PATH=/opt/ESP8266_RTOS_SDK  # Put your path to SDK here
      $ export BIN_PATH=./bin; mkdir ./bin
      $ make clean; make BOOT=none APP=0 SPI_SPEED=40 SPI_MODE=dio SPI_SIZE_MAP=0

      E agora, se tudo estiver instalado corretamente, você terá o firmware na pasta ./bin

      Você fez de novo!

      ESP piscando

      Existem muitas ferramentas disponíveis para atualizar o ESP8266. Vamos usar esptool. Para usá-lo, clone este repositório e adicione o caminho para esptool.py em sua variável PATH (isso é opcional e apenas conveniente).

      Agora, desconecte o picocom, se ainda estiver conectado (Dica: pressione Ctrl+A; Ctrl+D para sair dele) e execute:

      esptool.py --port /dev/ttyUSB0 --baud 230400 \
         write_flash --flash_mode=dio --flash_size=4m \
         0x00000 ${BIN_PATH}/eagle.flash.bin \
         0x20000 ${BIN_PATH}/eagle.irom0text.bin \
         0x7e000 ${SDK_PATH}/bin/esp_init_data_default.bin

      Nota importante: se o seu módulo não for um NodeMCU, você precisa aterrar o GPIO0 antes de piscar (o aterramento do GPIO0 muda o módulo para o modo intermitente). Depois de piscar, desconecte o GPIO0 do terra e reinicie o ESP.

      Se nenhum erro ocorreu, você verá a saída como esta:

      Connecting...

      Erasing flash...

      Took 0.58s to erase flash block

      Wrote 35840 bytes at 0x00000000 in 1.8 seconds (157.5 kbit/s)...

      Erasing flash...

      Took 2.02s to erase flash block

      Wrote 301056 bytes at 0x00020000 in 15.4 seconds (156.7 kbit/s)...

      Erasing flash...

      Took 0.11s to erase flash block

      Wrote 1024 bytes at 0x0007e000 in 0.1 seconds (163.5 kbit/s)...

      Leaving…

      Preparar! Agora o dispositivo é atualizado com o seu firmware.

      primeiros resultados

      Agora você deve ver uma rede WiFi \Mongoose aparecer. O exemplo configura um AP. Use a senha \Mongoose para se conectar, navegue até http://192.168.4.1/ e você verá um \Olá, mundo” página de saudação.

      Parabéns! Você acabou de rodar o Web Server no ESP8266!

      Próximos passos

      Os próximos passos dependem de você. Você pode usar o exemplo descrito como ponto de partida.

      Olhe para seu arquivo user_main.c . Ele configura um ponto de acesso WiFi e inicia o servidor web. Você pode alterar facilmente o modo AP para um modo de estação (e conectar-se à sua rede WiFi) e usar a API do Mongoose para implementar o que quiser. Esta é uma maneira comum de usar o Mongoose, portanto, você pode usar outro exemplo do Mongoose para criar seu programa e ter http, tcp, udp, mqtt e mais mais recursos em seu dispositivo ESP.

      Use documentos do Espressif (por exemplo, documentação para descobrir recursos do Mongoose.

      O punk não está morto!