Inicio Arduino ¡Integra un shield LoRa en tu proyecto!

¡Integra un shield LoRa en tu proyecto!

Si alguna vez has pensado en experimentar con comunicaciones a larga distancia, puede que te interese integrar un módulo LoRa a tu proyecto. LoRa es un protocolo de comunicación de largo alcance, con un rango de 1km a 5km en promedio, consume poca energía y es muy eficiente. Un shield que puedes usar muy fácilmente es el CatWAN Shield para Arduino UNO de Electronic Cats.

El CatWAN utiliza el chip RFM95 para implementar la red LoRa. Vía: 330ohms

Los ejemplos

El repositorio del shield incluye una carpeta de ejemplos y otra donde puedes encontrar la documentación del hardware. Si puedes darte un rato para revisar el hardware mejor, y funciona con el puerto SPI. En cuanto a los ejemplos hay 3 subcarpetas, cada uno con un ejemplo para transmitir y otro para configurar como receptor.

En la primer carpeta de ejemplos puedes encontrar el código que utiliza la librería LoRa.h para comunicarse. La segunda utiliza la librería RH_RF95.h (RadioHead) y en el tercero se establece una conexión por internet usando una red WAN.

Librería LoRa

La librería LoRa emplea algunas funciones para crear paquetes y para enviarlos. Los ejemplos se centran en la configuración del módulo estableciendo el puerto SPI y en enviar un paquete o recibirlo e imprimir el contenido del mensaje. En caso de que falle la configuración se enviará un mensaje de error advirtiendo del fallo. A continuación mostramos el ejemplo para que el shield funcione como transmisor.

#include <SPI.h>
#include <LoRa.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);
  
  LoRa.setPins(10, 9, 2);
  
  Serial.println("LoRa Receiver");

  if (!LoRa.begin(915E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}

void loop() {
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    // received a packet
    Serial.print("Received packet '");

    // read packet
    while (LoRa.available()) {
      Serial.print((char)LoRa.read());
    }

    // print RSSI of packet
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
  }
}

Para seguir leyendo…

¿Qué es LoRa y LoRaWAN?

¿Qué es BastWAN?

¿Quieres incursionar en el mundo del IoT?

Arduino MKRFox1200, la nueva placa de Arduino para makers enfocados en el IoT

Librería RadioHead

Estos ejemplos emplean un poco más de circuitería, ya que emplea una pantalla LCD para desplegar los mensajes. Se emplea la librería RH_RF95.h, con la que se establecen los parámetros del módulo y se envían o reciben los paquetes. Por ejemplo, para el módulo receptor, tenemos este código de ejemplo:

#include <SPI.h>
#include <RH_RF95.h>

#define RFM95_CS 10 
#define RFM95_RST 9
#define RFM95_INT 2
#define RF95_FREQ 915.0 //Usados creando el objeto

RH_RF95 rf95(RFM95_CS, RFM95_INT);

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
char reci[10];
uint32_t cont=1;

void setup() 
{
  Serial.begin(9600);
  lcd.begin();                      // initialize the lcd 
  lcd.backlight();
  /*****LoRa init****/
  pinMode(RFM95_RST, OUTPUT);
  digitalWrite(RFM95_RST, HIGH);
  delay(100);
  lcd.print("Electronic cats");
  lcd.setCursor(0,1);
  lcd.print("LoRa Tester 2017");
  delay(1800);
  // manual reset
  digitalWrite(RFM95_RST, LOW);
  delay(10);
  digitalWrite(RFM95_RST, HIGH);
  delay(10);
    while (!rf95.init()) {
    Serial.println(F("LoRa radio init failed"));
    while (1);
  }
  
  lcd.print("LoRa Ok");
  lcd.setCursor(0,1);
  lcd.print("inicializado");
  Serial.println("LoRa radio init OK!");

  if (!rf95.setFrequency(RF95_FREQ)) {
    while (1);
  }
  
  rf95.setTxPower(23, false); //Set the max transmition power
  /******************/
  
}

void loop()
{ 
  if(rf95.available())
  {
    lcd.clear();
    lcd.setCursor(0,0);
    // Should be a message for us now   
    uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
    uint8_t len = sizeof(buf);
    if (rf95.recv(buf, &len))
    {
      Serial.print("got request: ");
      Serial.write((char*)buf,4);
      Serial.println();
      for(int i=0;i<len;i++){
      reci[i]=(char*)buf[i];
      Serial.print("reci: ");
      Serial.println(reci[i]);
      }
      Serial.print(len);
      Serial.println(" bytes of payload");
      Serial.print("RSSI: ");
      Serial.println(rf95.lastRssi(), DEC);
      lcd.print("Boton:");
      lcd.print(reci[0]);
      lcd.print(" Data:");
      for(int a=2;a<len;a++){
        lcd.print(reci[a]);
      }
      lcd.setCursor(0,1);
      lcd.print("Fct:");
      lcd.print(cont);
      cont++;
      lcd.print(" RSSI:");
      lcd.print(String(rf95.lastRssi()));
      delay(1200);
      
      // Send a reply
      uint8_t data[] = "ACK";
      rf95.send(data, sizeof(data));
      rf95.waitPacketSent();
      Serial.println("Sent a reply");
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Enviando ");
      lcd.setCursor(0,1);
      lcd.print("Respuesta: ACK");
      delay(800);
    }
    else
    {
      Serial.println("recv failed");
    }
  }
}

Comunicación WAN

Para estos ejemplos tenemos una versión ABP y otra OTAA. Ambos ejemplos utilizan un sensor de temperatura, un sensor ultrasónico y un GPS para mandar información a la red. En este caso se emplea un formato especializado de paquete, en el que enviamos el canal de transmisión, el tipo de paquete y la información.

Con estos ejemplos puedes darte una idea como implementar los dos modos de activación en la red LoRaWAN, que son Activation By Personalization (ABP) y el Over-The-Air Activation (OTAA). Una de las principales diferencias entre estos dos métodos de activación es que en el primero el dispositivo mantiene una DevAddr fija, mientras que en el segundo es variable y es asignada en un proceso de ingreso. Por ciertas ventajas dinámicas, es preferible usar el segundo método, ya que vuelve más dinámica la red. Sin embargo, los dispositivos finales deben cumplir con ciertos requisitos para que se pueda implementar de forma óptima la red.

Conclusiones:

Con estos ejemplos puedes establecer una comunicación de larga distancia entre dos módulos, con los que puedes implementar una red de internet de las cosas muy eficiente. Un ejemplo de uso puede ser en edificios inteligentes o en producción de energía solar, en donde requieres que los módulos sean muy eficientes y estén a largas distancias. Es importante aprender a implementar cualquiera de las dos librerías, LoRa.h o RH_RF95.h , así como aprender los dos modos de activación en LoRaWAN.

Referencias:

CATWAN SHIELD PARA ARDUINO

ABP vs OTAA – The Things Stack

CatWAN Arduino Shield

CatWAN Shield Github