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.
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.
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.
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
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 | – |
Für die folgenden Sketches wird die Library arduino-LoRa verwendet, die die Benutzung des RFM95W-Moduls recht einfach macht.
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.
#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);
}
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()) + ")");
}
}
zurück