1 LoRIS (LoRaWAN) von ELV

LoRIS-Base Experimentierplattform für LoRaWAN unter Linux betreiben LoRIS-BM-TRX1

H. Högl, Februar 2022

1.1 Kompilieren des Beispielprogrammes

  1. STM CubeIDE herunterladen und installieren. Zum Download von der ST Seite braucht man einen Login, deshalb habe ich die Sachen mal unter [2] zum schnellen Zugriff abgespeichert. Am besten nicht weitersagen, vermutlich könnte STMicro da was dagegen haben ;-) Es liegen auch noch einige einschlägige PDF Dokumente zur Nutzung der IDE dort, die muss man aber nicht unbedingt anschauen.


  2. Von [1] im Reiter „Downloads“ das ZIP Archiv „LoRIS-Base Code-Template“ herunterladen und entpacken. Die Datei heisst 156514_loris_base_customer_template_211214.zip, nach dem Entpacken heisst der neu angelegte Ordner 156514_loris_base_customer_template_211214.


  3. Den Projektordner mit CubeIDE kompilieren:

    • Im Menüpunkt File Open Projects from File System auswählen. Ordner anklicken, dann Finish.

    • Im Project Explorer auf der linken Seite sieht man dann den Projektbaum.

    • Rechsklick auf LoRIS-Base-Template, Auswahl Build Project. Danach wird das Projekt in der IDE gebaut.

      Das kompilierte Programm ist im Ordner Debug zu finden.

    Hier ist ein Screenshot.


  4. Nachdem das Projekt einmal mit der CubeIDE gebaut wurde, kann man es auch mit dem make Kommando auf der Kommandozeile kompilieren:

    cd Debug
    make clean
    make main-build
    

    Nachtrag: Man muss dazu den GNU Compiler für ARM installiert haben. Den gibt es zum Download unter [5] für alle gängigen Betriebssysteme.

    Der GNU Compiler ist auch in der CubeIDE enthalten, jedoch muss man ihn dort erst einmal finden. Unter Linux ist er im CubeIDE Installationsverzeichnis unter stm32cubeide_1.8.0/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.linux64_2.0.0.202105311346/tools/bin/. Nun muss man nur noch die PATH Umgebungsvariable um diesen Pfad erweitern, dann sollte auch das funktionieren. Zum Test gibt man which arm-none-eabi-gcc auf der Kommandozeile ein, ausgegeben werden sollte der absolute Pfad des Compilers.


  5. Programm auf das LoRIS Board flashen

    • Für Windows-Leute: Von [1] im Reiter „Downloads“ das Flasher Tool herunterladen, evtl. noch den Treiber. Im ZIP Archiv des Flasher Tools ist eine Anleitung wie es gemacht wird.

    • Für Linux-Leute: Das Flasher Tool von ELV gibt es leider nicht für Linux. Alternativ funktioniert aber auch der „STMCubeProgrammer“. Den habe ich zum Download unter [2] abgelegt.


    Man kann am LoRIS Board auch einen professionellen Debug-Adapter wie den STLINK v3 [3] oder den STLINK v3 Mini [4] anstecken, so dass man ein Programm in der CubeIDE beim Ablauf untersuchen kann. Der STLINK v3 Mini kostet z.B. bei mouser.de nur etwa 9 Euro.

    lora/stlinkv3mini.jpg

Links

[1] https://de.elv.com/loris-base-funk-basismodul-1-loris-bm-trx1-156514

[2] http://hhoegl.informatik.hs-augsburg.de/st

[3] https://www.st.com/en/development-tools/stlink-v3set.html

[4] https://www.st.com/en/development-tools/stlink-v3mini.html

[5] https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm

1.2 Besonderheit der seriellen Schnittstelle

Auf dem LoRIS-Base Board ist ein CP2102N USB-zu-Seriell Wandler, der auf eine USB Typ-C Buchse gelegt ist. Linux geht davon aus, dass die Vendor- und Product-ID bei diesem Baustein 10c4 und ea60 ist. Eine kleine Hürde entsteht nun dadurch, dass die Herstellerfirma ELV den Baustein mit einer eigenen Vendor- und Product-ID versehen hat (18ef:e02e). Dadurch erkennt Linux den Baustein nicht mehr. Wenn man das lsusb Kommando bei angestecktem LoRIS Board eingibt, dann erhält man z.B.:

Bus 001 Device 012: ID 18ef:e02e ELV LoRIS-BM-TRX1

Der benötigte Treiber für den CP2102 wird nicht geladen.

Bei einem „unbehandelten“ CP2102 würde man hingegen die Ausgabe erhalten

Bus 001 Device 006: ID 10c4:ea60 Silicon Labs CP210x UART Bridge

Durch Ausführen der folgenden Kommandos kann man das Problem umgehen:

modprobe usbserial
modprobe cp210x
echo 18ef e02e > /sys/bus/usb-serial/drivers/cp210x/new_id

Dadurch werden bis zum nächsten Reboot die neuen IDs mit dem richtigen Treiber verknüpft. Man kann die drei Zeilen z.B. in ein Shellskript fix_cp2102.sh schreiben und mit sudo bash fix_cp2102.sh ausführen.

Wer die Sache dauerhaft einstellen will, kann folgende udev Regeln in /etc/udev/rules.d/ aufnehmen:

# CP2102N auf dem LoRIS Base Modul
ACTION=="add", ATTRS{idVendor}=="18ef", ATTRS{idProduct}=="e02e", RUN+="/sbin/modprobe cp210x" RUN+="/bin/sh -c 'echo 18ef e02e > /sys/bus/usb-serial/drivers/cp210x/new_id'"


SUBSYSTEM=="tty", ATTRS{idVendor}=="18ef", ATTRS{idProduct}=="e02e", MODE="0666", SYMLINK+="lorisbase"

1.3 Cube Programmer

ELV hat nur für Windows einen eigenen Flash Programmer für das LoRIS Board zur Verfügung gestellt. Für Linux kann man auch den gewöhnlichen ST Cube Programmer verwenden, siehe

https://www.st.com/en/development-tools/stm32cubeprog.html

Allerdings muss man vorher die serielle Schnittstelle zum Laufen bringen (siehe vorherigen Abschnitt). Über die USB-zu-Seriell Schnittstelle spricht der Programmer das LoRIS Board an.

Die vorgegebene Hex Datei, in der das ausführbare Programm enthalten ist, kann dann sofort auf das Board geflasht werden.

lora/stm32-cube-programmer2.png

Programmiervorgang ist abgeschlossen.

1.4 Strommessung

Wenn das LoRIS-Base Board über USB versorgt wird, dann zieht es mindestens 12 mA Strom, selbst wenn das dnt LoRa-Modul im Stromsparmodus mit wenigen μA ist. Wenn man das ganze an einer USB Power-Bank betreibt, z.B. mit 5 Ah Kapazität, dann reicht die Ladung für etwa zwei Wochen, wenn man nur sparsam Datenpakete schickt.

Man kann das Board aber auch über den +VDD Anschluss mit ca. 3,3V versorgen (bei abgestecktem USB), dann wird der USB-Teil der Schaltung nicht versorgt, sondern nur das Funkmodul. Nachdem der Join-Vorgang erfolgt ist, legt sich das Funkmodul schlafen und benötigt dann nur noch ca. 2 μA Strom. Bei dem Beispiel mit der Power-Bank würde das zumindest theoretisch eine Laufzeit von vielen Jahren bedeuten.

Das folgende Bild zeigt eine einfache Schaltung zum Messen von Strömen im mA-Bereich, mit der der verbrauchte Strom als Spannungsverlauf über der Zeit auf einem Oszilloskop visualisiert werden kann.

Zum Vergrössern auf die Bilder klicken.

lora/Strommessung-Aufbau.jpg

Selbstgebaute Strommessung mit einem INA139 Strom-zu-Spannungs Konverter

Stromverbrauch beim Join Vorgang nach dem Anstecken der Versorgungsspannung oder einem Reset des Boards.

lora/Messung-2.jpg

Join Vorgang

Stromverbrauch einer Datenübertragung durch Drücken einer der beiden Tasten.

lora/Messung-1a.jpg

Datenpaket senden

Wer zum Stromverbrauch beim STM32WL mehr erfahren möchte, sollte sich den Video von Orkhan AmirAslan ansehen, Deep dive into the Generic Node hardware features, The Things Industries, February 2021. Auf dem Generic Node wird zwar ein STM32WL55 (dual-core) verwendet, auf dem LoRIS Board hingegen ein STM32WLE44 (single-core). Die Messwerte sind aber bei beiden vergleichbar. https://www.youtube.com/watch?v=Fxv1l75Ge1c

1.5 Das Beispiel-Template

Die von ELV zur Verfügung gestellte Beispielanwendung erlaubt es, zwei Tasten und eine LED an den LoRIS-Base anzuschliessen. Ein Tastendruck auf einen der beiden Tasten führt zum Senden eines LoRaWAN Datenpakets. Über eine Downlink kann man die LED ein- und ausschalten. Da es sich um eine „Class-A“ Anwendung handelt, muss zum Übertragen des Downlinks vorher immer erst ein Uplink vom Gerät zum Gateway geschickt werden, d.h. ein Tastendruck muss vorher erfolgen.

Zum Testen der Beispielanwendung muss das LoRIS Board in der TTN Konsole konfiguriert worden sein, das bedeutet, dass folgende Teile existieren:

  • Application

  • End-Device

  • Payload-Formatter für den Uplink (bei ELV zum Download)

  • Eine Webhook-Integration, wenn man den Downlink über HTTP zum Netzwerkserver übertragen möchte. Die weiter unten aufgeführten Methoden curl-xxx.sh und downlink.py benötigen das.

Der Code ist unter https://hhoegl.informatik.hs-augsburg.de/pub/lora/updown/

Bei allen Programmbeispielen und Kommandozeilen muss man natürlich seine eigenen Werte für die verschiedenen IDs eingeben!

  • client.py | MQTT Client, der beim TTN Netzwerkserver die Tastendruck-Ereignisse abonniert hat. Er findet heraus, welcher Taster gedrückt wurde und schickt eine Nachricht an den Signal-Messenger unter meiner Nummer. Das Verschicken der Nachricht geht mit einem simplen Kommandozeilenaufruf, der aus Python abgeschickt wird:

    def signal_message(msg):
        s = f'signal-cli -u +4916091044545 send -m "{msg}" +4916094870498'
        os.system(s)
    

    Der Aufruf erfolgt dann z.B. mit signal_message("Rote Taste gedrückt").

    Damit das klappt muss das signal-cli Programm installiert und eingerichtet sein. Wie man das macht erfährt man auf der zugehörigen Projektseite:

    https://github.com/AsamK/signal-cli

    Man braucht unbedingt ein zweites Mobiltelefon, unter dessen Nummer man sich bei Signal registriert. Damit wird dann der Absender mit der -u Option festgelegt. Die zweite Nummer im obigen Kommando ist die „Zieladresse“. Das Telefon zum Registrieren muss kein Smartphone sein, es reicht ein altes reines Sprachtelefon mit SIM-Karte, die Registrierung erfolgt entweder über einen Sprachautomaten oder über ein SMS-Nachricht. Nach der Registrierung kann man das Telefon wieder für die nächsten 10 Jahre in die Schublade legen.

Den Downlink kann man über verschiedene Wege veranlassen, die alle zum Ziel führen:

  • Auf der TTN Console auf das Device gehen und nacheinander die Reiter Messaging und Downlink anklicken. Dort findet man dann Eingabefelder für die Portnummer (FPort) und die Datenbytes für den Download.

  • curl-on.sh, curl-off.sh, curl-clear.sh | HTTP Downlink mit curl über eine Webhook Integration („loriswh“)

  • downlink.py | Downlink über HTTP Webhook, dieses mal aber nicht mit curl, sondern mit dem Python „requests“ Modul programmiert.

  • Über das ttn-lw-cli Kommandozeilenprogramm.

    Typische Kommandos, die den Downlink betreffen, sind:

    $ ttn-lw-cli login  # Browserfenster oeffnet sich zum Login
    $ ttn-lw-cli end-devices downlink push lopy-class-c eui-70b3d5499c804184 --frm-payload 0103 --priority NORMAL --f-port 10
    $ ttn-lw-cli end-devices downlink list lopy-class-c eui-70b3d5499c804184
    $ $ ttn-lw-cli end-devices downlink list lopy-class-c eui-70b3d5499c804184
    $ ttn-lw-cli end-devices downlink clear lopy-class-c eui-70b3d5499c804184
    

    Nähere Informationen dazu findet man unter https://www.thethingsindustries.com/docs/devices/downlink-queue-ops.