Wireless Communication

Um den Chlorgehalt, die Temperatur und den pH-Wert des Wassers im Pool zu überwachen und aufzuzeichnen muss hinter der Pumpe ein Mikrocontroller sitzen, welcher über Sensoren die drei Parameter aufnehmen kann.

Da sich die Pumpe direkt hinter dem Pool in einem Schacht befindet, und der Pool zudem noch 10 Meter weit weg von der nächst gelegenen Hausmauer ist, wäre es doch recht mühsam, ein Kabel zu verlegen, um die Daten bequem von drinnen auszulesen.

Deshalb kommt hier die Lösung: Der Controller bei der Pumpe sendet die Daten Kabellos zu einem anderen, der sich im Haus befindet.

Gut, genug geredet: Wie stellt man das nun an?

NRF24L01+

Das ist die genaue Bezeichnung des Wireless-Moduls, welches ich im Rahmen dieses Eintrags vorstellen will. Es ist ein sehr, sehr günstiges Modul, welches Daten über eine 2.4GHz Funkverbindung mit einem zweiten NRF-Modul austauschen kann.

Module

Zum Preis: Ich habe zwei Module um 1,66€ auf eBay neu gekauft. Mit kostenlosem Versand.

Die Reichweite wird mit bis zu 100m angegeben. Dies stimmt natürlich nur, wenn man die Reichweite des Moduls auf Maximum einstellt und man sich zudem auf einem freien Feld befindet. Ich habe es auf der Straße vorm Haus getestet, bis etwa 90 Meter war die Kommunikation tadellos. Befinden sich Mauern oder starke elektromagnetische Felder dazwischen, dann sinkt die Reichweite.

Wer etwas mehr Reichweite braucht: Es gibt das Modul auch mit längeren Antennen. Auf dem „Standard“ Modul ist die Antenne lediglich eine geätzte Leiterbahn (im Bild unten, links zu sehen).

Pins

Etwas, das mich ein bisschen stört ist, wie am Bild oben zu erkennen ist, die Pin Anordnung, denn so wie sie auf meiner Modulplatine angeordnet sind, lässt sich die Platine nicht auf einem Steckbrett unterbringen.

Der Aufbau

Man benötigt folgende Komponenten:

  • Arduino Uno oder Nano (zwei Stück)
  • NRF24L01+ Modul (zwei Stück)
  • Jumper Kabel

Zusätzlich habe ich noch einen 0,96″ Display verbaut, um die Daten von einem Arduino auf dem anderen anzuzeigen. Wer den Display nicht braucht/will/hat, der kann im Programm die // in der Zeile #define USE_SERIAL löschen. So werden die Daten nicht am Display, sondern am seriellen Monitor angezeigt.

Die Verdrahtung sieht dann wie folgt aus:

  • Pin 9: CE
  • Pin 10: CSN
  • Pin 11: MOSI
  • Pin 12: MISO
  • Pin 13: SCK
  • 3V3: VCC
  • GND: GND

Für mehr Übersicht: Hier der Schaltplan für den Sender:

WcomTX

Und jener für den Empfänger:

WcomRX.png

Wichtig: Das Modul wird mit 3.3 Volt versorgt. Eine Spannung von 5 Volt würde es zerstören.

Ich habe ein Modul mit dem Uno, das andere mit dem Nano verbunden. Zusätzlich sitzt auch dem Steckbrett des Nanos der kleine Display, um die Daten anzuzeigen, welch vom Uno kommen. Man kann natürlich auch 2 Arduinos des selben Modells nutzen.

RX&TX

Mehr zum Display gibt es hier nachzulesen.

Das Programm

Auf GitHub befinden sich 3 Ordner. Im ersten (Library) findet man die Programmbibliothek für das Modul. Diese muss in das Standard-Verzeichnis der Arduino IDE für Bibliotheken kopiert werden. Das Verzeichnis heißt …/Arduino/libraries/

Im zweiten Ordner (Transmitter) befindet sich das Programm für den Sender. Dieser nimmt die Werte auf und sendet sie zum anderen Controller.

Im dritten Ordner (Receiver) ist das Programm für den Empfänger. Dieser ließt die Daten vom anderen Controller und gibt sie aus.

Basic Code

Neben den Header-Files (#include <SPI.h> & #include „RF24.h“) benötigt das Modul etwas an Initialisierungs-Code – hierfür sollten die beiden Programme geöffnet sein.

  • Addresse: Dies ist quasi die Erkennungsmarke für die beiden Module. Ein Modul sendet nur an ein anderes, welches über die Addresse identifiziert wird. So können hunderte Module nebeneinander Daten senden, ohne dabei andere zu stören.
  • Setup: Hier wird festgelegt, dass die Module über das SPI-BUS-System miteinander kommunizieren.
  • Struct: Hier werden die empfangenen Daten gespeichert. Man muss nicht unbedingt ein Struct nutzen, doch mir gefällt eine solche zusammengefasste Schreibweise.
  • setPALevel: Hier wird die Reichweite in 4 Stufen festgelegt (Min, Low, High, Max). Je höher die Reichweite, desto höher der Energieverbrauch!
  • openWritingPipe: Hier wird festgelegt, welche Adresse zum Schreiben der Daten genutzt wird.
  • openReadingPipe: Vice versa zu writing pipe.

Wichtig ist, dass openWritingPipe und openReadingPipe auf den beiden Arduinos gegengleich definiert werden!

Noch eine Anmerkung: Um Daten zu senden, darf man nicht zuhören! Um also den Befehl write(…); ausführen zu können, muss zuerst der Befehl stopListening(); ausgeführt werden.

Um generell auf Daten zu warten, muss der Befehl startListening(); gesetzt werden. Erst dann kann das Arduino Daten empfangen.

Die Programme sind so geschrieben, das der Empfänger sofort mit der Ausgabe der Daten beginnt, sobald er diese bekommt. Und genau das ist das schöne an den Module: Es ist keine Koppelung nötig. Die Daten werden einfach gesendet, und wer die richtige Adresse hat, der empfängt sie.

Falls noch Fragen offen sind: Ein Kommentar ist immer erwünscht!

Advertisements

3 Gedanken zu “Wireless Communication

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s