Fernwirken und die Erkennung von Verbindungsverlusten - mit Hilfe von nRF24L01+ Modulen
Best of Elektor-Labs.com
Von Roel Arits (Niederlande)
Das HF-Modul nRF24L01+ (Bild 1) bietet eine interessante, kostengünstige Lösung für drahtlose bidirektionale Kommunikation [1]. Das Modul verfügt über einen SPI-Bus (Serial Peripheral Interface), der die Konfiguration und Steuerung über einen Mikrocontroller ermöglicht. Im Internet finden sich zahllose Beispiele für Projekte, bei denen Arduino-Boards in Kombination mit diesen HF-Modulen eingesetzt werden.
Mit dem hier beschriebenen Projekt mit zwei nRF24L01+ möchte ich einer (Heim-) Automatisierungsvorrichtung eine zusätzliche Funktion hinzufügen, die die Zwei-Wege-Kommunikation nutzt, um den Verlust der Kommunikationsstrecke zwischen Sender und Empfänger zu erkennen. Es ist zwar etwas seltsam, bei einer Zwei-Wege-Kommunikation von einem Sender und einem Empfänger zu sprechen, da die Module doch gleichzeitig als Sender und als Empfänger fungieren, doch der Klarheit halber bezeichnen wir das Modul als Sender, dessen Hauptaufgabe darin besteht, den Zustand eines (PIR-) Sensors an ein anderes Modul zu übertragen, den Empfänger, der die Daten weiter verarbeitet.
Die Fähigkeit, den Verlust der Kommunikationsstrecke zu erkennen, ist für entfernte Sensoren sehr nützlich, denn wenn es keine Kommunikation gibt, könnten Daten unbemerkt verloren gehen oder sinnlos wertvolle Batteriekapazität „verbraten“ werden. Es ist auch nützlich, bei der Installation des Sensors zu prüfen, ob sich die beiden nRF24L01 RF-Module tatsächlich gegenseitig „sehen“ können und nicht außerhalb ihrer Reichweite sind.
In Bild 2 sehen Sie einen Überblick über das Projekt und wie die beiden nRF24L01-Module miteinander kommunizieren - und wie die Erkennung von Kommunikationsverlusten implementiert ist.
Schaltplan
Beginnen wir mit dem Schaltplan des Senders (Bild 3). Der nRF24L01 muss zwar mit 3,3 V versorgt werden, aber die I/O-Pins des Moduls sind 5-V-tolerant. Es ist also kein Problem, den SPI-Bus des nRF24L01 direkt an einen 5-V-Arduino Pro Mini anzuschließen.
Die Entkopplungskondensatoren für die Stromversorgung sollten so nah wie möglich am Arduino beziehungsweise am nRF24L01-Modul platziert werden, um alle „Schaltgeräusche“ zu unterdrücken, die von diesen Chips ausgehen. Dies wird bei Arduino-Projekten oft übersehen und kann zu allen möglichen unerwarteten Problemen führen. Es ist auch sinnvoll, mehrere Bypass-Kondensatoren mit unterschiedlichen Werten parallel zu schalten, zum Beispiel C1 = 100 µF und C2 = 100 nF, weil Elektrolytkondensatoren zwar viel Energie aufnehmen können, aber bei höheren Frequenzen nicht so wirksam wie Keramikkondensatoren oder Polypropylen-Folienkondensatoren sind. Durch die Parallelschaltung verschiedener Kondensatortypen wird so ein wirksameres Filter über einen breiteren Frequenzbereich geschaffen.
Der PIR-Sensor (Bild 4) ist an D4 des Arduino angeschlossen. Die Schaltung lässt auch PIR-Sensoren mit einer anderen Spannung als 5 V zu: Q1 fungiert als (invertierender) Pegelwandler für den Fall, dass Sensoren mit einer Ausgangsspannung von 3,3 V oder weniger verwendet werden. Auf diese Weise können Sie andere Sensortypen anschließen, ohne die Hardware ändern. Wenn der PIR-Sensor einen 5-V-Ausgang hat, können Q1, R4 und R3 natürlich weggelassen und der PIR-Sensorausgang direkt an Pin 4 des Arduino angeschlossen werden. In diesem Fall muss aber der Arduino-Sketch angepasst werden, so dass der Trigger-Eingang high aktiv statt low aktiv ist: #define TRIGGER_ACTIVE_LEVEL 0 /* 0 = low active, 1 = high active */.
Die rote LED D1 blinkt, wenn die Verbindung zwischen dem Sender und dem Empfänger unterbrochen ist. Wenn die Verbindung wiederhergestellt ist, stellt die rote LED diese Tätigkeit ein und alles funktioniert wieder wie gewohnt.
Die blaue LED D2 zeigt an, dass der PIR-Sensor eine Bewegung erkennt. Dieses Triggerereignis wird als Triggercode-Byte an den Empfänger gesendet. Wenn der PIR-Sensor keine Bewegung erkennt, wird ein „Livebeat“-Code, eine Art Lebenszeichen an den Empfänger gesendet. Auf diese Weise weiß der Empfänger immer zuverlässig, ob ein Triggerereignis vorliegt oder nicht.
Der folgende Code zeigt die Definitionen des Livebeat- und des Trigger-Codes.
Bild 5 zeigt die Sendeeinheit mit dem PIR-Sensor.
Receiver
Der Empfänger (Bild 6) sendet denselben Code, den er vom Sender erhalten hat, als Bestätigung zurück. Aufgrund dieser kontinuierlichen Kommunikation zwischen Sender und Empfänger können beide leicht feststellen, ob die Verbindung steht oder unterbrochen ist.
Die Empfängerschaltung (Bild 7) ist fast identisch mit der Senderschaltung. Die rote LED D1 blinkt, wenn die Verbindung unterbrochen ist, und der Arduino sendet mit dem Befehl tone (x,y) einen Ton an den Lautsprecher, wobei x die Frequenz und y die Dauer angibt. Der Lautsprecher sollte ein 8-Ω-Typ sein und über einen Elektrolytkondensator an den Arduino angeschlossen werden. Je höher der Wert des Kondensators ist, desto höher ist auch die Lautstärke des Lautsprechers. Für einen 50-Hz-Ton mit einer Dauer von 150 ms wird der folgende Code verwendet:
Ich habe mich für diesen niederfrequenten Ton entschieden, da er weniger nervend ist als höhere Töne. Die blaue LED D2 leuchtet auf an, wenn eine Bewegung erkannt wird. An diesen Ausgang kann man auch über einen Transistor ein Relais anschließen, um ein anderes Gerät einzuschalten/zu steuern, wenn eine Bewegung erkannt wird.
Weblinks
[1] Datenblatt des HF-Moduls: https://www.nordicsemi.com/Products/nRF24-series[2] Dieses Projekt auf Elektor Labs: https://www.elektormagazine.com/remote-nrf24l01
Übersetzung: Rolf Gerstendorf