ESP32 Longa Distância - LoRaWan


Neste artigo vamos tratar da LoRaWAN, uma rede que vai longe gastando pouca energia. Mas, o quanto “longe”? Com o chip que uso no vídeo, o ESP32, o controle chega a 3,6 quilômetros de distância. Então, aqui vamos falar das características do chip e desta rede LoRa, que praticamente foi feita para IOT (Internet Of Things).

ESP32

Chip SX1276
Na montagem, em um exemplo da Heltec, com o ESP32 mais chip SX1276, temos o Sender enviando o pacote de dados para o Receiver. No dispositivo de cabo verde, o Receiver, temos o sinal que está em -9dB. Isso porque as antenas estão praticamente coladas, de tão próximas, mas, à medida que você vai distanciando uma da outra você vê que a força do sinal vai diminuindo, podendo chegar a -124dB, quando para de receber as informações. No mesmo display, Rx9 bytes significa o tamanho do pacote e Hello é a string que o dispositivo de cabo amarelo, o Sender, está enviando. No Sender também temos um led piscando a 500 milissegundos.


ESP32 LoRaWan

As minhas placas ESP32 eu já comprei com os chips LoRa já embutidos. Esses kits de desenvolvimento já vêm com display, os quais considero vantajosos. Então, desmontamos um kit. Embaixo do dispositivo nos deparamos com as informações do chip SX1276.
Lembrando que o ESP32 tem três chips: o da memória Flash, o da Espressif, que é o processador da Tensilica, e tem ainda a USB para serial Ttl, da Silicon Labs. No caso deste kit de desenvolvimento temos um quarto chip, que é o SX1276.

Como é utilizada a rede LoRa


Para entender a utilização da rede, temos os chips LoRa se comunicando entre si, medindo  posição geográfica, temperatura, pressão, umidade, ou seja, todas as informações que são analisadas através da IOT na rede LoRa. Temos, então, um concentrador, o Gateway, que recebe todos esses sinais. Este é que vai entrar na rede TCP/IP SSL LoRaWAN e, então, seguir para um server side, uma coisa mais robusta, o IBM Watson, Amazon, enfim, os dados são processados em um outro nível.

Principais recursos da tecnologia LoRa e do protocolo LoRaWAN

Aqui deixo algumas características da tecnologia LoRa e do protocolo LoRaWAN. Destaco que a ideia dessa rede não é você enviar conteúdo multimídia, mas, sim,  mandar pacotes de dados de leitura.





Protocolo LoRaWAN: LoRaWAN é uma especificação de protocolo construída em cima da tecnologia LoRa desenvolvida pela Aliança LoRa. Ele usa espectro radioelétrico sem licença nas bandas Industrial, Científica e Médica (ISM) para permitir a comunicação de baixa potência e ampla área entre sensores remotos e gateways conectados à rede. Esta abordagem baseada em padrões para a construção de um LPWAN permite a instalação rápida de redes IoT públicas ou privadas em qualquer lugar usando hardware e software que seja bidirecionalmente seguro, interoperável e móvel, fornece uma localização precisa e funciona do jeito que você espera.




CHIP sx1276


Então, desmontando o kit de desenvolvimento, desparafusamos o display e localizamos o chip LoRa, criado pela empresa francesa Semtech. Aqui deixo uma tabela tirada do Datasheet com informações deste dispositivo nos modelos 1276, 1277, 1278 e 1279. A diferença deles é mais no quesito da frequência.

ESP32 LoRa X ESP32 WiFi

ESP32 WiFi
ESP32 LoRa
Comparando o ESP32 tradicional com o ESP32 LoRa, então, destacamos novamente que o tradicional tem três chips, enquanto o LoRa possui quatro. Este quarto chip, no caso o sx1276 está ligado pela porta SPI. Quanto ao Flat do OLED, este está ligado no i2c.




Pinagem do ESP32 LoRa

Importante observar os pinos que já estão ocupados.


Teste

ESP32 LoRaWAN TTGO


Para fazer o teste pegamos os chips da TTGO, colocamos uma antena, bateria e saímos andando. Logo de cara, constatamos ele funcionando a 915 MHz. Testamos o de 433 MHz também.
Montamos um pacote para envio do Sender para o Receiver. O segundo vai receber este pacote, medir a intensidade do sinal em dB, e vai mostrar no display. Desta maneira que será possível você fazer um teste. Eu pretendo, em uma próxima oportunidade, fazer isso também utilizando meu drone, que vai a 7 quilômetros, para ver até onde consigo chegar.

ESP32 LoRaWAN – Heltec


Esse é o modelo da Heltec, que está a 433 MHz e funciona muito bem. Caso você esteja querendo comprar um ESP32, aconselho esta marca, pois conta com uma Lib dentro do Arduino IDE, o que facilita o manuseio.

Lib e Exemplos da Heltec

Os exemplos da Heltec estão no GitHub:


Abaixo coloco o caminho para localizar o código fonte do exemplo no seu computador após a instalação:
C:\Program Files (x86)\Arduino\hardware\heltec\esp32\libraries\LoRa\examples\OLED_LoRa_Sender

Manual em PDF

O manual eu traduzi para o português e vou entregar para você em um arquivo PDF.
Para tal, peço que você se inscreva na minha lista de e-mails através do link: pdf.fernandok.com.
Você receberá uma mensagem na qual deve confirmar sua inscrição. Confira sua caixa de entrada, bem como a de Spam, entre outras.
Com a inscrição confirmada, vou lhe enviar um segundo e-mail com o link para download do manual: “Como instalar o Arduino IDE ESP32 LoRa – Heltec no Windows”.

Código fonte

Hoje temos dois programas .INO: o Sender e o Receiver.

Sender e Receiver

Primeiramente declaro os pinos de SPI e defino a frequência do rádio, ou seja, faço todas as declarações necessárias.

#include <spi.h>  //responsável pela comunicação serial
#include <lora.h>  //responsável pela comunicação com o WIFI Lora
#include <wire.h>  //responsável pela comunicação i2c
#include "SSD1306.h" //responsável pela comunicação com o display
#include "images.h" //contém o logo para usarmos ao iniciar o display

// Definição dos pinos 
#define SCK 5 // GPIO5 -- SX127x's SCK
#define MISO 19 // GPIO19 -- SX127x's MISO
#define MOSI 27 // GPIO27 -- SX127x's MOSI
#define SS 18 // GPIO18 -- SX127x's CS
#define RST 14 // GPIO14 -- SX127x's RESET
#define DI00 26 // GPIO26 -- SX127x's IRQ (Interrupt Request)

#define BAND 915E6 //Frequencia do radio - podemos utilizar ainda : 433E6, 868E6, 915E6
#define PABOOST true

Sender: OLED_LoRa_Sender.ino

Aqui tenho o display que está ligado nos pinos do i2c e as strings.

//variável responsável por armazenar o valor do contador (enviaremos esse valor para o outro Lora)
unsigned int counter = 0;

//parametros: address,SDA,SCL 
SSD1306 display(0x3c, 4, 15); //construtor do objeto que controlaremos o display

String rssi = "RSSI --";
String packSize = "--";
String packet ;

Setup: OLED_LoRa_Sender.ino

Aqui configuramos os pinos como saída, bem como as ações do display. Iniciamos a comunicação LoRa e configuramos os pinos que serão utilizados pela biblioteca.
Destaque: Toda vez que você ligar o ESP32 com a rede LoRa, verifique se a anteninha está conectada no conector do Pigtail porque se você ligar na USB sem ele estar conectado na antena poderá queimar o chip transmissor.

void setup()
{
//configura os pinos como saida
pinMode(16,OUTPUT); //RST do oled
pinMode(25,OUTPUT);
digitalWrite(16, LOW); // reseta o OLED
delay(50); 
digitalWrite(16, HIGH); // enquanto o OLED estiver ligado, GPIO16 deve estar HIGH

display.init(); //inicializa o display
display.flipScreenVertically(); 
display.setFont(ArialMT_Plain_10); //configura a fonte para um tamanho maior

//imprime o logo na tela
logo();

delay(1500);
display.clear(); //apaga todo o conteúdo da tela do display

SPI.begin(SCK,MISO,MOSI,SS); //inicia a comunicação serial com o Lora
LoRa.setPins(SS,RST,DI00); //configura os pinos que serão utlizados pela biblioteca (deve ser chamado antes do LoRa.begin)
//inicializa o Lora com a frequencia específica.
if (!LoRa.begin(BAND,PABOOST))
{
display.drawString(0, 0, "Starting LoRa failed!");
display.display(); //mostra o conteúdo na tela
while (1);
}
//indica no display que inicilizou corretamente.
display.drawString(0, 0, "LoRa Initial success!");
display.display(); //mostra o conteúdo na tela
delay(1000);
}

Loop: OLED_LoRa_Sender.ino

Mostramos aqui como montar um pacote e ligar o led indicativo.

void loop()
{
//apaga o conteúdo do display
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_16);
display.drawString(0, 0, "Sending packet: ");
display.drawString(40, 26, String(counter));
display.display(); //mostra o conteúdo na tela

//beginPacket : abre um pacote para adicionarmos os dados para envio
LoRa.beginPacket();
//print: adiciona os dados no pacote
LoRa.print("hello ");
LoRa.print(counter);
//endPacket : fecha o pacote e envia
LoRa.endPacket(); //retorno= 1:sucesso | 0: falha

//beginPacket : abre um pacote para adicionarmos os dados para envio
LoRa.beginPacket();
//print: adiciona os dados no pacote
LoRa.print("hello ");
LoRa.print(counter);
//endPacket : fecha o pacote e envia
LoRa.endPacket(); //retorno= 1:sucesso | 0: falha

//incrementa uma unidade no contador
counter++;

digitalWrite(25, HIGH); // liga o LED indicativo
delay(500); // aguarda 500ms
digitalWrite(25, LOW); // desliga o LED indicativo
delay(500); // aguarda 500ms
}

Imprime – Logotipo: OLED_LoRa_Sender.ino

Essa função apenas imprime o logo na tela do display.

//essa função apenas imprime o logo na tela do display
void logo()
{
//apaga o conteúdo do display
display.clear();
//imprime o logo presente na biblioteca "images.h"
display.drawXbm(0,5,logo_width,logo_height,logo_bits);
display.display();
}

Setup: OLED_LoRa.Reciver.ino

Iniciamos aqui a LoRa com a frequência específica, apontamos a inicialização correta no display e habilitamos a LoRa para receber os dados enviados pelo Sender. Checamos ainda o recebimento do pacote.

//inicializa o Lora com a frequencia específica.
if (!LoRa.begin(BAND,PABOOST)) {
display.drawString(0, 0, "Starting LoRa failed!");
display.display();
while (1);
}

//indica no display que inicilizou corretamente.
display.drawString(0, 0, "LoRa Initial success!");
display.drawString(0, 10, "Wait for incomm data...");
display.display();
delay(1000);

//LoRa.onReceive(cbk);
LoRa.receive(); //habilita o Lora para receber dados
}

void loop() {
//parsePacket: checa se um pacote foi recebido
//retorno: tamanho do pacote em bytes. Se retornar 0 (ZERO) nenhum pacote foi recebido
int packetSize = LoRa.parsePacket();
//caso tenha recebido pacote chama a função para configurar os dados que serão mostrados em tela
if (packetSize) { 
cbk(packetSize); //função responsável por recuperar o conteúdo do pacote recebido
delay(10);
}
}

Print no OLED: OLED_LoRa.Reciver.ino

Aqui configuramos as informações que aparecerão na tela do display.

//função responsável por configurar os dados que serão exibidos em tela.
//RSSI : primeira linha
//RX packSize : segunda linha
//packet : terceira linha
void loraData(){
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_16);
display.drawString(0 , 18 , "Rx "+ packSize + " bytes");
display.drawStringMaxWidth(0 , 39 , 128, packet);
display.drawString(0, 0, rssi); 
display.display();
}




Faça o download dos arquivos:

Sender.INO

Receiver.INO

PDF


23 comentários:

  1. Fernando, com esse esp32+LoRa poderiamos utilizar/enviar dados com o wifi/http e rede LoRa simultaneamente ?

    ResponderExcluir
    Respostas
    1. Tenho a mesma dúvida, até porque tem uma antena embutida na placa ao lado do display.

      Excluir
    2. Sim, são bibliotecas distintas com rádios distintos. Abraço!

      Excluir
    3. Sim, são bibliotecas distintas com rádios distintos. Abraço!

      Excluir
  2. Respostas
    1. Na internet coloque na busca do Google
      “WiFi Lora Esp32” aparecerá vários sites que vendem. Abraço!

      Excluir
  3. Ola Fernando ,esse modulo LORAWAN , posso usa-lo como naquele exemplo controle remoto com socket ?

    ResponderExcluir
    Respostas
    1. Oi Jorge. Não, o tipo de programação é diferente, ok! Abraço

      Excluir
  4. Já se encontra? para venda no brasil?

    ResponderExcluir
  5. Fernando, me da uma dica de onde comprar ele

    ResponderExcluir
    Respostas
    1. Na internet coloque na busca do Google
      “WiFi Lora Esp32” aparecerá vários sites que vendem. Abraço!

      Excluir
  6. Olá, excelente conteúdo! Fiquei com uma divida. O Lora já vem com GPS integrado? Ou para aplicações com GPS deve se utilizar outra placa? Obrigado e parabéns pelo seu trabalho

    ResponderExcluir
    Respostas
    1. Não, o Lora não vem com GPS. Para utilizar GPS você precisaria de um módulo GPS. Abraço.

      Excluir
  7. Posso usar 2 ESP32 LoRa pra enviar dados de 2 sensores para um esp32 lora "centra" e ele fazer uma ação dependendo do valor dos sensores?

    ResponderExcluir
    Respostas
    1. Olá. Sim, você pode fazer isso. Porém você deve implementar um protocolo próprio para identificar cada um dos Lora, e saber quem está se comunicando e assim poder realizar as ações desejadas. Abraço.

      Excluir
    2. Poderia me ajudar em como fasso isso? Preciso para um TCC e não encontro como fazer isso na internet, se possível um vídeo seria mais do que ótimo, se não der por favor tente me explicar por aqui mesmo, seria de grande ajuda

      Excluir
  8. Boas, a distância falada, 3.6km, pode ser em altura, ou seja, consigo captar sinais a 2km de altitude? Abçs

    ResponderExcluir
  9. boa tarde,exite a possibilidade de usar o esp32 para capitar dados de uma porta mini usb,e outro para receber os dados e transmitir para a leitura em um pc.por ex:o modulo a qual quero comunicacao seria móvel e o receptor uma base.

    ResponderExcluir
    Respostas
    1. Olá. É possivel, mas sempre o que recebe tem que ser um host usb. Abraço

      Excluir
  10. Boa noite!!
    O Programa não compila, ele dá erro em tudo que se refere ao display!! Tem alguma ideia do que pode ser?

    ResponderExcluir
    Respostas
    1. Carlos estou com o mesmo problema, conversão de tipo de valor, o problema está naquele logo_bits

      Excluir
    2. Olá. Como o problema de compilação está no display, verifique se você possui a biblioteca “SSD1306”, ela que irá controlar o display. Abraço!

      Excluir
  11. Comprei a TTGO ESP32 V2.0 e comecei a fazer os testes. bem animador

    ResponderExcluir

Tecnologia do Blogger.