NRF24L01 funktioniert nicht

Tag zusammen,

ich habe ein Projekt, bei dem die Arduinos empfangen und senden können müssen.
Zu Anfang habe ich vereinfacht den einen Arduino über einen Schalter das Relais des anderen Arduinos schalten lassen. Das hat EINMAL funktioniert. Als es funktioniert hat, habe ich das Programm 10 Minuten weiter laufen lassen. Als ich dann erneut den Schalter betätigte funktionierte nichts mehr. Auch nicht nach einem Reset und einem neuen Upload. Versorgt wurde das System über eine 9V Batterie. Jetzt erfolgt die Versorgung über zwei USB Kabel. Laut Multimeter liegt am NRF24L01 Modul 3,2V an.
Die Folgenden Dinge habe ich draufhin getestet:
-zwei neue Arduinos
-zwei neue NRF24L01 Module (Diesmal statt mit externer Antenne, die kleinen Module)
-neue USB Kabel
-unterschiedliche Pins für das Relais und den Schalter
-unterschiedliche Pins für CE, CSN
Weiter wusste ich nicht mehr. Auch Codes z.B. von Youtube, mit den richtigen Steckverbindungen bewirken nichts. Der eine sendet laut dem Serial Monitor, der andere empfängt aber nichts. Auch die Adressen habe ich überprüft. Ich weiß nicht mehr weiter und hoffe, ihr könnt mir helfen.

Transmitter Code:

   #include <SPI.h>
   #include <nRF24L01.h>
   #include <RF24.h>
   #define schalter 3
   
   RF24 radio(9, 10); // CE, CSN

   const byte addresses[][6] = {"00001", "00002"};
   boolean switchState = 0;
   
   void setup() {
     pinMode(schalter, INPUT);
     radio.begin();
     radio.openWritingPipe(addresses[0]); // 00002
     radio.openReadingPipe(1, addresses[1]); // 00001
     radio.setPALevel(RF24_PA_MIN);
     radio.setDataRate(RF24_250KBPS);
     radio.setChannel(124);
   }
   void loop() {
     delay(5);
     radio.startListening();
     //if ( radio.available()) {
       //radio.read(&,sizeof());
       //delay(5);
       radio.stopListening();
       switchState = digitalRead(schalter);
       radio.write(&switchState, sizeof(switchState));
     }

Der herauskommentierte Teil sollte verwendet werden, sobald das Senden funktioniert hätte.

Receiver Code:

#include <SPI.h>
   #include <nRF24L01.h>
   #include <RF24.h>
   #define relais 3
   
   RF24 radio(9, 10); // CE, CSN
   
   const byte addresses[][6] = {"00001", "00002"};
   boolean switchState = 0;
   void setup() {
     pinMode(3, OUTPUT);
     radio.begin();
     radio.openWritingPipe(addresses[1]); // 00001
     radio.openReadingPipe(1, addresses[0]); // 00002
     radio.setPALevel(RF24_PA_MIN);
     radio.setDataRate(RF24_250KBPS);
     radio.setChannel(124);
   }
   void loop() {
     delay(5);
     radio.stopListening();
     delay(5);
     radio.startListening();
     while (!radio.available());
     radio.read(&switchState, sizeof(switchState));
     if (switchState == HIGH) {
       digitalWrite(relais, HIGH);
     }
     else {
       digitalWrite(relais, LOW);
     }
   }

IMG_20190322_155506_mittel.jpg

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Danke

Zunächst zur Hardware:

ein kleiner Elko 2-10 micro Farad direkt an den Modulen hilft
eine eigene 3.3V Stromversorgung ist für die kleinen Module gut, für die großen unverzichtbar

Dein Empfangssketch treibt mir Tränen in die Augen.
Du versuchst Kommunikation zu erzwingen, statt einfach Pakete zu empfangen.

Versuch mal etwas wie

#include <RF24.h>

const byte relaisPin = 3;
const byte address[] = "00001";

RF24 radio(9, 10); // CE, CSN

void setup() {
  pinMode(relaisPin, OUTPUT);
  radio.begin();
  radio.openReadingPipe(1, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.setDataRate(RF24_250KBPS);
  radio.setChannel(124);
  radio.startListening();
}

void loop() {
  if (radio.available()) {
    byte switchState = 0;
    radio.read(&switchState, sizeof(switchState));
    digitalWrite(relaisPin, switchState);
  }
}

Du sendest meiner Ansicht nach wesentlich zu häufig den Tastenzustand,
es würde doch völlig ausreichen jede Änderung zu übertragen und zusätzlich den
aktuellen Zustand vielleicht 2x in der Sekunde.

Entferne alle delay aus deinem Programmen, Zeitabläufe steuert man mit millis().

Du hast einen Sender der nur sendet und einen Empfänger der nur empfängt,
also sollte in deinen Programmen kein stopListening vorkommen,
und nur im Empfänger ein startListening.

Dein Kanal (124) erscheint mir sehr hoch, welche Frequenz benutzt du da?

Erst einmal herzlichen Dank für deine Antwort. Sorry, dass mein Code so grausam ist :sweat_smile: Gut, dass mit dem Kondensator wird erledigt. Ich werde den Code mal ausprobieren.

Da ich am Ende mit jedem Arduino empfangen und senden möchte und muss zumindest, nachdem das empfangen funktioniert hat, auch das Senden möglich gemacht werden. Deshalb ist im Code startListening sowie stopListening enthalten. Am Ende soll es nämlich eine 2,4Ghz Fernsteuerung werden.
Ich werde wie du gesagt hast mal die Delays raus löschn und wenn benötigt durch millis() ersetzen.

Der Channel 124 müsste die Frequenz 2524Mhz haben. Das habe ich eingefügt um nicht eventuell auf der Frequenz von einem Router o.ä. zu senden.

Die Frequenzen von NATO, Polizei und RTW sind auch vielversprechend frei. :wink:

Bramadem:
Am Ende soll es nämlich eine 2,4Ghz Fernsteuerung werden.

Fernsteuerungen sind überwiegend unidirektional.

Der NRF kann Daten an die Acknowledges anhängen,
insofern ist auch für bidirektionale Kommunikation kein Rollenwechsel nötig. :wink:

Whandall:
Die Frequenzen von NATO, Polizei und RTW sind auch vielversprechend frei. :wink:

Fernsteuerungen sind überwiegend unidirektional.

Die Fernsteuerung soll auch Daten empfangen und auf einem kleinen Display ausgeben. Deswegen soll es bidirektional sein :smiley:

Whandall:
Der NRF kann Daten an die Acknowledges anhängen,
insofern ist auch für bidirektionale Kommunikation kein Rollenwechsel nötig. :wink:

Wenn ich das richtig verstehe (sorry bin noch relativ am Anfang was Arduino und co. anbelangt :sweat_smile: ), dann kann ich den einen auf startListening stellen und den anderen auf stopListening lassen und durch die Acknowledges Daten senden. Somit brauche ich nicht ständig im Loop startListening und stopListening deklarieren, richtig?

Ja. Robin2's NRF Tutorial hat ein Beipiel dazu (SimpleTxAckPayload.ino und SimpleRxAckPayload.ino).

Du solltest das Datenblatt des NRFs studieren, da sind all die Details beschrieben.

Whandall:
Ja. Robin2's NRF Tutorial hat ein Beipiel dazu (SimpleTxAckPayload.ino und SimpleRxAckPayload.ino).

Du solltest das Datenblatt des NRFs studieren, da sind all die Details beschrieben.

Werde ich machen, herzlichen Dank.