Se você precisa transmitir dados à longas distâncias, precisa conhecer o LoRa (Long Range), uma tecnologia cada vez mais presente em projetos de IoT, e nesse post vamos mostrar como você pode fazer a comunicação entre Arduino e Raspberry Pi com LoRa de uma forma simples.

O que é o LoRa?

LoRa é uma tecnologia de comunicação via rádio que se caracteriza por permitir transmissão a longas distâncias e com um baixo consumo de energia. É uma excelente tecnologia para uso em projetos de IoT e sistemas embarcados, já que a sua característica “econômica” permite que funcione por longos períodos alimentado apenas por baterias.

Logo LoRa

Mas se o LoRa é tão bom assim, por que eu já não uso ele ao invés do Wifi para transmitir os meus dados?

Bom, a questão é que o Lora não foi feito exatamente para manipulação de um grande volume de dados. Lembre-se, o LoRa atinge grandes distâncias, e para isso ele “sacrifica” o volume de dados que podem ser enviados.

Assim, ele é ideal para utilização em envio e recebimento de sinais de sensores e acionamentos remotos por exemplo. O mais comum então é encontrarmos dispositivos que usam o LoRa para comunicação a longas distâncias, e nas pontas, digamos assim, o receptor se conecta à uma rede wifi, para aí sim distribuir os dados, manipular, enviar para um servidor de banco de dados, etc. A imagem abaixo ilustra bem isso:

Soluções LoRa
Imagem: microchip.com

No campo, podemos ter dispositivos espalhados pela lavoura coletando dados e enviando esses dados automaticamente para os Gateways, que vão se encarregar de manipular esses dados e se necessários armazená-los em um servidor ou nuvem. A mesma coisa na cidade, onde dispositivos LoRa podem ser conectados à veículos como automóveis e caminhões para rastreamento e controle. São inúmeras possibilidades.

O módulo RF Lora 433MHz

O módulo RF LoRa 433MHz que vamos utilizar trabalha na frequência de 433Mhz e aceita alimentação entre 2.3 e 5.5V DC. Possui controlador SX1278 (datasheet) e se comunica com o microcontrolador por meio de interface serial/UART.

O conector para antena é SMA, e apesar de utilizarmos nos testes uma antena comum de 3dB (dessas que encontramos em roteadores wireless) recomendamos o uso de uma antena específica para a frequência do módulo, como uma antena SMA 433 MHz.

Módulo RF Wireless Lora 433Mhz

No módulo que estamos usando sentimos falta da marcação dos pinos na PCB. São 7 pinos que tem funções específicas como configurar o modo de operação, interface serial e alimentação.

Na imagem abaixo você confere a pinagem:

Pinagem módulo Lora 433MHz

E a função de cada pino do módulo:

  • M0 e M1: Pinos de entrada, são utilizados para configurar o modo de operação (normal, sleep mode, power saving, etc);
  • RXD e TXD: Pinos da interface serial/UART (Recepção e Transmissão);
  • AUX: Pino de saída, indica o estado do módulo;
  • VCC e GND: Alimentação (3,3 ou 5V DC) e Comum, ground.

Vamos então dar uma olhada em um exemplo prático de utilização do LoRa, efetuando a comunicação entre uma placa Raspbery Pi e um Arduino Uno.

Recomendo que você também confira o post Comunicação Arduino e Raspberry Pi usando I2C, onde mostro uma outra possibilidade de comunicação entre essas duas famosas placas.

Vamos aos testes!

Conexão do LoRa no Arduino Uno

Para comunicação do Arduino Uno com o nosso LoRa, vamos usar os pinos 2 e 3 como interface serial via software (usaremos a biblioteca SoftwareSerial). No pino digital 5 temos um botão que ao ser acionado enviará uma string para a Raspberry.

Circuito de conexão Arduino Uno e módulo Lora 433Mhz

Repare que os pinos M0 e M1 estão interligados e conectados ao GND (Ground). Nessa configuração o módulo está funcionando no modo “normal”. Faremos a mesma coisa no Lora conectado na Raspberry Pi.

Carregue agora o programa abaixo no Arduino:

//Programa: Comunicacao Arduino e Raspberry Pi com LoRa
//Autor: Arduino e Cia

#include <SoftwareSerial.h>

//Pino do push-button
#define botao  5

//Serial Lora nos pinos 2 (TX) e 3 (RX)
SoftwareSerial loraSerial(2, 3);

int contador;

void setup()
{
  //Define o pino do botao como entrada
  pinMode(botao, INPUT_PULLUP);
  //Inicializa a serial do Arduino
  Serial.begin(9600);
  //Inicializa a serial do Lora
  loraSerial.begin(9600);
}

void loop()
{
  //Verifica se o botão foi pressionado
  if (digitalRead(botao) == 0)
  {
    //Aviso no serial monitor
    Serial.print("Botao pressionado - Contador: ");
    Serial.println(contador);

    //Envia os dados pelo modulo Lora
    loraSerial.print(contador);
    loraSerial.print("\r\n");

    while (digitalRead(botao) == 0);
    //Incrementa o contador
    contador++;
    delay(50);
  }
}

O programa cria, via SoftwareSerial, uma porta serial nos pinos digitais 2 e 3, que fará a comunicação com o módulo LoRa. Isso vai liberar a serial “padrão” do Arduino para que possamos acompanhar pelo Serial Monitor se o botão está funcionando corretamente e os dados estão sendo enviados.

Conexão do Lora na Raspberry Pi

Aqui vamos usar um módulo Lora conectado na Raspberry Pi 4, lembrando que você pode usar outras placas da linha Raspberry Pi sem problemas, ok?

A interface serial da Raspberry Pi que vamos usar será habilitada nos pinos 8 (TX) e 10 (RX), que serão conectados respectivamente nos pinos RXD e TXD do módulo LoRa. No pino 12 (GPIO18) da placa vamos conectar um led que irá acender quando algum dado for recebido.

Circuito de conexão Raspberry Pi e módulo Lora 433Mhz

O resistor utilizado no led é de 1K, mas você pode usar outros valores de acordo com o led que tiver em mãos.

Para os testes, certifique-se que a sua placa Raspberry Pi esteja configurada e com o sistema operacional rodando adequadamente. Para instalação do SO recomendamos a leitura do post sobre o Raspberry Pi Imager, que vai facilitar muito o seu trabalho.

A primeira coisa que temos que fazer é habilitar a interface Serial na Raspberry. Muita atenção nesta etapa pois vamos configurar dois parâmetros: um deles é o “login shell”, ou seja, se queremos que seja habilitada uma autenticação no acesso via interface serial, e a segunda opção é a habilitação da interface serial propriamente dita.

Para essa configuração, use o comando abaixo:

sudo raspi-config

Na tela principal do raspi-config, selecione a opção 5 Interfacing Options e em seguida a opção P6 Serial.

A primeira pergunta é se você deseja habilitar o login shell para acesso via interface serial. Selecione NÃO.

Raspi-config Serial Login Shell

Em seguida a pergunta é sobre habilitar a interface serial. Selecione SIM.

Raspi-config Habilitar Serial

No final temos um resumo das opcões escolhidas. Certifique-se que a seleção tenha sido feita corretamente e em caso de problemas refaça a configuração:

Raspi-config Serial habilitada

Agora digite ou copie o programa abaixo na sua placa e salve com o nome de comunica.py:

#Programa: Comunicacao Arduino e Raspberry Pi com LoRa
#Autor: Arduino e Cia
 
import RPi.GPIO as GPIO
import time
import serial
 
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

#Configura a serial e a velocidade de transmissao
ser = serial.Serial('/dev/serial0', 9600)
time.sleep(3) 
 
#Define o pino do led como saida
GPIO.setup(12, GPIO.OUT)
 
while(1):
	#Apaga o led
	GPIO.output(12, GPIO.LOW)
	
	print ("Aguardando informacoes do LoRa...")
	
	#Aguarda a string na serial
	x = ser.readline()
	
	#Mostra na tela a string recebida
	print ("Recebido: ",x.decode('utf-8'))
	
	#Acende o led
	GPIO.output(12, GPIO.HIGH)
	
	time.sleep(2)

Para rodar o programa na Raspberry Pi use o seguinte comando:

sudo python3 comunica.py

O programa configura a porta serial na linha 12, setando a velocidade de comunicação para 9600 bps. O pino 12 da GPIO é setado como saída para que possamos acionar o led quando a string for recebida.

Testando a comunicação Arduino e Raspberry Pi com LoRa

Com as placas configuradas e os programas carregados, basta você pressionar o botão no circuito com Arduino para que o valor de um contador seja enviado via wireless do Arduino para a Raspberry Pi.

Esse contador é incrementado cada vez que o botão é pressionado, e você pode acompanhar o envio do Arduino usando o Serial Monitor:

Serial Monitor mostrando a comunicação entre Arduino e Raspberry Pi usando LoRa

Na placa Raspberry Pi o led fica aceso por 2 segundos caso uma string seja recebida. Se você estiver executando o programa usando uma janela do terminal, verá uma imagem como essa:

Raspbian terminal comunicação Arduino e Raspberry Pi com LoRa

Você pode adaptar esse exemplo básico para envio de dados de sensores, informações sobre temperatura, estado de atuadores e outros componentes conectados no Arduino. Posteriormente você pode trabalhar com esses dados na Raspberry Pi da forma que preferir, seja armazenando isso em algum banco de dados ou enviando para a nuvem, por exemplo.

Gostou dessa forma de comunicação Arduino e Raspberry Pi com Lora? Confira outros posts usando comunicação wireless aqui mesmo no Arduino e Cia!

Avalie este post!