Raspberry Pi Pico: Daten an das TTN-LoRaWAN mit LoRa-Modul RAK4200 senden

LoRa (Long Range) in ist ein offener Funkstandard für ein Low Power Wide Area Network (LPWAN) zur Übertragung kleiner Datenmengen und mit hoher Reichweite. Ein Funknetzwerk mit LoRA nennt man dann LoRaWAN.
Um ein LoRaWAN nutzen zu können benötigt man ein LoRa-Modul zum Senden und Empfangen, das zum Beispiel mit dem Raspberry Pi Pico gesteuert wird.
Das RAK4200 Breakout Board von RAK Wireless ist ein LoRa-Modul, das mit dem Raspberry Pi Pico mit nur 4 Verbindungskabeln verbunden werden kann.

Mit dem Raspberry Pi Pico wollen wir das LoRa-Modul RAK4200 über die UART-Schnittstelle mit AT-Kommandos steuern, um Daten an das LoRaWAN von The Things Network (TTN) zu senden.

The Things Network (TTN) kann nach einer Registrierung kostenlos genutzt werden. Wenn Du noch keine Erfahrung mit LoRa und TTN hast, empfiehlt es sich, Dich über LoRa und TTN zu informieren.

Wenn Du noch keine Erfahrung mit dem RAK4200 Breakout Board hast, empfiehlt es sich, zuerst die UART-Verbindung mit dem Pico zu testen.

Aufbau und Bauteile

Raspberry Pi Pico: Daten an das TTN-LoRaWAN mit LoRa-Modul RAK4200 senden

Für die Verbindung vom Raspberry Pi Pico zum RAK4200 Breakout Board werden nur 4 Leitungen benötigt. Zwei Leitungen für die Stromversorgung und zwei weitere für die UART-Schnittstelle.

Raspberry Pi Pico RAK4200
3V3 Pin 36 3V3
GND Pin 38 GND
GPIO0 UART0 TX Pin 1 RX2 (UART)
GPIO1 UART0 RX Pin 2 TX2 (UART)

Hinweis: In der Dokumentation des RAK4200 Breakout Boards wird empfohlen die RX2/TX2-Pins für die Verbindung zu einem Mikrocontroller zu verwenden.

Voraussetzungen für die TTN-Nutzung

Die sinnvolle Nutzung des folgenden Aufbaus und Programmcode setzt voraus, dass man sich in der Nähe eines TTN-Gateways befindet, dass man einen TTN-Account hat, sowie das RAK4200 Breakout Board als Endgerät in diesem TTN-Account registriert ist.

  1. TTN-Gateway in der Nähe?
  2. TTN-Account erstellen
  3. Application und RAK4200 registrieren

Bei der Registrierung des RAK4200-Moduls sind Geräte-spezifische Angaben zu machen. Bei einigen Angaben ist es sinnvoll diese generieren zu lassen.

Aktivierungsmethode OTAA (empfohlen) ABP
Frequenzbereich EU868 / SF9
LoRaWAN-Version 1.0.2 / RP001 Regional Parameters 1.0.2 revision B
Endgeräte-Klasse A
JoinEUI 0000000000000001
DevEUI Ist auf dem LoRa-Modul aufgedruckt.
AppEUI 0000000000000001
AppKey Generieren lassen.
Device address Generieren lassen.
AppSKey Generieren lassen.
NwkSKey Generieren lassen.

Einige dieser Angaben werden später im Programmcode verwendet. In der Regel lassen sich diese bei Bedarf aus der TTN-Verwaltungsoberfläche ablesen oder herauskopieren.

Programmcode für das OTAA-Verfahren

Der folgende Programmcode dient dazu, über eine UART-Verbindung das RAK4200 Breakout Board zu steuern. Die Steuerung besteht darin, das RAK4200 Breakout Board für das LoRaWAN des The Things Network (TTN) zu konfigurieren. Für das OTAA-Verfahren müssen folgende Parameter aus der TTN-Console ermittelt werden:

  • Device EUI (DEVEUI)
  • Application EUI (APPEUI)
  • Application Key (APPKEY)

Für das Senden der AT-Kommandos und Empfangen der Rückmeldung dient eine Funktion. Im Programm wird die Rückmeldung direkt auf der Kommandozeile ausgegeben.

Im folgenden Programmcode wird zuerst das LoRa-Modul konfiguriert. Durch einen Neustart wird die Konfiguration gespeichert und wird dann automatisch verwendet. Dieser Vorgang muss also nur einmal erfolgen, sofern alle Konfigurationsparameter korrekt sind.

Zum Senden von Daten sind nur noch das Join-AT- und das Send-AT-Kommando notwendig. Das zu sendende Datenformat ist die hexadezimale Schreibweise.

# Bibliotheken laden
from machine import UART
import time

# TTN: Parameter für OTAA
dev_eui = 'xxxxxxxxxxxxxxxx'
app_eui = '0000000000000001'
app_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

# Payload: Daten in hexadezimaler Schreibweise
payload = '01234567890ABCDEF'

# Initialisierung: UART
# UART 0, TX=GPIO0 (Pin 1), RX=GPIO1 (Pin 2)
# UART 1, TX=GPIO4 (Pin 6), RX=GPIO5 (Pin 7)
uart = UART(0, 115200, rxbuf=2048)

# Funktion: AT-Kommando senden und Rückmeldung empfangen
def sendCmdAT (at_cmd, wait=1):
    char = ''
    dataString = ''
    uart.write(at_cmd + '\r\n')
    time.sleep(wait) # Warten nach dem Senden des AT-Kommandos
    while char is not None:
        char = uart.read(1)
        try: dataString += char.decode()
        except: pass
    if dataString == '': return 'Keine Rückmeldung. Bitte TX und RX prüfen.'
    return dataString

###
### Konfiguration: TTN mit OTAA für RAK4200
###

print('LoRa-Modus: OTAA')
print(sendCmdAT('at+set_config=lora:join_mode:0'))

print('Endgeräte-Klasse: A')
print(sendCmdAT('at+set_config=lora:class:0'))

print('Empfangsbestätigung: ja')
print(sendCmdAT('at+set_config=lora:confirm:1'))

print('Region/Frequenzbereich: EU868')
print(sendCmdAT('at+set_config=lora:region:EU868'))

print('Device EUI (dev_eui)')
print(sendCmdAT('at+set_config=lora:dev_eui:' + dev_eui))

print('Application EUI (app_eui)')
print(sendCmdAT('at+set_config=lora:app_eui:' + app_eui))

print('Application Key (app_key)')
print(sendCmdAT('at+set_config=lora:app_key:' + app_key))

print('Speichern und Neustarten')
print(sendCmdAT('at+set_config=device:restart', 9))

print('LoRa-Konfiguration anzeigen')
print(sendCmdAT('at+get_config=lora:status'))

###
### Daten senden: JOIN + SEND
###

print('TTN beitreten (OTAA-JOIN)')
print(sendCmdAT('at+join', 9))

print('Daten senden')
print(sendCmdAT('at+send=lora:1:' + payload, 9))

OTAA-Join und Datenempfang prüfen

Nach etwa 5 bis 6 Sekunden ist der Beitritt (Join) des LoRa-Endgeräts an einem LoRa-Gateway erfolgreich abgeschlossen. Das Ergebnis auf der Kommandozeile sollte „OK Join Success“ sein.
In der TTN-Console wird ein erfolgreicher Beitritt verzeichnet (Live Data). Ein NICHT erfolgreicher Betritt erscheint dort ebenfalls, wenn sich das LoRa-Modul in Reichweite zu einem TTN-Gateway befindet.
Wenn nicht, dann wird auf der Kommandozeile ein Fehlercode ausgeworfen. Die meisten Fehlerbeschreibungen zu diesen Fehlercodes sind ziemlich eindeutig. Eine Ausnahme ist der Fehler „ERROR: 99“. Die Fehlerbeschreibung dazu ist „Failed to join into a LoRa network.“ Die Frage ist, was hier jetzt zu tun ist?

Sollte der Beitritt fehlschlagen, dann sind folgende Punkte zu prüfen:

  • Wenn in der TTN-Console kein Join-Versuch verzeichnet ist, dann muss geprüft werden, ob sich ein TTN-Gateway in Reichweite zum LoRa-Endgerät befindet.
  • Desweiteren ist ein Betritt nur dann erfolgreich, wenn die OTAA-Parameter (DEVEUI, APPEUI, and APPKEY) korrekt sind.

Wenn das alles OK, dann helfen vielleicht noch folgende Ideen:

  • Man kann versuchen die Position des LoRa-Moduls zu optimieren, um bessere Sende- und Empfangsbedingungen zu bekommen.
  • Denkbar ist es, es einfach zu einem späteren Zeitpunkt noch einmal zu versuchen.

Programmcode für das ABP-Verfahren

Der folgende Programmcode dient dazu, über eine UART-Verbindung das RAK4200 Breakout Board zu steuern. Die Steuerung besteht darin, das RAK4200 Breakout Board für das LoRaWAN des The Things Network (TTN) zu konfigurieren. Für das ABP-Verfahren müssen folgende Parameter aus der TTN-Console ermittelt werden:

  • Device Address (DEVADDR)
  • Application Session Key (APPSKEY)
  • Network Session Key (NWKSKEY)

Für das Senden der AT-Kommandos und Empfangen der Rückmeldung dient eine Funktion. Im Programm wird die Rückmeldung direkt auf der Kommandozeile ausgegeben.

Im folgenden Programmcode wird zuerst das LoRa-Modul konfiguriert. Durch einen Neustart wird die Konfiguration gespeichert und wird dann automatisch verwendet. Dieser Vorgang muss also nur einmal erfolgen, sofern alle Konfigurationsparameter korrekt sind.

Zum Senden von Daten sind nur noch das Join-AT- und das Send-AT-Kommando notwendig. Das zu sendende Datenformat ist die hexadezimale Schreibweise.

# Bibliotheken laden
from machine import UART
import time

# TTN: Parameter für ABP
dev_addr = 'xxxxxxxx'
nwks_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
apps_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

# Payload: Daten in hexadezimaler Schreibweise
payload = '0123456789ABCDEF'

# Initialisierung: UART
# UART 0, TX=GPIO0 (Pin 1), RX=GPIO1 (Pin 2)
# UART 1, TX=GPIO4 (Pin 6), RX=GPIO5 (Pin 7)
uart = UART(0, 115200, rxbuf=2048)

# Funktion: AT-Kommando senden und Rückmeldung empfangen
def sendCmdAT (at_cmd, wait=1):
    char = ''
    dataString = ''
    uart.write(at_cmd + '\r\n')
    time.sleep(wait) # Warten nach dem Senden des AT-Kommandos
    while char is not None:
        char = uart.read(1)
        try: dataString += char.decode()
        except: pass
    if dataString == '': return 'Keine Rückmeldung. Bitte TX und RX prüfen.'
    return dataString

###
### Konfiguration: TTN mit ABP für RAK4200
###

print('LoRa-Modus: ABP')
print(sendCmdAT('at+set_config=lora:join_mode:1'))

print('Endgeräte-Klasse: A')
print(sendCmdAT('at+set_config=lora:class:0'))

print('Empfangsbestätigung: ja')
print(sendCmdAT('at+set_config=lora:confirm:1'))

print('Region/Frequenzbereich: EU868')
print(sendCmdAT('at+set_config=lora:region:EU868'))

print('Device Address (dev_addr)')
print(sendCmdAT('at+set_config=lora:dev_addr:' + dev_addr))

print('Network Session Key (nwks_key)')
print(sendCmdAT('at+set_config=lora:nwks_key:' + nwks_key))

print('Application Key (apps_key)')
print(sendCmdAT('at+set_config=lora:apps_key:' + apps_key))

print('Speichern und Neustarten')
print(sendCmdAT('at+set_config=device:restart', 9))

print('LoRa-Konfiguration anzeigen')
print(sendCmdAT('at+get_config=lora:status'))

###
### Daten senden: JOIN + SEND
###

print('TTN beitreten (ABP-JOIN)')
print(sendCmdAT('at+join', 9))

print('Daten senden')
print(sendCmdAT('at+send=lora:2:' + payload, 9))

ABP-Join und Datenempfang prüfen

Die Daten werden über ein TTN-Gateway an einen TTN-Server gesendet. In der TTN-Console kann man prüfen, ob die Daten eingegangen sind (Live Data).

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren