Table of Contents

Zigbee Netzwerke mit Arduino

Auf diesen Seiten möchten wir die aktuellen Erfahrungen und das Wissen zu XBee und ZigBee Netzwerken dokumentieren. Das Dokument wird laufend überarbeitet, sollten Sie Fehler finden oder Anregungen haben, senden Sie bitte eine Email an playground@boxtec.ch.

Einführung

Leider gibt es eine Vielzahl von XBee-Modulen und die Bezeichnungen der unterschiedlichen Module sind teilweise sehr verwirrend. Wir versuchen im folgenden etwas Übersicht in den Bienenstock zu bringen:

XBee Hardware Familien

Es gibt insgesamt 2 XBee Hardware Hauptmodellreihen:


Die Series 1 Modelle wurden zum Teil auch 802.15.4 resp. DigiMesh genannt.

Diese Modelle werden nun wieder weiter unterschieden nach Standard und Pro, d.h. es gibt:


Die Pro Modelle verfügen jeweils über mehr Sendeleistung als die Standard Module verwenden aber grundsätzlich die gleichen Features Jedes Modell gibt es auch wiederum mit verschiedenen Antennen, von On-Board über integriert bis extern.

Daneben gibt es OEM Module die sich ZNet 2.5 nennen, diese Module sind mit den XBee Series 2 Hardware-kompatibel und können auch auf die entsprechende Firmware gehoben werden.

Firmware Versionen

Für die Series 1 existieren verschiedenste Firmware Versionen, die bekanntesten sind dabei die DigiMesh und 802.15.4.
Für die Series 2 existieren die ZNet 2.5 und die ZigBee Firmware Reihen. Die Firmware kann dabei jeweils beliebig von ZNet 2.5 auf ZigBee und wieder zurückgeändert werden.

XBee Modul Konfiguration

Für die weitere Betrachtung konzentrieren wir uns auf die uns zur Verfügung stehenden ZNet 2.5 Modulen mit 1mW Chip Antenne.

Voraussetzungen

Um die Module zu konfigurieren wird ein USB- oder RS232- zu TTL-Wandler benötigt, das kann ein USB-TTL Adapter sein oder aber auch ein Bee-Shield (dabei wird dann der USB-TTL Adapter des Arduino Boards verwendet).
Folgende Produkte haben wir erfolgreich für die Konfiguration der ZNet 2.5 Module eingesetzt:

Am einfachsten und komfortabelsten war die Arbeit jedoch mit dem Foca v2.1.

Konfigurations-Software X-CTU

Einerseits können die Module mit jedem beliebigen Terminal Programm über AT Kommandos konfiguriert werden.
Komfortabler, speziell auch für den Firmware Update ist aber die Konfiguration mit X-CTU dem Konfigurationsprogramm für XBee Module von Digi.

Installation der Software

Windows

Stellen Sie vorab sicher, dass Sie die Treiber für Ihren USB-TTL Adapter installiert haben und dass diese funktionieren.
Laden Sie X-CTU von dieser URL herunter.
Starten Sie die Installation des Programms durch Doppelklick wie gewohnt.

Linux

Die Software X-CTU läuft nach unseren ersten Erfahrungen einwandfrei unter Linux mit der Windows Laufzeitumgebung wine, es ist allerdings ein kleiner Trick nötig um der Software die für die Windows Welt üblichen COM-Ports zur Verfügung zur stellen.

Unter Linux werden diese Geräte z.B. über /dev/ttyUSB0 (für einen USB-TTL Adapter) oder /dev/ttyS0 (für einen RS232-TTL Adapter) angesprochen.
Um diese Geräte zur Verfügung zu stellen, reicht es im .wine Verzeichnis Ihres Benutzers einen symbolischen Link für das Gerät anzulegen, also z.B. für /dev/ttyUSB0 zu COM10:

ln -s /dev/ttyUSB0 ~/.wine/dosdevices/com10

Aktualisieren der Firmware Images von X-CTU

Starten Sie X-CTU und wählen Sie den Reiter Modem Configuration, klicken Sie nun auf Download new versions…. Der Download kann einige Minuten in Anspruch nehmen ist aber durchaus empfehlenswert.

Update Fenster


Sollte der Download scheitern (was unter Linux passiert) kann auch eine ZIP Archiv mit Images eingeladen werden. Am einfachsten man lädt sich das ZNet2.5 to ZB Conversion Kit herunter und extrahiert die Datei xbee_zb.zip (diese Datei nicht auspacken!).

Laden Sie nun die Datei xbee_zb.zip mit der Funktion Download new versions… über File in X-CTU - die aktuellen Firmware Images sollten Ihnen nun ebenfalls zur Verfügung stehen.

Verbinden des ZigBee Moduls

Verbinden Sie Ihr ZigBee Modul über einen USB-Adapter oder Shield mit Ihrem PC.

Starten Sie nun X-CTU welches Sie vorher heruntergeladen haben und wählen Sie den COM-Port unter welchem Ihr USB-Adapter im System bekannt ist, z.B. COM5 etc. [Wenn Sie Linux verwenden sehen Sie weiter oben unter Konfigurations-Software nach wie Sie den COM Port für Linux sichtbar machen].

Die Geschwindigkeit ist bei neuen Modulen auf 9600bps voreingestellt, kann aber jederzeit verändert werden:

X-CTU COM Port Selection


Drücken Sie nun den Button Test / Query. Wenn alles soweit geklappt hat, sollten Sie nach 3-5 Sekunden ein Meldungsfenster wie das folgende sehen:

X-CTU meldet Erfolg bei der Kommunikation mit dem Modul

Wenn dies soweit funktioniert hat, können Sie nun die Konfiguration des Moduls auslesen, verändern und/oder neue Firmware einspielen.

Konfiguration auslesen

Nachdem Sie Ihre Kommunikationseinstellungen erfolgreich geprüft haben können Sie nun die Konfiguration und Firmware Version Ihres Moduls auslesen.

Wechseln Sie dazu nun auf den Reiter Modem Configuration, wählen Sie optional in der Auswahl Modem Ihren Modemtyp - in unserem Fall ein XB24-B - und klicken Sie auf Read:

X-CTU liest Modul Parameter aus

Nach einigen Sekunden sollten Sie die ausgelesene Konfiguration und Firmware Version angezeigt erhalten:

X-CTU zeigt ausgelesene Parameter an


Sie können nun mit der Konfiguration Ihres Moduls beginnen.

Einfache Mesh Konfiguration

Übersicht ZigBee Mesh Netzwerke

Das spannende an den ZigBee Modulen ist, dass die Mesh Netzwerk sich vollkommen automatisch organisieren. Kritiker monieren zwar, dass grössere Netzwerke mit mehr als 100 Modulen mehrere Minuten zum Organisieren benötigen können.

Bei weniger Modulen sinkt diese Zeit aber massiv und kann mit ein paar Sekunden bei weniger als 10 Stk. auch durchaus vernachlässigt werden. Bei grösseren Projekten empfiehlt es sich aber dennoch diese Tatsache im Auge zu behalten - so steht das Netzwerk ev. nach einem Stromausfall erst Minuten später wieder zur Verfügung.

ZigBee Netzwerk Rollen (Functions)

Jedes ZigBee Modul kann eine oder mehrere Rollen im Netzwerk ausüben. Diese Rollen oder Function wie sie in X-CTU genannt werden können entweder Coordinator, Router, End Device resp. Router/End Device sein.

Ein ZigBee Netzwerk besteht in der Regel aus einem Coordinator und einem bis vielen Router resp. End Devices welche alle direkt oder indirekt Verbindung mit dem Coordinator halten.

Der Coordinator ist insofern auch ein SPOF (Single Point of Failure für das gesamte Netzwerk, ist dieser ausgefallen können Teilnehmer nicht mehr kommunizieren. Digi hält zwar Lösungen für Redundanz vor, trotzdem bleibt dies aber eine Schwachstelle des ZigBee Designs. ZigBee Device Konfigurationen

Device Mode Beschreibung
Coordinator Zentral Schaltstelle eines ZigBee Netzwerks, bestimmt z.B. den Kanal und andere Parameter
Router Jedes ZigBee Modul das als Router fungiert stellt einerseits anderen Modulen Verbindung zum Coordinator oder einem anderen Router zur Verfügung und andererseits kann der Router auch ganz normal am Netzwerk teilnehmen also gleichzeitig als End Device arbeiten.
End Device Können nur am Netzwerk teilnehmen, aber nicht anderen Modulen Zugang zum Netzwerk resp. Coordinator vermitteln.

ZigBee Modul Modi (API/AT)

Jede der obenerwähnten Functions oder Rollen gibt es jeweils in zwei Betriebsmodi:

Im AT-Modus können alle an das Modul gesendete Daten transparent bei allen Teilnehmern des Netzwerks wiedergegeben werden. Das kann man sich so in etwa vorstellen wie ein IRC Chatroom bei dem alle jederzeit reden dürfen und alle Nachrichten allen angezeigt werden. Der AT Modus kann aber auch mit Punkt-zu-Punkt resp. Punkt-zu-Mehrpunkt Verbindungen arbeiten.

Im Gegensatz dazu wird im API-Modus das Modul bewusst von der MCU/Software gesteuert, d.h. Datenpakete müssen vom Sender mit einer Zieladresse und Payload versehen werden und dem Modul zum Versand übergeben werden. Dieser Ansatz ist aufwendiger zu handhaben, bietet aber natürlich offensichtliche Vorteile in der Skalierung gegenüber dem Broadcast-ähnlichen AT. Für den Arduino ist eine Library für den API Modus verfügbar.

Wir bauen nun ein kleines ZigBee Mesh Netzwerk mit 3 Knoten auf, wobei einer davon der Coordinator ist und die anderen beiden als Router fungieren.

Wählen der Firmware

Da wir hier mit XBee 2 Modulen arbeiten kommt die ZNet- resp. ZigBee-Firmware Familie als Alternativen in Frage.

Auf jeden Fall sollte auf allen Modulen die gleiche Firmware Familie und auch Firmware Version eingesetzt werden.

Die ZigBee Firmware ist etwas neuer und bietet mehr Funktionalität aber es wird verschiedentlich davon berichtet, dass bessere Resultate mit der ZNet Firmware erzielt wurden.

Wenn Verschlüsselung gewünscht wird, muss entweder die ZNet Firmware verwendet werden, oder aber das Modul auf XB24-ZB upgedatet werden - die dort verfügbare Zigbee Protokoll Version bietet ebenfalls Verschlüsselung.

Da wir ZNet OEM Module zur Verfügung haben, werden wir deren ZNet Firmware nun auf ZigBee upgraden und dabei die einige Einstellungen vornehmen.

Übersicht Hardware XBee Typen und mögliche Firmware Versionen

Model Beschreibung Stack Version Mögliche Firmware Versionen
XB24-BCIT [XB24-B] Auch als ZNet OEM Module bekannt EmberZNet 2.5 XB24-B / XB24-ZB
XB24-Z7
[XB24-ZB]
Dieselbe Hardware wie XB24-B aber bereits mit dem 3.1 Stack ausgerüstet EmberZNet PRO 3.1 XB24-B / XB24-ZB
XBP24-BUIT [XBP24-B] Auch als XBee Pro Znet OEM Module bekannt EmberZnet 2.5 XBP24-B / XBP24-ZB
XBP24-Z7CIT
[XBP24-ZB]
Dieselbe Hardware wie XBP24-B aber bereits mit dem 3.1 Stack ausgerüstet EmberZNet PRO 3.1 XBP24-B / XBP24-ZB

Firmware Upgrade

Stellen Sie sicher, dass Sie Ihr Modul wie unter Konfiguration auslesen beschrieben ansprechen können und lesen Sie entsprechend die Konfiguration mit Read aus.

Wählen Sie nun unter Function Set die entsprechende Firmware / Funktion (wir verwenden den AT Modus für unser Beispiel, da wir damit schneller zu Resultaten kommen):

Für den Coordinator ZIGBEE COORDINATOR AT
Für Router / End Devices ZIGBEE ROUTER/END DEVICE AT

Anmerkung: Wir spielen hier bewusst die aktuellere ZigBee Firmware (EmberZnet 2.5 [XB24-B]) auf, es kann aber sein, dass Sie in Ihrer Umgebung mit ZNet2.5 oder ZigBee (EmberZnet Pro 3.1) bessere Werte erzielen. Hier ist auch Testen angesagt, wichtig ist nur, dass alle Module die exakt gleiche Firmware aufweisen.

Stellen Sie sicher, dass bei Ihrem Modul je nach Rolle die folgenden Parameter eingestellt wurden bevor Sie die Firmware hochladen:

Coordinator Parameter
ID - PAN ID Die ID Ihres Netzwerks, Sie können auch den Standard verwenden
DH - Destination Address High 00
DL - Destination Address Low FFFF
Optional: Baudrate auf allen Knoten identisch!
Mehr als 57600bps ist wegen der verfügbaren Bandbreit nicht sinnvoll
Router/End Device Parameter
ID - PAN ID Die ID Ihres Netzwerks, die der Coordinator verwendet
DH - Destination Address High 00
DL - Destination Address Low 00
Optional: Baudrate auf allen Knoten identisch!
Mehr als 57600bps ist wegen der verfügbaren Bandbreite nicht sinnvoll

Die Option Always update firmware muss unbedingt gewählt sein bevor Sie die Firmware und Einstellungen mit Klick auf Write auf das Modul übertragen:

Übertragen von Firmware und Einstellungen in X-CTU

Wiederholen Sie diesen Vorgang für alle Module mit den entsprechenden Einstellungen.

Wechseln des Softwarestacks

Gehen Sie dazu vor wie beim Updaten, d.h. stellen Sie sicher, dass Always Update Firmware angeschaltet ist und wechseln Sie zusätzlich den Modem Typ je nach Wunsch von -B auf -ZB oder umgekehrt von -ZB auf -B (um zu ZNet 2.5 zurückzukehren).

Wenn sich die Einstellungsmöglichkeiten zwischen den Firmwaren stark unterscheiden, kann es nötig sein, dass Update-Prozedere mehrmals durchzuführen, da unter Umständen die Einstellungen nicht geschrieben werden können.

ZigBee Modul Test

Es stehen einige Methoden zur Verfügung um die grundsätzliche Konnektivität erstmal zu prüfen bevor weiterentwickelt wird:

Shield Status LEDs

Wenn Sie Shields verwenden, die eine Status Anzeige mit LEDs haben können Sie nun natürlich so Ihre Module testen.

Mehrere USB-Adapter

Wenn Sie über die Möglichkeit verfügen, mehr als ein Modul gleichzeitig über USB-Adapter oder Shields an Ihrem PC zu betreiben können Sie die Funktion Range Test in X-CTU verwenden um die Verbindung zu testen.

Shields und USB-Adapter

Ansonsten können Sie auch Ihr Shield mit dem Modul bestücken und jedes Modul etwas anderes regelmässig senden lassen - diese Daten empfangen Sie dann am Coordinator.

Verbinden Sie dazu das Coordinator Modul via USB-Adapter mit Ihrem PC, verbinden Sie sich mit X-CTU und wählen Sie Terminal.

Laden Sie nun folgenden Sketch auf Ihren mit einem Router Modul und Shield bestückten Arduino oder ein kompatibles Board und passen Sie bei mehreren Modulen auf jedem Board die Variable XBEE_ID an:

#define XBEE_ID 1
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("This is XBEE: ");
  Serial.println(XBEE_ID);
}

Wenn Ihr Shield nicht die Pins D0 und D1 verwendet resp. Sie dies geändert haben, können Sie die SoftwareSerial Library auf diesen Pins verwenden:

#include <SoftwareSerial.h>

#define XBEE_ID 1
#define rxPin 2
#define txPin 3
#define ledPin 13

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()  {
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  mySerial.begin(9600);
}

void loop() {
  mySerial.print("This is XBEE: ");
  mySerial.println(XBEE_ID);
}

An Ihrem PC im Terminal des X-CTU sollten Sie nun die Module senden sehen:

Mesh Konfiguration mit Verschlüsselung

Übersicht Verschlüsselung XBee

Um Verschlüsselung mit Ihren XBee Modulen zu nützen müssen Sie zurzeit die ZNet Firmware Reihe (mit EmberZnet2.5) auf Koordinator und Router/Endgeräten einsetzen. Mit EmberZNet Pro 3.1 steht Verschlüsselung ebenfalls zur Verfügung.

Folgen Sie zuerst der Anleitung Einfache Mesh Konfiguration.

Setzen der Verschlüsselungs-Optionen

Verschlüsselung mit ZNet 2.5

Setzen Sie nun die folgenden zwei Parameter auf allen beteiligten Geräten sowohl dem Koordinator als auch allen Endgeräten/Routern identisch:

Encryption Enable 1
AES Encryption Key <Ihr Hex Key>, z.B. abcdef123456789

Speichern Sie nun die Konfiguration auf Ihren Modulen, Sie sollten nun über das Terminal oder den Range Test Daten verschlüsselt zwischen den Modulen übertragen können.

Verschlüsselung mit ZNet Pro 3.1

Setzen Sie einfach den Parameter Encryption Enable auf allen angeschlossenen Geräten (Koordinator, Router und End Devices). Der Koordinator wählt dann bei jedem Start selber einen zufälligen Schlüssel. Bei Bedarf kann noch ein Netzwerk Schlüssel gesetzt werden, der die Module vor dem Zugriff auf das Netzwerk authentisiert.

Referenzen

Folgende Ressourcen waren bei der Erstellung dieses Dokuments sehr hilfreich: