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".
Com o gerenciador aberto, digite "robocore smw sx1262", conforme mostrado na imagem abaixo.
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.
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.
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.
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.
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.