Raspberry Pi Pico: Daten an das TTN-LoRaWAN mit LoRa-Modul RAK3272S 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.
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 RAK3272S Breakout Board von RAK Wireless ist ein LoRa-Modul. Das Board kann auf ein Steckbrett gesteckt und mit nur 4 Verbindungskabeln mit dem Pico verbunden werden.

Mit dem Raspberry Pi Pico wollen wir das LoRa-Modul RAK3272S ü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 RAK3272S Breakout Board hast, empfiehlt sich, zuerst die UART-Verbindung mit dem Pico zu testen.

Aufbau und Bauteile

Raspberry Pi Pico: RAK3272S Breakout Board verbinden und testen

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

Hinweis: Die Belegung des 3V3-Pins auf dem RAK3272S Breakout Board unterscheidet sich zwischen der Hardware-Version B und C. Der hier dargestellt Aufbau ist für die Hardware-Version C. Die Hardware-Version ist auf der Platine aufgedruckt.

Raspberry Pi Pico RAK3272S
3V3 Pin 36 3V3
GND Pin 33 GND
GPIO0 UART0 TX Pin 1 UART2_RX
GPIO1 UART0 RX Pin 2 UART2_TX

Voraussetzungen für die TTN-Nutzung

Die sinnvolle Nutzung des folgenden Aufbaus und Programmcodes setzt voraus, dass man sich in der Nähe eines TTN-Gateways befindet, dass man einen TTN-Account hat, sowie das RAK3272S 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 RAK3272S registrieren

Bei der Registrierung des RAK3272S-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.3 / RP001 Regional Parameters 1.0.3 revision A
Endgeräte-Klasse A
JoinEUI 0000000000000000
DevEUI Ist auf dem LoRa-Modul aufgedruckt.
AppEUI 0000000000000000
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 (bis RAK3272S-Firmware-Version 1.0.4)

Der folgende Programmcode dient dazu, über eine UART-Verbindung das RAK3272S Breakout Board zu steuern. Hierbei ist zu beachten, dass es RAK3272S-Module gibt, deren UART2-Schnittstelle mit 9600 Bit/s und welche mit 115200 kBit/s arbeiten.
Die Steuerung besteht darin, das RAK3272S 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. Diese Konfiguration wird automatisch gespeichert und bleibt beim Verlust der Stromversorgung erhalten. Sie muss also nur einmal ausgeführt werden, sofern alle Konfigurationsparameter korrekt sind.

Zum Senden von Daten sind das Join-AT- und das Send-AT-Kommando auszuführen. Der zu sendende Payload (Daten) ist die hexadezimale Darstellung. Hier wird beispielhaft die Zeichenfolge „0123456789ABCDEF“ verwendet.

# Bibliotheken laden
from machine import UART
import time

# LoRaWAN/TTN-Konfiguration für OTAA
DEVEUI = 'xxxxxxxxxxxxxxxx'
APPEUI = '0000000000000000'
APPKEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

# 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, 9600, rxbuf=2048)
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 RAK3272S
###

print('Typ: LoRaWAN')
print(sendCmdAT('AT+NWM=1'))

print('Endgeräte-Klasse: A')
print(sendCmdAT('AT+CLASS=A'))

print('Sendebestätigung: Ja')
print(sendCmdAT('AT+CFM=1'))

print('Aktivierung: OTAA')
print(sendCmdAT('AT+NJM=1'))

print('Region/Frequenzbereich: EU868')
print(sendCmdAT('AT+BAND=4'))

print('Device EUI (DEVEUI)')
print(sendCmdAT('AT+DEVEUI=' + DEVEUI))

print('Application EUI (APPEUI)')
print(sendCmdAT('AT+APPEUI=' + APPEUI))

print('Application Key (APPKEY)')
print(sendCmdAT('AT+APPKEY=' + APPKEY))

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

print('Test: AT')
print(sendCmdAT('AT'))

print('OTAA: TTN beitreten (Join)')
print(sendCmdAT('AT+JOIN=1:0:10:8', 10))

print('Daten senden')
print(sendCmdAT('AT+SEND=2:' + payload, 10))

Ob der Beitritt (Join) und das Senden der Daten erfolgreich waren, kann man in der Kommandozeile und in der TTN-Console unter Live Data prüfen.

OTAA-Join 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 „+EVT:JOINED“ sein. In der TTN-Console wird ein erfolgreicher Beitritt verzeichnet (Live Data). Ein NICHT erfolgreicher Betritt erscheint dort ebenfalls.

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.

Datenempfang prüfen

Nach dem Join-AT-Kommando werden die Daten gesendet. Der erfolgreiche Versand wird mit „+EVT:SEND CONFIRMED OK“ bestätigt.
Den Datenempfang kann man auch in der TTN-Console prüfen (Live Data).

Programmcode für das ABP-Verfahren (bis RAK3272S-Firmware-Version 1.0.4)

Der folgende Programmcode dient dazu, über eine UART-Verbindung das RAK3272S Breakout Board zu steuern. Die Steuerung besteht darin, das RAK3272S 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 über die UART-Schnittstelle und Empfangen der Rückmeldung vom LoRa-Modul dient eine Funktion. Im Programm wird die Rückmeldung direkt auf der Kommandozeile ausgegeben.

Im folgenden Programmcode wird zuerst das LoRa-Modul konfiguriert. Die Konfiguration wird automatisch gespeichert und muss nur einmal ausgeführt werden, sofern alle Konfigurationsparameter korrekt sind.

Zum Senden von Daten sind das Join-AT- und das Send-AT-Kommando auszuführen. Der zu sendende Payload (Daten) müssen hexadezimal sein.

# Bibliotheken laden
from machine import UART
import time

# LoRaWAN/TTN-Konfiguration für ABP
DEVADDR = 'xxxxxxxx'
NWKSKEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
APPSKEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

# 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, 9600, 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 RAK3272S
###

print('Typ: LoRaWAN')
print(sendCmdAT('AT+NWM=1'))

print('Endgeräte-Klasse: A')
print(sendCmdAT('AT+CLASS=A'))

print('Sendebestätigung: Ja')
print(sendCmdAT('AT+CFM=1'))

print('Aktivierung: ABP')
print(sendCmdAT('AT+NJM=0'))

print('Region/Frequenzbereich: EU868')
print(sendCmdAT('AT+BAND=4'))

print('Device Address (DEVADDR)')
print(sendCmdAT('AT+DEVADDR=' + DEVADDR))

print('Network Session Key (NWKSKEY)')
print(sendCmdAT('AT+NWKSKEY=' +  NWKSKEY))

print('Application Key (APPSKEY)')
print(sendCmdAT('AT+APPSKEY=' + APPSKEY))

###
### Daten senden: SEND
###

print('Test: AT')
print(sendCmdAT('AT'))

print('ABP: TTN beitreten (Join)')
print(sendCmdAT('AT+JOIN=1:0:10:8', 10))

print('Daten senden')
print(sendCmdAT('AT+SEND=2:' + paypload, 10))

Ob das Senden der Daten erfolgreich war, kann man in der Kommandozeile und in der TTN-Console unter Live Data prüfen.

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 dort 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