En esta entrada aprenderemos como enviar y recibir mensajes a varios kilómetros de distancia utilizando el modulo con antena LoRa RYLR998. En este ejercicio nos centraremos en comunicar dos antenas.
Componentes
- 2 Módulos LoRa RYLR998
- 2 Microcontroladores ESP32
Que es LoRa?
LoRa es una tecnología que utiliza una técnica de modulación que nos permite alcanzar una distancia de comunicación alta (varios kilómetros), pero con poca información (51 – 241 Bytes) muy tolerante a las interferencias y de bajo consumo de energía. Con esta tecnología se pueden tener dispositivos con 10 años de duración sin ninguna recarga, es perfecto para aplicaciones donde dejaremos un sensor por mucho tiempo solo con su batería y en una zona donde no se tenga acceso a internet.
Modulo Transceptor LoRa RYLR998.
El modulo tranceptor RYLR998 cuanta con un modulo de largo alcance LoRa que proporciona una distancia de comunicación alta de espectro extendido y alta inmunidad a las interferencias y bajo consumo de energía. Es altamente recomendado para aplicaciones IoT, seguridad en casa, equipos de monitoreo y control industrial.
PIN | Nombre | Función |
1 | VDD | Fuente de Alimentación |
2 | NRST | Reset |
3 | RXD | Recibir |
4 | TXD | Transmitir |
5 | GND | Tierra |
Estructura de Red.
Se pueden comunicar múltiples módulos LoRa entre si, siempre y cuando estos lleven el mismo Network ID y cada dispositivo debe de tener su dirección. De esta manera se pueden comunicar de punto a punto, de punto a multipunto y multipunto a multipunto, en el caso de que se encuentre otro grupo de antenas cerca pero con diferente Network ID no existirá comunicación entre grupos de antenas. Es importante recalcar que para que exista comunicación entre antenas del mismo grupo ademas de compartir el mismo Network ID deben de estar configuradas con la misma frecuencia y parámetros.
Diagrama de Conexiones.
En la siguiente imagen se muestra el diagrama de conexiones para este ejercicio, esto para ambos circuitos (Transmisor y Receptor).
Funcionamiento.
Vamos a configurar dos antenas una sera el transmisor (con adr:1) y la otra sera el receptor (con adr:2), ambas estarán configuradas con el Network ID: 5, el transmisor estará enviando tres valores aleatorios con distintos rangos al receptor. Los valores enviados estarán separados por comas para que cuando recibamos el mensaje en el receptor podamos identificar las comas y así obtener el valor que nos interese, todos estos valores los vamos a imprimir en el monitor serial del IDE Arduino.
Código Transmisor.
Iniciamos definiendo los pines para utilizar el serial2 ademas declaramos 3 variables que representaran valores de sensores.
// Se definen los pines para utilizar el Serial2 #define RXD2 16 #define TXD2 17 // Valores que se transmitirán int value1, value2, value3;
Enseguida creamos la función que servirá para enviar los comandos a la antena.
void sendCmd(String cmd) { Serial2.println(cmd); // Enviar string cmd a módulo LoRa delay(500); // Esperar 500ms a que el módulo reciba el comando while (Serial2.available()) { Serial.print(char(Serial2.read())); // Si hay respuesta imprimirla en el monitor serial } }
En el setup iniciamos la comunicación con el monitor serial y configuramos los parámetros de la antena LoRa.
void setup() { Serial.begin(115200); // Iniciar el monitor serial a 115200 baudios Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2); // Iniciar el Serial2 a 115200 delay(3000); Serial.println("Configurando parámetros antena LoRa"); delay(1000); sendCmd("AT+ADDRESS=1"); // Configurar el address a 1 delay(1000); sendCmd("AT+NETWORKID=5"); // Configurar el Network ID a 5 delay(1000); sendCmd("AT+BAND?"); // Leer la frecuencia configurada delay(1000); sendCmd("AT+PARAMETER?"); // Leer los parámetros configurados delay(1000); sendCmd("AT+MODE?"); // Leer el modo configurado delay(1000); }
Por ultimo en el void loop generamos datos aleatorios que se enviaran al circuito receptor.
void loop() { // Generar los valores que transmitiremos value1 = random(-100,100); value2 = random(0,4000); value3 = random(1,9); String data = String(value1) + "," + String(value2) + "," + String(value3); // Contruir el mensaje que enviaremos en un solo string String datalen = String(data.length()); // Obtener el tamaño del mensaje Serial.println("Enviando: " + data); sendCmd("AT+SEND=2," + datalen + "," + data); // Construir el comando AT y enviar al módulo LoRa delay(5000); }
Código Receptor.
Iniciamos definiendo los pines para utilizar el serial2, así como las variables que estarán en el mensaje recibido ademas definimos los strings donde guardaremos las variables del mensaje recibido.
// Se definen los pines para utilizar el Serial2 #define RXD2 16 #define TXD2 17 int varInMsg = 7; // Variables que estarán en el mensaje recibido int commasInMsg = varInMsg - 1; // Calcular las comas que habrá en el mensaje int keyPos[10]; // Array para almacenar la posición de las comas en el mensaje // Strings donde guardaremos las variables del mensaje recibido String msg; String txId; String dataLen; String value1; String value2; String value3; String rssi; String snr;
Configuramos los parámetros de la antena de igual forma que en el transmisor lo único que cambia es la dirección a la cual le damos el valor de 2.
void sendCmd(String cmd) { Serial2.println(cmd); // Enviar string cmd a módulo LoRa delay(100); // Esperar 500ms a que el módulo reciba el comando while (Serial2.available()) { Serial.print(char(Serial2.read())); // Si hay respuesta imprimirla en el monitor serial } } void setup() { Serial.begin(115200); // Iniciar el monitor serial a 115200 baudios Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2); // Iniciar el Serial2 a 115200 delay(3000); Serial.println("Configurando parámetros antena LoRa"); delay(1000); sendCmd("AT+ADDRESS=2"); // Configurar el address a 2 delay(1000); sendCmd("AT+NETWORKID=5"); // Configurar el Network ID a 5 delay(1000); sendCmd("AT+BAND?"); // Leer la frecuencia configurada delay(1000); sendCmd("AT+PARAMETER?"); // Leer los parámetros configurados delay(1000); sendCmd("AT+MODE?"); // Leer el modo configurado delay(1000); }
En el void loop obtenemos el mensaje del transmisor, con un ciclo “for” creamos la función para detectar las comas del mensaje recibido después obtenemos los valores de las variables del mensaje recibido y por ultimo imprimimos el mensaje recibido, la posición de las comas y los valores de las variables.
void loop() { //Choose Serial1 or Serial2 as required // Esperar por mensaje del transmisor while (Serial2.available()) { msg = Serial2.readString(); } msg.trim(); // Eliminar espacios antes y después del mensaje // Función para detectar las comas del mensaje recibido for(int i = 1; i <= commasInMsg; i++) { keyPos[i] = msg.indexOf(',', keyPos[i-1] + 1); } // Obtener el valor de las variables del mensaje txId = msg.substring(5, keyPos[1]); dataLen = msg.substring(keyPos[1] + 1, keyPos[2]); value1 = msg.substring(keyPos[2] + 1, keyPos[3]); value2 = msg.substring(keyPos[3] + 1, keyPos[4]); value3 = msg.substring(keyPos[4] + 1, keyPos[5]); rssi = msg.substring(keyPos[5] + 1, keyPos[6]); snr = msg.substring(keyPos[6] + 1); // Imprimir el mensaje recibido del transmisor Serial.println(msg); // Imprimir la posición de las comas del mensaje Serial.print("Posición de las comas:"); for(int i = 1; i <= commasInMsg; i++) { Serial.print(keyPos[i]); Serial.print(" "); } // Imprimir las variables del mensaje Serial.println(" "); Serial.print("TxId: " + txId); Serial.print(" Length: " + dataLen); Serial.print(" Value 1: " + value1); Serial.print(" Value 2: " + value2); Serial.print(" Value 3: " + value3); Serial.print(" RSSI: " + rssi); Serial.println(" SNR: " + snr); delay(1000); }
En esta parte ya tenemos los códigos del transmisor y receptor listos ya solo queda cargar los códigos al ESP32 para observar el funcionamiento de las antenas LoRa.
Video Explicativo.
En seguida les comparto el video donde se explica mas detalladamente el funcionamiento del código de programación de este ejercicio para que despejen todas sus dudas, no olviden dejar su like y suscribirse.
Descarga.
Enlace de descarga con códigos completos: