Arduino Funkübertragung - NRF24L01

OP #3441499
Hallo
Ich möchte in Zukunft gerne einige Projekte mit Funkübertragung machen 
und habe deshalb ein paar NRF24L01 Funkchips im EbAY bestellt. Nun sind 
diese angekommen und ich habe begonnen zu versuchen eine Verbindug 
herzustellen. Und das ist auch das Problem! Es kommt keine Verbindung 
zustande!
Hier der Code des Senders:
1
#include <SPI.h>
2
#include <RF24.h>
3
#include <nRF24L01.h>
4
#include <RF24_config.h>
5

6

7

8
RF24 radio(9,10);
9
void setup(){
10
  radio.begin();
11
  radio.openWritingPipe(0xF0F0F0F0D2LL);
12
}
13
void loop(){
14
 char text[]="Hallo";
15
 radio.write( &text,5);
16
 delay(1000);
17
}
Hier der Code des Empfängers:
1
#include <SPI.h>
2
#include <RF24.h>
3
#include <nRF24L01.h>
4
#include <RF24_config.h>
5

6

7

8
RF24 radio(9,10);
9
void setup(){
10
  radio.begin();
11
  Serial.begin(57600);
12
  radio.openReadingPipe(1,0xF0F0F0F0D2LL);
13
  radio.startListening();
14
  
15
}
16
void loop(){
17
 char text[6];
18
 if(radio.available()){
19
   radio.read( &text,5);
20
   Serial.println(text);
21
 }
22
 
23
 delay(1000);
24
}
Der Sender ist ein ATMEGA328p, der Empfänger ein AArduino UNO (wegen 
Serial).
Angeschlossen sind die Chips so:
http://yourduino.com/docs/nRF24L01-Modules-connection-diagram.pdf

Ich hoffe, ihr könnt mir helfen!
Gast
Roman B. schrieb:
> was meinst du mit eigentlichem code?
> Das ist alles! Es soll ja nur ein Test sein. Was fehlt dir denn?

Der Code zu den RF24.h und nRF24L01.h z.B.

Was mir generell auffällt

Roman B. schrieb:
> radio.openWritingPipe(0xF0F0F0F0D2LL);

Das LL am Ende irritiert mich etwas. Ist das hier nötig?

Roman B. schrieb:
> char text[]="Hallo";
>  radio.write( &text,5);

text ist bereits ein Zeiger. Es kommt mir komisch vor dass du die 
Adresse von text übergibst. Kann natürlich richtig sein aber dazu müsste 
man den Code von radio.wirte() kennen.
Gast
die include Dateien sind aus der rf24 library. das mit dem text stimmt, 
allerdings müsste dann ja wenigstens die Adresse gesendet werden, aber 
es wird gar nichts gesendet!(zumindest empfange ich nichts)
Hallo Roman,

dein Code funtioniert (teilweise). Wenn ich auf der Senderseite RESET 
drücke, dann kommt beim Empfänger "Hallo}ç" an.
Also Funkverbindung steht.
Der Test läuft mit 2 Arduino UNO, einer ist R2, der andere R3. Ich habe 
allerdings in meiner Schaltung eine kleine Änderung. Der RF24 ist am 
SPI, geht ja nicht anders ;-). CE an 8 und CSN an 9. Soweit ist es ja 
noch so wie bei dir. Allerdings habe ich festgestellt, dass der Arduino 
mit dem RF24 nicht ganz kompatibel ist. Somit habe ich den Arduino auf 
3,3 V umgebaut. Ich habe einfach VCC (PIN7) auf 3,3 V gelegt. Von 5 V 
habe ich ihn natürlich getrennt.
Jetzt höre ich schon alle brüllen, dass er jetzt mit 16 MHz ausserhalb 
der Spezifikationen läuft. Ja, es ist mir bewusst.
Desweiteren habe ich per ISP die Brownoutschwelle heruntergesetzt, sonst 
läuft der ATmega 328P nicht bei 3,3 V.

Was hast du ansonsten mit der Funkübertragung vor?

Gruß
Guido
Hallo Roman,

1. Wie ist der Atmega328P angeschlossen? Die Arduino Pin-Nummern 
entsprechen ja NICHT den Pin-Nummern des IC's.

2. Der Sender sendet die String-Ende-Kennung nicht mit. Der Empfänger 
muss sie also noch anfügen bevor Serial.println mit dem empfangenen Text 
aufgerufen wird.

LG, Sebastian
Gast
Also liegt es bei mir an der schaltung? Die PinNummern habe ich 
berücksichtigt. Wieso hast du die pins auf 8 und 9 gelegt? geht es mit 9 
und 10 nicht? Momentan habe ich noch keine konkreten Vorstellungen, was 
ich mit der Funkübertragung machen möchte. Vielleicht eine 
Funklichtschranke oder als steuerung für einen roboter.
Gast
Das String ende habe ich noch nicht angefügt,weil es ja nur ein Testist 
und es mirdabei nicht auf eine korrekte darstellung des strings ankommt. 
Was hastdu noch per isp geändert? die chip habe ich am arduino auf 3.3v 
gelegt und beim atmega mit 2 dioden versehen, so dass auch ungefähr 3.3v 
zustande kommen. Geht das so nicht?
Gast
Danke für die schnelle Hilfe. Ich pribier es morgen oder später mal mit 
der \0 am String-Ende und hoffe,dass es nicht an der Schaltung liegt! 
RESET kann ich am sender leider nicht drücken, weil ich auf die 
Platine(Sender) keine Reset schaltung gelötet habe (nur 10k-Widerstand 
auf Vcc). Mal schauen ob es dann geht!!
Ich vermute, dass der Arduino die Signale vom RF24 nicht sicher erkennt.
Die Ausgänge sind OK, da der nRF24L01 (ich habe noch ein + dahinter) an 
den Eingängen 5V kompatibel ist. Wenn aber das Signal vom RF24 zum 
Arduino nicht ganz 3,3 V ist, kann es sein, dass es nicht immer als "H" 
erkannt wird.
Gast
haabe mal nachgerechnete: mit den dioden komme ich auf 3.4v am vcc des 
chips. Ist das zu viel? falls ja, wie bekomme ich die 0.1v weg? mit 
einem Widerstand? dann müsste ich aber die benötigte Stromstärke kennen, 
was momentan nicht der Fall ist.
Ich denke, dass die Dioden OK sind.
Versuch mal die Versorgungsspannung des Prozessors etwas zu reduzieren. 
Ich habe festgestellt, dass bei ca. 4 V die Kommunikation mit dem 
nRF24L01+ besser ist. Allerdings solltest du nicht zu tief gehen, da 
sonst die im Prozessor "eingebaute Sicherung" Brown out detection 
ansprechen könnte. Das kannst du mit dem Testprogramm "Blink" testen. 
Wenn es blinkt, ist alles OK. Du kannst natürlich die Brown out 
detection auch aussschalten, dann kannst du auf 3,3 V runter gehen.

Das Programm habe ich mal etwas verändert, so funktioniert es:
1
//SENDER
2

3
#include <SPI.h>
4
#include <RF24.h>
5
#include <nRF24L01.h>
6
#include <RF24_config.h>
7

8
RF24 radio(9,10);
9

10
void setup()
11
{
12
  Serial.begin(57600);
13
  radio.begin();
14
  radio.openWritingPipe(0xF0F0F0F0D2LL);
15
}
16

17
void loop()
18
{
19
  radio.stopListening();
20
  char text[]="Hallo";
21
  Serial.print("Senden:");
22
  if (radio.write( &text,sizeof(text)))
23
  {
24
    Serial.println("..OK");
25
  }
26
  else
27
  {
28
    Serial.println("..Fehler");
29
  }
30
  radio.startListening();
31
  delay(1000);
32
}

1
//EMPFÄNGER
2

3
#include <SPI.h>
4
#include <RF24.h>
5
#include <nRF24L01.h>
6
#include <RF24_config.h>
7

8
RF24 radio(9,10);
9

10
void setup(){
11
  radio.begin();
12
  Serial.begin(57600);
13
  radio.openReadingPipe(1,0xF0F0F0F0D2LL);
14
  radio.startListening();
15
}
16

17
void loop()
18
{
19
  char text[6];
20
  if(radio.available())
21
  {
22
    radio.read( &text,6);
23
    Serial.println(text);
24
  }
25
}

Jetzt will ich aber eine Erfolgsmeldung. ;-)
Gast
Das sieht vielversprechend aus!Danke ich probiere es heute nachmittag 
gleich aus!! Wieso läuft der Atemhauch normalerweise nicht auf 3.3 v? 
laut Datenblatt sollte er sogar bis 1.9v laufen.
Gast
Habs jetzt ausprobiert! Leider noch immer keine Verbindung :(
Im Anhang sind Fotos der Platine(Sender). Vielleicht entdeckt da ja 
jemand einen Fehler, den ich übersehen habe! Auf Empfängerseite habe ich 
nur zwei 4-Pin Header auf ein Stuck Platine gelötet, und auf die andere 
Seite zwei 4-Pin Stiftleisten. Das ganze stecke ich in ein Breadboard 
und verkabel es dann mit dem Arduino.(Foto auch im Anhang)
Hallo!

Ich habe mir mal den UNO angesehen. Soweit ich erkennen kann, ist die 
Verdrahtung OK.
Mit diesem UNO kannst du meinem Vorschlag nicht folgen, da er aufgelötet 
ist. Ich habe DIL-Gehäuse auf Sockel.
Nun habe ich auch keine Idee mehr.
Man könnte den Sender mal auf den UNO spielen, dann ist etwas auf COMxx 
zu sehen. Das sagt aber nicht viel aus. Ich habe gerade mal den RF24 
getrennt und das Programm laufen lassen. Leider sieht die Ausgabe dann 
genauso aus, wie wenn er angeschlossen ist. Schade!
Gast
Trotzdem danke für die Hilfe. Vielleicht bastle ich noch eine zweite 
Platine, wenn es mit dem uno nicht geht. Falls ich das Problem löse, 
poste ich die Lösung.
Was mir nicht so ganz gefällt, sind die zwei Dioden auf deiner 
Lochrasterplatte, die den RF24 versorgen. Über 2 Dioden ensteht ein 
Spannungsabfall von 1,4 V. Wenn du 5 V Versorgung hast, dann kommst du 
auf 3,6 V. Ich weiß nicht, ob der Schaltkreis das verträgt. Das liegt 
ca. 10 % über der angegeben Versorgungsspannung von 3,3 V. Ein 
Spannungsregler wäre besser.
Wie ich sehe, hast du den ATmega aufgelötet. Somit kann er nur per ISP 
programmiert werden. Versorgst du die Schaltung über den ISP? Welchen 
ISP hast du? Sind die FUSE-Bits richtig? Kann der ISP-Programmer auch 
3,3 V?

Da fällt mir ein, du hast doch 3,3 V. Aus deinem UNO kommen 3,3 V. Ich 
weiß jetzt nicht, wie belastbar die sind, aber für einen ATmega wird es 
wohl reichen. Die LED würde ich dann aus lassen.
Gast
Als isp nutze ich den Arduino. Die Schaltung wird mit 9V versorgt. 6 
dioden vor dem atmega macht 4.2 v spannnungsabfall. 2 zusätzlich vor dem 
funkchip führen zu 3.4v.  Ich hoffe das stimmt so. Der atmega läuft 
zumindest :)
Jetzt habe ich etwas entdeckt, womit du testen kannst, ob der RF24 
richtig angeschlossen ist.
Ich habe es nach "radio.begin();" eingefügt:
1
  if (radio.isPVariant())
2
  {
3
    Serial.println("nRF24L01+ erkannt ..OK");
4
  }
5
  else
6
  {
7
    Serial.println("..Fehler");
8
  }


PS: Wo wohnst du? Vielleicht ist es um die Ecke. Ich bin in der Nähe von 
Oranienburg oder Berlin.
Gast
In Wien. doch nicht um die ecke :)
Aber danke für den tipp. das füge ich in meinen code ein und mal sehen 
ob es funktioniert! Die led werde ich auf einen anderen pin hängen und 
dann als debug ausgabe nutzen.
OP
Hallo
Jetzt funktioniert es!!!! :)
Man muss noch den Channel setzen!
Hier der Code:
Empfänger:
1
//EMPFÄNGER
2

3
#include <SPI.h>
4
#include <RF24.h>
5
#include <nRF24L01.h>
6
#include <RF24_config.h>
7

8
RF24 radio(9,10);
9

10
void setup(){
11
  radio.begin();
12
  radio.setChannel(2);
13
  Serial.begin(57600);
14
  if (radio.isPVariant())
15
  {
16
    Serial.println("nRF24L01+ erkannt ..OK");
17
  }
18
  else
19
  {
20
    Serial.println("..Fehler");
21
  }
22
  radio.openReadingPipe(1,0xF0F0F0F0D2LL);
23
  radio.startListening();
24
}
25
int i=0;
26
void loop()
27
{
28
  char text[6];
29
  if(radio.available())
30
  {
31
    radio.read( &text,6);
32
    Serial.print(i++);
33
    Serial.println(text);
34
  }
35
}
Sender:
1
#include <SPI.h>
2
#include <RF24.h>
3
#include <nRF24L01.h>
4
#include <RF24_config.h>
5

6
RF24 radio(9,10);
7

8
void setup()
9
{
10
  radio.begin();
11
  radio.setChannel(2);
12
  if (radio.isPVariant())
13
  {
14
   
15
  }
16
  else
17
  {
18
 
19
  }
20
  radio.openWritingPipe(0xF0F0F0F0D2LL);
21
}
22

23
void loop()
24
{
25
  radio.stopListening();
26
  char text[]="Hallo";
27
  if (radio.write( &text,sizeof(text)))
28
  {
29
    
30
  }
31
  else
32
  {
33
   
34
  }
35
  radio.startListening();
36
  delay(1000);
37
}
Vielen Dank für eure Hilfe!!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.