bclose

M5Stack y LORA 866 Mhz

M5Stack y LORA 866 Mhz

 

 

    • Vamos a probar el modulo LORA con M5stack.
    • Veremos un ejemplo practico de envio y recepcion de mensajes con LORA.
    • Separaremos los programas emisor y receptor.
 

 

Material requerido.

 

 Tienda EspañaTienda Mexico
MOdelo basicoUn M5Stack
 Ampliacion m5stack para lora Una radio LORA 866 para M5stack

 

LORA con el M5Stack

 

El protocolo LORA esta ganando impulso a raíz de la próxima implementación de las redes 5G porque se supone que podrán permitir crear accesos LORA y LORAWAN a través de la red de transporte comercial (Aunque ya iremos viendo). Es un protocolo magnifico para la IOT, por su característica de bajo consumo y largo alcance, y aunque tiene alguna competencia importante como el Sigfox, parece que LORA lleva ventaja.

En esta sesión vamos a presentar un ejemplo de comunicación punto a punto unidireccional entre dos nodos LORA de forma que veamos un pequeño ejemplo de programación de la misma usando el M5STACK y el módulo LORA 866 disponible para él. De este modo iremos usando algunos módulos adicionales que es una de las grandes virtudes del M5Stack (Y la razon fundamental, para que prefiera usar modulos compactos con M5 en lugar de modulos externos con protoboards y cablecitos).

Ampliacion m5stack para lora

Como estamos en Europa la frecuencia asignada a LORA es de 866 MHz, y no deberíamos usar las otras frecuencias típicas de 466 MHz y 960 MHz asignadas en Asia y América, pero me imagino que estarán libres. Por si acaso os conviene comprar módulos 866 MHz para ahorraros disgustos o sorpresas.

 

Enviando mensajes LORA.

 

Para esta sesión vamos a partir del ejemplo que incluye la documentación del módulo LORA 866 de M5stack, en la que uno de los módulos envía una serie de mensajes repetitivos al otro nodo, pero lo modificaremos un poco para facilitar la comprensión del ejemplo y para que como es habitual en esta humilde casa os pueda servir como plantilla para vuestros proyectos.

La idea es escribir un programa emisor que radie el mensaje a una dirección dada, y otro programa receptor, que recoja e imprima el mensaje. Así que vamos a empezar con el módulo de envío. Empezamos por algunas definiciones:

#include <M5Stack.h>
#include <M5LoRa.h>

String outgoing;              // outgoing message
int i=0;

byte msgCount = 0;            // count of outgoing messages
byte localAddress = 0xFF;     // address of this device
byte destination = 0xBB;      // destination to send to

Lo primero es el típico include del M5stack, y el segundo es la librería para LORA. Luego un par de variables instrumentales, más unas variables para contar los mensajes enviados o salientes, y un par de direcciones en hexadecimal , sobre las que nos conviene hablar:

Cada nodo que se conecta a una red LORA tiene asignada una dirección hexadecimal entre 0x00 y 0xFF ( 0 – 255) que se usará como dirección local  cuando queramos mandarle un mensaje, y no hay que usar (En principio) ninguna de las dos para un nodo ( 0 y 255) , porque la 0x00 esta reservada y la 0xFF es la dirección de broadcast, es decir, si envías a la dirección 0xFF se recibirá en todos los nodos al alcance como válido.

Pero una cosa poco habitual, es que la dirección no se establece por hardware (Como el I2C y similares) con algún tipo de interruptores, como un switch de 8 posiciones binarias, sino que se establece por software y puede cambiarse sobre la marcha. Esto, aunque es poco frecuente es perfectamente válido.

En el ejemplo de arriba y del ejemplo, que es el oficial del módulo LORA, puedes ver que se asigna como local la dirección 0xFF, no es muy educativo, pero es válido y en cambio envía el mensaje a un nodo con dirección 0xBB. Mas adelante nuestro programa receptor usará esta dirección como propia para recibir el mensaje.

long lastSendTime = 0;        // last send time
int interval = 1000;          // interval between sends

Vamos a usar este par de variables para variar el tiempo entre mensajes a enviar. Vamos al setup()

void setup()
{       M5.begin();
        M5.Power.begin();
        while (!Serial);

        Serial.println("LoRa Duplex B");
        LoRa.setPins();                                 // set CS, reset, IRQ pin normal

        if (!LoRa.begin(868E6))
             {    // initialize ratio at 868 MHz
                 Serial.println("LoRa init failed. Check your connections.");
                 while (true);                       // if failed, do nothing
             }
         Serial.println("LoRa init succeeded.");
 }

Inicializamos el M5 con las primeras líneas y enviamos un mensaje a la puerta serie para advertir de que empezamos, y fijamos los pines de CS, IRQ y reset habituales. El siguiente if, es para que no siga si no conseguimos inicializar el hardware LORA

Ahora queremos enviar los mensajes. Para ello vamos a generar un mensaje de texto compuesto con un contador i que va creciendo:

String message = String(i++);
sendMessage(message);
Serial.println("Sending " + message);
M5.Lcd.setTextColor(BLUE);                    //Color azul  y tamaño que podamos ver
M5.Lcd.setTextSize(2);
M5.Lcd.println("Sending " + message);
lastSendTime = millis();            // timestamp the message
interval = random(1000) + 500;

El programa de referencia usa el botón A para borrar la pantalla cuando queramos:

f(M5.BtnA.wasPressed())
{     M5.Lcd.setCursor(0, 0);
      M5.Lcd.clear(BLACK);
}

Y el botón B para reiniciar el módulo LORA, en caso de que haya problemas:

void reinit()
{  Serial.println("LoRa Duplex Reinitialization");
   LoRa.setPins();            // set CS, reset, IRQ pin

   if (!LoRa.begin(868E6))
     {   // initialize ratio at 868 MHz
         Serial.println("LoRa init failed. Check your connections.");
         M5.Lcd.setCursor(0, 0);
         M5.Lcd.setTextColor(RED);
         M5.Lcd.println("Init failed!!!");
         while (true);                       // if failed, do nothing
      }
   Serial.println("LoRa init succeeded.");
 }

Hasta aquí poco de nuevo. Vamos con la función que empaqueta y envía los mensajes, Básicamente componemos el mensaje rellenando los campos requeridos y se envía al dar la orden de finalizar el paquete:

void sendMessage(String outgoing)
{    LoRa.beginPacket();                   // start packet
     LoRa.write(destination);              // add destination address
     LoRa.write(localAddress);             // add sender address
     LoRa.write(msgCount);                 // add message ID
     LoRa.write(outgoing.length());        // add payload length
     LoRa.print(outgoing);                 // add payload
     LoRa.endPacket();                     // finish packet and send it 
     msgCount++;                           // increment message ID
}

Aquí no hay mucho que rascar, ya que vamos componiendo el mensaje con la información precisa (De acuerdo con el manual)  y cuando finalizamos los datos del paquete la instrucción endPacket() finaliza y transmite el mensaje a la dirección especificada. Eso es todo. Como puedes ver la librería gestiona prácticamente todo ocultándonos los detalles escabrosos.

Aquí os dejo el programa completo: LoraSend

 

Recibiendo mensajes LORA

 

Recibir mensajes LORA es igual de sencillo. Empezamos el programa de recepción con los includes y en este caso asignamos la dirección local a 0xBB, porque es la dirección a la que estábamos enviando en el programa anterior:

#include <M5Stack.h>
#include <M5LoRa.h>

byte localAddress = 0xBB;

Para el setup vamos a tener prácticamente lo mismo que en el programa anterior. Inicializamos el M5 y el LORA y en caso de error clavamos el programa para que no siga y en caso de éxito enviamos un mensaje a la consola:

void setup()
{   M5.begin();
    M5.Power.begin();
    while (!Serial);

    LoRa.setPins();// set CS, reset, IRQ pin
    if (!LoRa.begin(868E6))
     {  // initialize ratio at 868 MHz
        Serial.println("LoRa init failed. Check your connections.");
        while (true);                       // if failed, do nothing
     }
    Serial.println("LoRa init succeeded.");
}

En el loop, simplemente, fijamos color y tamaño del texto y llamamos a la función onReceive pasándole el paquete recibido como parámetro  y que vamos a ver a continuación

void loop()
{  M5.Lcd.setTextColor(BLUE);
   M5.Lcd.setTextSize(2);

   onReceive(LoRa.parsePacket());
}

Vamos con la función que se encarga de la recepción:

Contenido solo disponible para suscriptores. ¡Accede al contenido!

   

Cuando lleguen los mensajes que nuestro emisor está radiando, veremos en pantalla unas letras amarillas replicando el mensaje (Un simple número) y los datos del mensaje en la consola

  Muestra los mensajes recibidos 
Copia del mensaje en pantalla

 

 

IMAGEN DE MARCA

No Comments

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login