====== Zigbee Netzwerke mit Arduino ====== Auf diesen Seiten möchten wir die aktuellen Erfahrungen und das Wissen zu [[wp>XBee|XBee]] und [[wpde>ZigBee|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: * XBee Series 1 (802.15.4 / DigiMesh) * XBee Series 2 \\ 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: * XBee Series 1 (802.15.4 / DigiMesh) * XBee Series 1 Pro (802.15.4 / DigiMesh) * XBee Series 2 * XBee Series 2 Pro \\ 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 [[http://shop.boxtec.ch/product_info.php/products_id/40216|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 [[http://shop.boxtec.ch/product_info.php/products_id/40216|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: * [[http://shop.boxtec.ch/product_info.php/products_id/40332|Foca v2.1 : FT232RL Tiny Breakout]] * [[http://shop.boxtec.ch/product_info.php/products_id/40271|UartSBee V3.1]] * [[http://shop.boxtec.ch/product_info.php/products_id/40215|Bees Shield dual]] * [[http://shop.boxtec.ch/product_info.php/products_id/40296|XBee Shield v1.0]] 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 [[http://www.digi.com/support/productdetl.jsp?pid=3140&osvid=0&s=357&tp=5&tp2=0|X-CTU]] dem Konfigurationsprogramm für XBee Module von [[http://www.digi.com|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 [[http://www.digi.com/support/productdetl.jsp?pid=3140&osvid=0&s=357&tp=5&tp2=0|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 [[wpde>Wine|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. {{ :wireless:x-ctu_06.png |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 [[ftp://ftp1.digi.com/support/images/ZNet%202.5%20to%20ZB%20Conversion%20Kit.zip|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|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: {{ :wireless:x-ctu_01.png?350x480 |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: {{ :wireless:x-ctu_03.png?300x150 |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**: {{ :wireless:x-ctu_04.png?350x480 |X-CTU liest Modul Parameter aus}} Nach einigen Sekunden sollten Sie die ausgelesene Konfiguration und Firmware Version angezeigt erhalten: {{ :wireless:x-ctu_05.png?350x480 |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 [[wpde>Single_Point_of_Failure|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: * API * AT 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 [[wpde>Internet_Relay_Chat|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 [[#Referenzen|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 ^ | [[http://shop.boxtec.ch/product_info.php/products_id/40216|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 | | [[http://shop.boxtec.ch/product_info.php/products_id/40272|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|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: {{ :wireless:x-ctu_07.png?350x480 |Ü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 #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|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 | , 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: * [[http://www.dudek.org/blog/180|Xbee Znet and gps]] * [[http://www.digi.com/support/productdetl.jsp?pid=3140&osvid=0&s=357&tp=3|Digi Dokumentation XBee / XBee-PRO ZNet 2.5 Adapters]] * [[http://www.digi.com/support/productdetl.jsp?pid=3262&osvid=62&tp2=0|Digi Dokumentation XBee ZNet 2.5 Module]] * [[http://www.digi.com/technology/rf-articles/wireless-zigbee.jsp|Digi wireless ZigBee]] * [[https://sites.google.com/site/xbeetutorial|XBee Tutorial]] * [[http://www.makingthings.com/documentation/tutorial/xbee-wireless-interface|XBee Wireless Interface]] * [[http://xbee.wikispaces.com/Mesh+with+Xbee|Mesh with XBee]] * [[http://paparazzi.enac.fr/wiki/XBee_configuration|XBee Configuration]] * [[wp>ZigBee_specification]] * [[http://code.google.com/p/xbee-arduino/|Arduino Library for XBees in API Mode]]