quinta-feira, 29 de setembro de 2022

Programando u-blox NINA-W106 com NuttX/WOKIWI - Network Support - WIFI

Programando u-blox NINA-W106 com NuttX/WOKIWI - Network Support - WIFI


O objetivo deste BLOG é demonstrar como é possível utilizar o NuttX para programação do U-BLOX NINA W106. Foi utilizado o BREAKOUT U-BLOX NINA W106 para o teste. O exemplo abrirá um terminal para interagir com o NuttX e iniciar acesso permitir acesso à Rede (modo cliente).


NuttX

NuttX: O sistema operacional para a Internet das Coisas.

NuttX é um sistema operacional em tempo real (RTOS) com ênfase na conformidade de padrões e pequeno footprint. Escaláveis de ambientes de microcontroladores de 8 bits a 64 bits (RISC-V 64 e AMD64) os principais padrões que governam o NuttX são os padrões POSIX e ANSI. APIs padrão adicionais do Unix e de outros RTOS comuns (como o VxWorks) são adotadas para funcionalidades não disponíveis sob esses padrões, ou para funcionalidades que não são apropriadas para ambientes profundamente incorporados (como fork()).

O NuttX busca alcançar um alto grau de conformidade de padrões.  APIs padrão adicionais do Unix e de outros RTOS comuns são adotadas para funcionalidades não disponíveis sob esses padrões ou para funcionalidades que não são apropriadas para os RTOS profundamente incorporados (como fork()).

Devido a essa conformidade de padrões, o software desenvolvido para outros OSes padrão (como o Linux, MacOS, FreeBSD,etc) deve ser portado facilmente para NuttX.

Tempo Real Totalmente preemptivo; prioridade fixa, round-robin, e agendamento "esporádico".

Licença Apache não restritiva totalmente aberta.

GNU Toolchains Compatíveis com as cadeias de ferramentas GNU baseadas no buildroot disponível para download para fornecer um ambiente completo de desenvolvimento para muitas arquiteturas.

Uri Shaked

Best  Simulator

Wokwi é um simulador de eletrônica online. Você pode usá-lo para simular Arduino, ESP32 e muitas outras placas além de componentes e sensores populares como LEDs, shift registers, Buzzer, sensores (ultrassônico, temperatura, umidade etc), Display TFT, teclados e muito mais.

Pode carregar BIN ou HEX gerados de terceiros, no caso NuttX.

Você pode aprender programação NuttX no simulador do ESP32 onde quer que esteja. sem ter a necessidade de dispor de um Hardware real.

UBLOX NINA W106
Wi-Fi 802.11b/g/n
Dual-Mode Bluetooth v4.2
Poderoso suporte de CPU aberta para aplicativos personalizados
Tamanho pequeno e várias opções de antena
Pino compatível com outros módulos NINA
Certificação global
Super Pequena
Módulo baseado no ESP32, com 4MB FLASH
HOMOLOGADO PELA ANATEL

U-BLOX NINA W106 E NuttX

Como o módulo U-BLOX NINA W106 é baseado no chip ESP32 (CPU), será possível rodar o Nuttx sem problemas. 


CRIANDO AMBIENTE DE PROGRAMAÇÃO NuttX

O link abaixo, é roteiro Básico para que você possa preparar o ambiente para programar o U-BLOX NINA W106 com o NuttX


    Dependências
$sudo apt install \
bison flex gettext texinfo libncurses5-dev libncursesw5-dev \
gperf automake libtool pkg-config build-essential gperf genromfs \
libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev \
libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux
Nota 1: O NuttX utiliza um sistema de build semelhante ao do Kernel do Linux (https://www.kernel.org/doc/html/latest/kbuild/index.html). Ele utiliza o kconfig-frontends como seu sistema de configuração. O repositório tools.git é utilizado para instalar este pacote. Porém se você estiver usando o Ubuntu 19.10 ou mais recente, estas distribuições já contém o pacote, mas de qualquer forma, instale.

$ sudo apt-get install kconfig-frontends


Nota 2: Outra dependência para o processo do NuttX com o ESP32 é o ESP-IDF (Espressif IoT Development Framework). Este framework é nativo do ESP e mantido pela Espressif. Ele compreende um conjunto de códigos como drivers, APIs, scripts, ferramental para compilar e fazer upload do firmware e o FreeRTOS customizado. Neste ponto, uma observação conceitual é muito importante, o NuttX não usa o FreeRTOS em nenhuma camada interna, apenas algumas ferramentas auxiliares que compõem o IDF serão utilizadas para geração do binário e gravação.
Download do NuttX
$ mkdir nuttx
$ cd nuttx
$ git clone https://github.com/apache/incubator-nuttx.git nuttx
$ git clone https://github.com/apache/incubator-nuttx-apps apps
O Ubuntu e o Debian ainda fornecem o Python 2.7 como o interpretador padrão, mas alguns 
pacotes necessários podem estar faltando para distribuições mais recentes. Python 3 é
recomendado e pode ser instalado da seguinte maneira:
 
$ sudo apt-get install python3 python3-pip python3-setuptool sudo update-alternatives --install /usr/bin/python python /usr/bin/python3
 Instale agora o ESP-IDF (ESP32 TOOLS, LIBS, ETC) manualmente
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/linux-setup.html
(ESP-IDF) extrair

osboxes@osboxes:~$ cd esp/
osboxes@osboxes:~/esp$ cd esp-idf/
osboxes@osboxes:~/esp/esp-idf$ ./install.sh
Detecting the Python interpreter
Checking "python" ...
/home/osboxes/esp/esp-idf/tools/detect_python.sh: line 16: python: command not found
Checking "python3" ...
Python 3.8.5
"python3" has been detected
Installing ESP-IDF tools
Installing tools: xtensa-esp32-elf, xtensa-esp32s2-elf, xtensa-esp32s3-elf, riscv32-esp-elf, esp32ulp-elf, esp32s2ulp-elf, openocd-esp32
Installing xtensa-esp32-elf@esp-2020r3-8.4.0
Downloading xtensa-esp32-elf-gcc8_4_0-esp-2020r3-linux-amd64.tar.gz to /home/osboxes/.espressif/dist/xtensa-esp32-elf-gcc8_4_0-esp-2020r3-linux-amd64.tar.gz.tmp
Done
Extracting /home/osboxes/.espressif/dist/xtensa-esp32-elf-gcc8_4_0-esp-2020r3-linux-amd64.tar.gz to /home/osboxes/.espressif/tools/xtensa-esp32-elf/esp-2020r3-8.4.0
Installing xtensa-esp32s2-elf@esp-2020r3-8.4.0
Downloading xtensa-esp32s2-elf-gcc8_4_0-esp-2020r3-linux-amd64.tar.gz to /home/osboxes/.espressif/dist/xtensa-esp32s2-elf-gcc8_4_0-esp-2020r3-linux-amd64.tar.gz.tmp
Done
.
.
.
 $ cd nuttx
$ make -C tools/esp32/ ${HOME}/esp/esp-idf
Após a instalação do IDF, ou caso já possua o IDF instalado, execute o
seguinte comando para ativar o ambiente virtual que foi configurado na
instalação. Sempre que for realizar o build do NuttX, será necessário
ativar este ambiente.
$. ${HOME}/esp/esp-idf/export.sh
No presente momento, o NuttX utiliza 2 binários gerados através do
IDF: o bootloader e a tabela de partição. Ainda dentro do diretório
nuttx/, faça o download destes binários pré configurados:
$ wget -O bootloader.bin https://github.com/saramonteiro/esp32_binaries_nuttx/blob/main/bootloader.bin?raw=true
$ wget -O partitions.bin https://github.com/saramonteiro/esp32_binaries_nuttx/blob/main/partitions.bin?raw=true

Mantenha-se no diretório do NuttX e execute o script de configuração para criar um arquivo de configuração para o U-BLOX NINA W106. 

$ make distclean
$ ./tools/configure.sh esp32-devkitc:nsh 

Finalmente, faça o build e confirme em seguida que o firmware binário foi gerado:
$ make
osboxes@osboxes:~/nuttx/nuttx$ make
Create .version
Create version.h
LN: include/arch/board to /home/osboxes/nuttx/nuttx/boards/xtensa/esp32/esp32-devkitc/include
make[1]: Entering directory '/home/osboxes/nuttx/nuttx/libs/libxx'
make[1]: Leaving directory '/home/osboxes/nuttx/nuttx/libs/libxx'
make[1]: Nothing to be done for 'dirlinks'. make[1]: Entering directory '/home/osboxes/nuttx/nuttx/boards'
make[1]: Entering directory '/home/osboxes/nuttx/nuttx/openamp'
make[1]: Nothing to be done for 'dirlinks'. make[1]: Leaving directory '/home/osboxes/nuttx/nuttx/boards' make[1]: Nothing to be done for 'dirlinks'.
make[2]: Entering directory '/home/osboxes/nuttx/apps/platform'
make[1]: Leaving directory '/home/osboxes/nuttx/nuttx/openamp' make[1]: Entering directory '/home/osboxes/nuttx/apps' LN: platform/board to /home/osboxes/nuttx/apps/platform/dummy
make[2]: Entering directory '/home/osboxes/nuttx/nuttx/boards/xtensa/esp32/common'
make[2]: Leaving directory '/home/osboxes/nuttx/apps/platform' make[1]: Leaving directory '/home/osboxes/nuttx/apps' make[1]: Entering directory '/home/osboxes/nuttx/nuttx/boards' make[2]: Nothing to be done for 'context'.
make[1]: Nothing to be done for 'context'.
make[2]: Leaving directory '/home/osboxes/nuttx/nuttx/boards/xtensa/esp32/common' make[1]: Leaving directory '/home/osboxes/nuttx/nuttx/boards' make[1]: Entering directory '/home/osboxes/nuttx/nuttx/fs' make[1]: Leaving directory '/home/osboxes/nuttx/nuttx/fs'
make[2]: Entering directory '/home/osboxes/nuttx/apps'
make[1]: Entering directory '/home/osboxes/nuttx/apps'
.
.
.
make[3]: Leaving directory '/home/osboxes/nuttx/apps/system/readline'
make[2]: Leaving directory '/home/osboxes/nuttx/apps'
IN: /home/osboxes/nuttx/apps/libapps.a -> staging/libapps.a
make[1]: Leaving directory '/home/osboxes/nuttx/apps'
make[1]: Leaving directory '/home/osboxes/nuttx/nuttx/fs'
make[1]: Entering directory '/home/osboxes/nuttx/nuttx/fs' make[1]: 'libfs.a' is up to date.
make[1]: Leaving directory '/home/osboxes/nuttx/nuttx/binfmt'
make[1]: Entering directory '/home/osboxes/nuttx/nuttx/binfmt' make[1]: 'libbinfmt.a' is up to date.
make[2]: 'libboard.a' is up to date.
make[1]: Entering directory '/home/osboxes/nuttx/nuttx/arch/xtensa/src' make[2]: Entering directory '/home/osboxes/nuttx/nuttx/boards/xtensa/esp32/common'
CP: nuttx.hex
make[2]: Leaving directory '/home/osboxes/nuttx/nuttx/boards/xtensa/esp32/common' LD: nuttx make[1]: Leaving directory '/home/osboxes/nuttx/nuttx/arch/xtensa/src' CP: nuttx.bin
osboxes@osboxes:~/nuttx/nuttx$

**Este binário não tem os cabeçalhos com as informações que o bootloader do ESP32 espera encontrar, então ele deve ser removido:

$ rm nuttx.bin

E um novo binário deverá ser gerado a partir do arquivo ELF chamado “nuttx”. Para isso, é necessário usar o script esptool.py para gerar este arquivo:

esptool.py --chip esp32 elf2image --flash_mode dio --flash_size 4MB -o ./nuttx.bin nuttx

$ make menuconfig
.config - NuttX/x86_64 Configuration
────────────────────────────────────────────────────────────────────────────────────
┌───────────────────────── NuttX/x86_64 Configuration ──────────────────────────
Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
submenus ----). Highlighted letters are hotkeys. Pressing <Y> includes, │
<N> excludes, <M> modularizes features. Press <Esc><Esc> to exit, <?> for │
Help, </> for Search. Legend: [*] built-in [ ] excluded <M> module < > │
┌───────────────────────────────────────────────────────────────────────────
Build Setup --->
System Type --->
Board Selection --->
RTOS Features --->
Device Drivers --->
│ Networking Support --->
Crypto API --->
File Systems --->
Graphics Support --->
│ Memory Management --->
Audio Support --->
Video Support --->
Wireless Support --->
Binary Loader --->
Library Routines --->
Open Asymmetric Multi Processing --->
Application Configuration --->
───────────────────────────────────────────────────────────────────────────┘
├───────────────────────────────────────────────────────────────────────────────
<Select> < Exit > < Help > < Save > < Load > │
───────────────────────────────────────────────────────────────────────────────┘

Make menuconfig customiza o que deseja adicionar/retirar na placa. Por exemplo, permite adicionar os drivers de um determinado periférico, adicionar mensagens de debug, etc.

Configurando Rede para o U-BLOX NINA W106
 
$ make distclean
$ ./tools/configure.sh esp32-devkitc:wapi
$ make menuconfig
* Library Routines
        * NETDB Support
            * DNS Name resolution
                * Target IPv4 Address
                    0xc0a80101                                               
  .config - NuttX/x86_64 Configuration
 → Library Routines → NETDB Support → DNS Name resolution ─────────────────────────────
  ┌────────────────────────────── DNS Name resolution ──────────────────────────────
    Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty         │  
    submenus ----).  Highlighted letters are hotkeys.  Pressing <Y> includes, <N>  │  
    excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help,   │  
    </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < > module    │  
   ┌─────────────────────────────────────────────────────────────────────────────  
   │    --- DNS Name resolution                                                    
   │    (8)   Number of DNS resolver entries                                       
   │    (32)  Max size of a cached hostname                                        
   │    (3600) Life of a DNS cache entry (seconds)                                 
   │    (256) Max response size                                                    
   │    (30)  DNS receive timeout                                                  
   │    (3)   Number of retries for DNS request                                    
   │    [ ]   DNS resolver file support                                            
   │    (1)     Max number of configured nameservers                               
  DNS server address type (IPv4 DNS server address)  --->            
  (0xc0a86401) Target IPv4 address                                           
                                                                                 
                                                                                 
                                                                                 
                                                                                 
                                                                                 
                                                                                 
                                                                                 
                                                                                 
                                                                                 
                                                                                 
  ─────────────────────────────────────────────────────────────────────────────┘  
  ├─────────────────────────────────────────────────────────────────────────────────  
              <Select>    < Exit >    < Help >    < Save >    < Load >             │  
  ─────────────────────────────────────────────────────────────────────────────────┘  

0xc0a86401 IP DO SEU GATEWAY
Salve 
Altere o arquivo src/driver_wext.c
Basicamente remova Key_len do corpo da função
salve e então execute o make
$make
Pediu para instalar o curl 
 osboxes@osboxes:~/nuttx/nuttx$ curl

Command 'curl' not found, but can be installed with:

sudo apt install curl

osboxes@osboxes:~/nuttx/nuttx$ sudo apt-get install curl
.
. 
$make     
.
.
make[2]: Leaving directory '/home/osboxes/nuttx/apps' make[1]: Leaving directory '/home/osboxes/nuttx/apps' make[1]: Entering directory '/home/osboxes/nuttx/nuttx/arch/xtensa/src' Downloading: ESP Wireless Drivers % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 178 100 178 0 0 294 0 --:--:-- --:--:-- --:--:-- 293 100 9971k 0 9971k 0 0 2799k 0 --:--:-- 0:00:03 --:--:-- 4066k Unpacking: ESP Wireless Drivers
.
.
ake[2]: Leaving directory '/home/osboxes/nuttx/nuttx/boards/xtensa/esp32/common' LD: nuttx make[1]: Leaving directory '/home/osboxes/nuttx/nuttx/arch/xtensa/src' CP: nuttx.hex CP: nuttx.bin MKIMAGE: ESP32 binary esptool.py -c esp32 elf2image -fs 4MB -fm dio -ff 40m -o nuttx.bin nuttx esptool.py v3.1-dev Merged 1 ELF section Generated: nuttx.bin (ESP32 compatible)
GRAVANDO
Após compilar, será gerado um BIN, o mesmo deve ser gravado no UBLOX NINA W106, via FLASHTOOLS, junto com 
partitions.bin e bootloader.bin.
Pode também ser utilizado o ESPTOOLS.
nsh>ifconfig wlan0 192.168.100.88 netmask 255.255.255.0
nsh>wapi psk wlan0 "xxxxxxxx" 1
nsh>wapi essid wlan0 "Andreia Oi Miguel 2.4G" 1
nsh>ifconfig
wlan0   Link encap:Ethernet HWaddr a4:cf:12:75:31:c8 at UP
        inet addr:192.168.100.88 DRaddr:192.168.100.1 Mask:255.255.255.0
Sem explicação, deves fazer ping para 8.8.8.8 antes




TESTANDO U-BLOX NINA W106 NO WOKWI

No WOKWI, crie e desenhe o projeto abaixo




ALTERANDO SKIN PARA U-BLOX NINA W106 NO WOKWI

  • Descompacte em alguma pasta qualquer.
  • Clique dentro do editor de código, pressione "F1" e escolha "Load custom board file..."
  • Selecione o diretório que contém os arquivos de definição do quadro (board.json e board.svg)
  • A  Skin vai ser carregada no wokwi. Verifique no console JavaScript do navegador para obter mensagens de erro.
  • Cole o seguinte código no arquivo diagram.json:
{
  "version": 1,
  "author": "Miguel Alexandre Wisintainer",
  "editor": "wokwi",
  "serialMonitor": { "display": "terminal" },
  "parts": [ { "id": "esp", "type": "wokwi-custom-board" } ],
  "connections": [ [ "esp:TX0", "$serialMonitor:RX", "" ], [ "esp:RX0", "$serialMonitor:TX", "" ] ]
}

Ficará assim


EXECUTANDO NO WOKWI

Como visto anteriormente, foi gerado um arquivo Nuttx.bin para ser gravado junto com outros dois arquivos (bootloader.bin e partitions.binno U-BLOX NINA W106. No caso do WOKWI, os três arquivos devem ser agregados e então gerar um único BIN, o qual deve ser simulado no U-BLOX NINA W106.

Para isto, deve ser baixado o utility escrito em Python: esp32_binary_merger, o mesmo pode ser baixado pelo GIT em 

Copie para a pasta deste utilitário os arquivos bootloader.bin/partitions.bin e sempre o Nuttx.bin gerado pela compilação do "APP" no NuttX.



Então execute o seguinte Script em Python

python3 merge_bin_esp.py --output_name app_output.bin --bin_path bootloader.bin nuttx.bin partitions.bin --bin_address 0x1000 0x10000 0x8000


Na pasta Output será gerado um arquivo para ser simulado no WOKWI, chamdo de app_output.bin


Clicando no "Sketch" (não se preocupe com o código em Arduino), pressione F1 e escolha LOAD HEX FILE AND SIMULATE e então COLE o BIN app_output.bin




Configurando WIFI

ifconfig wlan0 10.10.0.47 netmask 255.255.255.0
wapi psk wlan0 "" 0
wapi essid wlan0 "Wokwi-GUEST" 1
ifconfig



Em breve novos exemplos baseados em alguns destes sensores, atuadores e microcontroladores

wokwi-74hc165
wokwi-74hc595
wokwi-7segment
wokwi-a4988
wokwi-analog-joystick
wokwi-arduino-mega
wokwi-arduino-nano
wokwi-arduino-uno
wokwi-attiny85
wokwi-buzzer
wokwi-dht22
wokwi-dip-switch-8
wokwi-ds1307
wokwi-franzininho
wokwi-hc-sr04
wokwi-ili9341
wokwi-ir-receiver
wokwi-ir-remote
wokwi-ks2e-m-dc5 (relay)
wokwi-ky-040
wokwi-lcd1602
wokwi-lcd2004
wokwi-led
wokwi-led-bar-graph
wokwi-logic-analyzer
wokwi-max7219-matrix
wokwi-membrane-keypad
wokwi-microsd-card
wokwi-mpu6050
wokwi-nlsf595
wokwi-ntc-temperature-sensor
wokwi-photoresistor-sensor
wokwi-pi-pico
wokwi-pir-motion-sensor
wokwi-potentiometer
wokwi-pushbutton
wokwi-rgb-led
wokwi-resistor
wokwi-servo
wokwi-slide-potentiometer
wokwi-slide-switch
wokwi-stepper-motor
wokwi-tm1637-7segment
wokwi-tv

DÚVIDAS

suporte@smartcore.com.br

REFERÊNCIAS
 
Sobre a SMARTCORE

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.
Nosso portfólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.

Mais detalhes em www.smartcore.com.br 

Nenhum comentário:

Postar um comentário