mikrocontroller.net

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


Autor: Roman B. (dxx255)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>
#include <RF24_config.h>



RF24 radio(9,10);
void setup(){
  radio.begin();
  radio.openWritingPipe(0xF0F0F0F0D2LL);
}
void loop(){
 char text[]="Hallo";
 radio.write( &text,5);
 delay(1000);
}
Hier der Code des Empfängers:
#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>
#include <RF24_config.h>



RF24 radio(9,10);
void setup(){
  radio.begin();
  Serial.begin(57600);
  radio.openReadingPipe(1,0xF0F0F0F0D2LL);
  radio.startListening();
  
}
void loop(){
 char text[6];
 if(radio.available()){
   radio.read( &text,5);
   Serial.println(text);
 }
 
 delay(1000);
}
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!

Autor: René K. (cyprius)
Datum:

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

Autor: Roman B. (Gast)
Datum:

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

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn keiner eine Idee?

Autor: Hubsy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich doch! Software,Schaltung,...

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Guido S. (flintstone)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian W. (wangnick)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Guido S. (flintstone)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Guido S. (flintstone)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Guido S. (flintstone)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roman B. (Gast)
Datum:

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

Autor: Guido S. (flintstone)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
irgendeine Idee warum? Ich bin etwas ratlos.

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder Verbesserungvorschläge?

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Guido S. (flintstone)
Datum:

Bewertung
0 lesenswert
nicht 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:
//SENDER

#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>
#include <RF24_config.h>

RF24 radio(9,10);

void setup()
{
  Serial.begin(57600);
  radio.begin();
  radio.openWritingPipe(0xF0F0F0F0D2LL);
}

void loop()
{
  radio.stopListening();
  char text[]="Hallo";
  Serial.print("Senden:");
  if (radio.write( &text,sizeof(text)))
  {
    Serial.println("..OK");
  }
  else
  {
    Serial.println("..Fehler");
  }
  radio.startListening();
  delay(1000);
}

//EMPFÄNGER

#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>
#include <RF24_config.h>

RF24 radio(9,10);

void setup(){
  radio.begin();
  Serial.begin(57600);
  radio.openReadingPipe(1,0xF0F0F0F0D2LL);
  radio.startListening();
}

void loop()
{
  char text[6];
  if(radio.available())
  {
    radio.read( &text,6);
    Serial.println(text);
  }
}

Jetzt will ich aber eine Erfolgsmeldung. ;-)

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Atemhauch soll atmega sein! Sch*** autokorrektur

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
??

Autor: Roman B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiß denn keiner Rat?

Autor: Guido S. (flintstone)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Guido S. (flintstone)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Guido S. (flintstone)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt habe ich etwas entdeckt, womit du testen kannst, ob der RF24 
richtig angeschlossen ist.
Ich habe es nach "radio.begin();" eingefügt:
  if (radio.isPVariant())
  {
    Serial.println("nRF24L01+ erkannt ..OK");
  }
  else
  {
    Serial.println("..Fehler");
  }


PS: Wo wohnst du? Vielleicht ist es um die Ecke. Ich bin in der Nähe von 
Oranienburg oder Berlin.

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roman B. (Gast)
Datum:

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

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss ich vielleicht den channel setzten?

Autor: Roman B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
????

Autor: Roman B. (dxx255)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Jetzt funktioniert es!!!! :)
Man muss noch den Channel setzen!
Hier der Code:
Empfänger:
//EMPFÄNGER

#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>
#include <RF24_config.h>

RF24 radio(9,10);

void setup(){
  radio.begin();
  radio.setChannel(2);
  Serial.begin(57600);
  if (radio.isPVariant())
  {
    Serial.println("nRF24L01+ erkannt ..OK");
  }
  else
  {
    Serial.println("..Fehler");
  }
  radio.openReadingPipe(1,0xF0F0F0F0D2LL);
  radio.startListening();
}
int i=0;
void loop()
{
  char text[6];
  if(radio.available())
  {
    radio.read( &text,6);
    Serial.print(i++);
    Serial.println(text);
  }
}
Sender:
#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>
#include <RF24_config.h>

RF24 radio(9,10);

void setup()
{
  radio.begin();
  radio.setChannel(2);
  if (radio.isPVariant())
  {
   
  }
  else
  {
 
  }
  radio.openWritingPipe(0xF0F0F0F0D2LL);
}

void loop()
{
  radio.stopListening();
  char text[]="Hallo";
  if (radio.write( &text,sizeof(text)))
  {
    
  }
  else
  {
   
  }
  radio.startListening();
  delay(1000);
}
Vielen Dank für eure Hilfe!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.