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

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!

Posts Relacionados

Deixe uma resposta

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

3 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.