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)
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.
- https://cmake.org/download/
C:\Program Files\CMake\bin para variáveis de ambiente - https://developer.arm.com/open-source/gnu-toolchain/gnu-rm
C:\Program Files (x86)\Arm GNU Toolchain arm-none-eabi\12.2 mpacbti-bet1\bin para variáveis de ambiente
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)
$ 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
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 }, \
}, \
DÚVIDAS
suporte@smartcore.com.br
REFERÊNCIAS
zephyrproject-rtos/loramac-node: Zephyr repository tracking https://github.com/Lora-net/LoRaMac-node
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.
Nenhum comentário:
Postar um comentário