Comunicação LoRa com Arduino Ponto a Ponto (P2P) 18

Apesar da disponibilidade das tecnologias Wi-Fi, Bluetooth e redes de comunicação celular (GPRS/3G/4G) em diferentes soluções em Internet das Coisas (IoT), surgiu a necessidade por um tipo de comunicação de longo alcance com baixo de consumo de energia. Assim, um novo grupo de tecnologias de comunicação, as LPWAN (do inglês Low Power Wide Area Networks), apresentam como principais características alto alcance de transmissão e baixo consumo de energia. As duas redes LPWAN mais conhecidas são a rede Sigfox e redes LoRa, sendo esta última baseada na tecnologia LoRa e procotolo LoRaWAN. Essas tecnologias também estão disponíveis para comunicação LoRa com Arduino.

A tecnologia LoRa trata-se de um tipo de modulação patenteado pela empresa SEMTECH e disponível como comunicação de radiofrequência (RF) nas frequências 433, 868 e 915 MHz. As faixas de operação do LoRa fazem parte da banda ISM (Industrial Sientific and Medical), onde diferentes intervalos são reservadas internacionalmente para o desenvolvimento Industrial, científico e médico. Um exemplo de um módulo de comunicação que também faz parte da banda ISM é o nRF24L01.

O transceiver LoRa SX1276

Considerando as alternativas para desenvolvimento de soluções em sistemas embarcados e projetos makers e DIY de baixo custo com a tecnologia LoRa, um módulo em especial se destaca, o SX1276. O módulo SX1276 é um transceiver, dispositivo responsável pela comunicação sem fio, oferecendo comunicação de espectro disperso de alcance ultra longo e alta imunidade a interferências e minimizando o consumo de energia.

O transceiver SX1276 é um circuito integrado muito pequeno e que necessita diferentes circuitos de proteção a interferências e ruídos, assim diversos fabricantes têm disponibilizado o SX1276 em módulos com comunicação serial para diversas plataformas de desenvolvimento, como Arduino e Raspberry Pi. Assim, torna-se importante conhecer os diferentes módulos LoRa baseado no SX1276.  A figura abaixo ilustra três dos principais módulos LoRa baseados no SX1276 que podem ser conectados com plataformas como Arduino e Raspberry Pi.

Módulos LoRa

Da esquerda para direita temos o módulo LoRa mini, e LoRaF 30, ambos da niceRF. A diferença entre os dois primeiros corresponde a potência de transmissão, o LoRa mini permite transmissao com 100mW e LoRaF 30 com 500mW. O terceiro módulo corresponde ao RFM95W da HopeRF. Vale destacar que você já encontra o LoRa mini disponível para venda na loja virtual da FilipeFlop.

Em comum a todos os três módulos listados acima tem-se a pinagem para conexão com as placas de desenvolvimento, baseado na comunicação seria pelo protocolo SPI, onde será detalhada na seção a seguir.

A pinagem para comunicação com Arduino e outras plataformas

Como descrito anteriormente, o tipo de comunicação serial utilizado pelos diferentes módulos baseados no SX1276 é o protocolo SPI. Assim, faz-se necessária a identificação dos pinos principais para o estabelecimento da comunicação. Do protocolo SPI temos os pinos: SCK, MISO, MOSI e NSS (que atua como Chip Select). Os pinos responsáveis pela alimentação do módulo são o VCC (com funcionamento exclusivamente na tensão de 3.3V!) e o GND (terra). Para a conexão com antena, seja esta helicoidal, wire (baseada em fio) ou com algum conector específico, o pino ANT. Outros pinos exclusivos do módulo são: DIO0, DIO1, DIO2, e NRESET.  A tabela abaixo mostra a descrição completa (também ilustrada na Figura) e resumida.

Módulo LoRa

Tabela Pinagem para comunicação LoRa com Arduino

Comunicação Ponto a Ponto (P2P) e comunicação LoRaWAN

É importante diferenciar o tipo de comunicação a ser utilizada com o módulo LoRa. A tecnologia torna-se possível para comunicação de maneira direta entre módulos, comunicação ponto a ponto (P2P) e o uso dos módulos para caracterizar um dispositivo conectado com o protocolo LoRaWAN. Como o objetivo inicial deste post é introduzir a comunicação do módulo com Arduino, irei abordar apenas a comunicação P2P, por enquanto.

Circuito LoRa Mini com Arduino UNO

Para a conexão do modulo LoRa mini com o Arduino faz-se necessário o uso de conversor de nível lógico 3.3-5V Bidireccional, visto que o Arduino UNO opera em 5V e o nível lógico do modulo LoRa mini é 3.3V. Assim, segue a lista dos componentes necessários (para a comunicação LoRa com Arduino entre dois módulos):

Componentes utilizados

  • 2x Arduino UNO R3
  • 2x Módulo LoRa Mini 915MHz
  • 4x Conversor de Nível Lógico 3.3-5V Bidireccional ou 2x PCBs adaptadoras do módulo LoRa

Antes de começar qualquer passo da montagem do circuito note que o módulo LoRa mini não possui conexão direta com os tradicionais pinos da protoboard. Assim faz-se necessária uma conexão com protoboard ou pinos para ligação com Arduino UNO. Duas opções tornam-se possíveis (mostradas na figura abaixo): soldar diretamente o jumper a ser utilizado na placa ou utilizar uma placa de circuito (PCB) de modo a adaptar a ligação do módulo.  O leitor que optar pela segunda opção pode utilizar esta placa open-source hardware desenvolvida anteriormente para conexão.

Montagem Módulo LoRa

Considerando o uso com Arduino UNO (também válido para o Mega e placas baseadas no Atmega32u4 como Arduino Leonardo) segue abaixo a tabela para comunicação.

Tabela Ligação Arduino

Programação para Comunicação LoRa com Arduino

Considerando as bibliotecas disponíveis para a operação do LoRa como comunicação RF direta entre sistemas embarcados, a biblioteca Arduino LoRa, do Sandeep Mistry, torna-se uma solução bastante interessante para comunicação LoRa com Arduino pelo fato da mesma implementar o endereçamento de dispositivos, ao anexar um cabeçalho no payload da mensagem. A mesma está disponível no GitHub e também pode ser adicionada pela IDE Arduino, como mostrado a seguir.

O código a ser utilizado pela biblioteca possui alguns parâmetros de configuração, como o endereço do dispositivo, o endereço do destino da mensagem e o intervalo de tempo entre o envio de mensagens. O código comentado e explicado, pode ser encontrado a seguir:

// Comunicação LoRa com Arduino 
// Definicao das bibliotecas a serem utilizadas no projeto
#include <SPI.h>             
#include <LoRa.h>

// Definicacao de constantes
const int csPin = 10;         // Chip Select (Slave Select do protocolo SPI) do modulo Lora
const int resetPin = 0;       // Reset do modulo LoRa
const int irqPin = 4;         // Pino DI0

String outgoing;              // outgoing message

byte localAddress = 0xBB;     // Endereco deste dispositivo LoRa
byte msgCount = 0;            // Contador de mensagens enviadas
byte destination = 0xFF;      // Endereco do dispositivo para enviar a mensagem (0xFF envia para todos devices)
long lastSendTime = 0;        // TimeStamp da ultima mensagem enviada
int interval = 5000;          // Intervalo em ms no envio das mensagens (inicial 5s)

// Setup do Microcontrolador
void setup() 
{
  // inicializacao da serial 
  Serial.begin(9600);                   
  while (!Serial);

  Serial.println(" Comunicacao LoRa Duplex - Ping&Pong ");

  // override the default CS, reset, and IRQ pins (optional)
  LoRa.setPins(csPin, resetPin, irqPin);// set CS, reset, IRQ pin

  // Inicializa o radio LoRa em 915MHz e checa se esta ok!
  if (!LoRa.begin(915E6)) 
  {             
    Serial.println(" Erro ao iniciar modulo LoRa. Verifique a coenxao dos seus pinos!! ");
    while (true);                      
  }

  Serial.println(" Modulo LoRa iniciado com sucesso!!! 🙂 ");
}

// Loop do microcontrolador - Operacoes de comunicacao LoRa
void loop() 
{
  // verifica se temos o intervalo de tempo para enviar uma mensagem
  if (millis() - lastSendTime > interval) 
  {
    String mensagem = " Ola mundo! :O ";    // Definicao da mensagem 
    sendMessage(mensagem);
    Serial.println("Enviando " + mensagem);
    lastSendTime = millis();            // Timestamp da ultima mensagem
  }

  // parse for a packet, and call onReceive with the result:
  onReceive(LoRa.parsePacket());
}

// Funcao que envia uma mensagem LoRa
void sendMessage(String outgoing) 
{
  LoRa.beginPacket();                   // Inicia o pacote da mensagem
  LoRa.write(destination);              // Adiciona o endereco de destino
  LoRa.write(localAddress);             // Adiciona o endereco do remetente
  LoRa.write(msgCount);                 // Contador da mensagem
  LoRa.write(outgoing.length());        // Tamanho da mensagem em bytes
  LoRa.print(outgoing);                 // Vetor da mensagem 
  LoRa.endPacket();                     // Finaliza o pacote e envia
  msgCount++;                           // Contador do numero de mensagnes enviadas
}

// Funcao para receber mensagem 
void onReceive(int packetSize) 
{
  if (packetSize == 0) return;          // Se nenhuma mesnagem foi recebida, retorna nada

  // Leu um pacote, vamos decodificar? 
  int recipient = LoRa.read();          // Endereco de quem ta recebendo
  byte sender = LoRa.read();            // Endereco do remetente
  byte incomingMsgId = LoRa.read();     // Mensagem
  byte incomingLength = LoRa.read();    // Tamanho da mensagem

  String incoming = "";

  while (LoRa.available())
  {
    incoming += (char)LoRa.read();
  }

  if (incomingLength != incoming.length()) 
  {   
    // check length for error
    Serial.println("erro!: o tamanho da mensagem nao condiz com o conteudo!");
    return;                        
  }

  // if the recipient isn't this device or broadcast,
  if (recipient != localAddress && recipient != 0xFF)
  {
    Serial.println("This message is not for me.");
    return;                             // skip rest of function
  }

  // Caso a mensagem seja para este dispositivo, imprime os detalhes
  Serial.println("Recebido do dispositivo: 0x" + String(sender, HEX));
  Serial.println("Enviado para: 0x" + String(recipient, HEX));
  Serial.println("ID da mensagem: " + String(incomingMsgId));
  Serial.println("Tamanho da mensagem: " + String(incomingLength));
  Serial.println("Mensagem: " + incoming);
  Serial.println("RSSI: " + String(LoRa.packetRssi()));
  Serial.println("Snr: " + String(LoRa.packetSnr()));
  Serial.println();
}

Funcionamento dos módulos LoRa conectados

Para realizar uma comunicação LoRa com Arduino entre dois módulos basta programar cada respectivo Arduino com seu endereço e o endereço do módulo a ser enviado. Por exemplo, programe um módulo condereco 0x01 e com envio de mensagens para o módulo 0x05. Em seguida, programe um Arduino com o endereço 0x05 e envio para 0x01.

Gostou de aprender mais sobre comunicação LoRa com Arduino? Ajude-nos a melhorar o blog comentando abaixo sobre este tutorial. Não se esqueça de visitar o Fórum da Filipeflop para postar suas ideias e dúvidas!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

18 Comentários

  1. Bom dia .
    É possivel uma comunicação entre esses módulo tipo um com varios (como se fosse um servidor e cinco clientes) ?
    Se sim quantos módulos eu precisaria ?

    Se não qual o tipo de comunicação que você recomendaria ?

    Obrigado pela ajuda

    Edmundo Gualberto Jr.
    1. Oi Edmundo , tudo certo?

      Voce pode realizar este tipo de comunicacao a partir de um gateway. Que poderia ser configurado com um Raspberry Pi, ou qualquer placa com linux embarcado. Outra alternativa tambem, seria o uso de um ESP32 ou ESP8266.

      Em breve irei abordar sobre a montagem de um gateway LoRa a partir do Raspberry Pi.

  2. Oi Edmundo , tudo certo?

    Voce pode realizar este tipo de comunicacao a partir de um gateway. Que poderia ser configurado com um Raspberry Pi, ou qualquer placa com linux embarcado. Outra alternativa tambem, seria o uso de um ESP32 ou ESP8266.

    Em breve irei abordar sobre a montagem de um gateway LoRa a partir do Raspberry Pi.

  3. Melhor texto sobre Lora que encontrei ate agora. Tem como mandar ou postar um desenho do equema de pinagens que fez entre o lora e o arduino?

    Não entendi quais pinos passam pelo conversor bidirecional.

    Obrigado.

    1. Oi Thiago, vou melhorar essa comunicacao em breve com uma imagem do Fritizing. Em resumo os pinos que voce deve utilizar sao os do barramento SPI (MOSI, MISO e SCLK) mais o RESET (NSS)

  4. Ola Eron,

    Estou querendo fazer um payload com uma combinacao de data de 4 sensores

    1 – Acelerometro: que funciona basicamente como um contator de free fall
    2- Sensor de distancia: que vai retornar um bool ou char, caso um certo range de distancia seja atigindo
    3- Sensor de carga/ou um FRS: que vai detectar a presenca de um objeto ou nao no sistema.

    A logica eh a seguinte:

    Case 1: objeto seja detectado AND a queda desse objeto for detectada = dispatch a lora message
    Case 2: objeto seja detectado AND a queda desse objeto for detectada OR distacia de seguranca for atingida = dispatch a lora message

    Gostaria de saber como poderia configurar essas mensagens usando esses sensores?

    Voce poderia me ajudar?

    1. Oi Paola, voce pode definir um vetor (do tipo float, por exemplo) com as variaveis que voce deseja enviar e depois fazer a conversao para string para ser mandando como mensagem na String.

      https://playground.arduino.cc/Main/FloatToString

  5. Olá boa tarde,ótimo texto,gostaria de fazer uma comunicação p2p com lora e seria tipo assim
    2 chave de toque de um lado , e do outro lado,1 led pra cada chave,você pode me ajudar? Sou leigo

  6. Boa tarde Eron!
    Parabéns pelo post! Muito interessante.
    O que eu mais gostaria de saber é quais distancias os modelos aqui apresentados conseguem atingir?
    Preciso transmitir RS232.
    Poderia me dar uma dica do que usar para distância entre 2 a 4 Km.
    Muito obrigado!
    Abraço!

    1. Esse tipo de pergunta vai depender de muitos fatores como:

      – casamento de impedancia do modulo;
      – tipo de antena.

      Em geral, algumas antenas externas omni de 3dBi ja apresentam bons resultados. Como o modulo apresentado apresenta a possibilidade de soldar o conector da antena em uma PCB, ou diretamente no modulo, existem grandes chances de acontecer perdas, ocasioanando em um alcance nao tao grande.

  7. Muito bom esse post para começar a brincar com LoRa, na cidade onde moro temos uma infraestrutura pública para testes e estou ansioso para testar!
    Só ficou um pouco confuso quais os pinos que precisam da conversão bidirecional, pois o módulo LoRa tem 12 pinos e na lista de materiais pede 4 conversores de nível lógico, que só têm 2 canais bidirecionais, totalizando 8 pinos… Tens um esquemático mais detalhado? Ou devo procurar algo na documentação do SPI? Só preciso usar os pinos referenciados naquela tabela?
    Obrigado!

    1. Oi Cristian, voce podera utilizar os conversores para os sinais descritos tabela, como cada conversor tem apenas 04 entradas, voce precisara de dois.

      Os pinos utilizados sao o do protocolo SPI (MISO, MOSI, SCLK e um CS) alem dos outros digitais do modulo

  8. Muito bom este material que postou; foi importante para min que estou terminando Gestão de tecnologia da informação.
    Tenho um projeto a desenvolver voltado para segurança pública por inciativa própria, onde será implementado com várias tecnologia. conhecimento mais profundo sobre IOT tem haver com meu projeto, especificamente o esp32 wifi lora e os demais da linha voltados para área de comunicação; onde penso aplicar estas tecnologias.
    Obrigado pela colaboração adquirida.
    desejo sucesso.

    1. Olá Souza!

      É sempre bom saber que nosso trabalho ajuda as pessoas! Você também pode dar uma olhada no nosso fórum. Lá você pode tirar algumas dúvidas e postar seus projetos. Colaborar e aproveitar a comunidade:

      https://www.filipeflop.com/forum/

      Abraços!

      André – Equipe FilipeFlop

  9. Fala Eron! Tudo certo?

    É possível fazer uma comunicação de áudio, como se fosse uma conferência de voz?

    Quero montar algo parecido com aqueles comunicadores que colocam em capacete de moto para viajar e se comunicar, porém utilizando o LoRa. No caso, preciso enviar o audio por um microfone que será plugado nele, e receber do outros simultaneamente, sem pressionar botões (como ocorria com um Nextel, por exemplo).

    Não quero atingir grandes distâncias… minha dificuldade na realidade é em como fazer para o LoRa receber o audio do microfone e transmitir para o outro lado transmitir pelo fone.

    Talvez precisaria montar um servidor que recebesse e enviasse os áudios, mas se não precisasse de um, seria mais interessante (não que isso seja um problema).

    Consegui fazer essa comunicação via WiFi usando linux, mas não queria depender de sinal de WiFi…

    1. Olá Edmilson

      Você pode colocar esse problema com mais detalhes no nosso fórum? Lá o pessoal pode te ajudar melhor nisso.

      https://www.filipeflop.com/forum/

      Abraço,
      Rosana – Equipe FilipeFlop

  10. Olá, posso implementar esta biblioteca em um arduino mega?

    1. Olá Elcio,

      Sim, também válido para o Mega e placas baseadas no Atmega32u4 como Arduino Leonardo.

      Abraço!
      Rosana – Equipe FilipeFlop