Comunicação Arduino e Raspberry Pi com LoRa
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.
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:
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.
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:
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.
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.
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.
Em seguida a pergunta é sobre habilitar a interface serial. Selecione SIM.
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:
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:
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:
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!
[…] Atualizado em 27-07-2020: veja também como realizar uma conexão wireless entre essas duas placas no post Comunicação Arduino e Raspberry Pi com LoRa. […]