LoRa meets ESP32

Intrarea pe piață a microprocesorului SoC ESP32 a marcat o nouă și interesantă etapă în cadrul familiei de circuite produse de compania Espressif. Două nuclee LX6 ce lucrează la frecvențe de până la 240MHz, conectivitate WiFi b/g/n și bluetooth 4.2, convertor analog-numeric pe 12 biți / 18 canale, două convertoare numeric-analogice pe 8 biți, patru interfețe SPI, două I2C, două I2S și trei UART, interfață CAN bus 2.0 sunt doar câteva dintre facilitățile puse la dispoziția dezvoltatorilor de către ESP32 făcând din acesta o alternativă atrăgătoare pentru noi proiecte. Mai mult decât atâta, pe lângă plăci de dezvoltare bazate pe ESP32 precum Adafruit HUZZAH32, Sparkfun ESP32 Thing sau Olimex ESP32-Gateway, asistăm la apariția unei generații noi de plăci de dezvoltare ce combină conectivitatea circuitului ESP32 cu conectivitatea modulelor radio LoRa.

LoPy este o astfel de placă de dezvoltare dar putem aminti și alte variante precum HELTEC WiFi LoRa 32 sau TTGO ESP32 SX1276 LoRa. Chiar dacă placa de dezvoltare LoPy este gândită pentru a fi programată în mediul MicroPython există și posibilitatea de a utiliza mediul Arduino IDE.

Avantajele unei plăci de dezvoltare ce îmbină conectivitatea circuitului ESP32 (WiFi + bluetooth) cu conectivitatea unui modul radio LoRa (comunicații radio pe distanțe mari) sunt evidente: posibilitatea de implementarea de dispozitive IoT multiprotocol, posibilitatea de implementarea de sisteme gateway LoRa sau bluetooth – implementări ce nu necesită nici un fel de montaj electronic pentru partea de comunicație, placa de dezvoltare integrează toate componentele necesare.

Realizarea unui nod LoRaWAN TTN, de exemplu, este extrem de simplă fără a fi nevoie să interconectăm o placă de dezvoltare cu un modul radio LoRa. Plecând de la exemplul ttn-abp al bibliotecii LMIC trebuie să personalizăm datele de autentificare în rețeaua TTN (obținute în urma înregistrării gratuite):

static const PROGMEM u1_t NWKSKEY[16] = { … };

static const u1_t PROGMEM APPSKEY[16] = { … };

static const u4_t DEVADDR = … ;

să modificăm pinii utilizați de modulul LoRa:

const lmic_pinmap lmic_pins = {

    .nss = 18,

    .rxtx = LMIC_UNUSED_PIN,

    .rst = 14,

    .dio = {26, 33, 32},

};

și să inserăm comanda de inițializare personalizată a portului SPI în cadrul secțiunii setup():

SPI.begin(5,19,27,18);

Pentru mai multe informații puteți consulta și materialele: „The ESP32 Oled Lora TTGO LoRa32 board and connecting it to TTN” și „Easy LoRaWAN and more with LoPy”.

Pentru a crea un gateway LoRaWAN TTN putem să apelăm la pachetul software Single Channel LoRaWAN Gateway în care vom avea de făcut câteva personalizări minore. În fișierul ESP-sc-gway.h vom modifica următoarele secțiuni:

  • Datele de identificare ale sistemului gateway (coordonate GPS, altitudine, platformă, descriere și email de contact)

#define _DESCRIPTION “ESP32 Single Channel Gateway”

#define _EMAIL “…”

#define _PLATFORM “ESP32”

#define _LAT …

#define _LON …

#define _ALT …

  • Datele serverului NTP cu care vom realiza sincroniza ceasul și fusul orar

#define NTP_TIMESERVER    “ro.pool.ntp.org”

#define NTP_TIMEZONES     2

#define SECS_PER_HOUR     3600

#define NTP_INTR      0

  • Datele de conectare la rețeaua WiFi ce asigură conectivitatea Internet

wpas wpa[] = {

{ “” , “” },

{ “…”, “…” }

};

După încărcarea programului pe placa de dezvoltare, deschizând consola serială a mediului Arduino IDE, obținem ID-ul gateway-ului ce trebuie înregistrat pe platforma TTN:

2

Sistemul gateway dispune de o interfață web (accesibilă din rețeaua locală din care face parte sistemul) ce permite supravegherea funcționării și modificarea unor parametrii (precum canalul radio pe care ascultă gateway-ul):

3

Pentru mai multe detalii despre implementarea unui sistem gateway LoRaWAN TTN puteți consulta și materialele: „LoPy to Single Channel Gateway to The Things Network” și „BIG ESP32 / SX127x”.

LoRa meets Robofun IoT

Modulele radio LoRa oferă posibilitatea de a transmite date la distanță mare (sute de metri sau chiar kilometri) utilizând module electronice de cost redus și cu un consum de energie scăzut. Acest lucru constituie o metodă eficientă pentru a extinde aria de acoperire pentru rețelele IoT fără fir. Chiar dacă semnalul WiFi are o acoperire limitată fiind influențat de puterea dispozitivelor de tip AP și de mediul în care operează (câmp deschis, locuințe sau birouri) există posibilitatea să extindem aria de acoperire radio a unei rețele IoT prin intermediul comunicațiilor ISM iar soluțiile LoRa oferă o variantă foarte bună cost / arie de acoperire.

Pentru a implementa o soluție LoRa în vederea extinderii ariei de acoperire IoT vom implementa un sistem gateway ce va realiza transferul datelor provenite de la modulele IoT către un sistem specific IoT și anume Robofun IoT. Modulul gateway propus se bazează pe placa de dezvoltare NodeMCU ce oferă conectivitate WiFi și un modul LoRa RFM96W în bandă de 433MHz. Conexiuniile între placa de dezvoltare și modulul radio sunt prezentate în diagrama următoare:

2.png

Modulul radio RFM96W se interconectează cu placa de dezvoltare prin intermediul magistralei SPI:

  • Pinul SCK al modulului se conectează la pinul D5 (GPIO14 – HSCLK);
  • Pinul MISO se conectează la pinul D6 (GPIO12 – HMISO);
  • Pinul MOSI se conectează la pinul D7 (GPIO13 – HMOSI);
  • Pinul CS se conectează la pinul D2;
  • Pinul RST se conectează la pinul D3;
  • Pinul G0 (INT) se conectează la pinul D1;
  • Vin și GND la pinii 3.3V și GND ai plăcii de dezvoltare.

Pentru ca placa să poată transmite prin Internet datele către serviciul Robofun IoT este necesară înregistrarea gratuită pe platformă:

3

După înregistrare și conectare este necesară definirea (Adauga senzor) a trei senzori: Temperatura, Umiditate și Nivel baterie, pentru a putea transmite datele primite de la sistemul IoT către platforma online. După definirea fiecărui senzor este necesar să copiem cheia de autentificare (Token) pentru a fi utilizată în program.

4

5

Programul a fost dezvoltat și testat utilizând Arduino IDE 1.8.3 (pentru instalarea plăcii NodeMCU sub Arduino IDE se poate vedea materialul „Quick Start to Nodemcu (ESP8266) on Arduino IDE”), extensia esp8266 versiunea 2.3.0 și biblioteca RadioHead 1.7.9. În cadrul programului trebuie personalizate datele de conectare la rețeaua WiFi (ssid și password) precum și cheile de autentificare pentru cele trei canale IoT (SENSOR_TOKEN1, SENSOR_TOKEN2 și SENSOR_TOKEN3).

#include <SPI.h>

#include <RH_RF95.h>

#include <ESP8266WiFi.h>

#include <ESP8266HTTPClient.h>

const char* ssid = “…”;

const char* password = “…”;

#define RFM95_CS D2

#define RFM95_RST D3

#define RFM95_INT D1

#define RF95_FREQ 434.0

RH_RF95 rf95(RFM95_CS, RFM95_INT);

#define LED D0

void setup() {

  pinMode(LED, OUTPUT);

  digitalWrite(LED,HIGH);    

  pinMode(RFM95_RST, OUTPUT);

  digitalWrite(RFM95_RST, HIGH);

  Serial.begin(9600);

  delay(100);

  Serial.println();

  Serial.println();

  Serial.println(“Gateway Module starting…”);

  Serial.print(“Connecting to “);

  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {

      delay(500);

      Serial.print(“.”);

    }

    Serial.println(“”);

    Serial.println(“WiFi connected”);

  digitalWrite(RFM95_RST, LOW);

  delay(10);

  digitalWrite(RFM95_RST, HIGH);

  delay(10);

  while (!rf95.init()) {

    Serial.println(“LoRa radio init failed”);

    while (1);

  }

  Serial.println(“LoRa radio init OK!”);

  if (!rf95.setFrequency(RF95_FREQ)) {

    Serial.println(“setFrequency failed”);

    while (1);

  }

  Serial.print(“Set Freq to: “);

  Serial.println(RF95_FREQ);

}

typedef struct {float temperature; float humidity;

float bat_voltage;} ParametriiRX;

ParametriiRX parametrii;

Ledul de pe placa de dezvoltare (conectat pe pinul D0) se va aprinde pe perioada recepției de mesaje LoRa. Toate datele primite prin intermediul LoRa vor fi postate pe platforma Robofun IoT. Sistemul va raporta și în consola serială toate mesajele recepționate.

6

void loop() {

  if (rf95.available())  {

    uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];

    uint8_t len = sizeof(buf);

    if (rf95.recv(buf, &len)){

      digitalWrite(LED, LOW);

      RH_RF95::printBuffer(“Received: “, buf, len);

      parametrii = *(ParametriiRX*)buf;

      Serial.print(“Temperature: “);

      Serial.println(parametrii.temperature);

      Serial.print(“Humidity: “);

      Serial.println(parametrii.humidity);

      Serial.print(“Battery Voltage: “);

      Serial.println(parametrii.bat_voltage);

      Serial.print(“RSSI: “);

      Serial.println(rf95.lastRssi(), DEC);

      digitalWrite(LED, HIGH);

      String SENSOR_TOKEN1=”…”;

      String SENSOR_TOKEN2=”…”;

      String SENSOR_TOKEN3=”…”;

      HTTPClient http;

      String data = String(“http://iot.robofun.ro/api/v1/senzor/&#8221;) + SENSOR_TOKEN1 + “/input?value=” + String(parametrii.temperature, DEC);

      http.begin(data);

      int httpCode = http.GET();

      http.end();

      data = String(“http://iot.robofun.ro/api/v1/senzor/&#8221;) + SENSOR_TOKEN2 + “/input?value=” + String(parametrii.humidity, DEC);

      http.begin(data);

      httpCode = http.GET();

      http.end();

      data = String(“http://iot.robofun.ro/api/v1/senzor/&#8221;) + SENSOR_TOKEN3 +  “/input?value=” + String(parametrii.bat_voltage, DEC);

      http.begin(data);

      httpCode = http.GET();

      http.end();    }

    else    {

      Serial.println(“Receive failed”);    }

  }

}

Modulul LoRa ce va beneficia de extinderea ariei de comunicație (se poate afla la sute de metri, sau chiar kilometri în spațiu deschis, de aria de acoperire WiFi) se bazează pe placa de dezvoltare Feather M0 RFM95 433MHz LoRa – placă ce combină puterea unui microcontroler ARM Cortex-M0+ ATSAMD21 (la fel ca și plăcile Arduino M0/Zero) cu conectivitatea unui modul radio LoRa. Placa de dezvoltare va transmite către modulul gateway date preluate de la un senzor digital I2C de temperatură și umiditate Si7021 precum și nivelul bateriei proprii (unul dintre avantajele majore ale plăcilor Feather este posibilitatea de alimentare mobilă de la un acumulator LiPo de 3.7V).

Pentru mai multe informații legate de utilizarea plăcii Feather M0 RFM95 puteți consulta și materialul: „Adafruit Feather M0 Radio with LoRa Radio Module”.

Schema de interconectare între senzor și placa de dezvoltare este specifică unei magistrale I2C (pinii SDA și SCL conectați între senzor și placa de dezvoltare, alimentarea senzorului se va face la 3.3V):

7

Programul a fost dezvoltat și testat utilizând Arduino IDE 1.8.3, extensia Adafruit SAMD Boards 1.0.19 și bibliotecile RadioHead 1.7.9, Adafruit Si7021.

Decomentarea directivei debug va permite observarea funcționării modulului în consola serială.

//#define debug

7.5

#include <SPI.h>

#include <RH_RF95.h>

#define VBATPIN A7

#include <Adafruit_Si7021.h>

Adafruit_Si7021 sensor = Adafruit_Si7021();

#define RFM95_CS 8

#define RFM95_RST 4

#define RFM95_INT 3

#define RF95_FREQ 434.0

RH_RF95 rf95(RFM95_CS, RFM95_INT);

void setup() {

  pinMode(RFM95_RST, OUTPUT);

  digitalWrite(RFM95_RST, HIGH);

  sensor.begin();

  #ifdef debug

    while (!Serial);

    Serial.begin(9600);

    delay(100);

    Serial.println(“LoRa Sensor Module starting…”);

  #endif

  digitalWrite(RFM95_RST, LOW);

  delay(10);

  digitalWrite(RFM95_RST, HIGH);

  delay(10);

  while (!rf95.init()) {

    #ifdef debug

      Serial.println(“LoRa radio init failed”);

    #endif

    while (1);

  }

  #ifdef debug

    Serial.println(“LoRa radio init OK!”);

  #endif

  if (!rf95.setFrequency(RF95_FREQ)) {

    #ifdef debug

      Serial.println(“setFrequency failed”);

    #endif

    while (1);

  }

  #ifdef debug

    Serial.print(“Set Freq to: “);

    Serial.println(RF95_FREQ);

  #endif

  rf95.setTxPower(23, false);

}

typedef struct {float temperature; float humidity;

float bat_voltage;} ParametriiTX;

ParametriiTX parametrii;

void loop() {

  float voltage = analogRead(VBATPIN);

  voltage *= 2;   

  voltage *= 3.3;

  voltage /= 1024;

  parametrii.bat_voltage = voltage;

  parametrii.temperature = sensor.readTemperature();

  parametrii.humidity = sensor.readHumidity();

  #ifdef debug

    Serial.print(“Sample OK: “);

    Serial.print(parametrii.temperature);

   Serial.print(” *C, “);

    Serial.print(parametrii.humidity);

    Serial.println(” %”);

    Serial.print(“VBat: ” ); Serial.println(voltage);

    Serial.println(“Sending to Gateway Module”);

    Serial.println(“Sending…”); delay(10);

  #endif

  RH_RF95::printBuffer(“Sending: “, (uint8_t*)&parametrii, sizeof parametrii);

  #ifdef debug

    Serial.println(“Sending…”); delay(10);

  #endif

  rf95.send((uint8_t *)&parametrii, sizeof parametrii);

  #ifdef debug

    Serial.print(“Waiting for packet to complete…”);

delay(10);

  #endif

  rf95.waitPacketSent();

  #ifdef debug

    Serial.println(“done.”); delay(10);

  #endif

  delay(100);

  rf95.sleep();

  delay(60000);

}

După programarea și punerea în funcțiune a celor două sisteme se pot observa datele înregistrate în cadrul platformei Robofun IoT (capturile de ecran de mai jos reprezintă date înregistrate de sistemul de test pentru temperatură și umiditate).

8

9

Bineînțeles, sistemul LoRa poate deservi atât sisteme de achiziție (temperatură, umiditate, presiunea în diverse conducte, consumul de energie electrică, nivelul radiației solare etc.) dar și sisteme de acționare (chiar dacă nu a fost exemplificată această parte este posibil să comandăm de la distanță diverse mecanisme de închidere / deschidere, motoare etc).

Faceți cunoștință cu LoRa

Termenul de LoRa (sau tehnologie LoRa) se referă la o categorie de comunicații radio caracterizate de distanță mare de transmisie (Long Range) cu un consum mic de energie (Low Power). Spre deosebire de tehnologiile de transmisie radio digitale clasice, tehnologiile LoRa au capabilitatea de a comunica date la distanțe de câțiva kilometri sau chiar zeci de kilometri având aplicabilitate extraordinară în rețele de senzori wireless (fără fir), internetul obiectelor (IoT) și crearea de rețele de dispozitive inteligente. În spatele termenului de LoRa se află de fapt o multitudine de tehnologii proprietar sau deschise, similare ca funcționalitate dar total incompatibile ca implementare – domeniul de comunicații digitale radio la distanțe mari fiind la momentul actual într-o fază de pionierat în care stabilitatea oferită de standardizare și metode de interconectare tehnologică sunt un deziderat destul de îndepărtat. Alți termeni utilizați pentru a referi rețelele radio digitale cu raza mare de transmisie sunt: LoRaWAN (LoRa Wide Area Network), LPWAN (Low Power Wide Area Network), 6LowPAN (IPv6 Low-power Personal Area Network), LPN (Low Power Network) – unii dintre acești termeni sunt înregistrați ca mărci aparținând unor anumite companii sau consorții fiind folosiți pentru a identifica o anumită tehnologie LoRa (chiar și termenul de LoRa este marcă înregistrată a companiei Semtech).

Există foarte multe materiale care încearcă să clarifice asemănările / deosebirile și avantajele / dezavantajele oferite de fiecare tehnologie LoRa în parte, în acest sens vă recomandăm:

dar în cadrul materialului de față ne vom limita să prezentăm cele mai cunoscute tehnologii de transmisie radio la distanță mare la momentul actual precum și diverse dispozitive radio disponibile pe piață pentru implementarea acestor tehnologii (dispozitive aflate la un nivel decent de cost și complexitate pentru a le putea folosi în dezvoltarea unor sisteme proprii).

Tehnologii de transmisie radio la distanță mare  și dispozitive radio compatibile

LoRa –  Tehnologie radio ce utilizează benzi de frecvență radio ISM sub-Ghz pentru a transmite datele la distanțe mari cu un consum foarte mic de energie.

2

Este o tehnologie proprietar și este dezvoltată de compania Semtech. Specifică nivelul fizic de comunicație (modulația radio). Este implementată în circuitele integrate radio din seria SX1xxx produse de Semtech sau în circuitele RFM9x produse de HopeRF (care a cumpărat licența pentru nucleul radio LoRa). Cele două familii de circuite radio sunt compatibile deoarece implemetează același nucleu electronic de comunicație radio. Există mai multe plăci de dezvoltare și module de comunicație radio bazate pe circuitele din cele două familii:

  • Seeeduino LoRaWAN – placă de dezvoltare bazată pe un microcontroler ARM Cortex-M0+ ATSAMD21G18 (la fel ca și placa Arduino M0, placa este compatibilă cu mediul Arduino IDE) și un modul de comunicație radio RHF76-052 bazat pe circuitul SX1276 (compatibil LoRa).

3

  • Dragino LoRa Shield – shield Arduino bazat pe circuitul radio RFM98W (compatibil LoRa). Integrează un senzor de temperatură și indicator de baterie. Compatibil cu Arduino Uno, Leonardo, Mega.

4

  • Raspberry Pi LoRa/GPS HAT – shield (hat) pentru placa Raspberry Pi 2/3. Bazat pe un modul RFM92 (compatibil LoRa). Include un receptor GPS.

5

  • Adafruit Feather 32U4 / M0 RFM9x precum și shield-ul LoRa Radio Feather bazate pe module RFM9x și compatibile cu mediul Arduino IDE. Plăci de dezvoltare de mici dimensiuni, compacte și cu posibilitatea de alimentare de la un acumulator LiPo de 3.7V.

6

  • Modul radio Adafruit RFM96W ce permite utilizarea modului radio de la HopeRF împreună cu diverse plăci de dezvoltare inclusiv plăcile de dezvoltare Arduino.

7

LoRaWAN (LoRa Wide Area Network) – set de specificații deschise de tipul LPWAN (Low Power Wide Area Network) dezvoltate de consorțiul LoRa Alliance.

8

Completează tehnologia LoRA cu nivelul MAC. Chiar dacă este un set de specificații deschise la care contribuie o serie de companii importante (CISCO, IBM, ST, Renesas, ZTE, Microchip…) se bazează în totalitate pe nivelul fizic proprietar LoRa. Totuși, există o comunitate mare de utilizatori care și-au propus construirea unei rețelei globale LoRaWAN (The Thing Network) – în prezent puteți găsi acoperire TTN la noi în țară în București și Timișoara.

9

Sigfox – tehnologie LPWAN dezvoltată de compania franceză Sigfox. Utilizează modulație radio UNB (Ultra Narrow Band) și frecvențe radio ISM sub-GHz. Acoperire aproapre totală în circa 30 de țări.

10

Multiplii producători pentru circuite radio compatibile: Microchip, Texas Instruments, NXP sau ON Semiconductors și numeroase plăci de dezvoltare din care trebuie să menționăm placa de dezvoltare:

  • Arduino MKR FOX 1200 echipată cu un microcontroler ARM Cortex-M0+ SAMD21 (la fel ca și placa Arduino M0) și un circuit radio ATAB8520E (compatibil Sigfox).

11

6LowPAN (IPv6 Low-power Personal Area Network) este un set de specificații realizate de o comisie, cu același nume, a IETF (Internet Engineering Task Force). Specificațiile își propun extinderea seturilor de protocoale Internet pentru diferite metode de comunicație IoT (implementarea protocoalelor Internet în dispozitive specializate simple cu un consum redus de energie) și au influențat diverse tehnologii proprietar din domeniul LPWAN precum Thread dând naștere la diverse derivații funcționale pentru protocoalele radio existente precum IPv6 over BLE.

12