Primeiros Passos com o Shield LoRaWAN em P2P




Introdução

Alguns dispositivos LoRaWAN, como o Shield LoRaWAN e o módulo LoRaWAN Bee da RoboCore, permitem a comunicação ponto a ponto (também conhecida como "P2P" - Point to Point) entre dois ou mais dispositivos do mesmo modelo.

Neste tutorial veremos como utilizar a comunicação P2P do Shield LoRaWAN, em um exemplo simples para acender um LED L na placa receptora caso um botão da placa transmissora seja pressionado.

Lista de Materiais

Atenção: na lista acima foi listado o Shield LoRaWAN Helix Antenna, porém este tutorial também é possível com o Shield LoRaWAN Chip Antenna.

Biblioteca

Caso já tenha seguido o tutorial Primeiros Passos com o Shield LoRaWAN em OTAA, não será necessário seguir os passos desta seção, já que a biblioteca já foi instalada no outro tutorial.

A biblioteca do Shield LoRaWAN está disponível para ser instalada diretamente pelo "Gerenciador de Bibliotecas" da Arduino IDE. Para acessá-lo, siga o caminho da imagem abaixo, ou então pressione "Ctrl+Shift+I".

caminho-gerenciador-bibliotecas
Caminho para o "Gerenciador de Bibliotecas"

Com o gerenciador aberto, digite "robocore smw sx1262", conforme mostrado na imagem abaixo.

biblioteca-encontrada
Biblioteca Encontrada

Com a biblioteca listada como na imagem acima, pressione o botão "Instalar" e aguarde alguns instantes. Assim que a instalação estiver finalizada, será exibido "Instalada" ao lado do nome da biblioteca, como na imagem a seguir.

biblioteca-instalada
Biblioteca Instalada

Código

Com a biblioteca instalada, grave o código a seguir em ambas as placas base. Em uma delas, use-a como transmissor, mantendo a linha #define TRANSMISSOR descomentada. Na outra, comente a linha mencionada, para que a placa opere como receptor.

Entendendo o Código

O código se inicia com a definição de "TRANSMISSOR" pelo comando #define TRANSMISSOR. Se essa linha não estiver comentada, ou seja, se "TRANSMISSOR" estiver definido no código, o Shield operará como transmissor de mensagens. Caso contrário, se essa linha for comentada, não haverá a definição de "TRANSMISSOR" e o Shield operará como receptor.

Em seguida são adicionadas as bibliotecas "SoftwareSerial" e "RoboCore_SMW_SX1262M0" ao código, com a criação do objeto LoRaSerial a partir da biblioteca "SoftwareSerial" e o objeto LoRa atrelado ao objeto LoRaSerial a partir da biblioteca "RoboCore_SMW_SX1262M0". Feito isso, é criado o objeto response como instância de CommandResponse da biblioteca do módulo, e a frequência em que as mensagens serão enviadas e lidas é configurada na variável FREQUENCIA.

Para finalizar as declarações globais do código, verificamos através do comando #ifdef TRANSMISSOR se o "TRANSMISSOR" está definido no código. Se estiver, são declaradas as variáveis que armazenam o pino conectado ao botão do Shield e uma variável auxiliar para definir se a mensagem enviada irá acender ou apagar o LED da placa receptora. Caso "TRANSMISSOR" não esteja definido (diretiva #else), são declaradas as variáveis rssi e snr para armazenar os parâmetros de qualidade do sinal da mensagem recebida; o objeto data é criado como instância de Buffer da biblioteca do módulo; a constante TEMPO_MAXIMA_ESCUTA é declarada recebendo o valor de 1000 milissegundos; e a variável mensagem é declarada para armazenar a mensagem recebida da comunicação. Por fim, a verificação de definição é encerrada com o comando #endif.

Já nas configurações do código, iniciamos o monitor serial e a comunicação com o Shield, ambos com a velocidade de 9600 bps, e reiniciamos o módulo pelo comando LoRa.reset(). Feito isso, se "TRANSMISSOR" estiver definido, o pino conectado ao botão do Shield é configurado como entrada com pull-up interno e o pino conectado ao pino LED L é configurado como saída em nível lógico baixo inicial. Caso o código esteja configurado para receptor, o Shield é configurado para recepção contínua de mensagens na frequência configurada na variável FREQUENCIA pelo comando LoRa.P2P_start(FREQUENCIA, true), e o LED L também é configurado como uma saída com o nível lógico baixo inicial.

Já na repetição do código, novamente é verificado se "TRANSMISSOR" foi definido no código e, caso seja, é verificado se o botão do Shield foi pressionado pela condição if (digitalRead(PINO_BOTAO) == LOW) com um debounce. Se o botão for pressionado, a variável auxiliar para acender e apagar o LED da placa receptora acende_LED tem sua lógica invertida (se era "false" passa para "true", e vice-versa). Se a variável acende_LED for verdadeira, a mensagem "HIGH" é enviada uma única vez pelo Shield na frequência configurada anteriormente pelo comando response = LoRa.P2P_start(FREQUENCIA, false, "HIGH"). Caso a variável acende_LED seja falsa, a mensagem "LOW" é enviada para apagar o LED da placa receptora pelo comando response = LoRa.P2P_start(FREQUENCIA, false, "LOW"). Em seguida é verificado se a mensagem foi corretamente enviada, e então o resultado é avisado pelo monitor serial. A condição "vazia" while(digitalRead(PINO_BOTAO) == LOW) garante que nada será executado enquanto o botão for mantido pressionado.

Caso o código esteja configurado como receptor, o Shield aguarda durante o tempo configurado na variável TEMPO_MAXIO_ESCUTA a recepção de uma mensagem pelo comando response = LoRa.P2P_listen(TEMPO_MAXIMO_ESCUTA, data, rssi, snr). Caso uma mensagem seja recebida (condição if (response == CommandResponse::DATA)), os caracteres da mensagem recebida são salvos em sequência na variável mensagem graças ao comando mensagem += (char)data.read(). Então, a mensagem é impressa no monitor serial, juntamente com os parâmetros de qualidade de sinal da mensagem recebida. Em seguida, é verificado se a mensagem recebida é igual a "HIGH" ou "LOW". Se for "HIGH", o LED L é aceso, e se for "LOW", o LED L é apagado. Caso seja outra mensagem, nada será executado. Para finalizar, a variável mensagem é "limpa" para o recebimento de uma nova mensagem.

O Que Deve Acontecer

Após carregar o código para as placas transmissora e receptora, acompanhe a execução dos códigos delas pelo monitor serial e pressione o botão do Shield transmissor. Você verá o envio da mensagem para acender ou apagar o LED, como na imagem abaixo.

resultado-final-transmissor
Resultado Final no Transmissor

Já na placa receptora, será possível observar as mensagens recebidas quase que instantaneamente após pressionar o botão, como na próxima imagem.

resultado-final-receptor
Resultado Final no Receptor

Também é possível ver a qualidade do sinal recebido (RSSI e SNR), sendo que quanto maior ambos os valores, melhor a qualidade.

Juntamente com o recebimento das mensagens, será possível ver o LED do Shield e da placa base acendendo e apagando conforme a mensagem enviada.

Resultado Final

Indo Além

Agora que sabemos como realizar uma comunicação ponto a ponto por LoRa, as possibilidades são inúmeras, já que diversas aplicações de comunicação sem fio entre dois dispositivos podem ser adaptadas para esse protocolo. Uma das possibilidades é o controle remoto de robôs, onde a placa transmissora pode ser conectada a botões para o envio de sinais de controle e a receptora pode estar conectada a um driver de motores DC, por exemplo.

Conclusão

Neste tutorial vimos como a comunicação P2P do Shield LoRaWAN funciona com um exemplo básico de envio e recebimento de mensagens.

Avatar