sábado, 8 de julho de 2023

LSM110A COMO INTERFACE PARA COMUNICAÇÃO MASTER/SLAVE (P2P)

  

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

O objetivo específico neste projeto é programar o LSM110 com VISUINO, para permitir que seu NINA W106  (Master) possa efetuar um comunicação bidirecional (Topologia P2P) com vários NINA W106 (Slaves).  Foi  utilizado o recurso do VISUINO: Custom Code, o qual permite a inclusão de código Arduino,  baseado nos exemplos Arduino da Library RADIOLIB.

p2p

Uma comunicação peer-to-peer usando a tecnologia LoRa permite uma comunicação direta e de longa distância entre 2/n dispositivos (Polling). Isso é particularmente útil em ambientes restritos onde a infraestrutura global LoraWAN não é necessária ou simplesmente não está disponível.

Protocolo de Comunicação


Comunicação Bidirecional

Basicamente o Master enviará um pacote o  LSM110A e este fará um broadcasting para todos os Slaves.

Este pacote será um JSON que conterá um Id do Slave com o qual ele deseja se comunicar:

{"Id":0,"...}, onde X é Id do Slave, que no caso será 0,1,2,3...

O Slave que corresponde à este Id, poderá enviar uma resposta através de um pacote JSON também:

{"ID":0,"A0":26,"A1":0,"A2":0,"A3":1023,"D0":0,"D1":0,"D2":0,"D3":0,"C":54761,"T":26,"U":59,"P":102028

Também via Broadcasting, o pacote enviado pelo Slave chegará ao Master, mas também para os outros Slaves o qual deverá ser descartado observando seu Id.


Para o NINA W106 (Master ou Slave) fazer um broadcasting, dever enviar (Txd) via Serial o pacote até o RX do  LSM110A.

Para o NINA W106 (Master ou Slave) receber (Rxd) um broadcasting, deve ser conectando a Serial no TX do  LSM110A.

NINA W106 MASTER e SLAVE
 LSM110A atuando como Broadcasting
LSM110A e Arduino (STM32DUINO)

LSM110A é baseado em STM32WL55.  No Arduino STM32 existe este core.

Como instalar Arduino STM32? adicionar em Arquivo-->Preferências-->URLs adicionais

https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json


BSP

4.0.0 (Última versão)

RadioLib (instale)

O RadioLib permite que seus usuários integrem todos os tipos de diferentes módulos de comunicação sem fio, protocolos e até mesmo modos digitais em um único sistema consistente. Deseja adicionar uma interface Bluetooth à sua rede LoRa? Coisa certa! Você só quer ir realmente à moda antiga e brincar com teletipo de rádio, TV de varredura lenta ou até mesmo Hellschreiber usando nada além de um módulo de rádio barato? Por que não!

O RadioLib suporta nativamente o Arduino, mas também pode ser executado em ambientes não-Arduino! Veja esta página Wiki e exemplos/NonArduino.

O RadioLib foi originalmente criado como um driver para o RadioShield, mas pode ser usado para controlar quantos módulos sem fio diferentes você desejar - ou pelo menos quantos seu microcontrolador puder suportar!O RadioLib permite que seus usuários integrem todos os tipos de diferentes módulos de comunicação sem fio, protocolos e até mesmo modos digitais em um único sistema consistente. Deseja adicionar uma interface Bluetooth à sua rede LoRa? Coisa certa! Você só quer ir realmente à moda antiga e brincar com teletipo de rádio, TV de varredura lenta ou até mesmo Hellschreiber usando nada além de um módulo de rádio barato? Por que não!

O RadioLib suporta nativamente o Arduino, mas também pode ser executado em ambientes não-Arduino! Veja esta página Wiki e exemplos/NonArduino.

O RadioLib foi originalmente criado como um driver para o RadioShield, mas pode ser usado para controlar quantos módulos sem fio diferentes você desejar - ou pelo menos quantos seu microcontrolador puder suportar!


VISUINO

Visuino é o mais recente software inovador da Mitov Software. Um ambiente de programação visual que permite programar suas placas Arduino.
Os componentes encontrados no software Visuino representam seus componentes de hardware e você poderá facilmente criar e projetar seus programas arrastando e soltando. Nenhum equipamento ou hardware é necessário para executar o software no modo de design. Depois de concluir o projeto, você pode conectar o upload da placa Arduino e executá-lo.
Para aquelas pessoas que não são fortes em escrever código, projetar, compilar e criar programas Arduino nunca foi tão fácil! Por que perder tempo codificando quando todo o trabalho duro é feito para você? Você tem sua placa Arduino e um ótimo design de hardware, coloque-a em funcionamento em minutos, não em horas!

No Visuino, altere Mitov.Boards.STM32Duino.vcomp para 

Wisintainer : Namespace //--------------------------------------------------------------------------- +TArduinoSTM32_STM32WL_HardwareSerial : TArduinoSTM32DefinedPinsBasicSerial RXPin = 3 TXPin = 2 ; //--------------------------------------------------------------------------- [Name( 'STM32WL' )] [ArduinoBoardArchitecture_STM32] [ArduinoBoardCompileParams( 'STMicroelectronics:stm32:GenWL:pnum=GENERIC_WL55JCIX' )] [Category( TSTM32Category )] [ParentImage] +TArduino_STM32_STM32WL_Board : TArduino_STM32_Basic_Shared_Modules_Board [AddItem( TArduinoSTM32HardwareSerial0 )] [AddItem( TArduinoSTM32_STM32WL_HardwareSerial )] Serial [AddItem( TArduinoI2C, 1 )] I2CChannels [AddItem( TArduinoSPI, 1 )] SPIChannels [ArduinoBoard_Add_DigitalAnalogChannel( 0, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA0 (BUT1) 3.3V', 'PA0' )] [ArduinoBoard_Add_DigitalAnalogChannel( 1, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA1 (BUT2) (WKUP) 3.3V', 'PA1' )] [ArduinoBoard_Add_DigitalAnalogChannel( 2, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSerial0Channel, 'PA2 (TX0) 3.3V', 'PA2' )] [ArduinoBoard_Add_DigitalAnalogChannel( 3, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSerial0Channel, 'PA3 (RX0) 3.3V', 'PA3' )] [ArduinoBoard_Add_DigitalAnalogChannel( 4, TArduinoCombinedAnalogDigitalPullDownOpenDrainChannel, 'PA4 (SPI1-NSS) 3.3V', 'PA4' )] [ArduinoBoard_Add_DigitalAnalogChannel( 5, TArduinoCombinedAnalogDigitalPullDownOpenDrainChannel, 'PA5 (SPI1-SCK) 3.3V', 'PA5' )] [ArduinoBoard_Add_DigitalAnalogChannel( 6, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSPI0Channel, 'PA6(SPI1-MISO) 3.3V', 'PA6' )] [ArduinoBoard_Add_DigitalAnalogChannel( 7, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSPI0Channel, 'PB5(SPI1-MOSI) 3.3V', 'PB5' )] [ArduinoBoard_Add_DigitalAnalogChannel( 8, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA7 3.3V', 'PA7' )] [ArduinoBoard_Add_DigitalAnalogChannel( 9, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA8 3.3V', 'PA8' )] [ArduinoBoard_Add_DigitalAnalogChannel( 10, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSerial1Channel, 'PA9 (TX1) 3.3V', 'PA9' )] [ArduinoBoard_Add_DigitalAnalogChannel( 11, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSerial1Channel, 'PA10 (RX1) 3.3V', 'PA10' )] [ArduinoBoard_Add_DigitalAnalogChannel( 12, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMI2C0Channel, 'PA11 (I2C0-SDA) 3.3V', 'PA11' )] [ArduinoBoard_Add_DigitalAnalogChannel( 13, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMI2C0Channel, 'PA12 (I2C0-SCL) 3.3V', 'PA12' )] [ArduinoBoard_Add_DigitalAnalogChannel( 14, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA13 (SWDIO) 3.3V', 'PA13' )] [ArduinoBoard_Add_DigitalAnalogChannel( 15, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA14 (SWCLK) 3.3V', 'PA14' )] [ArduinoBoard_Add_DigitalAnalogChannel( 16, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA15 (LED3) 3.3V', 'PA15' )] [ArduinoBoard_Add_DigitalAnalogChannel( 17, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PB2 3.3V (ADC-IN4)', 'PB2' )] [ArduinoBoard_Add_DigitalAnalogChannel( 18, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PB3 3.3V', 'PB3' )] [ArduinoBoard_Add_DigitalAnalogChannel( 19, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PB4 3.3V', 'PB4' )] [ArduinoBoard_Add_DigitalAnalogChannel( 20, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PB6 3.3V', 'PB6' )] [ArduinoBoard_Add_DigitalAnalogChannel( 21, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PB7 3.3V', 'PB7' )] [ArduinoBoard_Add_DigitalAnalogChannel( 22, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PB8 3.3V', 'PB8' )] Digital : TArduinoDigitalChannels ; //--------------------------------------------------------------------------- ; // Wisintainer

Projeto VISUINO

Configure as Seriais 1 e 2



Em Global Declarations de CustomCode (Uart1), coloque
HardwareSerial Serial1(USART1); 

Em Global Implementations de CustomCode (RadioLib), coloque
void ReceivedPackage(String Txt)
{ Declarations::Instances::RadioLib.Received.Send(Txt); } void SendSNR(double Value) { Declarations::Instances::RadioLib.SNR.Send(Value); } void SendRSSI(double Value) { Declarations::Instances::RadioLib.RSSI.Send(Value); } void StatusTransmit(String Txt) { Declarations::Instances::RadioLib.Status.Send(Txt); } void CodeTransmit(byte Value) { Declarations::Instances::RadioLib.Code.Send(Value); }



















o  qual enviará para o OUTPUT do CustomCode (RadioLib)

Em Global Declarations do CustomCode (RadioLib), coloque

// no need to configure pins, signals are routed to the radio internally STM32WLx radio = new STM32WLx_Module(); // set RF switch configuration for Nucleo WL55JC1 // NOTE: other boards may be different! static const uint32_t rfswitch_pins[] = {PB12, PC13, PC5}; static const Module::RfSwitchMode_t rfswitch_table[] = { {STM32WLx::MODE_IDLE, {LOW, LOW, LOW}}, {STM32WLx::MODE_RX, {HIGH, LOW, LOW}}, {STM32WLx::MODE_TX_LP, {HIGH, HIGH, HIGH}}, {STM32WLx::MODE_TX_HP, {HIGH, HIGH, HIGH}}, END_OF_MODE_TABLE, }; // save transmission states between loops int transmissionState = RADIOLIB_ERR_NONE; // flag to indicate transmission or reception state bool transmitFlag = false; // flag to indicate that a packet was sent or received volatile bool operationDone = false; // this function is called when a complete packet // is transmitted or received by the module // IMPORTANT: this function MUST be 'void' type // and MUST NOT have any arguments! void setFlag(void) { // we sent or received a packet, set the flag operationDone = true; }






















Em Includes do CustomCode(RadioLib), coloque
#include <RadioLib.h>

Em OnExecute do CustomCode (RadioLib), coloque
// check if the previous operation finished if(operationDone) { // reset flag operationDone = false; if(transmitFlag) { // the previous operation was transmission, listen for response // print the result if (transmissionState == RADIOLIB_ERR_NONE) { // packet was successfully sent //Serial.println(F("transmission finished!")); //CustomCode Output Status StatusTransmit(F("transmission finished!")); } else { Serial.print(F("failed, code ")); //CustomCode Output Status StatusTransmit(F("transmission finished!")); //CustomCode Output Code CodeTransmit(transmissionState); //Serial.println(transmissionState); } // listen for response radio.startReceive(); transmitFlag = false; SendingData(transmitFlag); } else { // the previous operation was reception // print data and send another packet String str; int state = radio.readData(str); if (state == RADIOLIB_ERR_NONE) { // packet was successfully received //Serial.println(F("[LSM110A] Received packet!")); // print data of the packet //Serial.print(F("[LSM110A] Data:\t\t")); //Serial.println(str); //RadioLib CustomCode OUTPUT ReceivedPackage(str); // print RSSI (Received Signal Strength Indicator) //Serial.print(F("[LSM110A] RSSI:\t\t")); //Serial.print(radio.getRSSI()); //Serial.println(F(" dBm")); //RadioLib CustomCode OUTPUT SendRSSI(radio.getRSSI()); // print SNR (Signal-to-Noise Ratio) //Serial.print(F("[LSM110A] SNR:\t\t")); //Serial.print(radio.getSNR()); //Serial.println(F(" dB")); //RadioLib CustomCode OUTPUT SendSNR(radio.getSNR()); // force listen radio.startReceive(); transmitFlag = false; SendingData(transmitFlag); } } } //Verify is there is payload to transmite each 2 seconds if(millis() >= time) { if(!(Payload=="")) { transmissionState = radio.startTransmit(Payload); transmitFlag = true; SendingData(transmitFlag); Payload=""; } time = millis() + 2000; } //WDT WAKE UP IWatchdog.reload();





















































Em Input On Data do CustomCode (RadioLib), coloque

// send another one //Serial.print(F("[SX1262] Sending another packet ... ")); transmissionState = radio.startTransmit(AValue); transmitFlag = true;

LSM110a para comunicação P2p.

Você agora pode desenvolver uma aplicação no NINA W106 (Master) que envie dados para os demais NINA W106 (Slaves), conforme descrito no início.

Para NINA W106 (Master ou Slave) fazer um broadcasting, dever enviar (Txd) via Serial o pacote até o RX do LSM110A

Para o NINA W106 (Master ou Slave) receber (Rxd) um broadcasting, deve ser conectando a Serial no TX do LSM110A.

A velocidade comunicação com a UART é de 115200,N,8,1

Master


Slave


Colisões

Não deveria haver, pois apenas um Slave irá responder por vez.

Vídeo da execução da comunicação Master e Slave

Parte I


Parte II

P2P 


Payloads


Slave recebendo requisição e devolvendo dados para Master


Streaming para 3 Slaves







Testando P2P com 3 NINA W106 (1 Master e 2 Slaves)


STM32Programmer

Uma boa opção se tiveres problemas com drivers é instalar.

Fontes:


Dúvidas

suporte@smartcore.com.br

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