terça-feira, 4 de janeiro de 2022

Wisol LOM204A02 acessando TTN V3 - OTAA - LoRaMAC-node

 Wisol LOM204A02 acessando TTN V3 - OTAA - LoRaMAC-node


O objetivo deste BLOG é demonstrar como pode-se programar o LOM204 baseado no repositório GITHUB AlexandroSantos/LoraMac-IKS01A2: Sensores do módulo IKS01A2 com LoraMac. (github.com) utilizado pelo Aluno Alexandre Santos do Curso de ENG ELÉTRICA DA UFSC (EEL7515-EEL7415_assinado.pdf (ufsc.br)) na forma de TCC.

O mesmo foi portado para se compatível com o LOM204.

IMPORTANTE: Opção NÃO OFICIAL da WISOL, indicamos uso do KEIL C

Foi alterado board-config.h para

/*!
 * \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__

/*!
 * 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 //LOM204

#define RADIO_MOSI                                  PA_7 //LOM204
#define RADIO_MISO                                  PA_6 //LOM204
#define RADIO_SCLK                                  PA_5 //LOM204

#define RADIO_NSS                                   PA_4 //LOM204

#define RADIO_DIO_0                                 PA_12 //LOM204
#define RADIO_DIO_1                                 PB_2 //LOM204
#define RADIO_DIO_2                                 PB_5 //LOM204
#define RADIO_DIO_3                                 PB_0 //LOM204
#define RADIO_DIO_4                                 PA_11 //LOM204
#define RADIO_DIO_5                                 PB_11 /////INPUT LIVRE NAO USADO PELO LOM204

#define RADIO_TCXO_POWER                            PB_1 //LOM204

#define RADIO_ANT_SWITCH_RX                         PA_15 //LOM204
#define RADIO_ANT_SWITCH_TX_BOOST                   PC_1 ///// GPIO LIVRE NAO USADO PELO LOM204
#define RADIO_ANT_SWITCH_TX_RFO                     PC_2 //// GPIO LIVRE NAO USADO PELO LOM204

#define LED_1                                       PC_0 //LOM204
#define LED_2                                       PA_2 //LOM204
#define LED_3                                       PB_15 //LOM204
#define LED_4                                       PB_10 ////GPIO LIVRE NAO USADO PELO LOM204

#define LED_GREEN                                   LED_1
#define LED_RED1                                    LED_2
#define LED_BLUE                                    LED_3
#define LED_RED2                                    LED_4

#define BTN_1                                       PA_0 //LOM204
#define BTN_2                                       PC_13 //LOM204

#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 //LOM204
#define I2C_SDA                                     PB_9 //LOM204

#define UART_TX                                     PA_2 //TXD DISPONIVEL NO LOM204
#define UART_RX                                     PA_3 //RXD DISPONIVEL NO LOM204

// Debug pins definition.
#define RADIO_DBG_PIN_TX                            PB_3
#define RADIO_DBG_PIN_RX                            PB_4

#endif // __BOARD_CONFIG_H__

Também foi modificado em board.c a função SystemClockConfig() para

void SystemClockConfig( void )
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

  /* Set Voltage scale1 as MCU will run at 32MHz */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /**Configure LSE Drive Capability
    */
  __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);

  /* Enable HSE Oscillator and Activate PLL with HSE as source */
  RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.HSIState            = RCC_HSI_ON;
  RCC_OscInitStruct.LSEState            = RCC_LSE_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLLMUL_4;
  RCC_OscInitStruct.PLL.PLLDIV          = RCC_PLLDIV_2;

 

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    //Error_Handler(__func__);
  }

 
 
  /* Poll VOSF bit of in PWR_CSR. Wait until it is reset to 0 */
  while (__HAL_PWR_GET_FLAG(PWR_FLAG_VOS) != RESET) {};

  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
      //Error_Handler(__func__);
  }

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_RTC;
                          //    |RCC_PERIPHCLK_LPTIM1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_HSI;
  PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
//  PeriphClkInit.LptimClockSelection = RCC_LPTIM1CLKSOURCE_PCLK;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
//    _Error_Handler(__FILE__, __LINE__);
  }

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
 
__GPIOA_CLK_ENABLE();
__GPIOB_CLK_ENABLE();
__GPIOC_CLK_ENABLE();
 
}

PREPARANDO O AMBIENTE PARA O DESENVOLVIMENTO 

O sistema operacional Linux (por exemplo Ubuntu 20.04) foi escolhido para o desenvolvimento devido suas características, que reduzem os gastos com licenças, e por possuir ambientes de desenvolvimento de qualidade profissional e de código aberto. Os seguintes programas ou pacotes de software também foram utilizados para realizar esta integração: 

•   O LoRaMAC foi desenvolvido pela Semtech e é disponibilizado em um repositório público; 
•   Cmake, gerenciador de compilação; 
•   GCC-ARM, compilador para processadores ARM.

PREPARAÇÃO DO SISTEMA OPERACIONAL 

Para que o desenvolvimento ocorra sem haver problemas com falta de bibliotecas, aplicativos ou compiladores, todos necessários para a fase de programação do dispositivo que monitora os sensores, alguns passos devem ser seguidos. São eles: 


1. Abrir um terminal no sistema Linux; 
2. Instalar o Cmake: sudo apt-get install cmake 
3. Instalar o Cutecom: sudo apt-get install cutecom 
4. Instalar o compilador GCC-ARM: sudo apt-get install gcc-arm-none-eabi 
5. Instalar os seguintes pacotes extras: sudo apt-get install libnewlib-dev libnewlib-arm-none-eabi 
6. Instalar o gerenciador de versão GIT: sudo apt-get install git 
7. Utilizar o GIT para baixar o LoRaMAC: git clone https://github.com/AlexandroSantos/LoraMac-IKS01A2 
8. Entrar no diretório LoraMac-IKS01A2. cd LoraMac-IKS01A2 
9. Permissão de execução. Neste passo, é necessário indicar, ao sistema operacional, que os arquivos .sh podem ser executados. sudo chmod +x *.sh 
10. Permissão de uso da porta serial. Algumas distribuições necessitam de uma liberação para conectar com a porta serial. Para isso, o seguinte comando é usado, lembrado que devemos substituir usuario pelo seu nome de usuário: sudo usermod -a -G dialout usuario Caso o usuário não saiba o nome de usuário, basta digitar, no terminal, o comando: users 

Configure sua TTN

CONFIGURAR E COMPILAR O CÓDIGO FONTE 

Uma vez obtidas as chaves e outras informações relevantes para conexão à rede IoT, é necessária a inserção dessas informações no código fonte (LoRaMAC), de forma a serem interpretadas corretamente pelo compilador. Dentre os arquivos, fornecidos pelo desenvolvedor original, tem-se o main.c e o Commissioning.h. No arquivo Commissioning.h são encontradas as constantes de configuração de rede, tais como o intervalo de envio, a faixa de frequência utilizada pelo rádio e a sub-banda, que devem ser definidas conforme a operadora a ser utilizada. Já em main.c estão as configurações de hardware, identificação de sensores, protocolo de comunicação entre o kit e os sensores, além do payload, o pacote a ser enviado. Para que nosso rádio seja conectado ao gateway e à TTN, de forma adequada, é necessário editar o Commissioning.h, seguindo os passos listados a seguir: 

• Passo 1: Abrir, com um editor de texto (gedit, nano, vi, geany, sublime), o arquivo Commissioning.h localizado na seguinte pasta: src/apps/LoRaMac/classA/B-L072Z-LRWAN1. Neste arquivo, serão editadas as linhas contendo as seguinte definições (#define)

 – [Linha 4] OVER_THE_AIR_ACTIVATION 0 Desativa ao método de ativação OTAA, passando a ser ABP. – [Linha 8] IEEE_OUI 0x00, 0x17, 0xAA Utilizar os 3 primeiro bytes de Device EUI 

– [Linha 9] LORAWAN_DEVICE_EUI {IEEE_OUI, 0x38, 0xF8, 0xE0, 0x78, 0x14} Utilizar os 5 últimos bytes de Device EUI 

– [Linha 10] LORAWAN_JOIN_EUI {0x70, 0xB3, 0xD5, 0x7E, 0xD0, 0x02, 0xBC, 0x8F} Utilizar Application EUI

Quando uma nova aplicação for gerada outras chaves serão criadas pela TTN, e então os dados em vermelho deverão ser modificados de acordo.

 – [Linha 11] LORAWAN_APP_KEY e [Linha 20] LORAWAN_APP_S_KEY Ambos devem ser configurados com App Session Key 0x6E, 0x19, 0x04, 0x1B, 0x3D, 0xFF, 0x5A, 0x0B, 0xB9, 0xAE, 0x61, 0x81, 0x4A, 0x73, 0xC5, 0x89 

– [Linha 13] LORAWAN_NWK_KEY, [Linha 17] LORAWAN_F_NWK_S_INT_KEY, [Linha 18] LORAWAN_S_NWK_S_INT_KEY e [Linha 19] LORAWAN_NWK_S_ENC_KEY Todos devem ser configurados com Network Session Key 0x0F, 0x78, 0x42, 0xD4, 0x25, 0xEC, 0x0B, 0xCC, 0x49, 0xA5, 0xCA, 0x54, 0x57, 0xE7, 0x97, 0x8B 

– [Linha 16] LORAWAN_DEVICE_ADDRESS ( uint32_t ) 0x260314D7 Deve ser configurado com Device Address 

– [Linha 21] APP_TX_DUTYCYCLE 60000 Nesta, configura-se o intervalo de envios, dado em milisegundos. 

– [Linha 25] SUBBAND 2 Se a rede usada for a da TTN, o valor é 2. Se for a rede da Kore, então o valor deverá ser 0. 

• Passo 2: Salvar o arquivo Commissioning.h. A TTN é uma rede gratuita, o que não significa dizer que não haja limites de uso, quer para fins de teste, ou para fins comerciais. O APP_TX_- DUTYCYCLE está setado para 1 minuto, mas este valor deve ser utilizado apenas para verificação do dispositivo. Em operações cotidianas, os intervalos devem ser maiores, a cada 1 hora, por exemplo, excetuando-se em casos de violação de regra, como o aumento repentino da temperatura de uma câmara fria. Como a rede LoRaWAN preza pela economia no tráfego de dados, é fundamental informar apenas o estritamente necessário.

No caso do LOM204, o Commissioning.h ficou assim

//Create by software LoraMac
#ifndef __LORA_COMMISSIONING_H__
#define __LORA_COMMISSIONING_H__
#define OVER_THE_AIR_ACTIVATION                            1 //OTA
#define ABP_ACTIVATION_LRWAN_VERSION_V10x                  0x01000300
#define ABP_ACTIVATION_LRWAN_VERSION                       ABP_ACTIVATION_LRWAN_VERSION_V10x
#define LORAWAN_PUBLIC_NETWORK                             true
#define IEEE_OUI                                           0x01, 0x10, 0x51
#define LORAWAN_DEVICE_EUI                                 { IEEE_OUI, 0x3B, 0x7B, 0xED, 0xB6, 0x8D }
#define LORAWAN_JOIN_EUI                                   { 0xFB, 0x3F, 0xA2, 0xBA, 0x05, 0x78, 0x2A, 0x97 }
#define LORAWAN_APP_KEY                                    { 0xE0, 0x00, 0x07, 0xB9, 0xFA, 0x1F, 0x12, 0x89, 0x20, 0x81, 0x9C, 0xD2, 0x89, 0x0C, 0x9C, 0xCF }
#define LORAWAN_GEN_APP_KEY                                { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
#define LORAWAN_NWK_KEY                                    { 0x1F, 0xD6, 0xC7, 0x40, 0x1C, 0xD9, 0x74, 0xF7, 0x20, 0x63, 0x69, 0xA5, 0x81, 0xD0, 0x5D, 0x29 }
#define LORAWAN_NETWORK_ID                                 ( uint32_t )1
#define STATIC_DEVICE_ADDRESS                              1
#define LORAWAN_DEVICE_ADDRESS                             ( uint32_t )0x7908BA44
#define LORAWAN_F_NWK_S_INT_KEY                            { 0x1F, 0xD6, 0xC7, 0x40, 0x1C, 0xD9, 0x74, 0xF7, 0x20, 0x63, 0x69, 0xA5, 0x81, 0xD0, 0x5D, 0x29 }
#define LORAWAN_S_NWK_S_INT_KEY                            { 0x1F, 0xD6, 0xC7, 0x40, 0x1C, 0xD9, 0x74, 0xF7, 0x20, 0x63, 0x69, 0xA5, 0x81, 0xD0, 0x5D, 0x29 }
#define LORAWAN_NWK_S_ENC_KEY                              { 0x1F, 0xD6, 0xC7, 0x40, 0x1C, 0xD9, 0x74, 0xF7, 0x20, 0x63, 0x69, 0xA5, 0x81, 0xD0, 0x5D, 0x29 }
#define LORAWAN_APP_S_KEY                                  { 0xE0, 0xA2, 0x07, 0xB9, 0xFA, 0x1F, 0x12, 0x89, 0x20, 0x81, 0x9C, 0xD2, 0x89, 0x0C, 0x9C, 0xCF }
#define APP_TX_DUTYCYCLE                                   60000
#define APP_TX_DUTYCYCLE_RND                               1000
#define LORAWAN_DEFAULT_DATARATE                           DR_2
#define LORAWAN_CONFIRMED_MSG_ON                           false
#define SUBBAND                                            2 //TTN
#define LORAWAN_ADR_ON                                     1
#define LORAWAN_APP_PORT                                   2
#define LORAWAN_DUTYCYCLE_ON                               true
#define LORAWAN_CONFIG_MANUAL                              false
#endif

COMPILANDO

No diretório raiz do projeto, encontramos os scripts create.sh e program.sh. O script ./create.sh, usado para compilar, cria o diretório build. No caminho build/src/apps/LoRaMac, encontra-se o arquivo LoRaMac-classA.bin, que deve ser copiado para o disco removível DIS_L072Z, para rodar o programa na placa. Para compilar e programar a placa é utilizado ./program.sh, fazendo com que todos os passos sejam feitos automaticamente.

No caso do LOM204, foi utilizado STM32CUBE-PROGRAMMER e código foi o formato .HEX


Veja a execução!

PS: Para Debug, foram utilizados PA2 e PA3 (TXD e RXD) do LOM204.


Questões: suporte@smartcore.com.br


FONTES: 

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