Remote sensing met detectie van verbindingsverlies met nRF24L01+ modules
Best of Elektor-Labs.com
Roel Arits (Nederland)
De nRF24L01+ RF-modules (figuur 1) zijn interessante, goedkope oplossingen voor draadloze tweewegcommunicatie [1]. De modules hebben een SPI-bus (serial peripheral interface) die configuratie en besturing via een microcontroller mogelijk maakt. Op het internet zijn veel voorbeelden te vinden van projecten waarbij Arduino-boards in combinatie met deze RF-modules worden gebruikt.
Met het hier beschreven project wil ik een extra functie toevoegen die gebruik maakt van de twee-weg-communicatie om het uitvallen van de verbinding tussen zender en ontvanger te detecteren. Het is een beetje vreemd om bij tweewegcommunicatie te spreken over een zender en een ontvanger, omdat modules tegelijkertijd als zender en als ontvanger fungeren. Maar voor de duidelijkheid bestempelen we één module als zender, omdat het zijn belangrijkste taak is de toestand van een (PIR-)sensor door te geven aan een andere module, die deze gegevens ontvangt voor verdere verwerking.
De mogelijkheid om het uitvallen van de verbinding te detecteren is zeer nuttig voor ‘remote’ sensoren, omdat er bij uitval van de verbinding gegevens verloren kunnen gaan zonder dat men het merkt. Het is ook nuttig bij het installeren van de sensor om te controleren of beide nRF24L01 RF-modules elkaar daadwerkelijk ‘zien’ en niet buiten elkaars bereik zijn.
In figuur 2 zie je een overzicht van het project en hoe beide nRF24L01-modules met elkaar communiceren – en hoe detectie van verbindingsuitval is geïmplementeerd.
Schema’s
Laten we beginnen met het schema van de zender (figuur 3). De nRF24L01 moet worden gevoed met 3,3 V, maar de I/O-pinnen van de nRF24L01 verdragen 5 V. Het is daarom geen probleem de SPI-bus van de nRF24L01 zonder meer op een 5-V Arduino Pro Mini aan te sluiten.
De ontkoppelcondensatoren van de voeding moeten zo dicht mogelijk bij respectievelijk de Arduino- en de nRF24L01-module worden geplaatst om alle schakelruis afkomstig van hun chips te onderdrukken. Dit wordt vaak over het hoofd gezien in Arduino-projecten en kan allerlei onverwachte problemen veroorzaken. Het is ook een goede gewoonte om meerdere ontkoppelcondensatoren met verschillende waarde parallel te schakelen (bijvoorbeeld C1 = 100 µF en C2 = 100 nF). Elektrolytische condensatoren zijn bij hogere frequenties niet zo effectief als keramische of polypropyleen-filmcondensatoren. Door verschillende condensatortypes parallel te schakelen, ontstaat een effectiever filter over een groter frequentiebereik.
De PIR-sensor (figuur 4) wordt aangesloten op D4 van de Arduino. Wanneer de PIR-sensor een andere spanning dan 5 V nodig heeft, is dat geen probleem. Q1 fungeert als een (inverterende) ‘level shifter’ voor het geval sensoren worden gebruikt die bijvoorbeeld een uitgangsspanning van 3,3 V of minder hebben. Op deze manier kun je andere typen sensoren aansluiten zonder de hardware te hoeven veranderen. Wanneer de PIR-sensor een uitgang op 5V-niveau heeft, kunnen Q1, R4 en R3 worden weggelaten en kan de uitgang van de PIR-sensor direct worden verbonden met pin 4 van de Arduino Pro Mini. In dat geval moet de Arduino-sketch worden aangepast, zodat is de triggeringang actief hoog in plaats van actief laag is: #define TRIGGER_ACTIVE_LEVEL 0 /* 0 = low active, 1 = high active */ .
De rode LED (D1) knippert wanneer de verbinding tussen de zender en de ontvanger verbroken is. Wanneer de verbinding hersteld is, stopt de rode LED met knipperen en werkt alles weer als normaal.
De blauwe LED (D2) geeft aan dat de PIR-sensor een beweging detecteert. Dit trigger-event wordt naar de ontvanger gestuurd als een trigger-codebyte. Wanneer de PIR-sensor geen beweging detecteert, dan wordt een live beat-code naar de ontvanger gestuurd. Op deze manier weet de ontvanger of er al dan niet een beweging is gedetecteerd.
De volgende code toont de betreffende definities:
Figuur 5 toont de zender-unit met de PIR-sensor.
Receiver
De ontvanger (figuur 6) retourneert de code die hij van de zender heeft ontvangen naar de zender als een bevestiging. Door deze voortdurende communicatie tussen zender en ontvanger kunnen beide gemakkelijk vaststellen wanneer de verbinding is verbroken.
De ontvangerschakeling (figuur 7) is bijna identiek aan de zenderschakeling. In de ontvanger gaat de rode LED (D1) knipperen als de verbinding uitvalt; de Arduino geeft dan via de luidspreker een toontje weer met behulp van het commando tone (x, y), waarbij x de frequentie is en y de duur. De luidspreker is een 8Ω-exemplaar en is met de Arduino verbonden via een elektrolytische condensator. Hoe hoger de waarde van de condensator, hoe groter het volume van de weergegeven toon is. De code voor een 50Hz-toon gedurende 150 ms is:
Ik heb voor een laagfrequentie toon gekozen omdat dat minder storend/ergelijk is dan hogerfrequente tonen. De blauwe LED (D2) geeft aan wanneer beweging wordt gedetecteerd. Op deze uitgang kun je via een transistor een relais aansluiten om in dat geval iets anders in te schakelen/aan te sturen.
Weblinks
[1] Datasheet RF-modules: https://www.nordicsemi.com/Products/nRF24-series[2] Projectpagina op Elektor Labs: https://www.elektormagazine.com/remote-nrf24l01
Vertaling: Eric Bogers