Neue LoRa-Nodes sind da

Kleiner LoRa-Test mit Arduino Mega und Dragino Shield

Projektart
Prototyp
Datum
10.01.2018
Material
GitHub

Die letzten Tage hatte ich endlich Gelegenheit, mich mal wieder etwas praktischer mit dem Thema LoRaWAN zu beschäftigen. Unsere ersten Gehversuche im freien Internet der Dinge sind schon einige Monate her und in der Zwischenzeit haben wir uns bei der Technologiestiftung eher mit dem Aufbau von Infrastruktur und der Community-Organisation rund um LoRa befasst. Jetzt aber haben wir unsere Hacking Box um zwanzig LoRa-Nodes erweitert, die natürlich auch eingerichtet und getestet werden wollten. Freiwillige vor!

Frisch geschlüpft
Frisch geschlüpft

Die Nodes bestehen aus einem Arduino Mega 2560 und einem LoRa-Shield von Dragino (teils mit, teils ohne GPS). Wir haben sie bei The Things Network (TTN) registriert, mit Device-Adressen versorgt und für jedes der zwanzig Geräte ein eigenes .ino-File angelegt. Damit lassen sie sich nach einem Workshop schnell wieder in ihren Ursprungszustand zurückversetzen. Standardmäßig versenden die Nodes jetzt nach dem Einschalten eine kurze Nachricht mit einer individuellen Kennung. So sieht man 1.) dass sie ordnungsgemäß funktionieren und hat 2.) gleich ein Template, um weitere Anwendungen zu entwickeln.

Die Dragino-Shields vertragen sich übrigens nicht mit der offiziellen TTN-Arduino-Library. Macht aber nichts, da mit Arduino-LMIC eine prima Alternative existiert. Auf GitHub findet sich ein passendes Hello World-Programm. Hier trägt man seine TTN-Keys ein, spielt das .ino auf den Arduino und schon sind wir auf Sendung:

What, what?
What, what?

Um die angekommenen Bytes wieder in lesbaren Text zu verwandeln, müssen wir in der TTN-Konsole eine Decoder-Function anlegen:

function Decoder(bytes, port) {
    var decoded = {};
    decoded.message = String.fromCharCode.apply(null, bytes);
    return decoded;
}

Wer sich über die Syntax wundert: Anders als der Arduino spricht die TTN-Konsole Javascript, wenn auch in etwas rudimentärer Form. Aber für unsere Zwecke reichts:

Now we're talkin
Now we're talkin

Zwei kleine Änderungen haben wir dann doch noch vorgenommen:

1.) Text versenden sollte man über LoRa eigentlich gar nicht – die Übertragungskapazitäten sind limitiert und Text ist hier einfach nicht effizient: Ein einzelner Unicode-Buchstabe braucht bereits stolze 3 Byte. Wenn 20 Geräte gleichzeitig ein „Hello World“ senden, könnten die LoRa-Götter böse werden. Zumindest aber verstopfen wir unnötig den Luftraum. Da wir lediglich für jedes Gerät eine individuelle Kennung senden möchten, sollten wir mit einem Byte pro Gerät locker auskommen (zur Erinnerung: 1 Byte = 8 Bit = 256 mögliche Werte).

2.) Dem Kollegen Christian Hammel, der unser LoRa-Gateway betreibt, ist aufgefallen, dass die HelloWorld.ino standardmäßig mit einem Spreading Factor von 12 sendet, was die Airtime unnötig in die Höhe treibt. Auch hier gilt zunächst: weniger ist mehr. Mit dem niedrigsten Spreading Faktor 7 reduzieren wir die genutzte Airtime von 1155ms auf nur noch 46ms. Nicht dass die Bundesnetzagentur noch einen Funkwagen vorbeischickt :) .

Wir passen also den Arduino-Code ein wenig an: Die Message-Variable ändern wir so, dass nur noch ein Byte mit einer Kennzahl (hier: 42) versendet wird. Der Spreading Faktor wird nach unten geschraubt und zuletzt der Sende-Befehl angepasst.

//static uint8_t message[] = "Hello World";
byte message[] = {42};

//LMIC_setDrTxpow(DR_SF12,14);
LMIC_setDrTxpow(DR_SF7,14);

//LMIC_setTxData2(1, message, sizeof(message)-1, 0);
LMIC_setTxData2(1, message, 1, 0);

Unser einsames kleines Byte übersetzen wir erneut via Decoder-Funktion zurück in die ursprüngliche versendete ID. Voilà – schlanker geht’s nicht mehr:

Kein Byte wird verschenkt
Kein Byte wird verschenkt

Unser angepasstes .ino liegt auf GitHub. Wenn ihr Lust habt, die LoRa-Nodes für Bildungszwecke auszuleihen, geht es hier entlang zur Hacking Box.