Arduino tutorial: Draadloos sensor netwerk met de nRF24L01+

Introductie

De nRF24L01+ 2.4GHz RF radio’s van Nordic zijn een geweldige manier om Arduino’s met elkaar te laten communiceren. Omdat deze transceivers (zender en ontvanger in één) goedkoop en krachtig zijn, zijn ze perfect om bijvoorbeeld een draadloos sensor-netwerk mee aan te leggen.

nRF24L01+ transceiver

nRF24L01+ transceiver

De nRF24L01+ vormt dan ook een prima alternatief voor communicatie met ZigBee, XBee, bluetooth of wifi. Ze lijken, zeker voor beginners, wat lastig maar als je er eenmaal mee aan de slag gaat valt dat best mee.

Deze tutorial probeert je alvast een stuk op weg te helpen. De bedoeling is om één transceiver de uitgelezen data van een sensor draadloos over te laten sturen naar een andere transceiver. Deze transceiver ‘print’ de ontvangen data naar de USB-port waar dan een PC of andere hardware op aangesloten kan worden die de data kan verwerken.

De hardware

Om data te versturen en te ontvangen heb je natuurlijk op z’n minst 2 transceivers nodig. In deze tutorial gebruiken we 2 nRF24L01+ transceivers zoals hier afgebeeld en hier te vinden in de shop. Deze hebben meestal genoeg bereik voor binnenshuis. Wil je meer bereik (tot een paar honderd meter, afhankelijk van de hoeveelheid verzonden data) dan kun je ook de versie met antenne gebruiken.

De onderdelen die je nodig hebt:

Wil je het project gelijk wat permanenter maken kun je in plaats van de kabeltjes ook een Doe-het-zelf shield met female header pins nemen waarop je de nRF24L01+ module drukt. (In dit geval gaan we uit van het aansluiten door middel van de Dupont breadboard kabeltjes.)

Aansluiten

We maken twee identieke schakelingen, één voor de zender (waaraan een sensor wordt aangesloten) en één voor de ontvanger (waarop een PC kan worden aangesloten). Het onderstaande moet je dus twee keer uitvoeren.

Sluit de nRF24L01+ module als volgt aan op het Arduino board met behulp van de Dupont kabeltjes:

GND pin van de nRF24L01+ (maakt niet uit welke) naar één van de GND-pins op je Arduino.
Vcc pin van de nRF24L01+ (maakt niet uit welke) naar de 3.3V pin van je Arduino.
CE pin van de nRF24L01+ naar pin 9 van je Arduino.
CSN pin van de nRF24L01+ naar pin 10 van je Arduino.
SCK pin van de nRF24L01+ naar pin 13/52 van je Arduino UNO/Mega.
MOSI pin van de nRF24L01+ naar pin 11/51 van je Arduino UNO/Mega.
MISO pin van de nRF24L01+ naar pin 12/50 van je Arduino UNO/Mega.

Nog even in tabel formaat:

nRF24L01+ pin Arduino UNO pin Arduino MEGA pin Arduino Pro Mini pin
GND GND GND GND
Vcc 3.3V 3.3V 3.3V (bij 3,3V Pro Mini, anders extern)
CE 9 9 9
CSN 10 10 10
SCK 13 52 13
MOSI 11 51 11
MISO 12 50 12

Je hebt nu 2 identieke schakelingen die we ieder van een ander programma zullen voorzien waardoor de één zender wordt en de andere ontvanger.

De software

Voor deze tutorial gaan we uit van RF24 en RF24Network library van maniacbug.
De RF24 library kun je hier downloaden (klik op ‘Download ZIP’).
De RF24Network library kun je hier downloaden (klik op ‘Download ZIP’).

Je kunt de libraries ook downloaden in de shop onder het tabblad documentatie. Pak de libraries uit in de Arduino libraries map.

Start nu het Arduino programma. Je zult nu in het Voorbeelden-menu de RF24 en RF24Network voorbeelden zien.

De schakelingen testen

Om te zien of we alles goed hebben aangesloten en of we kunnen zenden en ontvangen op beide transceivers laden we eerst het testprogramma on RF24 ‘Gettingstarted’.

Sluit hiervoor beide Arduino’s middels de USB-kabels aan op je computer. Beide Arduino’s zullen een andere COM-poort toegewezen krijgen. Het is handig om even vast te leggen welke Arduino welke COM-poort heeft. (Tip: plak Post-it’s.)

Laad op beide Arduino’s het programma ‘GettingStarted’ zoals eerder genoemd. Start de seriële monitor en zet de snelheid op 57600. (Bekijk de output van de beide Arduino’s door te wisselen tussen de COM-port in het Arduino programma.)

Als alles goed aangesloten is dan zullen beide Arduino’s een output geven als volgt:

Als je een hele hoop nullen krijgt dan is er iets fout aangesloten. Check dan alle verbindingen en probeer het nog eens totdat de output wel klopt.

Als beiden schakelingen (nodes) ongeveer de bovenstaande output geven, druk dan op één van de schakelingen op de ‘T’ en dan enter. Hiermee zet je de schakeling in transmit mode, de zender-modus. Het programma op de Arduino verstuurt dan een zogenaamde ‘ping’ naar de andere node. Deze zal daarop reageren door het terugsturen van een ‘pong’.  De zender-node zal dit oppikken en de onderstaande regels gaan laten zien:

Werkt dit dan weet je dat de communicatie tussen de nodes werkt. Tijd voor de volgende stap.

Het sensornetwerk maken

We gaan het systeem wat intelligenter maken, we geven elke node een nummer en laten ze berichten met data naar elkaar sturen. In dit geval zal node 1 gegevens van een sensor sturen naar node 0.
In plaats van een sensor gebruiken we nu even voor het gemak de input van analoge input pin A0 waar niets op aangesloten is. Hij zal dan enigszins gaan zweven en steeds een iets andere waarde teruggeven. Je kunt natuurlijk later zelf hier op een sensor aansluiten of  de sensorwaarde op een andere manier verkrijgen.

Zet het volgende ontvanger-programma in node 0:

Zet het volgende zender-programma in node 1 (met de sensor):

Als alles werkt dan zie je in de seriële monitors dat node 0 de gegevens ontvangt die node 1 verstuurt.

ontvanger


zender



Om meer sensor-nodes toe te voegen maak je simpelweg meer schakelingen die je voorziet van het zender-programma. Hoog dan natuurlijk wel het node adres op zodat je unieke adressen houdt per node:

Om nu te weten van welke node de ontvangen data komt zul je ook moeten kijken naar het node nummer. Dit kun je doen door de volgende regels toe te voegen aan je ontvanger:

Natuurlijk kun je ook meer gegevens (van bijvoorbeeld meerdere sensors op één node) in je bericht plaatsen. Pas hiervoor de struct sensor_bericht aan:

Het vastleggen (loggen) van de ontvangen gegevens (met PHP en MySQL) om er bijvoorbeeld grafieken mee te maken zal ik misschien in een andere tutorial uitleggen.

Succes met het bouwen van je eigen sensor-netwerk!

Met dank aan Maniacbug voor zijn uitstekende uitleg en library.

 

9 Comments

  • Ernst says:

    Bedankt voor de duidelijke uitleg. Top 🙂

  • Theo van de Laar says:

    Goede dag,
    Gewldige tutorial. Komt mij mooi van pas voor mijn weerstation.
    Hier wil ik met vier radio,s een basis(ontvang) en drie zenders een netwerk opzetten.
    De zenders hoeven slechts resp. de temp, de speed en richting en de humi en lucht druk door te geven.
    Nu kan ik wel twee ontvangen maar de in de tutorial beschreven onderscheid tussen de zenders ziet de ontvanger niet.
    Met het grootste gemak staan de data van node 1 bij die van node 2.
    Heb ik iets gemist om de ontvangen data correct af te vangen?
    Theo

  • Kees Veenstra says:

    Beste Siewert,
    Dank voor deze handige tutorial. Ik wil dit ook graag toepassen met een Arduino Pro mini (Arduino Pro Mini 328 – 5V/16MHz). Je had al een tabel gemaakt waarin de te gebruiken pins van de Arduino Uno en Mega zijn weergegeven, echter hoe kom ik er nu achter welke pins ik moet gebruiken op de Arduino mini?
    Mvg,
    K Veenstra

    • Siewert says:

      Hallo Kees,
      Ik heb de pinout voor de Pro Mini er ook bij gezet.
      Als je een 5V Pro Mini gebruikt moet je alleen opletten dat je daarvan niet de Vcc gebruikt voor je NRF’s want daar moet 3,3V op.
      Je moet dan 3,3V van bijv. een spanningsregelaar halen.
      gr. Siewert

  • Marcel says:

    Dank je voor deze duidelijk uitgelegde sketch. Ben al een tijdje bezig om een 2-tal Arduino Uno’s met elkaar in verbinding te krijgen en dat is helemaal gelukt. Nu is het mijn bedoeling de temperaturen van twee DS18B20 sensoren, die via oneWire zijn aangesloten op een digitale pin, te verzenden naar de ontvanger. Heb al e.e.a. geprobeerd aan te passen in de sketch, maar zonder succes. Iemand die mij hier mee kan helpen?

    groet,
    Marcel

  • Bas says:

    Ondervind je het probleem dat de tranceivers geen verbinding met elkaar maken ondanks dat je alles precies aangesloten hebt zoals hier beschreven?

    Dan kan het zijn dat je de NRF’s toch op 5V moet voeden. Sommige kloon bordjes (in mijn geval een chineese UNO kloon) leveren niet genoeg vermogen op de 3V3 pin, waardoor de NRF niet werkt. Nadat ik de NRF op 5V aansloot werkte de hele setup direct. Aparte is dat de NRF op mijn chineese Nano kloon (zender) wel gewoon werkte op 3V3.

    Inmiddels draait mijn ontvanger NRF nu 2 weken non-stop op 5V zonder problemen te geven.

  • Bas says:

    Je kunt het bereik van de NRF’s vergroten door een draadje van precies 10cm te solderen op het laatste hoekje van de ingebakken antenne. Gewoon even de witte en groene lak weg krabben met een mesje en het draadje erop solderen. De totale lengte van de gehele antenne (inclusief ingebakken deel) moet precies 12,5cm zijn.

  • allard says:

    Ook ik had verbindingsproblemen.

    Bleek vooral te liggen aan de veelgenoemde 3.3v power supply (gebrek aan vermogen). Een goede uitleg staat hier: http://arduinoinfo.mywikis.net/wiki/Nrf24L01-2.4GHz-HowTo#Power_Problems:

Leave a Reply