LoRa Mesh da Radioenge utiliza a tecnologia LoRa porém o grande diferencial deste módulo é a capacidade de se comunicar com outros módulos de modo que a informação saia de ‘A‘ e chegue a ‘J‘ sem se comunicarem de forma direta.
Se ‘J‘ estiver fora do alcance de ‘A’, a informação vai percorre todo o “alfabeto”, até chegar ao destino. Caso isso seja confuso para você, ao longo deste post irá entender.
1 O que é LoRaMesh?
Para esclarecer o que de fato é LoRa Mesh, vamos fazer uma analogia com a internet. Quando você envia uma mensagem para uma pessoa, toda a informação passa por servidores.
Os servidores são encarregados de transacionar toda comunicação dentro de uma rede, de modo que ‘A’ se comunique com ‘J’, mesmo a longas distâncias.
Na ausência dos servidores, seria até possível enviar uma mensagem para o celular de uma pessoa de forma direta, mas neste caso a distância máxima entre os celulares no melhor dos casos, seria uns 100m.

Porém se a mensagem começar a pular de celular a celular até chegar no destino, esta distância vai se multiplicar pela quantidade de celulares que repassaram a informação, se foram 10, teremos uma distância total de 1 km de comunicação.
Neste caso acima, os celulares estaria de certa forma, atuando como um servidor também, claro que não com a mesma capacidade e sim com função parecida.
O principio de funcionamento deste módulo é exatamente o mesmo da analogia da mensagem que pula de celular a celular até chegar ao destino, a única diferença é que a modulação do sinal é LoRa.
2 Como o LoRa gerencia a Rede?
Caso você tenha compreendido o que é o LoRa MESH, vai ficar bem mais fácil para entender o gerenciamento da rede.
Basicamente a rede é gerida por um único máster e todos os outros dispositivos são slaves.

Cada dispositivo na rede também é um “mini servidor” que repassa a informação até chegar ao destino.
3 Quando escolher o LoRa Mesh?
Se você precisa ter uma central que controla vários dispositivos espalhados dentro de uma área com uma distância acima de 1km e não tem muitas exigências em relação a consumo, esta tecnologia pode te servir muito bem.
Caso haja restrição em relação ao consumo energético da comunicação, sugiro o opção LoRa Wan, também fornecido pela Radioenge.
Se você apenas tem a necessidade de fazer uma comunicação de longa distância com um ou outro dispositivo sem restrição de consumo elétrico, talvez compense mais usar um módulo que é apenas LoRa, saiba mais.
3.1 Diferença do LoRa Wan para LoRa Mesh
Uma das grandes vantagens do LoRa é o baixo consumo de energia, mas utilizar uma estrutura de malha requer uma alta atividade do módulo.
Pois a informação precisa ficar repassando de dispositivo a dispositivo e isso consequentemente aumenta o consumo elétrico.
O LoRaWAN é pensado para reduzir ao máximo o consumo de energia, ele não tem estrutura de malha, apenas se comunica de forma direta com um gateway.

Basicamente o gateway é o dispositivo responsável por ficar operando de forma continua para capturar alguma informação de algum dispositivo.
Então o gateway não é feito para baixo consumo, pois ele precisa ficar ligado para conseguir capturar uma informação quando “alguém enviar”.
3.2 Diferenças Entre Zigbee e LoRa Mesh
Após o anúncio deste módulo em nossas redes sociais, alguns seguidores perguntaram qual é a diferença dele para o Zigbee. A resposta é simples, um é para longas distâncias e outro foi feito para dispositivos IoT residenciais.

O LoRa foi desenvolvido para longas distâncias, porém não tem a mesma estrutura de malha do Zigbee.
A ausência do mesh, impossibilita uma comunicação mais complexa com vários dispositivos, por isso foi criado o LoRaMESH.
4 Características do Módulo LoRa Mesh da Radioenge
A principal característica que mais chamou atenção é que este módulo é de uma empresa Brasileira e já vem homologado pela Anatel. Além disso ele conta com 8 GPIO’s programáveis, das 8 duas são entrada ADC.

4.1 Pinout
Além das GPIO’s este módulo também possui duas UART, uma é para comandos e a outra é para comunicação transparente. Isso será discutido mais afrente, mas antes é necessário identificar qual a função de cada pino.

4.1.1 Tensão
Uma das características deste módulo que é muito vantajosa, é a tolerância de tensão acima de 3.3v, que é a tensão do microcontrolador on-board.

Perceba que na tensão da UART tem um termo ‘classe A e classe C’, guarde essa informação até chegar nas configurações do módulo. Pois isso é extremamente importante.
4.2 Aplicação de baixo consumo
Caso você tenha escolhido a tecnologia LoRa Mesh ao invés do LoRa Wan e precisa reduzir o consumo elétrico da aplicação, sabia que é possível.
Com o intuito de facilitar nosso trabalho de desenvolvedor/projetista a Radioenge já deixou duas formas de reduzir consumo, tanto por meio de software como via hardware.
4.2.1 Via Software
Este primeiro método desabilita a repetição do sinal da rede, apenas responde a comandos da serial ou envia dados para o mestre.
Para habilitar o modo de economia de energia, basta mudar a classe para ‘classe A’. Porém tem que tomar cuidado com esta configuração, pois o módulo poderá ser danificado se sua aplicação usa tensão UART de 5v.

Ao definir a ‘classe A’ o módulo que esteja com essa configuração, não repetirá sinal, apenas vai enviar para o mestre ou responder a comandos através da UART.
4.2.2 Via Hardware
Como este LoRa Mesh é um módulo para inúmeras aplicações, já vem preparado para aceitar uma tensão de alimentação de até 16v para sair 3.3v no barramento da placa.
O regulador de tensão que faz esse gerenciamento da tensão de entrada, mas o próprio regulador consome também, mas se a tensão da sua aplicação já for 3.3v, não há necessidade do uso de regulador.
Por isso a Radioenge colocou um forma de fazer um bypass do regulador, para isso, basta remover o regulador (retângulo A) e adicionar um resistor de 0R 0402 no retângulo B.

Ao fazer isso, você estará sujeito a perder a placa caso a tensão de alimentação ultrapasse 4v.
Há também 3 LED’s que servem para sinalização de alguns comportamentos do módulo, porém no caso da ‘classe A’, não cheguei a testar se os LED’s permanecem funcionando, caso permaneça, dessolde eles para economizar ainda mais energia.
4.3 LEDs de sinalização
Um das funções mais úteis é autodiagnostico e a sinalização via 3 LEDs on-board de cor vermelha, verde e amarelo.

4.3.1 Funções do LED’s
- Vermelho: pisca quando ocorre alguma transmissão via rádio;
- Verde: pisca quando ocorre alguma recepção via rádio;
- Amarelo: pisca a cada 1 segundo para indicar que o radio está com a recepção ativa.
4.3.1.1 Função alternativa
Infelizmente o datasheet deste módulo aborda os LEDs com pouca relevância, sendo que são extremamente importantes na prática.
Por mais que cada LED tenha uma função base, se for analisado o comportamento do conjunto, é possível identificar problemas, configurações, erros de comunicação e até comunicações bem sucedidas.
Particularmente eu poderia abordar todos os comportamentos dos LED’s neste tópico, mas acredito que tenha mais sentido ao longo de cada tópico.
5 Como configurar LoRa Mesh da Radioenge
A única forma de configurar o módulo é através da porta serial de comando ou remotamente através de outro LoRa, mas neste post só iremos abordar a configuração local.
Porém você pode optar por enviar os comandos através de um microcontrolador ou pode fazer isso usando o aplicativo da Radioenge para configurar manualmente.

Caso esse seja seu primeiro contato com o módulo, recomendo usar o aplicativo e configurar manualmente, para baixar, basta clicar aqui.
Após baixar, abra o aplicativo e conecte com o módulo na porta serial de comando, para isso é necessário o uso de um conversor USB Serial, particularmente usei um FDI simples.

Dentro do aplicativo existem inúmeras configurações mas neste momento apenas vamos focar nos parâmetros mais importantes.
Assim que o aplicativo é aberto, já aparece algumas opções de configurações no canto direito. Para iniciar a configuração manual, clique no botão “LocalRead”.

Após feito essa etapa, podemos prosseguir para a configuração da taxa de bps da comunicação.
5.1 Configurando bps
Para obter a taxa de bps adequado é necessário configurar os sub-parâmetros “Bandwidth”, “Spreading Factor” e “Coding Rate”. Cada um deles será explicado individualmente a seguir.
5.1.1 Bandwidth
Esta configuração vai definir a largura de banda do LoRa, por padrão é possível definir 3 valores diferentes. Este parâmetro junto com os demais irá definir o bitrate da comunicação.

5.1.2 Spreading Factor
Basicamente esta configuração quanto maior for, maior será o “tempo no ar” e consequentemente o consumo de energia, porém se reduzida aumenta o alcance da comunicação.
Informações retiradas do artigo “An Adaptive Spreading Factor Selection Scheme for a Single Channel LoRa Modem“, recomendo a leitura.

5.1.3 Coding Rate
O coding rate é basicamente uma seleção de tabela que usa os dois parâmetros acima para obter o valor de bps. São um total de quatro configurações possíveis, cada uma representa uma tabela.
Os parâmetros de Bandwidth e Spreading factor podem resultar em 4 variações de bps, então consulte a tabela abaixo e selecione o coding rate respectivos.

5.1.4 Verificação da configuração
Após configurar o módulo, fique atento o LED amarelo, pois ele vai indicar se a placa foi configurado com modulação LoRa ou FSK. No caso do LoRa o LED amarelo pisca a cada 1s, no FSK o LED pisca a cada 500ms.
5.2 Configuração da Classe
Como já foi visto anteriormente, essa configuração precisa de uma atenção a mais, caso contrário, você poderá danificar o módulo.
Existem duas configurações de classe, a primeira é ‘classe A‘ e a segunda é ‘classe C’. Na ‘classe A‘ a tensão da UART cai para 3.3v e o módulo deixa de atuar como repetidor dentro da rede e apenas envia para o mestre e responde comandos via UART.

Ao contrário da ‘classe A’ a ‘classe C‘ atua como repetidor. Além disso, recebe comandos remotamente e a tensão da comunicação UART fica em 5v.
5.2.1 Janela
A janela é uma configuração destinada a ‘classe A’ e define o tempo que o rádio ficará ligado após uma transmissão, por padrão há 3 tempos predefinidos:

Embora seja exclusivo da ‘classe A’, ainda assim é necessário ser definido mesmo que seja para ‘classe C’, pois a janela é presente no pacote de bytes desta configuração.

Mesmo que o valor do byte 5 seja ‘0x00‘ estará definindo o tempo da janela em 5s. Então no caso do uso da ‘classe C’, pode escolher qualquer uma das opções de janela, pois não faz diferença.
5.3 Definir senha e ID da Rede
Para que os módulos comuniquem entre si, é necessário definir um ID de cada de módulo e uma senha única para todos da rede.
5.3.1 ID do LoRa Mesh
Antes de definir um ID é necessário entender qual vai ser a função do seu projeto, pois se for um dispositivo que gerencie a rede, então o módulo tem que ser mestre, ou seja, ID 0.
Caso contrário, se for uma aplicação que vai servir a uma central, o ID deve ser maior que zero. No datasheet do LoRa mesh da Radioenge deixa isso bem claro logo nas primeiras páginas

5.3.1.1 Como gravar o ID
Para gravar o ID clique primeiramente em ‘LocalRead‘ e em seguida digite um número de 0 a 2047 e clique em ‘set’.

Após ter clicado em ‘set’ o módulo retorna um pacote de bytes e logo no inicio os dois primeiros bytes são o novo ID.

Marcado em verde é o novo ID e marcado em amarelo é o feedback do módulo, podemos notar que a gravação foi bem sucedida.
5.3.1.1.1 Observação
Toda comunicação da rede tem feedback, então se um comando sai do “master” e vai para o “slave”, após o “slave” receber ele informa ao “master” que recebeu e a comunicação é encerrada.
Então se você pretende ter mais de um dispositivo com o mesmo ID, saiba que isso não vai funcionar de forma adequada.
Pois o LoRa que receber primeiro vai também, informar primeiro que recebeu o pacote e consequentemente o outro módulo de mesmo ID não vai receber nada.
5.3.2 Senha da Rede LoRa
Atenção a este tópico, pois ele vai definir se sua rede vai funcionar ou não, mas se você ler atentamente os próximos parágrafos, sua chance de sucesso vai ser muito próximo de 100%.
Como já foi dito anteriormente, para criar uma rede todos os módulos deverão ter a mesma senha. Caso você queira ter mais de uma rede, basta ter senhas diferentes.
5.3.2.1 Como gravar a senha
Para escolher uma senha você colocar qualquer número entre 0 até 4294967295. Após escolher basta clicar em “set”.

Após clicar em ‘set’ você pode logo em seguida verificar a comunicação do app com o LoRa Mesh da Radioenge clicando em ‘LocalRead’.
Os dois primeiros bytes após o byte ‘0xE2’ representarão a senha, porém como são apenas 2 bytes, só será possível ter o feedback da senha até o número 65535.

Perceba que na esquerda, marcado em verde, temos os bytes da senha que foi para o módulo.
Na direta após clicar em ‘localread’ temos o mesmo valor hexadecimal da senha que foi definida, neste casso a senha ‘123’ que em hexa é ‘0x7B’.
5.3.2.1.1 Observação
No datasheet não há nada que confirme que esses dois primeiros bytes após o byte ‘0xE2’ seja a senha, mas você pode fazer o teste e ver que vai funcionar.
5.4 Configuração da GPIO do LoRa Mesh da Radioenge
Esta é outra configuração que provavelmente vocês usarão com recorrência, mas não vou aprofundar sobre isso pois é muito autoexplicativo.

Apenas se atente nas definições do pino se a GPIO que você selecionou, aceita ADC ou não, caso queria usar é claro.
Outro ponto muito importante é a tensão de entrada e de saída, tome cuidado com as diferenças de tensões, isso pode queimar seu módulo.
6 LoRa Mesh da Radioenge com Arduino e ESP32
A principio a Radioenge tem uma biblioteca para este módulo porém além de ser muito vago em relação a infinidade de opções que este módulo oferece, também é incompatível com ESP32.
Por isso, decidi criar um fork da biblioteca da Radioenge e adicionar pelo menos as principais configurações e deixar compatível com o ESP32. Embora toda explicação seja com Arduino, na prática vai ser o mesmo para o ESP32, caso não conheça o ESP32, clique aqui.
Tudo que você já viu de configuração, vai está na biblioteca, para acessar o repositório, basta clicar aqui.
6.1 Ideia da aplicação
Como o LoRa mesh da Radioenge já possui um microcontrolador e temos a opção de configurar e controlar cada GPIO, no slave vamos apenas usar o Arduino para configurar o módulo.
6.1.1 Diagrama do Master
Caso sua montagem não funcione, adicione um resistor de 10k em pull up no pino 13 do Arduino ou mude para outro pino.

6.1.2 Diagrama do Slave
Observe que o LED não é conectado de forma direta ao Arduino, pois estamos usando a GPIO0 do LoRa.

6.1.3 Código do Master
Inicialmente o Arduino verifica as configurações iniciais do módulo e caso esteja diferente. grava a nova configuração. Em seguida aguarda algum click no botão e manda apagar ou ascender o LED do slave sem interferência do Arduino.
#include "LoRaMESH.h"
#include <SoftwareSerial.h>
SoftwareSerial SerialCommand(3, 4);
LoRaMESH lora(&SerialCommand);
uint8_t ID = 0;
void setup() {
Serial.begin(115200);
delay(2000);
SerialCommand.begin(9600);
lora.begin(true);
pinMode(13, INPUT_PULLUP);
if(lora.localId != ID)
{
if(!lora.setnetworkId(ID)){
Serial.println("Erro ao definir o novo ID");
while(1);
}
Serial.println("ID configurado com sucesso!");
if(!lora.config_bps(BW500, SF_LoRa_7, CR4_5)){
Serial.println("Erro ao configurar bps");
while(1);
}
Serial.println("Parametros LoRa configurados com sucesso!");
if(!lora.config_class(LoRa_CLASS_C, LoRa_WINDOW_15s)){
Serial.println("Erro ao configurar a classe");
while(1);
}
Serial.println("Modo de operacao configurado com sucesso!");
if(!lora.setpassword(123)){
Serial.println("Erro ao gravar a senha ou a senha gravada não condiz com a senha definida");
while(1);
}
Serial.println("Senha configurada com sucesso!");
}
if(ID == 1)
lora.config_digital_gpio(LoRa_GPIO0, LoRa_NOT_PULL, LoRa_INOUT_DIGITAL_OUTPUT, LoRa_LOGICAL_LEVEL_LOW);
Serial.println("LocalID: " + String(lora.localId));
Serial.println("UniqueID: " + String(lora.localUniqueId));
Serial.println("Pass <= 65535: " + String(lora.registered_password));
}
void loop() {
if(ID == 0 && digitalRead(13) == 0){
static bool button_status = false;
if(button_status)
lora.write_gpio(1, LoRa_GPIO0, LoRa_LOGICAL_LEVEL_HIGH);
else
lora.write_gpio(1, LoRa_GPIO0, LoRa_LOGICAL_LEVEL_LOW);
delay(1000);
}
}
6.1.4 Código do Slave
No caso do slave, apenas só é feito a verificação da configuração e caso esteja diferente, regrava a nova configuração.
#include "LoRaMESH.h"
#include <SoftwareSerial.h>
SoftwareSerial SerialCommand(3, 4);
LoRaMESH lora(&SerialCommand);
uint8_t ID = 1;
void setup() {
Serial.begin(115200);
delay(2000);
SerialCommand.begin(9600);
lora.begin(true);
pinMode(13, INPUT_PULLUP);
if(lora.localId != ID)
{
if(!lora.setnetworkId(ID)){
Serial.println("Erro ao definir o novo ID");
while(1);
}
Serial.println("ID configurado com sucesso!");
if(!lora.config_bps(BW500, SF_LoRa_7, CR4_5)){
Serial.println("Erro ao configurar bps");
while(1);
}
Serial.println("Parametros LoRa configurados com sucesso!");
if(!lora.config_class(LoRa_CLASS_C, LoRa_WINDOW_15s)){
Serial.println("Erro ao configurar a classe");
while(1);
}
Serial.println("Modo de operacao configurado com sucesso!");
if(!lora.setpassword(123)){
Serial.println("Erro ao gravar a senha ou a senha gravada não condiz com a senha definida");
while(1);
}
Serial.println("Senha configurada com sucesso!");
}
if(ID == 1)
lora.config_digital_gpio(LoRa_GPIO0, LoRa_NOT_PULL, LoRa_INOUT_DIGITAL_OUTPUT, LoRa_LOGICAL_LEVEL_LOW);
Serial.println("LocalID: " + String(lora.localId));
Serial.println("UniqueID: " + String(lora.localUniqueId));
Serial.println("Pass <= 65535: " + String(lora.registered_password));
}
void loop() {
if(ID == 0 && digitalRead(13) == 0){
static bool button_status = false;
if(button_status)
lora.write_gpio(1, LoRa_GPIO0, LoRa_LOGICAL_LEVEL_HIGH);
else
lora.write_gpio(1, LoRa_GPIO0, LoRa_LOGICAL_LEVEL_LOW);
delay(1000);
}
}
Note que no Loop há uma condicional que verifica o ID e caso seja diferente de 0, não vai executar o código que está dentro. Como o ID do slave é 1 não será executado, ou seja, o Arduino não vai acionar nada.
6.1.5 Teste Prático na Bancada
Você pode fazer esse teste na bancada com apenas 2 módulos LoRa mesh, mas caso tenha mais de 2, poderá adicionar na rede e perceber que ele irá piscar junto com outros módulos.
Este comportamento é exatamente a repetição do sinal e isso comprova que o módulo de fato cumpre o que promete.
7 Problemas de comunicação
Não há nada no daasheet que fala sobre como identificar problemas na comunicação, mas na prática notei o comportamento dos LED’s quando a comunicação é bem sucedida e quando não é.
Quando não é, os LED’s verde e vermelho piscam em intervalo de tempo mais prolongados. Este comportamento só pode ser visualizado no master e no slave.
A comunicação bem sucedida tem um comportamento muito rápido dos LED’s vermelho e verde. Este comportamento acontece preferencialmente no master.
Embora o comportamento do ‘malsucedido‘ para o ‘bem sucedido‘ esteja bem claro, na sua aplicação a quantidade de piscadas podem mudar. Caso apenas o LED vermelho pisque, isso indica que não há dispositivo na rede, no vídeo piscou pois havia mais um LoRa.
8 Boas Práticas
Rádios são feitos para usar antenas, então não ligue seu LoRa sem ter conectado uma antena. Outra coisa, a antena tem que ter 50R e só pode usar uma saída por vez.
Por mais que os “slaves” tenha a autonomia de enviar para o master quando quiser, evite esse tipo de funcionamento, pois o correto é o master solicitar um comando a determinado slave e em seguida receber a informação solicitada.
Sempre priorize fazer dessa forma, caso contrário o pacote pode acabar conflitando um com o outro e um dos dois perder informações.
9 Opinião Pessoal Sobre o LoRa Mesh da Radioenge
Primeiramente o que mais gostei foi de como a Radioenge me tratou, sendo eu que fui atrás da empresa, pois eu já queria testar esse produto há uns 1 a 2 anos.
Eu queria fazer o teste com apenas duas placas e eles foram muito educados e ainda enviou o dobro de LoRa’s, um a shild para conectar o Arduino UNO e uma interface de comunicação RS232 para usar com o LoRa.

9.1 Problemas Estranhos
Durante os testes do módulo, dois problemas surgiram, o primeiro bloqueava a senha do rádio e impedia novas modificações na senha apenas.

Na imagem acima é possível ver a senha inicial ’00 9C’ e logo após alterar para ‘7B 00’ note que a senha antiga permanece.
O diretor de P&D, Marco Chiodi pediu para marcamos uma chamada para verificar este problema. Ele chegou a conclusão que isso era uma função oculta que bloqueava e criptografava a senha anterior.
O byte que define esse bloqueio é o logo após o 0xCD, por padrão use 0x04, mas não se preocupe que isso tem como solucionar, mas é necessário entrar em contato com a Radioenge.
Porém para desbloquear é necessário a senha anterior. Não se preocupe com isso pois a biblioteca que foi feita e teve participação do Marco, junto com sua equipe, então pode usar sem medo.
De qualquer forma esta função deve ser removida do módulo, então você de fato não precisa se preocupar com isso.
9.1.1 Travamento da classe
O outro problema é relacionado a classe que após configurada, não aceitava novas modificações, porém nesse caso não foi nada relacionado a problema anterior e sim por causa do atraso muito curto.
Por isso, os pacotes que eram enviados para o LoRa mesh da Radioenge, acabavam saturando o módulo e consequentemente gerando o travamento da classe.

Para facilitar a análise o Marco adicionou um debug no código e também fez o correção de leitura dos bytes de uniqueID. Além disso, ele constatou que após mudar o ID do módulo, o travamento some.
9.2 Solução dos problemas
Todos os problemas anteriores são resolvidos com atualização de firmware, caso você se depare come algum deles. Quando fui tentar atualizar tive outro problema que deixou meu módulo travado.
Entrei em contato de novo com a Radioenge para solucionar o problema, eles resolveram através de um processo que volta para o firmware anterior sem regravar, confuso né? Achei que tinha perdido o módulo, mas não!
Decidi fazer um vídeo para explicar como usar o aplicativo de configuração, abordando cada configuração e informação disponível no app, inclusive expliquei como funciona essa questão do firmware do módulo.
Você precisa fazer log in para comentar.