LoRa punto a punto en PLCs basados en Arduino y ESP32
Conexiones
Familia M-Duino
Los PLCs de la familia M-Duino usan los siguientes pines para comunicarse con el módulo LoRa RFM95:
- PIN RESET: 13
- PIN SLAVE SELECT: 12
- PIN DE INTERRUPCIÓN: 2
Además de estos pines, el SPI del Arduino Mega también está conectado al módulo.
Familia Ardbox LoRa
El Ardbox LoRa está basado en Arduino Leonardo. Esto significa que el pinout difiere del Arduino Mega, y los pines para LoRa son los siguientes:
- PIN RESET: 3
- PIN SLAVE SELECT: 23
- PIN DE INTERRUPCIÓN: 2
Además de estos pines, el SPI del Arduino Leonardo también está conectado al módulo.
Gracias a la definición de pines, no hay problema en compilar el programa para un M-Duino LoRa PLC o para un Ardbox LoRa, ya que los pines se configuran automáticamente dentro de las boards.
Familia ESP32 LoRa
Los PLCs de la familia ESP32 LoRa utilizan los siguientes pines para comunicarse con el módulo RN2483:
- PIN RESET: 0x2306
- SLAVE SELECT: 12
Además del pin de reset, el módulo se comunica con la CPU ESP32 a través de un expansor UART, que utiliza el SPI de la placa ESP32.
ESP32 14 LoRa PLC
El ESP32 14 LoRa PLC utiliza el siguiente pin para comunicarse con el módulo RN2483:
- PIN RESET: 0x2003
Además del pin de reset, el módulo se comunica con la CPU ESP32 a través de un expansor UART, que utiliza I2C de la placa ESP32. La dirección del puerto de expansión I2C es 0x78.
Como se ve, el módulo LoRa usado en ambos PLCs basados en ESP32 es el mismo, aunque las conexiones internas son muy diferentes y, por tanto, las definiciones de pines difieren.
Inicialización del módulo
Primero, veamos cómo se inicia cualquier módulo LoRa de un PLC basado en Industrial Shields en un sketch de Arduino IDE:
#include <LoRa.h> uint32_t counter = 0UL; void setup() { Serial.begin(9600L); // Begin LoRa hardware if (!LoRa.begin()) { Serial.println("LoRa begin error: is LoRa module connected?"); while (true); } // Set LoRa working frequency if (!LoRa.setFrequency(868.0)) { Serial.println("LoRa set frequency error"); while (true); } Serial.println("Send started"); }
#include <LoRa.h> uint32_t counter = 0UL; void setup() { Serial.begin(9600L); // Begin LoRa hardware if (!LoRa.begin()) { Serial.println("LoRa begin error: is LoRa module connected?"); while (true); } // Set LoRa working frequency if (!LoRa.setFrequency(868.0)) { Serial.println("LoRa set frequency error"); while (true); } Serial.println("Send started"); }
- Incluimos la librería LoRa para poder usar sus funciones.
- En la función setup, tras iniciar el puerto serie, iniciamos el objeto LoRa. Esta función reinicia el módulo usando el pin RESET mencionado antes, e inicializa el módulo usando la librería Radio Head . Gracias a esta librería, podemos adaptar la librería ya existente de Radio Head a nuestros PLCs, manteniendo los formatos de paquetes y configuraciones para muchos módulos LoRa, facilitando la comunicación con módulos de terceros.
- Finalmente, podemos establecer la frecuencia del módulo. En M-Duino y Ardbox solo se fija en MHz, como en este ejemplo (868.0). En los PLC ESP32 puedes usar MHz o Hz (868000000); se recomienda Hz porque es más preciso.
Envío a través de LoRa
Después de la función setup, el módulo está listo para enviar y recibir. Para enviar algunos datos, puedes probar el siguiente código:
void loop() { // Send counter as packet payload LoRa.send((uint8_t*) &counter, sizeof(counter)); Serial.println("Sending counter..."); // Wait packet to be sent LoRa.waitPacketSent(); Serial.println("Counter sent!"); // The packet is sent, increment the counter and wait to send the next one ++counter; delay(5000); }
void loop() { // Send counter as packet payload LoRa.send((uint8_t*) &counter, sizeof(counter)); Serial.println("Sending counter..."); // Wait packet to be sent LoRa.waitPacketSent(); Serial.println("Counter sent!"); // The packet is sent, increment the counter and wait to send the next one ++counter; delay(5000); }
En este ejemplo, primero enviamos a través de LoRa un número contador, luego lo imprimimos y finalmente lo incrementamos antes de esperar 5 segundos y repetir el proceso. Como el protocolo LoRa no utiliza mensajes de confirmación tras cada transmisión, existe la posibilidad de que el emisor no sepa si el receptor recibió el mensaje con éxito. Si se desea esta funcionalidad, debe implementarse por parte del usuario.
Recepción a través de LoRa
De forma similar al caso anterior, la recepción también es posible tras la función setup. Para recibir, utiliza:
void loop() { // Wait packets from Send example if (LoRa.available()) { uint32_t value; uint8_t len = sizeof(value); // Save the received packet payload into value if (LoRa.recv((uint8_t *) &value, &len)) { Serial.print("Received value: "); Serial.println(value); } } }
void loop() { // Wait packets from Send example if (LoRa.available()) { uint32_t value; uint8_t len = sizeof(value); // Save the received packet payload into value if (LoRa.recv((uint8_t *) &value, &len)) { Serial.print("Received value: "); Serial.println(value); } } }
Antes de intentar leer un paquete LoRa, es muy importante comprobar si hay un mensaje pendiente. Si es así, procedemos a almacenar los datos en la variable value e imprimir su contenido.
Además de enteros únicos, LoRa.recv() también puede recibir cadenas, almacenándolas en un array y modificando la variable len para ajustar la longitud del array, permitiendo imprimirlo u operar fácilmente con él.
No hay comentarios por ahora.