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 (FSB1), ao servidor LoRaWAN CHIRPSTACK.
BETA - EM TESTES - APENAS PARA PROGRAMADORES COM ZEPHYR
Baseado no B-L072Z-LRWAN1
Ênfase em compilação no WSL2 e VirtualBox (Ubuntu)
O que é TTN
A Rede de Coisas (TTN) é uma iniciativa iniciada pela sociedade civil holandesa. O objetivo é ter redes LoRaWAN instaladas em todas as cidades do mundo. Ao interconectar essas redes locais, a TTN quer construir uma infra-estrutura mundial para facilitar uma Internet das Coisas (IoT) pública.A The Things Network (TTN) é o servidor IoT na nuvem utilizado nesse projeto. É um dos servidores gratuitos para LoRaWAN mais utilizados, com mais de 90 mil desenvolvedores, mais de 9 mil gateways de usuários conectados à rede ao redor do mundo e mais de 50 mil aplicações em funcionamento.A TTN comercializa "nós" e gateways LoRa e provê treinamento individual e coletivo para empresas e desenvolvedores que desejam utilizar o LoRa. Possui uma comunidade bem ativa nos fóruns, sempre colaborando e ajudando a resolver problemas, além de prover diversos meios de integrar a TTN com a aplicação que se deseja usar. Possui integração nativa com diversas aplicações como: Cayenne (utilizado nesse trabalho), Hypertext Transfer Protocol (HTTP), permitindo ao usuário realizar uplink para um gateway e receber downlink por HTTP, OpenSensors e EVRYTHNG . Caso o usuário queira criar sua própria aplicação, a TTN disponibiliza Application Programming Interface (API) para uso com Message Queuing Telemetry Transport (MQTT) e diversos Software Developer Kits (SDK) para uso com as linguagens Python, Java , Node.Js , NODE-RED e GoA rede TTN utiliza o protocolo LoRaWAN objetivando uma cobertura em longo alcance para os dispositivos da rede, caracterizando-a assim com uma Wide Area Network (WAN). Devido ao baixo consumo de energia e ao uso da tecnologia LoRa, é chamada de LPWAN (Low Power Wide Area Network). O grande diferencial da TTN é seu estabelecimento como uma rede aberta (open-source) e colaborativa (crowd-sourced), onde qualquer usuário pode contribuir instalando um gateway em sua residência.Os elementos da TTN são classificados como:• Endpoints (nós): Os dispositivos responsáveis pela camada de sensoriamento da rede, o endpoint LoRaWAN. Podem coletar informações através de sensores e também acionar dispositivos/máquinas via atuadores. São configurados através de uma das três classes distintas do protocolo LaRaWAN;• Gateways: Elementos responsáveis por concentrar e processar as informações enviadas pelos endpoints. Os gateways em geral estão conectados a internet, seja por WiFi/Ethernet ou 3G/4G em locais remotos. Mesmo que uma mesma rede LoRaWAN tenha diferentes objetivos, baseados em aplicações distintas, os gateways possuem o objetivo comum de fornecer a maior área de cobertura possível;• Aplicações: Conectar e interligar os diferentes dispositivos da rede TTN para o fornecimento de informações gerais sobre a coleta de dados dos dispositivos.
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 WSL2
$source ~/zephyrproject/.venv/bin/activate
Cmake muito antigo
cd ~
wget https://github.com/Kitware/CMake/releases/download/v3.21.1/cmake-3.21.1-Linux-x86_64.sh
chmod +x cmake-3.21.1-Linux-x86_64.sh
sudo ./cmake-3.21.1-Linux-x86_64.sh --skip-license --prefix=/usr/local
hash -rCompile Blynk para verificar instalação OKwest build -p always -b b_l072z_lrwan1 samples/basic/blinky
Compilacaocd /home/osboxes/zephyrproject/zephyr west build -p always -b b_l072z_lrwan1 samples/subsys/lorawan/class_a -p
.
.
-- The C compiler identification is GNU 12.1.0 -- The CXX compiler identification is GNU 12.1.0 -- The ASM compiler identification is GNU -- Found assembler: /home/osboxes/zephyr-sdk-0.15.1/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc -- Configuring done -- Generating done -- Build files have been written to: /home/osboxes/zephyrproject/zephyr/build -- west build: building application [1/171] Preparing syscall dependency handling [2/171] Generating include/generated/version.h -- Zephyr version: 3.2.99 (/home/osboxes/zephyrproject/zephyr), build: zephyr-v3.2.0-1267-g278120acb600 [161/171] Linking C executable zephyr/zephyr_pre0.elf [165/171] Linking C executable zephyr/zephyr_pre1.elf [171/171] Linking C executable zephyr/zephyr.elf Memory region Used Size Region Size %age Used FLASH: 74484 B 192 KB 37.88% RAM: 13944 B 20 KB 68.09% IDT_LIST: 0 GB 2 KB 0.00% (.venv) osboxes@osboxes:~/zephyrproject/zephyr$
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
Em
/home/osboxes/zephyrproject/zephyr/samples/subsys/lorawan/class_a/src
Altere main.c para as credenciais OTAA
* Customize based on network configuration */ #define LORAWAN_DEV_EUI { 0xDD, 0xEE, 0xAA, 0xDD, 0xBB, 0xEE,\ 0xEE, 0xFF } #define LORAWAN_JOIN_EUI { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ 0x00, 0x00 } #define LORAWAN_APP_KEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE,\ 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88,\ 0x09, 0xCF, 0x4F, 0x3C }Menuconfig (opcional)
/home/osboxes/zephyrproject/zephyr
west build -t menuconfig
(Top) Zephyr Kernel Configuration Devicetree Info ---- Modules ---> Board Selection (STMicroelectronics B-L072Z-LRWAN1 Discovery kit) ---> Board Options ---- SoC/CPU/Configuration Selection (STM32L0x Series MCU) ---> Hardware Configuration ---> ARM Options ---> General Architecture Options ---> -*- MPU features ---> -*- Assign appropriate permissions to kernel areas in SRAM [ ] Support code/data section relocation Floating Point Options ---- Cache Options ---- General Kernel Options ---> Device Options ---- Virtual Memory Support ---- Device Drivers ---> C Library ---> Additional libraries ---> Sub Systems and OS Services ---> Build and Link Features ---> Boot Options ---> Compatibility ---> [ ] Allow for the legacy include paths (without the zephyr/ prefix) (DEPRECATED) [Space/Enter] Toggle/enter [ESC] Leave menu [S] Save [O] Load [?] Symbol info [/] Jump to symbol [F] Toggle show-help mode [C] Toggle show-name mode [A] Toggle show-all mode [Q] Quit (prompts for save) [D] Save minimal config (advanced)
Em RegionAU915.c
/home/osboxes/zephyrproject/modules/lib/loramac-node/src/mac/region
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 (FSB2) 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; } }
}
Em
/home/osboxes/zephyrproject/zephyr/samples/subsys/lorawan/class_a
Altere prj.conf
CONFIG_LOG=y
CONFIG_SPI=y
CONFIG_PRINTK=y
CONFIG_SERIAL=y
CONFIG_LORA=y
CONFIG_LORA_SX12XX=y
CONFIG_LORA_LOG_LEVEL_DBG=y
CONFIG_LORA_SX127X=y
CONFIG_HAS_SEMTECH_RADIO_DRIVERS=y
CONFIG_HAS_SEMTECH_LORAMAC=y
CONFIG_LORAWAN=y
CONFIG_LORAMAC_REGION_AU915=y
CONFIG_LORAWAN_LOG_LEVEL_DBG=y
CONFIG_LORAWAN_NVM_NONE=y
#CONFIG_LORAWAN_NVM_SETTINGS=y
CONFIG_LORAWAN_SYSTEM_MAX_RX_ERROR=90
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_TEST_RANDOM_GENERATOR=y
Configurando GPIOS para ser compatível com LOM204A
Em
/home/osboxes/zephyrproject/zephyr/boards/arm/b_l072z_lrwan1
edit
b_l072z_lrwan1.dts
&spi1 {
pinctrl-0 = <&spi1_nss_pa4 &spi1_sck_pa5
&spi1_miso_pa6 &spi1_mosi_pa7>;
pinctrl-names = "default";
status = "okay";
cs-gpios = <&gpioa 4 GPIO_ACTIVE_LOW>;
lora: lora@0 {
compatible = "semtech,sx1276";
reg = <0>;
reset-gpios = <&gpioa 8 GPIO_ACTIVE_LOW>;
dio-gpios = <&gpioa 12 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>,
<&gpiob 2 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>,
<&gpiob 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>,
<&gpiob 0 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>,
<&gpioa 11 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>;
/*<&gpioa 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>;*/
rfi-enable-gpios = <&gpioa 15 GPIO_ACTIVE_HIGH>;
rfo-enable-gpios = <&gpioc 2 GPIO_ACTIVE_HIGH>;
pa-boost-enable-gpios = <&gpioc 1 GPIO_ACTIVE_HIGH>;
tcxo-power-gpios = <&gpiob 1 GPIO_ACTIVE_HIGH>;
tcxo-power-startup-delay-ms = <5>;
spi-max-frequency = <1000000>;
};
};UART
&usart1 {
pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>;
pinctrl-names = "default";
current-speed = <115200>;
status = "okay";
};
&usart2 {
pinctrl-0 = <&usart2_tx_pa2 &usart2_rx_pa3>;
pinctrl-names = "default";
current-speed = <115200>;
status = "okay";
};
SUBBANDAU915 FSB21.0.2
Na pasta
/home/osboxes/zephyrproject/zephyr/build/zephyr
você encontrará o zephyr.hex
Enviando um TEXTO
*** Booting Zephyr OS build zephyr-v3.2.0-1267-g278120acb600 ***
Starting up Lora node...
Starting Lorawan stack...
Joining TTN network over OTTA
[00:00:00.200,000] <inf> sx127x: SX127x version 0x12 found
[00:00:00.302,000] <dbg> lorawan: lorawan_init: LoRaMAC Initialized
[00:00:00.322,000] <dbg> lorawan: lorawan_join: Network join request sent!
Sending data...
[00:00:05.813,000] <dbg> lorawan: mlme_confirm_handler: Received MlmeConfirm (for MlmeRequest 1)
[00:00:05.813,000] <inf> lorawan: Joined network! DevAddr: 01c8ef34
[00:00:05.824,000] <inf> lorawan_node: New Datarate: DR_2, Max Payload 11
[00:00:05.824,000] <inf> lorawan: Datarate changed: DR_2
Downlink data received:
Data size: 0
Data Port: 0
RSSI: -42
SNR: 8
Data pend: 0
Data sent!
CÓDIGO FONTE
#define OTAA
//#define ABP
#include <zephyr/lorawan/lorawan.h>
#include <zephyr/drivers/uart.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/random/rand32.h>
#define DEFAULT_RADIO_NODE DT_ALIAS(lora0)
BUILD_ASSERT(DT_NODE_HAS_STATUS(DEFAULT_RADIO_NODE, okay), "No default LoRa radio specified in DT");
#define DEFAULT_RADIO DT_LABEL(DEFAULT_RADIO_NODE)
#define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(lorawan_node);
/* Customize based on network configuration */
// OTAA
#ifdef OTAA
#define LORAWAN_DEV_EUI { 0xXX, 0xXX, 0xXX, 0xFF, 0xXX, 0xEE, 0x8C, 0xXX } // MSB Format!
#define LORAWAN_JOIN_EUI { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } // MSB Format!
#define LORAWAN_APP_KEY { 0xF1, 0xD1, 0x1D, 0x78, 0xDA, 0x2A, 0xEF, 0xB2, 0x7C, 0x70, 0x35, 0x08, 0x25, 0xB8, 0xB6, 0x3B }
#endif
// ABP
#ifdef ABP
#define LORAWAN_DEV_ADDR { 0x00, 0x00, 0x00, 0x00 }
#define LORAWAN_NWK_SKEY { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
#define LORAWAN_APP_SKEY { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
#define LORAWAN_APP_EUI { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
#endif
#define DELAY K_MSEC(10000)
char data[] = {'H', 'E', 'L', 'L', 'O'};
/* size of stack area used by each thread */
#define STACKSIZE 1024
/* scheduling priority used by each thread */
#define PRIORITY 7
// Call back functions:
// Downlink callback
static void dl_callback(uint8_t port, bool data_pending, int16_t rssi, int8_t snr, uint8_t len, const uint8_t *data)
{
printk("\nDownlink data received: \n");
for(int i=0; i < len; i++ )
printk("%02X ", data[i]);
printk("\n");
printk("Data size: %d\n" , len );
printk("Data Port: %d\n" , port );
printk("RSSI: %d\n" , (int16_t)rssi );
printk("SNR: %d\n" , (int16_t)snr );
printk("Data pend: %d\n" , data_pending );
printk("\n\n");
}
// ADR change callback
static void lorwan_datarate_changed(enum lorawan_datarate dr)
{
uint8_t unused, max_size;
lorawan_get_payload_sizes(&unused, &max_size);
LOG_INF("New Datarate: DR_%d, Max Payload %d", dr, max_size);
}
/* Main program.
*/
void main(void)
{
const struct device *lora_dev;
struct lorawan_join_config join_cfg;
#ifdef OTAA
uint8_t dev_eui[] = LORAWAN_DEV_EUI;
uint8_t join_eui[] = LORAWAN_JOIN_EUI;
uint8_t app_key[] = LORAWAN_APP_KEY;
#endif
#ifdef ABP
uint8_t dev_addr[] = LORAWAN_DEV_ADDR;
uint8_t nwk_skey[] = LORAWAN_NWK_SKEY;
uint8_t app_skey[] = LORAWAN_APP_SKEY;
uint8_t app_eui[] = LORAWAN_APP_EUI;
#endif
int ret;
printk("Starting up Lora node...\n\n");
lora_dev = DEVICE_DT_GET(DT_ALIAS(lora0));
if (!lora_dev) {
printk("Lora default radio not found.\nExiting program.\n");
return;
}
printk("Starting Lorawan stack...\n");
ret = lorawan_start();
if (ret < 0) {
printk("lorawan_start failed: %d\n\n", ret);
return;
}
// Enable ADR
lorawan_enable_adr( true );
// Enable callbacks
struct lorawan_downlink_cb downlink_cb = {
.port = LW_RECV_PORT_ANY,
.cb = dl_callback
};
lorawan_register_downlink_callback( &downlink_cb );
lorawan_register_dr_changed_callback( lorwan_datarate_changed );
uint32_t random = sys_rand32_get();
uint16_t dev_nonce = random & 0x0000FFFF;
#ifdef OTAA
join_cfg.mode = LORAWAN_CLASS_A;
join_cfg.dev_eui = dev_eui;
join_cfg.otaa.join_eui = join_eui;
join_cfg.otaa.app_key = app_key;
join_cfg.otaa.nwk_key = app_key;
join_cfg.otaa.dev_nonce = dev_nonce;
#endif
#ifdef ABP
join_cfg.mode = LORAWAN_ACT_ABP;
join_cfg.dev_eui = dev_addr;
join_cfg.abp.dev_addr = dev_addr;
join_cfg.abp.app_skey = app_skey;
join_cfg.abp.nwk_skey = nwk_skey;
join_cfg.abp.app_eui = app_eui;
#endif
printk("Joining TTN network over");
#ifdef OTAA
printk(" OTTA\n\n\n");
#else
printk(" ABP\n\n\n");
#endif
// Loop until we connect
do {
ret = lorawan_join(&join_cfg);
if (ret < 0) {
printk("lorawan_join_network failed: %d\n\n", ret);
printk("Sleeping for 10s to try again to join network.\n\n");
k_sleep(K_MSEC(10000));
}
} while ( ret < 0 );
printk("Sending data...\n\n");
while (1) {
ret = lorawan_send(2, data, sizeof(data), LORAWAN_MSG_CONFIRMED);
if (ret == -EAGAIN) {
k_sleep(DELAY);
continue;
}
if (ret < 0) {
k_sleep(DELAY);
continue;
}
printk("Data sent!\n\n");
k_sleep(DELAY);
}
}DOWNLINK
DÚVIDAS
FORUMS ZEPHYR
THANKS TO
Benjamin Lindqvist <benjamin@eub.se>
REFERÊNCIAS
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