terça-feira, 1 de novembro de 2022

LOM204A - Programando com Zephyr RTOS

 

BETA 

O objetivo deste BLOG é demonstrar como é possível utilizar o Zephyr para programação do WISOL LOM204. Foi utilizado o Starter Kit LOM204 para o teste. O exemplo permitirá via linha de comandos o acesso à rede LoRaWAN e então será enviado um texto "HELLO" via OTA, AU915, ao servidor LoRaWAN CHIRPSTACK.

Baseado no B-L072Z-LRWAN1

Testado no MYS2 (Linux no Windows)

Módulo


O que é o MSYS2


O MSYS2 é uma coleção de ferramentas e bibliotecas que fornecem um ambiente fácil de usar para construir, instalar e executar software nativo do Windows.

Ele consiste em um terminal de linha de comando chamado mintty, bash, sistemas de controle de versão como git e subversion, ferramentas como tar e awk e até mesmo sistemas de construção como autotools, todos baseados em uma versão modificada do Cygwin. Apesar de algumas dessas partes centrais serem baseadas no Cygwin, o foco principal do MSYS2 é fornecer um ambiente de compilação para software nativo do Windows e as partes que usam Cygwin são mantidas no mínimo. O MSYS2 fornece compilações nativas atualizadas para GCC, mingw-w64, CPython, CMake, Meson, OpenSSL, FFmpeg, Rust, Ruby, apenas para citar alguns.

O que é ChirpStack
ChirpStack é um Servidor de Rede LoRaWAN de código aberto que pode ser usado para configurar redes LoRaWAN. O ChirpStack fornece uma interface web para o gerenciamento de gateways, dispositivos e inquilinos, bem como para configurar integrações de dados com os principais provedores de nuvem, bancos de dados e serviços comumente usados para lidar com dados de dispositivos. O ChirpStack fornece uma API baseada em gRPC que pode ser usada para integrar ou estender o ChirpStack.
ZEPHYR
O que é Zephyr

O sistema operacional Zephyr é baseado em um kernel de pequena dimensão projetado para uso em sistemas com recursos restritos e embarcados: de sensores ambientais incorporados simples e wearables de LED a sofisticados controladores embarcados, relógios inteligentes e aplicativos sem fio IoT.

O Projeto Zephyr RTOS é um esforço recente da Fundação Linux para fornecer ao mundo embarcado um Sistema Operacional em Tempo Real gratuito, seguro e completo. Ele foi projetado desde o início para ser um RTOS moderno, escalável, seguro e responsivo com um foco claro em protocolos e fundações de IoT. Este RTOS de código aberto é licenciado pelo Apache 2.0 e possui um modelo de desenvolvimento totalmente aberto

LOM204A e o Zephyr

Como o módulo LOM204A é baseado no chip STM32L0 (CPU), será possível rodar o Zephyr sem problemas. O usuário deve dar atenção ao mapeamento de GPIOS de acesso ao SX1276 (Semtech LoRa).

C:\msys64\home\Usuario\loramac-node\src\boards

O link abaixo, é roteiro Básico para que você possa preparar o ambiente para programar o LOM204, sobre o MSYS2.
http://www.msys2.org/
Siga as instruções de instalação fornecidas por eles.
Instale o "MinGW Make com"
pacman -S mingw-w64-x86_64-make



Nota: Certifique-se de que ambos os caminhos sejam adicionados à variável PATH do sistema. Adicionar, por exemplo: C:\msys64\mingw64\bin e C:\Program Files (x86)\Arm GNU Toolchain arm-none-eabi\12.2 mpacbti-bet1\bin para a variável Path
  • Também dentro do MSYS2 instale Ninja Build (similar ao Make)
      pacman -S mingw-w64-x86_64-{toolchain,cmake,ninja}



  • Baixe o projeto LoRaMAC (dos exemplos do Zephyr)
$ git clone https://github.com/lora-net/loramac-node.git loramac-node
$ cd 
loramac-node
$   git submodule update --init
$ mkdir build
$ cd src

Cole o texto abaixo e dê um Enter, permitindo gerar uma arquivos para o Ninja

cmake -DCMAKE_BUILD_TYPE=Release \
        -DTOOLCHAIN_PREFIX="C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/12.2 mpacbti-bet1" \
        -DCMAKE_TOOLCHAIN_FILE="../cmake/toolchain-arm-none-eabi.cmake" \
        -DAPPLICATION="LoRaMac" \
        -DSUB_PROJECT="periodic-uplink-lpp" \
        -DCLASSB_ENABLED="ON" \
        -DACTIVE_REGION="LORAMAC_REGION_AU915" \
        -DREGION_EU868="OFF" \
        -DREGION_US915="OFF" \
        -DREGION_CN779="OFF" \
        -DREGION_EU433="OFF" \
        -DREGION_AU915="ON" \
        -DREGION_AS923="OFF" \
        -DREGION_CN470="OFF" \
        -DREGION_KR920="OFF" \
        -DREGION_IN865="OFF" \
        -DREGION_RU864="OFF" \
        -DBOARD="B-L072Z-LRWAN1" \
        -DMBED_RADIO_SHIELD="SX1276MB1MAS" \
        -DSECURE_ELEMENT_PRE_PROVISIONED="ON" \
        -DUSE_RADIO_DEBUG="OFF" \
-DSECURE_ELEMENT="SOFT_SE" \
-DLORAWAN_DEFAULT_CLASS="CLASS_A"


Faça o Build com Ninja


Configuração do aplicativo do LOM204A
Antes de criar o aplicativo e ingressar em uma rede LoRaWAN, você precisa de uma conta em um provedor de back-end LoRaWAN. Em seguida, crie um aplicativo LoRaWAN e registre seu dispositivo. Como este aplicativo foi fortemente testado com o backend fornecido pelo CHIRPSTACK. Assim que seu aplicativo e dispositivo forem criados e registrados, você terá várias informações (fornecidas pelo provedor LoRaWAN).
Assim que seu aplicativo e dispositivo forem criados e registrados, você terá várias informações fornecidas pelo provedor LoRaWAN:
  • O tipo de procedimento de JOIN: ABP (Ativação por personalização) ou OTAA (Ativação Over The Air) 
  • O dispositivo EUI: uma matriz de 8 bytes 
  • A aplicação EUI: uma matriz de 8 bytes 
  • A chave do aplicativo: uma matriz de 16 bytes 
  • O endereço do dispositivo: uma matriz de 4 bytes, necessária apenas com o procedimento de junção ABP 
  • A chave de sessão do aplicativo: uma matriz de 16 bytes, necessária apenas com o procedimento de junção ABP 
  • A chave de sessão de rede: uma matriz de 16 bytes, necessária apenas com o procedimento de junção ABP 
  • Depois de obter essas informações, edite o Makefile adequadamente ou use os comandos set/get no shell do aplicativo de teste.
Editando arquivos para gerar o APP

Configurando GPIOS para ser compatível com LOM204A

Em board-config.h (loramac-node\src\boards\B-L072Z-LRWAN1) altere

/*! * \file board-config.h * * \brief Board configuration * * \copyright Revised BSD License, see section \ref LICENSE. * * \code * ______ _ * / _____) _ | | * ( (____ _____ ____ _| |_ _____ ____| |__ * \____ \| ___ | (_ _) ___ |/ ___) _ \ * _____) ) ____| | | || |_| ____( (___| | | | * (______/|_____)_|_|_| \__)_____)\____)_| |_| * (C)2013-2017 Semtech * * ___ _____ _ ___ _ _____ ___ ___ ___ ___ * / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __| * \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _| * |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___| * embedded.connectivity.solutions=============== * * \endcode * * \author Miguel Luis ( Semtech ) * * \author Gregory Cristian ( Semtech ) * * \author Daniel Jaeckle ( STACKFORCE ) * * \author Johannes Bruder ( STACKFORCE ) */ #ifndef __BOARD_CONFIG_H__ #define __BOARD_CONFIG_H__ #ifdef __cplusplus extern "C" { #endif /*! * Defines the time required for the TCXO to wakeup [ms]. */ #define BOARD_TCXO_WAKEUP_TIME 5 /*! * Board MCU pins definitions */ #define RADIO_RESET PA_8 #define RADIO_MOSI PA_7 #define RADIO_MISO PA_6 #define RADIO_SCLK PA_5 #define RADIO_NSS PA_4 #define RADIO_DIO_0 PA_12 #define RADIO_DIO_1 PB_2 #define RADIO_DIO_2 PB_5 #define RADIO_DIO_3 PB_0 #define RADIO_DIO_4 PA_11 //#define RADIO_DIO_5 PA_4 #define RADIO_TCXO_POWER PB_1 #define RADIO_ANT_SWITCH_RX PA_15 #define RADIO_ANT_SWITCH_TX_BOOST PC_1 #define RADIO_ANT_SWITCH_TX_RFO PC_2 //#define LED_1 PB_5 //#define LED_2 PA_5 //#define LED_3 PB_6 //#define LED_4 PB_7 //#define LED_GREEN LED_1 //#define LED_RED1 LED_2 //#define LED_BLUE LED_3 //#define LED_RED2 LED_4 //#define BTN_1 PB_2 #define OSC_LSE_IN PC_14 #define OSC_LSE_OUT PC_15 #define OSC_HSE_IN PH_0 #define OSC_HSE_OUT PH_1 #define SWCLK PA_14 #define SWDAT PA_13 #define I2C_SCL PB_8 #define I2C_SDA PB_9 #define UART_TX PA_2 #define UART_RX PA_3 // Debug pins definition. #define RADIO_DBG_PIN_TX PB_13 #define RADIO_DBG_PIN_RX PB_14 #ifdef __cplusplus } #endif #endif // __BOARD_CONFIG_H__

Em board.c(loramac-node\src\boards\B-L072Z-LRWAN1), comente os acessos às GPIOS, pois não serão utilizados no exemplo LoRaMAC

void BoardInitMcu( void ) { if( McuInitialized == false ) { HAL_Init( ); // LEDs //GpioInit( &Led1, LED_1, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 1 ); //GpioInit( &Led2, LED_2, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 1 ); //GpioInit( &Led3, LED_3, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 1 ); //GpioInit( &Led4, LED_4, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 1 ); SystemClockConfig( ); UsbIsConnected = true; FifoInit( &Uart2.FifoTx, Uart2TxBuffer, UART2_FIFO_TX_SIZE ); FifoInit( &Uart2.FifoRx, Uart2RxBuffer, UART2_FIFO_RX_SIZE ); // Configure your terminal for 8 Bits data (7 data bit + 1 parity bit), no parity and no flow ctrl UartInit( &Uart2, UART_2, UART_TX, UART_RX ); UartConfig( &Uart2, RX_TX, 921600, UART_8_BIT, UART_1_STOP_BIT, NO_PARITY, NO_FLOW_CTRL ); RtcInit( ); //GpioWrite( &Led1, 0 ); //GpioWrite( &Led2, 0 ); //GpioWrite( &Led3, 0 ); //GpioWrite( &Led4, 0 );

Em main.c (loramac-node-zephyr\src\apps\LoRaMac\periodic-uplink-lpp\B-L072Z-LRWAN1) comente os acessos de escrita às GPIOS

//GpioWrite
e adicione (ver Issue no final)
#include "RegionBaseUS.c"

Em sx1276-board.c(loramac-node\src\boards\B-L072Z-LRWAN1) comente
void SX1276IoInit( void )
{
GpioInit( &SX1276.Spi.Nss, RADIO_NSS, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 1 );
GpioInit( &SX1276.DIO0, RADIO_DIO_0, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &SX1276.DIO1, RADIO_DIO_1, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &SX1276.DIO2, RADIO_DIO_2, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &SX1276.DIO3, RADIO_DIO_3, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &SX1276.DIO4, RADIO_DIO_4, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
//GpioInit( &SX1276.DIO5, RADIO_DIO_5, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
}
void SX1276IoIrqInit( DioIrqHandler **irqHandlers )
{
GpioSetInterrupt( &SX1276.DIO0, IRQ_RISING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[0] );
GpioSetInterrupt( &SX1276.DIO1, IRQ_RISING_FALLING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[1] );
GpioSetInterrupt( &SX1276.DIO2, IRQ_RISING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[2] );
GpioSetInterrupt( &SX1276.DIO3, IRQ_RISING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[3] );
GpioSetInterrupt( &SX1276.DIO4, IRQ_RISING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[4] );
//GpioSetInterrupt( &SX1276.DIO5, IRQ_RISING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[5] );
}
void SX1276IoDeInit( void )
{
GpioInit( &SX1276.Spi.Nss, RADIO_NSS, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 1 );
GpioInit( &SX1276.DIO0, RADIO_DIO_0, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &SX1276.DIO1, RADIO_DIO_1, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &SX1276.DIO2, RADIO_DIO_2, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &SX1276.DIO3, RADIO_DIO_3, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &SX1276.DIO4, RADIO_DIO_4, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
//GpioInit( &SX1276.DIO5, RADIO_DIO_5, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
}
Em REGION_AU915.C (loramac\src\mac\region) (SUB-Bands) altere



void RegionAU915InitDefaults( InitDefaultsParams_t* params ) { Band_t bands[AU915_MAX_NB_BANDS] = { AU915_BAND0 }; switch( params->Type ) { case INIT_TYPE_DEFAULTS: { if( ( params->NvmGroup1 == NULL ) || ( params->NvmGroup2 == NULL ) ) { return; } RegionNvmGroup1 = (RegionNvmDataGroup1_t*) params->NvmGroup1; RegionNvmGroup2 = (RegionNvmDataGroup2_t*) params->NvmGroup2; RegionBands = (Band_t*) params->Bands; // Initialize 8 bit channel groups index RegionNvmGroup1->JoinChannelGroupsCurrentIndex = 0; // Initialize the join trials counter RegionNvmGroup1->JoinTrialsCounter = 0; // Default bands memcpy1( ( uint8_t* )RegionBands, ( uint8_t* )bands, sizeof( Band_t ) * AU915_MAX_NB_BANDS ); // Channels for( uint8_t i = 0; i < AU915_MAX_NB_CHANNELS - 8; i++ ) { // 125 kHz channels RegionNvmGroup2->Channels[i].Frequency = 915200000 + i * 200000; RegionNvmGroup2->Channels[i].DrRange.Value = ( DR_5 << 4 ) | DR_0; RegionNvmGroup2->Channels[i].Band = 0; } for( uint8_t i = AU915_MAX_NB_CHANNELS - 8; i < AU915_MAX_NB_CHANNELS; i++ ) { // 500 kHz channels RegionNvmGroup2->Channels[i].Frequency = 915900000 + ( i - ( AU915_MAX_NB_CHANNELS - 8 ) ) * 1600000; RegionNvmGroup2->Channels[i].DrRange.Value = ( DR_6 << 4 ) | DR_6; RegionNvmGroup2->Channels[i].Band = 0; } // Initialize channels default mask RegionNvmGroup2->ChannelsDefaultMask[0] = 0xFF00; RegionNvmGroup2->ChannelsDefaultMask[1] = 0x0000; RegionNvmGroup2->ChannelsDefaultMask[2] = 0x0000; RegionNvmGroup2->ChannelsDefaultMask[3] = 0x0000; RegionNvmGroup2->ChannelsDefaultMask[4] = 0x0000; RegionNvmGroup2->ChannelsDefaultMask[5] = 0x0000; // Copy channels default mask RegionCommonChanMaskCopy( RegionNvmGroup2->ChannelsMask, RegionNvmGroup2->ChannelsDefaultMask, CHANNELS_MASK_SIZE ); // Copy into channels mask remaining RegionCommonChanMaskCopy( RegionNvmGroup1->ChannelsMaskRemaining, RegionNvmGroup2->ChannelsMask, CHANNELS_MASK_SIZE ); break; } case INIT_TYPE_RESET_TO_DEFAULT_CHANNELS: { // Intentional fallthrough } case INIT_TYPE_ACTIVATE_DEFAULT_CHANNELS: { // Copy channels default mask RegionCommonChanMaskCopy( RegionNvmGroup2->ChannelsMask, RegionNvmGroup2->ChannelsDefaultMask, CHANNELS_MASK_SIZE ); for( uint8_t i = 0; i < CHANNELS_MASK_SIZE; i++ ) { // Copy-And the channels mask RegionNvmGroup1->ChannelsMaskRemaining[i] &= RegionNvmGroup2->ChannelsMask[i]; } break; } default: { break; } } }














Na pasta
Na pasta C:\msys64\home\Usuario\loramac-node\src\apps\LoRaMac
será gerado o LoRaMac-periodic-uplink-lpp.bin

Utilize STM32 PROGRAMMER para gravar


Abra o Emulador de Terminal

PA2 e PA3 do LOM204
  • Acesse CHIRPSTACK e pegue as credenciais
Em se-identity.h (loramac-node\src\peripherals\soft-se) altere
/*!
* end-device IEEE EUI (big endian)
*/
#define LORAWAN_DEVICE_EUI { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
/*!
* App/Join server IEEE EUI (big endian)
*/
#define LORAWAN_JOIN_EUI { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
.
#define SOFT_SE_KEY_LIST                                                                                            \
    {                                                                                                               \
        {                                                                                                           \
            /*!                                                                                                     \
             * Application root key                                                                                 \
             * WARNING: FOR 1.0.x DEVICES IT IS THE \ref LORAWAN_GEN_APP_KEY                                        \
             */                                                                                                     \
            .KeyID    = APP_KEY,                                                                                    \
            .KeyValue = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                                                                                   \
        },                                                                                                          \
Enviando um HELLO



Downlink


DÚVIDAS

suporte@smartcore.com.br

REFERÊNCIAS


Atenção:

Mani-Sadhasivam added a commit to Mani-Sadhasivam/zephyr that referenced this issue on 11 Oct 2021
These 2 regions depends on the RegionBaseUS.c file.

Fixes: zephyrproject-rtos#39297

Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>

Sobre a SMARTCORE

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.
Nosso portifó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