====== Funknetzwerke mit nRF24L01+ Modulen ====== [[http://shop.boxtec.ch/advanced_search_result.php?keywords=nRF24L01|nRF24L01 Module]] erfreuen sich zunehmender Popularität vor allem wegen dem geringen Preis und der einfachen Anbindung über [[wpde>Serial_Peripheral_Interface|SPI]] an Mikrokontroller Plattformen. Dieser Artikel soll eine kurze Einführung in die Verwendung der Module und eine Übersicht über die zurzeit vorhandenen Bibliotheken geben. ===== nRF24L01+ Hardware ===== Die Module verwenden zur Kommunikation mit einem Mikrokontroller das SPI Protokoll. ==== Anschlussbelegung nRF24L01+ ==== {{ :wireless:nrf24l01_pins.jpg?600 |Pin Belegung nRF24L01+}} Beachte, dass die nRF24L01+ Module zwar mit 5V Pegeln arbeiten können, aber als Betriebsspannung VCC unbedingt 3.3V erwarten. Für den Anschluss an ein Arduino Board sollte wie folgt verbunden werden, wobei die CE und CSN Pins auch an anderen Pins betrieben werden können, die restlichen jedoch nicht. ^ nRF24L01+ Pin ^ Name ^ Arduino Pin ^ | 1 | GND | GND | | 2 | VCC | 3.3V | | 3 | CE | D9 //(oder anderer)// | | 4 | CSN | D10 //(oder anderer)// | | 5 | SCK | D11 | | 6 | MOSI | D13 | | 7 | MISO | D12 | | 8 | IRQ | n/c | ===== Verfügbare Libraries für nRF24L01+ ===== ==== Libraries für Punkt-zu-Punkt Kommunikation ==== Die [[http://maniacbug.github.com/RF24/|RF24]] von Maniacbug bietet einen schnellen Einstieg für erste Versuche und auch als Basis für robuste Punkt-zu-Punkt Netzwerke. Auch wenn die Library nicht mehr weiterbetreut wird ist sie für erste Schritte der RadioHead Library die sie ersetzt vorzuziehen. Die [[http://www.airspayce.com/mikem/arduino/RadioHead/|RadioHead Packet Radio library for embedded microprocessors]] von AirSpayce ersetzt die RF24 und bietet ein gut organisiertes Schichtensystem mit Treiber Klassen als Abstraktion für die unterstützten Funkmodule und Manager Klassen welche z.B. Routing oder Mesh Dienstleistungen bereitstellen. ==== Libraries für (Mesh-)Netzwerke ==== Die [[https://github.com/maniacbug/RF24Network|RF24Network]] baut auf der RF24 Library auf und bietet ein manuell organisiertes Mesh, welches sehr zuverlässig arbeitet. Da sich das Mesh nicht selbst organisiert ist eine sorgfältige Planung nötig. Auch diese Library wird gleich wie die RF24 nicht mehr weiterentwickelt und wurde durch die RadioHead Library ersetzt. Die [[http://www.airspayce.com/mikem/arduino/RadioHead/|RadioHead Packet Radio library for embedded microprocessors]] von AirSpayce bietet verschiedene Formen von Netzwerken als Manager Klassen an, darunter auch ein selbstorganisierendes Mesh. ===== Erste Schritte mit dem nRF24L01+ ===== ==== Einfache Punkt-zu-Punkt Verbindung zum Test ==== Für einen ersten Verbindungs- und Funktionstest empfehlen wir Dir die RF24 Library von Maniacbug zu installieren und den //**Getting Started**// Sketch aus den Beispielen auf zwei Arduino Boards mit angeschlossenen nRF24L01+ Modulen zu installieren. Wenn Du nun auf einem der beiden Boards im Serial Monitor "T" eingibst sollten sich die beiden Arduino Boards über die Funkverbindung anpingen und so eine erfolgreiche Verbindung testen. Erst wenn dieser Test erfolgreich und zuverlässig läuft solltest Du mit komplexeren Setups weiterfahren. ===== Das erste Mesh Netzwerk ===== Wenn Du mehr als zwei Module und zwei Mikrokontroller Boards hast kannst Du ein selbstorganisierendes Netzwerk (Mesh) aufbauen. Der Vorteil eines Mesh Netzwerks liegt darin, dass nicht jeder Knoten mit jedem anderen Knoten direkt Verbindung aufbauen können muss. Wenn zwei Knoten nicht direkt miteinander kommunizieren können, werden die Nachrichten über dazwischenliegende Knoten weitervermittelt bis sie am Zielknoten ankommen. In folgendem Beispiel erhält ein Server periodisch von zwei Sensor Knoten die interne Temperatur und Spannung des Mikrokontrollers übermittelt. Installiere den Server Sketch auf einem Board und den Sensor Sketch auf min. 2 weiteren Boards. Stelle sicher, dass Du bei jedem Sensor Board eine andere ID verwendest. // Server Sketch // To be done... // Sensor Sketch // To be done... ===== Tuning und Einstellungen ===== Die nRF24L01+ Module verfügen über verschiedene Einstellungsmöglichkeiten wie Senderstärke, Frequenz und Datengeschwindigkeit. So hilft es z.B. oft den Kanal zu wechseln, wenn Probleme mit der Datenübertragung bestehen weil u.U. die verwendete Frequenz schon von anderen Teilnehmern im 2.4GHz Band genutzt/saturiert wird. Ebenso kann ein Reduzieren der Geschwindigkeit die Reichweite erhöhen, zur Verfügung stehen 250kbps, 1Mbps und 2Mbps. Bei nur wenigen Metern Abstand zwischen den Modulen ist es sinnvoll die Sendeleistung zu verringern, dadurch wird die Kommunikation stabiler und der Stromverbrauch geringer. Die Einstellungen bei der RadioHead Library mit der Methode setRF() der NRF24 Treiber Klasse vorgenommen werden: RH_NRF24 radio(9,10); void setup() { radio.init(); radio.setChannel(90); radio.setRF(RH_NRF24::DataRate250kbps, RH_NRF24::TransmitPower0dBm); /* possible values DataRate2Mbps, DataRate1Mbps TransmitPowerm6dBm, TransmitPowerm12dBm, TransmitPowerm18dBm */ } Bei der RF24 Library werden die Einstellungen wie folgt vorgenommen: RF24 radio(2,3); void setup() { radio.begin(); radio.setDataRate(RF24_250KBPS); // possible values RF24_2MBPS, RF24_1MBPS radio.setPALevel(RF24_PA_MIN); // possible values RF24_PA_HIGH, RF24_PA_LOW network.begin(/*channel*/ 90, /*node address*/ this_node); } ===== Tips ===== ==== Ethernet Shields und nRF24L01+ Modul ==== Der SPI Bus kann problemlos von mehreren Slaves genutzt werden, leider hat aber das Arduino Ethernet Shield mit dem Wiz5100 Chip ein Problem damit den Bus wieder freizugeben. Dies stört bei normalen Anwendungen nicht, jedoch wenn ein weiterer Slave wie das nRF24L01+ kommunizieren möchte schon. Ethernet Shields und Module die auf dem ENC28J60 basieren haben dieses Problem nicht. Es ist einfach darauf zu achten, dass der Chip Select (CS) Pin für das nRF24L01+ Module so gewählt wird, dass er nicht mit dem des verwendeten Ethernet Shields kollidiert. ==== Probleme beim Senden ==== Wenn beim Senden Probleme auftreten liegt dies oft an einer instabilen 3.3V Spannungsquelle. Am einfachsten ist natürlich eine separate und stabile Spannungsquelle, aber man kann sich auch mit einem 0.1uF - 10uF grossen Kondensator über GND und VCC und möglichst nahe am Modul zu helfen versuchen. ===== Referenzen ===== * [[http://cdn.boxtec.ch/pub/iteadstudio/DS_nRF24L01.pdf|Datenblatt nRF24L01]] * [[http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo|nRF24L01 2.4GHz Radio/Wireless Transceivers How-To]] * [[http://maniacbug.wordpress.com/2011/11/02/getting-started-rf24/|Getting Started with nRF24L01+ on Arduino]] * [[http://forum.boxtec.ch/index.php/topic,2572.msg4153.html|Verfügbare Libraries für nRF24L01+]] * **Libraries**: * [[http://www.airspayce.com/mikem/arduino/RadioHead/|RadioHead Packet Radio library for embedded microprocessors]] * [[http://maniacbug.github.com/RF24/|RF24]] from Maniacbug * [[https://github.com/maniacbug/RF24Network|RF24Network]] Mesh-like Network from Maniacbug