Forum: Mikrocontroller und Digitale Elektronik Arduino Funkübertragung - NRF24L01


von R. B. (dxx255)


Lesenswert?

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!

von René K. (cyprius)


Lesenswert?

Deine Schnipsel zeigen ja jetzt nur die Einbindung und Nutzung deiner 
Lib. Wo ist denn der eigentliche Code? So kann man nur raten..

von Roman B. (Gast)


Lesenswert?

was meinst du mit eigentlichem code?
Das ist alles! Es soll ja nur ein Test sein. Was fehlt dir denn?

von Roman B. (Gast)


Lesenswert?

Hat denn keiner eine Idee?

von Hubsy (Gast)


Lesenswert?

Das 11. Gebot: Du sollst posten Software, Schaltplan, Skizze und alles 
was sonst noch zum Projekt gehört oder schweigen für immer.

Siehe auch Beitrag "Re: Arduino Funkübertragung - NRF24L01"

von Roman B. (Gast)


Lesenswert?

Hab ich doch! Software,Schaltung,...

von Marcel (Gast)


Lesenswert?

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.

von Jim M. (turboj)


Lesenswert?

Marcel schrieb:
> Roman B. schrieb:
>> radio.openWritingPipe(0xF0F0F0F0D2LL);
>
> Das LL am Ende irritiert mich etwas. Ist das hier nötig?

Das sind fünf Byte, das passt nur in einen long Long a 64 Bit.

von Roman B. (Gast)


Lesenswert?

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)

von Guido S. (flintstone)


Lesenswert?

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

von Sebastian W. (wangnick)


Lesenswert?

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

von Roman B. (Gast)


Lesenswert?

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.

von Roman B. (Gast)


Lesenswert?

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?

von Guido S. (flintstone)


Lesenswert?

Es sollte mit 9 und 10 auch gehen.
Ich habe es nur geändert weil ich auch einen Ethernet Arduino habe. Bei 
dem ist 10 belegt.

Ich stecke mal auf 9, 10 um. Moment!

von Guido S. (flintstone)


Lesenswert?

Wie erwartet, funtioniert es auch mit 9,10. Allerdings tut sich nur 
etwas, wenn ich auf Senderseite RESET drücke.
Ich denke, dass noch irgendetwas fehlt, um zu sagen, dass die 
Zeichenkette zu Ende ist.

von Roman B. (Gast)


Lesenswert?

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!!

von Guido S. (flintstone)


Lesenswert?

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.

von Roman B. (Gast)


Lesenswert?

Kann ich dieses Problem auch ohne spannungswandler lösen(hab keinen auf 
3.3v daheim)

von Guido S. (flintstone)


Lesenswert?

Mit der \0 am Ende der Zeichenkette habe ich probiert.
Es geht auch nur nach einem RESET des Senders. Es kommt dann 2 x Hello 
mit den zwei Zeichen dahinter. Dann tut sich nichts mehr.

von Roman B. (Gast)


Lesenswert?

irgendeine Idee warum? Ich bin etwas ratlos.

von Roman B. (Gast)


Lesenswert?

Oder Verbesserungvorschläge?

von Roman B. (Gast)


Lesenswert?

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.

von Guido S. (flintstone)


Lesenswert?

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. ;-)

von Roman B. (Gast)


Lesenswert?

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.

von Roman B. (Gast)


Lesenswert?

Atemhauch soll atmega sein! Sch*** autokorrektur

von Roman B. (Gast)


Lesenswert?

??

von Roman B. (Gast)



Lesenswert?

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)

von Roman B. (Gast)


Lesenswert?

Weiß denn keiner Rat?

von Guido S. (flintstone)


Lesenswert?

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!

von Roman B. (Gast)


Lesenswert?

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.

von Guido S. (flintstone)


Lesenswert?

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.

von Roman B. (Gast)


Lesenswert?

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 :)

von Guido S. (flintstone)


Lesenswert?

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.

von Roman B. (Gast)


Lesenswert?

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.

von Roman B. (Gast)


Lesenswert?

Die NRF24L01 werden sowohl auf Sender- als auch auf Empfängerseite 
erkannt(durch obige Methode), allerdings kommt das Hallo nicht an!

von Roman B. (Gast)


Lesenswert?

Muss ich vielleicht den channel setzten?

von Roman B. (Gast)


Lesenswert?

????

von R. B. (dxx255)


Lesenswert?

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!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.