En esta oportunidad quiero contarte sobre algunas pruebas que he estado haciendo con la tecnología inalámbrica LoRa. En particular, me interesan las pruebas de LoRa sin línea de vista, para ver su comportamiento en situaciones reales en un entorno urbano.
Hace tiempo que soy un entusiasta promotor de esta tecnología, que promete cambiar el panorama IoT en todo el mundo. Si te interesa aprender sobre LoRaWAN, aquí te dejo unos artículos sobre el tema.
Qué es la tecnología LoRa y por qué es importante para IoT
LoRa – Características y Aplicaciones
Cómo es la arquitectura LoRaWAN
El gateway LoRa de TTN para su comunidad
A principios de este año asistí a la conferencia de The Things Network en Amsterdam, Países Bajos. Fue una experiencia sorprendente y volví con la convicción de que tenemos mucho por hacer en Latinoamérica para poder aprovechar las ventajas y oportunidades que ofrece esta tecnología.

En esta ocasión he utilizado solo la capa física LoRa, es decir no implementé una solución LoRaWAN, con gateway y demás. Mi intención fue simplemente hacer unas pruebas de alcance dentro del complejo de edificios donde vivo.
La configuración
Lo que hice fue comunicar dos nodos, uno funcionando como transmisor y otro como receptor.
El hardware que utilicé para esta prueba fue la placa de desarrollo TTGO LoRa V2 basada en ESP32. Esta placa ofrece comunicación LoRa, Bluetooth y WiFi, por lo que es muy conveniente para desarrollar prototipos.

La programación de los nodos la hice de la siguiente manera:
- El transmisor envía un mensaje donde indica el número de transmisión. La transmisión se produce cada un segundo, aunque se puede utilizar cualquier otra frecuencia de envío.
- En el display del receptor se puede ver la potencia recibida en el mensaje y el número de mensaje. De este modo se puede saber si se están recibiendo todos los mensajes o si pierden algunos.
El código
Para hacer estas pruebas utilicé código prestado de Random Nerd Tutorials.
Dejo aquí abajo el código para ambos nodos y te invito a realizar tus propias pruebas.
//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>
//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
//433E6 for Asia
//866E6 for Europe
//915E6 for North America
#define BAND 866E6
//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
String LoRaData;
void setup() {
//reset OLED display via software
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.print("LORA RECEIVER ");
display.display();
//initialize Serial Monitor
Serial.begin(115200);
Serial.println("LoRa Receiver Test");
//SPI LoRa pins
SPI.begin(SCK, MISO, MOSI, SS);
//setup LoRa transceiver module
LoRa.setPins(SS, RST, DIO0);
if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println("LoRa Initializing OK!");
display.setCursor(0,10);
display.println("LoRa Initializing OK!");
display.display();
}
void loop() {
//try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize) {
//received a packet
Serial.print("Received packet ");
//read packet
while (LoRa.available()) {
LoRaData = LoRa.readString();
Serial.print(LoRaData);
}
//print RSSI of packet
int rssi = LoRa.packetRssi();
Serial.print(" with RSSI ");
Serial.println(rssi);
// Dsiplay information
display.clearDisplay();
display.setCursor(0,0);
// display.print("LORA RECEIVER");
// display.setCursor(0,20);
// display.print("Received packet:");
display.setCursor(0,10);
display.print(LoRaData);
display.setCursor(0,30);
display.print("RSSI:");
display.setCursor(30,50);
display.print(rssi);
display.display();
}
}
//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>
//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
//433E6 for Asia
//866E6 for Europe
//915E6 for North America
#define BAND 866E6
//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
//packet counter
int counter = 0;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
void setup() {
//reset OLED display via software
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,5);
display.print("LORA SENDER ");
display.display();
//initialize Serial Monitor
Serial.begin(115200);
Serial.println("LoRa Sender Test");
//SPI LoRa pins
SPI.begin(SCK, MISO, MOSI, SS);
//setup LoRa transceiver module
LoRa.setPins(SS, RST, DIO0);
if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println("LoRa Initializing OK!");
display.setCursor(0,20);
display.print("LoRa Initializing OK!");
display.display();
delay(2000);
}
void loop() {
Serial.print("Sending packet: ");
Serial.println(counter);
//Send LoRa packet to receiver
LoRa.beginPacket();
LoRa.print("hello ");
LoRa.print(counter);
LoRa.endPacket();
display.clearDisplay();
display.setCursor(0,5);
//display.println("LORA SENDER");
display.setCursor(0,20);
display.setTextSize(2);
display.print("LoRa packet sent.");
display.setCursor(0,10);
display.print("Counter:");
display.setCursor(80,50);
display.print(counter);
display.display();
counter++;
delay(10000);
}
Es importante modificar algunos valores del código para que este se adapte a la placa que vayas a usar, ya que cambian números de pines, frecuencias, etc.
Las pruebas
Con esta configuración dejé el nodo transmisor en el balcón de mi departamento y salí a caminar con el receptor. Y ahora sí ya pude hacer las pruebas de LoRa sin línea de vista.


Durante el transcurso de mi caminata pude ver que la conexión se mantenía aun sin tener línea de vista en absoluto, que por otro lado era lo esperado. De hecho, caminando entre los edificios la recepción era bastante buena y logré cobertura en la mayor parte del trayecto, salvo puntos muy específicos.
En la figura siguiente muestro dos puntos específicos donde obtuve una potencia de -115 dBm sin pérdida de mensajes. Algo notable considerando que la prueba era en sí bastante precaria y estaba utilizando antenas de muy baja ganancia en ambos nodos.
Conclusión
La tecnología LoRa ofrece grandes oportunidades en la implementación de sistemas IoT, por su largo alcance y bajo consumo. Esto permite desplegar nodos fácilmente, sin depender de otra infraestructura de comunicación.
Además, el muy bajo consumo eléctrico hace que los nodos puedan ser alimentados por baterías, evitando la complicación de una instalación eléctrica. También se pueden utilizar pequeñas pantallas solares o alguna otra técnica de cosecha de energía (energy harvesting).
Por último hay que tener en cuenta que estas pruebas se hicieron para evaluar la fiabilidad de conectar sensores en los alrededores. No se evaluó la máxima distancia posible de conexión ni se maximizó la configuración del hardware para esto último.
Te invito a que dejes tus dudas y comentarios abajo ;).
11 comentarios
Marcelo · 7 septiembre, 2020 a las 8:48 PM
Hola Rodrigo,interesante prueba.Segun veo en el codigo,no usaste la frecuencia destinada para Argentina.El modulo lo soporta ?. Segun tu parecer sirve para usarlo en una aplicacion seria ó solo para testeos . Saludos Marcelo
IoT Consulting · 8 septiembre, 2020 a las 11:32 AM
Hola Marcelo
Este módulo soporta las bandas de 866 y 915. Eso lo puedes cambiar en el código fácilmente. De todos modos, para aplicaciones que no son LoRaWAN se puede usar cualquier banda porque ninguna requiere de una licencia.
Saludos!.
Rodrigo.
yilber · 9 septiembre, 2020 a las 9:32 PM
Excelente
Pablo Costan · 5 mayo, 2021 a las 12:38 AM
Que nodos recomendas usar en Argentina el día de hoy? La idea es tener 1 nodo transmitiendo cada 5 cuadras (entendería que necesito un gateway en vez de un nodo receptor común ahi no?)
Gracias.
IoT Consulting · 5 mayo, 2021 a las 10:21 AM
Pablo:
No sé cuál es tu proyecto, pero los nodos no están pensados para dar servicio a otros nodos. Para eso es mejor instalar gateways en lugares estratégicos. Con un solo gateway en una torre podés cubrir un área mucho mayor, dependiendo de la topografía del lugar. En áreas muy densas, con muchos edificios se pueden tener alcances de 500 mts sin línea de vista. En lugares con construcciones bajas, varios kms. Y a campo abierto, se puede llegar hasta 20/30 kms con la configuración adecuada.
Saludos!.
IoT Consulting · 5 mayo, 2021 a las 10:22 AM
Además, hay que tener en cuenta el tema de las antenas. Los nodos tienen antenas de muy poca ganancia, en cambio los gateways vienen con antenas de más ganancia, que ofrecen mucho mayor rango de cobertura.
Pablo Costan · 11 mayo, 2021 a las 9:00 PM
Gracias por la respuesta,
Mi idea es tener 1 nodo con 3 sensores transmitiendo mqtt (Lora), luego otro nodo alejado a 1 hectárea con otros 3 sensores transmitiendo mqtt (Lora) y todo esto que llegue a un servidor del estilo Google Cloud. Entiendo que como concentrador necesito de este Gateway cierto?
En este caso que tipos de dispositivos me sirven para transmitir por mqtt y Lora hacia el gateway.
IoT Consulting · 11 mayo, 2021 a las 9:09 PM
Pablo:
Vas a necesitar un gateway exterior para comunicar los nodos. Los nodos no envían MQTT, sino que utilizan la trama LoRa para empaquetar y transmitir los datos.
Luego el gateway puede utilizar LoRaWAN mediante un servidor de red o enviar los mensajes a un servidor MQTT (sin usar LoRaWAN).
Para tu caso un gateway de uno o dos canales puede ser suficiente.
Si vas a usar LoRaWAN, en el caso que utilices downlink, te recomiendo un gateway de dos canales por lo menos. Para este tipo de gateways, con LoRaWAN, vas a tener que usar ABP.
Si vas a usar LoRa y enviar los paquetes por MQTT, podés comprar un gateway de un canal para enviar los datos por el uplink.
Saludos.
Federico · 4 diciembre, 2022 a las 10:54 AM
Y dentro del mismo edificio cual es el alcance maximo? Es decir, si tengo un modulo en PB y otro en el piso 30, tendran comunicacion?
IoT Consulting · 4 diciembre, 2022 a las 6:06 PM
Hola Federico:
En principio creo que podría funcionar. Sin embargo habría que hacer pruebas.
En general sería una buena idea instalar el gateway a la mitad del edificio y cerca del fozo del ascensor.
Si necesitas ayuda con un proyecto me puedes escribir a info@iotconsulting.tech
Saludos!
Marco Salazar · 23 enero, 2023 a las 10:41 AM
Me gusto la prueba, estuve analizando que dependiendo de la velocidad de comunicación, disminuye el alcance, analice el código pero no encontré la velocidad del cambio de los datos pero si la frecuencia de modulación. de antemano agradezco por los datos compartidos en el experimento saludos.