LoRa - P2P-Kommunikation

Mit LoRa ("long range") können kleinere Datenmengen über verhältnismäßig große Distanzen bei sehr geringem Energie-/Stromverbauch drahtlos übertragen werden. In diesem Beitrag wird eine Punkt-zu-Punkt-Anwendung aufgebaut, so dass Daten zwischen zwei Arduinos ausgetauscht werden können.

LoRa

Die Übertragungsreichweiten von LoRa gehen von 2km (Stadtgebiet) bis zu 40km (ländliches Gebiet). Auch Gebäude werden gut durchdrungen, so dass auch Kellerräume erreicht werden können. Der Strombedarf für die Übertragung liegt bei ca. 10mA und geht im Ruhemodus bis zu 0,1µA. Die Kommunikation erfolgt mit Datenraten von 0,3kbit/s bis 50kbit/s. LoRa nutzt regional unterschiedliche Frequenzbereiche, wobei in Europa 433,05 bis 434,79 MHz (ISM-Band Region 1) und von 863 bis 870 MHz (SRD-Band Europa) genutzt werden. Daher ist es auch wichtig, LoRa-Module mit der richtigen Übertragungsfrequenz für die eigene Region zu erwerben.

Verwendete Bauteile

LoRa-Modul RFM95W

Für die Übertragung der Daten verwenden wir hier das LoRa-Modul RFM95W, welches einen kleinen Nachteil hat: es ist nicht ganz breaboard-kompatibel. Die Aschlüsse sind etwas enger, als die üblichen 2,54mm-Abstände des Breadboards, daher kann man sich z.B. mit Messingdrahtstücken behelfen, die in die Anschlüsse gelötet und dann auf den richtig Abstand gebogen werden.

Anschlüsse

LoRa-Modul RFM95W
Abb.: Anschlüsse am LoRa-Modul RFM95W

Antenne

Das RFM95W-Modul benötigt am Pin ANA eine Antenne. Diese kann leicht mit einem Draht oder Kabel selbst hergestellt werden. Für das Modul mit 868MHz ist eine Länge der Antenne von 86mm optimal. Um die Übertragungsentfernung zu maximieren sind gute Antenne wichtig, daher gibt es hier einige nützliche Hinweise:
YouTube: Coil antenna vs wire antenna revisited
YouTube: How to create a copper 868MHz coil antenna
DIY LoRa Antenna

Anschließen am Arduino

Das RFM95W-Modul besitzt eine SPI-Schnittstelle, die entsprechend der folgenden Tabelle an den Arduino angeschlossen wird. Wichtig ist noch, dass das Modul mit 3,3V und nicht mit 5V betrieben wird!

RFM95W Arduino RFM95W Arduino
ANT GND
GND GND DIO5
DIO3 RESET 5
DIO4 NSS 10
3.3V 3.3V SCK 13
DIO0 2 MOSI 11
DIO1 3 MISO 12
DIO2 GND

Programmierung

Für die folgenden Sketches wird die Library arduino-LoRa verwendet, die die Benutzung des RFM95W-Moduls recht einfach macht.

Installation der Library arduino-LoRa
Abb.: Installation der Library arduino-LoRa über den Bibliotheks-Manager der Arduino-IDE

Der Befehl LoRa.begin(866E6) wird mit der in Europa üblichen Frequenz initialisiert. Es kann auch alternativ 433E6 für Asien bzw. 915E6 für Nordamerika verwendet werden, je nach verwendeter Frequenz des RFM95W-Moduls. (auf der Unterseite der Platine ersichtlich)

Damit die beiden LoRa-Module nicht durch andere Module in der Nähe gestört werden bzw. Daten zum falschen Modul hin übertragen werden, gibt es die Möglichkeit ein sog. sync word mit LoRa.setSyncWord(x); zu setzen. Der Wert des Parameters x kann zwischen 0-0xFF frei gewählt werden. Sendet ein anderes Modul eine anderes sync word, so ignoriert der Empfänger diese Nachricht.

Sketch für Sender

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

#define PIN_NSS   10
#define PIN_RESET  5
#define PIN_DIO0   2

void setup()
{
  Serial.begin(9600);
  Serial.print("LoRa sender init...");

  LoRa.setPins(PIN_NSS, PIN_RESET, PIN_DIO0);

  while (!LoRa.begin(866E6)) {
    Serial.print(".");
    delay(500);
  }

  LoRa.setSyncWord(0xC6);
  Serial.println("[OK]");
}

void loop()
{
  static unsigned long myTime;

  myTime = millis();
  Serial.print("Sending packet...");

  LoRa.beginPacket();
  LoRa.print("millis=");
  LoRa.print(myTime);
  LoRa.endPacket();
  Serial.println("[OK]");

  delay(10000);
}

Sketch für Empfänger

Diese Sketch empfängt die übertragene Nachricht und stellt sie auf der seriellen Konsole dar. Zusätzlich wird auch noch die Empfangsfeldstärke RSSI (Received Signal Strength Indicator) ausgegeben.

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

#define PIN_NSS   10
#define PIN_RESET  5
#define PIN_DIO0   2

void setup()
{
  Serial.begin(9600);
  Serial.print("LoRa receiver init...");

  LoRa.setPins(PIN_NSS, PIN_RESET, PIN_DIO0);

  while (!LoRa.begin(866E6)) {
    Serial.print(".");
    delay(500);
  }

  LoRa.setSyncWord(0xC6);
  Serial.println("[OK]");
}

void loop()
{
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    Serial.print("Received packet: ");

    while (LoRa.available()) {
      Serial.print(LoRa.readString());
    }

    Serial.println(" (RSSI = " + String(LoRa.packetRssi()) + ")");
  }
}
Ausgabe auf der seriellen Konsole
Abb.: Ausgabe der per LoRa empfangenen Daten auf der seriellen Konsole der Arduino-IDE.
zurück