Arduino Funkübertragung - NRF24L01

OP #3441499
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!
Gast #3442789
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.
Gast #3442826
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)
#3442960
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
#3442963
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
Gast #3442991
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.
Gast #3443000
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?
Gast #3443024
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!!
#3443026
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.
Gast #3443139
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.
#3443249
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. ;-)
Gast #3444203
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)
#3444292
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!
#3444333
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.
Gast #3444392
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 :)
#3444481
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.
Gast #3444496
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.
OP #3444794
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!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren