Verzweiflung bei nrf24l01

Hallo an alle

Ich habe vor 2 Wochen auf Youtube ein Tutorial von dem nrf20l01 gesehen.

Darauf hin habe ich mir 2 Module gekauft.

Ich bekomme aber keine Verbindung zwischen den 2 Arduinos zustande.

Modul nrf20l01 Arduino
Pin1 = Gnd GND
Pin2 = +3.3V +3.3V
Pin3 = CE D7
Pin4 = CSN D8
Pin5 = SCK D13
Pin6 = MOSI D11
Pin7 = MISO D12
Pin8 = nc nc

Der Test code von dem Video ist der

(Sender)

#include <SPI.h>  
#include "RF24.h"

RF24 myRadio (7, 8);
byte addresses[][6] = {"0"};

struct package
{
  int id=1;
  float temperature = 18.3;
  char  text[100] = "Text to be transmitted";
};


typedef struct package Package;
Package data;


void setup()
{
  Serial.begin(115200);
  delay(1000);
  myRadio.begin();  
  myRadio.setChannel(115); 
  myRadio.setPALevel(RF24_PA_MAX);
  myRadio.setDataRate( RF24_250KBPS ) ; 
  myRadio.openWritingPipe( addresses[0]);
  delay(1000);
}

void loop()
{
  myRadio.write(&data, sizeof(data)); 

  Serial.print("\nPackage:");
  Serial.print(data.id);
  Serial.print("\n");
  Serial.println(data.temperature);
  Serial.println(data.text);
  data.id = data.id + 1;
  data.temperature = data.temperature+0.1;
  delay(1000);

}

Empfänger

#include <SPI.h>  
#include "RF24.h" 

RF24 myRadio (7, 8); 
struct package
{
  int id=0;
  float temperature = 0.0;
  char  text[100] ="empty";
};

byte addresses[][6] = {"0"}; 



typedef struct package Package;
Package data;

void setup() 
{
  Serial.begin(115200);
  delay(1000);

  myRadio.begin(); 
  myRadio.setChannel(115); 
  myRadio.setPALevel(RF24_PA_MAX);
  myRadio.setDataRate( RF24_250KBPS ) ; 
  myRadio.openReadingPipe(1, addresses[0]);
  myRadio.startListening();
}


void loop()  
{

  if ( myRadio.available()) 
  {
    while (myRadio.available())
    {
      myRadio.read( &data, sizeof(data) );
    }
    Serial.print("\nPackage:");
    Serial.print(data.id);
    Serial.print("\n");
    Serial.println(data.temperature);
    Serial.println(data.text);
  }

}

Was mache ich da falsch.

Wäre für hilfe dankbar

Stefan

In der setup() fehlt:

pinMode(SS,OUTPUT);

Zusätzlichen Kondensator an der Versorgung des NRF montiert?
min 10µF sind Pflicht für einen stabilen Betrieb.

Ansonsten... KA...

Hallo combie

Das habe ich schon gemacht habe es nur vergessen zu schreiben.

Danke Stefan

Versuche mal die Beispiele vo hier:
http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
http://arduino-info.wikispaces.com/nRF24L01-RF24-Examples
Ich habe mit dem Bespielsketch eine Verbindung hinbekommen.
Außerdem: hast du die Module mit 3,3V gespeist? Mehr vertragen die nicht an Betriebsspannung. Weiterhin sollte direkt an den Modulpins ein 100n KerKo und ein 10µF Elko angelötet werden, damit es zu keinen Spannungseinbrüchen kommt. Bei mir hat das so funktioniert. Ansonsten beachte die Ausführungen, das manche au den Arduinos on board vorhandnen Spannungsregler nicht genug Strom liefern können und teste die low power Einstellungen, ob es mit denen funktioniert. Des weiteren sind faktisch alle billigen Chinamodule mit gefakten NRF Chips bestückt sind, die ebenfalls Probleme machen können Nordic NRF24L01+ - real vs fake : weekend die-shot : ZeptoBars

Hallo nix_mehr_frei
Ja ich habe die Module mit 3.3 Volt gespeist.
Das die Arduinos nicht genug Strom liefer können habe ich auch gelesen, deshalb habe ich eine Extrene Stromversorung mit einem Lm 1117 gemacht. Es kommen dann 3.28 Volt am Modul an.
Was ich nicht gemacht habe sind die 100 nF , und das werde ich jetzt mal Probieren.
Die Module sind von China

Danke Stefan

Hallo

Habe jetzt noch 100nF angelötet , und jetzt gehts auf einmal.

Danke

Hallo
Jetzt habe ich den Code fertig.
Ich will die Werte von einem LDR übertragen .
Senderseite werden auch die korrekten Werte in Serial Monitor angezeigt .
Aber auf der Empfängerseite wird nur Müll im Serial Monitor angezeigt .
Habe das von einem Beispielcode übernommen.
Was ist daran Falsch.
Bitte um einen Tip.
Danke Stefan

1 Code ist Sender
2 Code ist Empfänger

//Sender
#include <SPI.h>
#include "RF24.h"
#define ldr A5
int veri[1];
RF24 myRadio (7, 8);

struct Packet
{
  int id = 1;
};

byte addresses[][6] = {"0"};
typedef struct package Package;
Packet data;

void setup()
{
  Serial.begin(115200);
  delay(1000);
  myRadio.begin();
  myRadio.setChannel(115);
  myRadio.setPALevel(RF24_PA_MAX);
  myRadio.setDataRate( RF24_250KBPS ) ;
  myRadio.openWritingPipe( addresses[0]);
}
void loop()
{
  myRadio.write(&data, sizeof(veri[1]));
  veri[1] = analogRead(ldr);
  veri[1] = map(veri[1], 0, 1023, 0, 512); //
  Serial.print("\nPacket:");
  Serial.print(data.id);
  Serial.print("\n");
  Serial.print(veri[1]); //
  data.id = data.id + 1 ;
}
//Empfänger
#include <SPI.h>
#include "RF24.h"
int veri[1];
RF24 myRadio (7, 8);

struct Packet
{
  int id = 0;
};

byte addresses[][6] = {"0"};
typedef struct package Package;
Packet data;

void setup()
{
  Serial.begin(115200);
  delay(1000);
  myRadio.begin();
  myRadio.setChannel(115);
  myRadio.setPALevel(RF24_PA_MAX);
  myRadio.setDataRate( RF24_250KBPS ) ;
  myRadio.openReadingPipe(1, addresses[0]);
  myRadio.startListening();
}
void loop()
{
  if ( myRadio.available())
  {
    while (myRadio.available())
    {
      myRadio.read(&data, sizeof(veri[1]));
    }
    Serial.print(veri[1]); //
    Serial.print("\t");
    Serial.println(); //
    Serial.print("\nPacket:");
    Serial.print(data.id);
    Serial.print("\n");
  }

}

Wer hat denn dieses 'Beispiel' erstellt?

Hast du einen Link?

Der Kode ist ziemlicher Quatsch.
Es wird etwas anderes gedruckt als gesendet bzw empfangen.
LDR Werte werden überhaupt nicht übertragen.

In Receiver und Transmitter wird lustig hinter den Array veri geschrieben und gelesen. :confused:

Hallo

Der Grundcode ist von

Das mit dem Array habe ich in Netz gefunden .

Ich muss eine Art Zugangskontrolle machen.
Das heist auf eine Seite des Grundstückes kommt eine Laserdiode und auf die andere Seite soll der LDR dann von der Laserdiode angestrahlt werden.

Wenn das mit eimem LDR nicht geht was kann ich dann nehmen .

Danke Stefan

Wenn du Arrays verwendest solltest du auch verstehen was gemacht wird. Und nicht auf Indizes zugreifen die nicht existieren. Ein Array der Größe N geht von 0 bis N - 1

Ein Array der Größe 1 kann sowieso durch eine Variable ersetzt werden!

Hallo

Den Code mit dem Array habe ich im Netz gefunden.
Kannst du mir das mal mit dem Array der Größe ("\n") erklären.
Ich habe noch nicht all zu viel Erfahrung mit dem Programmieren.

Danke Stefan

Den Code mit dem Array habe ich im Netz gefunden.

Man sollte halt nicht alles einfach übernehmen. Es gibt auch viel falsches.

Du hast ein Array das ein Element einhält. Das hat den Index 0. 1 ist ungültiger Speicher. Wenn du auf [1] lesend zugreifst kommt Unsinn heraus. Wenn du darauf schreibst bringst du wahrscheinlich dein Programm zum Absturz. In C/C++ musst da da ganz gut aufpassen, da bei Arrays nichts überprüft wird.

Allgemein hat z.B. ein Array der Größe 5 die Indizes 0 bis 4. Eben maximal eins weniger als die Größe, da man bei 0 anfängt zu zählen.

Hallo Serenifly

Wie kann ich das Problem den jetzt lösen.
Bin grade dabei mich mal mit den Arrays zu beschäftigen.

Danke Stefan

Vergiss die Arrays für diese Anwendung.

Ich denke dein 'Beispiel' könnte eher so funktionieren:

//Sender
#include <SPI.h>
#include "RF24.h"

const byte ldrPin = A5;

RF24 Radio (7, 8);

struct Packet {
  int id;
  int ldrRaw;
  byte ldrMapped;
} data;

byte address[6] = { "0test" };

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Receiver"));
  data.id = 1;
  Radio.begin();
  Radio.setChannel(76);  // 115 > 2.5MHz
  Radio.setPALevel(RF24_PA_MAX);
  Radio.setDataRate(RF24_250KBPS) ;
  Radio.openWritingPipe(address);
}
void loop()
{
  static unsigned long lastSend;
  if (millis() - lastSend > 500) {
    lastSend = millis();
    data.ldrRaw = analogRead(ldrPin);
    data.ldrMapped = data.ldrRaw >> 2;
    Serial.print(F("Packet "));
    Serial.print(data.id);
    Serial.print(F(" raw "));
    Serial.print(data.ldrRaw);
    Serial.print(F(" byte "));
    Serial.println(data.ldrMapped);
    Radio.write(&data, sizeof(data));
    data.id = data.id + 1;
  }
}
//Empfänger
#include <SPI.h>
#include "RF24.h"
RF24 Radio (7, 8);

struct Packet {
  int id;
  int ldrRaw;
  byte ldrMapped;
} data;

byte address[6] = { "0test" };

void setup()
{
  Serial.begin(115200);
  Radio.begin();
  Serial.println(F("Receiver"));
  Radio.setChannel(76);
  Radio.setPALevel(RF24_PA_MAX);
  Radio.setDataRate(RF24_250KBPS) ;
  Radio.openReadingPipe(1, address);
  Radio.startListening();
}
void loop()
{
  if ( Radio.available())
  {
    Radio.read(&data, sizeof(data));
    Serial.print(F("Received "));
    Serial.print(data.id);
    Serial.print(F(" raw "));
    Serial.print(data.ldrRaw);
    Serial.print(F(" byte "));
    Serial.println(data.ldrMapped);
  }
}

Meiner Ansicht nach war auch eine zu hohe (u.U. illegale) Frequenz von 2.515 MHz eingestellt.
Ich lasse den Wert jetzt zwei mal in der Sekunde übertragen, sowohl roh als auch berechnet.
Ich habe den Kram nur compiled, nicht getestet.

Wenn du mit einem Array arbeiten willst, wäre es ganz gut die Beschreibung zum Array zu lesen- da gibt es im Arduino Tutorial eigentlich ganz gute Tipps...

Prinzipiell hast du eine Array mit mehreren Stellen wie z.b.:

long meineWerte[4] = {Wert1, Wert2, Wert3, Wert4};

willst du auf nun einen Wert davon setzen sagst du:

meineWerte[0] = Wert1;
meineWerte[1] = Wert2;
.....

der Wert in der eckigen Klammer zeigt dir also welche Stelle du in dem Array lesen oder schreiben willst- die erste Stelle ist aber immer die [0]

Achtung man kann aber keine Werte mit einem Schub von einem Array ins ander schieben:

MeineWerte[] = DeineWert[]; funktioniert (leider) nicht....

Hallo Whandall

Danke für den SUPER CODE
Wenn ich den code jetzt richtig versanden habe,
ist der raw der Wert des LDRs und byte ist die größe des gesendenten Packets .

Wo kann man das lernen.

Danke Stefan

Es werden halt beide Werte, der gelesene (ein int) und der in ein Byte gewandelte, übertragen und ich hoffe auf beiden Seiten ordentlich ausgedruckt.
Ich sehe da keine echte Verwendung von Arrays, die Paket Struktur erlaubt da mehr als ein Array.

Wo kann man was lernen?

Hallo

Das man weis für welche Anwendung was am sinnvollsten ist.

Danke Stefan

Bei tabellarischen homogenen Daten (mehrere/viele gleiche Elemente) würde ich Arrays benutzen,
zum Zusammenfassen mehrerer verschiedener Daten(typen) nähme ich eine struct oder class,
ansonsten den Datentyp der meinen Anwendungsbereich abdeckt.

So wie ich zum Braten eine Pfanne und zum Grillen einen Grill nähme... da gibt es nicht viel zu lernen finde ich.