Arduino Nano V3 – nRFL01 Modul – Datenübertragung

In diesem ersten Beitrag möchte ich dir zeigen wie du Daten zwischen zwei Arduino Nano V3 mit zwei nRFL01 Modulen übertragen kannst. 

Bezug von nRFL01 Modulen

Die mir vorliegenden nRFL01 Module habe ich im Set mit auf aliexpress.com für 6,32€ zzgl. 3,73€ Versandkosten gekauft.

Anzeige auf der Plattform aliexpress.com
Anzeige auf der Plattform aliexpress.com

Dem Set liegen wie bereits erwähnt jeweils zwei Arduino Nano V3, nRFL01 Module, Antennen sowie Breadboard Adapter bei. Des Weiteren liegen noch zwei kleine USB Datenkabel bei welche leider so kurz sind (ca. 31cm) das diese nicht verwendet werden können.

länge USB Datenkabel
länge USB Datenkabel

Auf ebay.de du findest du recht günstig lange USB Datenkabel welche praktikabler sind als dieses kurze Teil.

benötigte Bauteile für diesen Beitrag

Wenn du die Beispiele aus diesem Beitrag nachbauen möchtest dann benötigst du:

Set Arduino Nano V3, USB Datenkabel, nRFL01 Module
Set Arduino Nano V3, USB Datenkabel, nRFL01 Module

Anschluss des nRFL01 Modules an den Arduino Nano V3

Da ich mir ein Set inkl. Arduino Nano V3 gekauft habe, möchte ich dir zeigen wie das nRFL01 Modul an dieses angeschlossen wird. Da der Arduino Nano V3 aber recht baugleich mit dem Arduino UNO ist, kannst du diese Schaltung auch 1:1 auf diesen Microcontroller übertragen.

Für die Ansteuerung des nRFL01 Modules am Microcontroller benötigst du zusätzlich ein Regler Modul welches dem Set bei liegt.

Auf dieses Modul kann das nRFL01 bzw. nRF24L01 Modul gesteckt werden und die Pins mit Breadboardkabel abgegriffen werden.

Pinout des Regler Modules für den nRFL01 / nRF24L01

Das nRF24L01 Modul mit SMA Antenne verfügt wie auch das “normale” nRF24L01 Modul über 8 Pins.

Pinout des nRF24L01 SMA Moduls
Pinout des nRF24L01 SMA Moduls

Das Regler Modul verfügt über 8 Pins wobei davon 2 für die Stromversorgung des Modules sowie 6 weitere für die Datenübertragung dienen.

Regler Modul für den nRFL01
Regler Modul für den nRFL01

An den Arduino Nano V3 / Arduino UNO wird dieses Modul wie folgt angeschlossen.

Regler ModulArduino Nano V3
VCC5 V (im betrieb ohne Regler an 3,3V)
GNDGND
CEdigitaler Pin D6
CSNdigitaler Pin D7
SCKdigitaler Pin D13
MO (MOSI)digitaler Pin D11
MI (MISO)digitaler Pin D12
IRQ– bleibt leer –

Beachte aber das es ggf. je nach verwendeter Bibliothek, eine andere Pinbelegung gibt.

Programmieren des nRFL01 Moduls am Arduino Nano V3

einrichten der benötigten Bibliothek

Für den betrieb bzw. der Programmierung des nRF24L01 am Arduino benötigst du zusätzlich eine Bibliothek. In meinem Beispiel verwende ich das *.zip Paket vom GitHub Repository nRF24 / RF24.

Wie du eine Bibliothek in der Arduino IDE installierst habe ich dir im Beitrag Arduino IDE, Einbinden einer Bibliothek ausführlich erläutert.

Beispiel 1 – blinken einer LED

Wollen wir zunächst eine LED steuern. Dazu senden wir den Befehl “ON” alle 1000ms. Und wenn wir am Empfänger diesen Befehl empfangen soll die LED aufleuchten, andernfalls soll diese deaktiviert sein.

Aufbau der Schaltung am Empfänger

Für den Aufbau der Schaltung des Empfängers benötigst du neben dem nRF24L01 Modul und einem Arduino Nano V3 noch zusätzlich

  • einen 220 Ohm Widerstand,
  • eine LED, 5mm,
  • diverse Breadboardkabel

Schaltung für den Empfänger
Schaltung für den Empfänger

Schaltung für den Sender

Die Schaltung für den Sender ist recht einfach denn es wird lediglich ein nRFL01 Modul und ein Arduino Nano V3 benötigt.

Schaltung für den Sender
Schaltung für den Sender

Sketch für den Sender

//Bibliotheken laden
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//CE - digitaler Pin D6
//CSN - digitaler Pin D7
RF24 radio(6, 7);  // CE, CSN

//Adresse über welche die Kommunikation stattfinden soll
const byte address[6] = "00001";

void setup(){
  //beginn der seriellen Kommunikation mit 9600baud
  Serial.begin(9600);
  
  radio.begin();
  
  //setzen der Adresse
  radio.openWritingPipe(address);
  
  //das Modul soll als Sender agieren daher
  //keine "abhören"
  radio.stopListening();
}
void loop(){
  //Nachricht welche gesendet werden soll
  const char status[] = "ON";
  //senden der Nachricht
  radio.write(&status, sizeof(status));
  //Ausgabe auf der seriellen Schnittstelle das 
  //eine Nachricht gesendet wurde
  Serial.println("send");
  //eine Pause von 1sek.
  delay(1000);
}
Sketch für den Empfänger
//Bibliotheken laden
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//CE - digitaler Pin D6
//CSN - digitaler Pin D7
RF24 radio(6, 7);  // CE, CSN

//Adresse über welche die Kommunikation stattfinden soll
const byte address[6] = "00001";

//LED am digitalen Pin D4 angeschlossen
#define led 4
//Variable um sich den Status der LED (AN/AUS) zu speichern
int ledStatus = 0;

void setup() {
  //Pin der LED als Ausgang definieren
  pinMode(led, OUTPUT);

  //solange der serielle Port nicht initialisiert ist
  //soll ein leere Schleife ausgeführt werden
  while (!Serial);

  //beginn der seriellen Kommunikation mit 9600baud
  Serial.begin(9600);

  radio.begin();

  //setzen der Adresse
  //es können mehr als eine Adresse verwendet werden
  radio.openReadingPipe(0, address);

  //starten des "abhören"
  radio.startListening();
}

void loop() {
  String t = "OFF";

  //Wenn Daten empfangen wurden, dann...
  if (radio.available()) {
    //einen Buffer für den gelesen Text initialisieren
    char text[32] = {0};
    //lesen der Daten in den Buffer
    radio.read(&text, sizeof(text));
    //umwandeln des Buffers (char Arrays) in einen String
    //dieses macht das vergleichen später einfacher
    t = String(text);
    //Ausgeben des gelesenen Textes auf der seriellen Schnittstelle
    Serial.println(text);
  }
  //Wenn der gelesene Text gleich "ON" ist dann soll die LED
  //aktiviert werden, d.h. Status 1 ansonsten Status 0 und die
  //LED wird deaktiviert.
  ledStatus = t == "ON" ? 1 : 0;
  digitalWrite(led, ledStatus);
  
  //eine kleine Pause von 500ms.
  //diese Pause sorgt dafür das die LED blinkt
  delay(500);
}

Download der Sketche

Hier nun die beiden Sketche / Programme zum bequemen Download.

Video

testen der Reichweite

Mit dem oben gezeigten Aufbau möchte ich dir nun einen kleinen Test präsentieren wie ich die Reichweite im bebaute Gelände getestet habe.

Folgende GPS Koordinaten konnte ich dabei festhalten, wobei natürlich eine gewisse Toleranz bei diesem Messverfahren besteht.

  • Startpunkt – 52.146194 10.961047
  • Position 1 – 52.145663 10.961269
  • Position 2 – 52.147116 10.961016

Der Abstand zwischen

  • dem Startpunkt und der Position 1 beträgt 110m,
  • dem Startpunkt und der Position 2 beträgt 200m

wobei aber immer Sichtkontakt bestehen musste.

Google Earth GPS Koordinaten
Google Earth GPS Koordinaten

In diesem gezeigten Gelände gibt es ein Gefälle von “Position 2” zu “Position 1”
(d.h. “Position 1” liegt tiefer als “Position 2”).

kleiner Test auf dem “Acker”

In bebautem Gelände gibt es diverse störungsquellen welche die Datenübertragung mindern kann.

Dazu zählen zbsp:

  • Hochspannungsleitungen,
  • elektrotechnische Geräte wie Rasenmäher, Pumpen usw.

Nun möchte ich einmal prüfen wie sich das ganze auf einem recht freien Feld verhält.

Folgende GPS Koordinaten habe ich aufgenommen:

  • Startpunkt – 52.148844 10.967183
  • Position 1 – 52.148715 10.968886
Reichweitentest des nRF24L01 Modules in offenem Gelände
Reichweitentest des nRF24L01 Modules in offenem Gelände

Zusammenfassung

Fassen wir kurz die gesammelten Daten in einer kleinen Tabelle zusammen:

Positionbebautes Geländeoffenes Gelände
Startpunkt – Position 1100m330m
Startpunkt – Position 2200m

Aus der Tabelle geht sehr gut hervor das in offenem Gelände das nRF24L01 Modul mit SMA Antenne deutlich bessere Leistung bring. Mit knapp 330m ist das auch schon eine recht gute Leistung, wenn man mal bedenkt dass, das Modul mit 3,3V und einer Powerbank betrieben wird.

nRF24L01 Sender & Empfänger inkl. Powerbank
nRF24L01 Sender & Empfänger inkl. Powerbank

Beispiel 2 – steuern einer LED mit einem Taster

Nachdem wir nun eine LED mit dem Befehl “ON” steuern können wollen wir diesen Befehl mit einem Tastendruck absenden.

erweitern der Schaltung für den Sender

Für den Aufbau mit einem Taster, müssen wir die Schaltung für den Sender um einen Pull-Up / Pull-Down Widerstand und einen besagten Taster erweitern.

erweiterte Schaltung mit einem Taster und einen Pullup Widerstand
erweiterte Schaltung mit einem Taster und einen Pullup Widerstand

implementieren des Tasters in den bestehenden Sketch

Den bestehenden Sketch für den Sender müssen wir lediglich um den Taster erweitern. Unser Taster ist am digitalen Pin D3 angeschlossen.

Es gibt nun die Möglichkeit den Taster einfach per “digitalRead” auszulesen ABER dann bekommen wir das Problem mit dem Prellen eines Tasters, um diesen Effekt zu unterbinden können wir die Bibliothek Bounce2 verwenden und somit ein gesichertes Tastersignal auswerten.

Wie du einen Taster am Arduino programmierst und auch das prellen eines Tasters unterbinden kannst habe ich im Beitrag Arduino Lektion 87: Taster entprellen erläutert.

einfache Lösung ohne zusätzliche Bibliothek

Wie bereits erwähnt ist die einfachste Lösung mit der Funktion “digitalRead”. Die Funktion “digitalRead” liefert uns entweder 0 / LOW wenn kein Signal anliegt oder aber 1 / HIGH wenn ein Signal anliegt.

#define taster 3

void setup(){
  pinMode(taster, INPUT);
}

void loop(){
   if(digitalRead(taster) == HIGH){
      //senden des Befehles "ON"
   }
}

aufwändige Lösung mit der Bibliothek Bounce2

Für die Lösung mit der Bibliothek Bounce2, müssen wir zunächst die besagte Bibliothek einfügen (zuerst in die Arduino IDE und danach in den Quellcode) und uns eine Objektinstanz erzeugen.

#include <Bounce2.h>

#define taster 3

//erster Parameter der Pin für den Taster,
//zweiter Parameter die ms. welche zwischen 2 Signalen liegen muss
Bounce btnBouncer = Bounce(taster, 50); 

void setup(){
  pinMode(taster, INPUT);
}

void loop(){
   btnBouncer.update();
   //Wenn der Taster losgelassen wird, dann...
   if(btnBouncer.fell()){
      //senden des Befehles "ON"
   }
}

Sketch des Senders

//Bibliotheken laden
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#include <Bounce2.h>

//CE - digitaler Pin D6
//CSN - digitaler Pin D7
RF24 radio(6, 7);  // CE, CSN

//Adresse über welche die Kommunikation stattfinden soll
const byte address[6] = "00001";

#define button 3

Bounce btnBouncer = Bounce(button, 50);

void setup(){
  //beginn der seriellen Kommunikation mit 9600baud
  Serial.begin(9600);

  pinMode(button, INPUT);
  
  radio.begin();
  
  //setzen der Adresse
  radio.openWritingPipe(address);
  
  //das Modul soll als Sender agieren daher
  //keine "abhören"
  radio.stopListening();
}
void loop(){
  btnBouncer.update();

  if(btnBouncer.fell()){
    //Nachricht welche gesendet werden soll
    const char status[] = "ON";
    //senden der Nachricht
    radio.write(&status, sizeof(status));
    //Ausgabe auf der seriellen Schnittstelle das 
    //eine Nachricht gesendet wurde
    Serial.println("send");    
  } 
  
}

Sketch des Empfängers

//Bibliotheken laden
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//CE - digitaler Pin D6
//CSN - digitaler Pin D7
RF24 radio(6, 7);  // CE, CSN

//Adresse über welche die Kommunikation stattfinden soll
const byte address[6] = "00001";

//LED am digitalen Pin D4 angeschlossen
#define led 4

//Variable um sich den Status der LED (AN/AUS) zu speichern
int ledStatus = 0;

void setup() {
  //Pin der LED als Ausgang definieren
  pinMode(led, OUTPUT);

  //solange der serielle Port nicht initialisiert ist
  //soll ein leere Schleife ausgeführt werden
  while (!Serial);

  //beginn der seriellen Kommunikation mit 9600baud
  Serial.begin(9600);

  radio.begin();

  //setzen der Adresse
  //es können mehr als eine Adresse verwendet werden
  radio.openReadingPipe(0, address);

  //starten des "abhören"
  radio.startListening();
}

void loop() {
  //Wenn Daten empfangen wurden, dann...
  if (radio.available()) {
    //einen Buffer für den gelesen Text initialisieren
    char text[32] = {0};
    //lesen der Daten in den Buffer
    radio.read(&text, sizeof(text));
    
    if (ledStatus == 1) {
      ledStatus = 0;
    } else {
      ledStatus = 1;
    }
  }
  
  digitalWrite(led, ledStatus);
}

Download der Sketche

Video

Für den Aufbau habe die einzelnen, elektronischen Komponenten auf dem Schreibtisch festgeklebt. Durch das starre Kabel war das leider nicht anders möglich.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.