quarta-feira, 24 de maio de 2023

COMUNICAÇÃO P2P COM LSM110A - RAK

       

O objetivo deste BLOG é demonstrar como é possível programar o módulo WISOL LSM110A via ARDUINO e assim utilizá-lo como OPENCPU.

BETA BETA BETA BETA

Será testado o exemplo LoRa_P2P da RAK WIRELESS que permite fazer a comunicação P2P entre 2 LSM110A, na frequência de 868000000.

A tecnologia LoRa® permite estabelecer comunicação diretamente entre dois dispositivos, dispensando o gateway. Com um pouco de esforço de desenvolvimento, é possível implementar uma rede de comunicação. Essa arquitetura é comumente chamada no mercado de peer-to-peer ou P2P.

LSM110A Starter KIT
Módulo

O LSM110A é um módulo de última geração que integra o STMicroelectronics STM32WL. É muito menos consumo atual para o dispositivo IoT para estender a vida útil da bateria. E, também suporta ambas as tecnologias – Sigfox e LoRa – com o próprio módulo LSM110A.

Você pode trocar Sigfox ou LoRa com ele para que você também possa reduzir o custo. É altamente otimizado para solução de IoT (Alto Consumo de Energia, Baixo Custo)

BREAKOUT para testes

Esquema Elétrico - últimas correções





PLACA MONTADA



CONEXÃO COM ST-LINK V2 E UART



LSM110A e ARDUINO (RAKWIRELESS)

LSM110A é baseado em STM32WL55.  No Arduino RAKWIRELESS existe o core similar, o qual deve ser modificado para ser compatível com LSM110A

Baixar RAKWIRELESS Arduino

Versão: 3.5.1
https://raw.githubusercontent.com/RAKWireless/RAKwireless-Arduino-BSP-Index/main/package_rakwireless.com_rui_index.json

Altere Cristal para uso de frequênciais (BAND) mais altas (board.c)

uint8_t BoardGetHardwareFreq(void)
{
    uint8_t hardwareFreq = 0;
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /*Configure GPIO pin : PB12 */
    GPIO_InitStruct.Pin = GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    hardwareFreq  = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12);
hardwareFreq = 1;

    HAL_GPIO_DeInit(GPIOB,GPIO_PIN_12);
    return hardwareFreq;
}

Altere Placa para RAK3272-SIP, compile


Grave com o STM32 Programmer o BOOTLOADER no LSM110A 

Assim, pode-se transferir o programa via Serial, através dos pinos PA2 e PA3 do LSM110A.


RAK3272-SiP_latest_final.hex


Altere radio_board_if.c para

int32_t RBI_ConfigRFSwitch(RBI_Switch_TypeDef Config) { switch (Config) { case RBI_SWITCH_OFF: { /* Turn off switch */ HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET); break; } case RBI_SWITCH_RX: { /*Turns On in Rx Mode the RF Switch */ HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET); break; } case RBI_SWITCH_RFO_LP: { /*Turns On in Tx Low Power the RF Switch */ HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET); break; } case RBI_SWITCH_RFO_HP: { /*Turns On in Tx High Power the RF Switch */ HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET); break; } default: break; } return 0; }


































Altere radio_board_if.h para

#define RF_SW_CTRL1_PIN GPIO_PIN_12 #define RF_SW_CTRL1_GPIO_PORT GPIOB #define RF_SW_CTRL1_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() #define RF_SW_CTRL1_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() /* official version */ #define RF_SW_CTRL2_PIN GPIO_PIN_13 #define RF_SW_CTRL2_GPIO_PORT GPIOC #define RF_SW_CTRL2_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() #define RF_SW_CTRL2_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE()

Transferindo


Executando

Deve-se gravar 2 LSM110A para que haja a comunicação P2P.  Um pacote "payload" será transmitido entre eles.

Segue código final

/************************************* * This example is from https://github.com/Kongduino/RUI3_LoRa_P2P_PING_PONG * This example needs two devices, a device will send LoRa P2P package after receiving LoRa P2P package. *************************************/ long startTime; bool rx_done = false; double myFreq = 868000000; uint16_t sf = 12, bw = 0, cr = 0, preamble = 8, txPower = 22; void hexDump(uint8_t * buf, uint16_t len) { char alphabet[17] = "0123456789abcdef"; Serial.print(F(" +------------------------------------------------+ +----------------+\r\n")); Serial.print(F(" |.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .a .b .c .d .e .f | | ASCII |\r\n")); for (uint16_t i = 0; i < len; i += 16) { if (i % 128 == 0) Serial.print(F(" +------------------------------------------------+ +----------------+\r\n")); char s[] = "| | | |\r\n"; uint8_t ix = 1, iy = 52; for (uint8_t j = 0; j < 16; j++) { if (i + j < len) { uint8_t c = buf[i + j]; s[ix++] = alphabet[(c >> 4) & 0x0F]; s[ix++] = alphabet[c & 0x0F]; ix++; if (c > 31 && c < 128) s[iy++] = c; else s[iy++] = '.'; } } uint8_t index = i / 16; if (i < 256) Serial.write(' '); Serial.print(index, HEX); Serial.write('.'); Serial.print(s); } Serial.print(F(" +------------------------------------------------+ +----------------+\r\n")); } /* typedef struct rui_lora_p2p_revc { // Pointer to the received data stream uint8_t *Buffer; // Size of the received data stream uint8_t BufferSize; // Rssi of the received packet int16_t Rssi; // Snr of the received packet int8_t Snr; } rui_lora_p2p_recv_t; */ void recv_cb(rui_lora_p2p_recv_t data) { rx_done = true; if (data.BufferSize == 0) { Serial.println("Empty buffer."); return; } char buff[92]; sprintf(buff, "Incoming message, length: %d, RSSI: %d, SNR: %d", data.BufferSize, data.Rssi, data.Snr); Serial.println(buff); hexDump(data.Buffer, data.BufferSize); } void send_cb(void) { Serial.printf("P2P set Rx mode %s\r\n", api.lorawan.precv(65534) ? "Success" : "Fail"); } void setup() { Serial.begin(115200); Serial.println("RAKwireless LoRaWan P2P Example"); Serial.println("------------------------------------------------------"); delay(2000); startTime = millis(); if(api.lorawan.nwm.get() != 0) { Serial.printf("Set Node device work mode %s\r\n", api.lorawan.nwm.set(0) ? "Success" : "Fail"); api.system.reboot(); } Serial.println("P2P Start"); Serial.printf("Hardware ID: %s\r\n", api.system.chipId.get().c_str()); Serial.printf("Model ID: %s\r\n", api.system.modelId.get().c_str()); Serial.printf("RUI API Version: %s\r\n", api.system.apiVersion.get().c_str()); Serial.printf("Firmware Version: %s\r\n", api.system.firmwareVersion.get().c_str()); Serial.printf("AT Command Version: %s\r\n", api.system.cliVersion.get().c_str()); Serial.printf("Set P2P mode frequency %3.3f: %s\r\n", (myFreq / 1e6), api.lorawan.pfreq.set(myFreq) ? "Success" : "Fail"); Serial.printf("Set P2P mode spreading factor %d: %s\r\n", sf, api.lorawan.psf.set(sf) ? "Success" : "Fail"); Serial.printf("Set P2P mode bandwidth %d: %s\r\n", bw, api.lorawan.pbw.set(bw) ? "Success" : "Fail"); Serial.printf("Set P2P mode code rate 4/%d: %s\r\n", (cr + 5), api.lorawan.pcr.set(cr) ? "Success" : "Fail"); Serial.printf("Set P2P mode preamble length %d: %s\r\n", preamble, api.lorawan.ppl.set(preamble) ? "Success" : "Fail"); Serial.printf("Set P2P mode tx power %d: %s\r\n", txPower, api.lorawan.ptp.set(txPower) ? "Success" : "Fail"); api.lorawan.registerPRecvCallback(recv_cb); api.lorawan.registerPSendCallback(send_cb); Serial.printf("P2P set Rx mode %s\r\n", api.lorawan.precv(3000) ? "Success" : "Fail"); // let's kick-start things by waiting 3 seconds. } void loop() { uint8_t payload[] = "payload"; bool send_result = false; if (rx_done) { rx_done = false; while (!send_result) { send_result = api.lorawan.psend(sizeof(payload), payload); Serial.printf("P2P send %s\r\n", send_result ? "Success" : "Fail"); if (!send_result) { Serial.printf("P2P finish Rx mode %s\r\n", api.lorawan.precv(0) ? "Success" : "Fail"); delay(1000); } } } delay(500); }
Execução

Primeiro LSM

Segundo LSM


Fontes:

Dúvidas

FORUM

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