Forum: Mikrocontroller und Digitale Elektronik nRF24L01+ und Arduino Nano


von sunshineh (Gast)


Lesenswert?

Ich habe die Hardware 2x identisch aufgebaut. Den nRF24L01 habe ich 
jeweils mit externer Antenne.

Folgendes Softwarepaket habe ich heruntergeladen und die GettingStarted 
Datei geöffent und einem Board die RadioNumber 1 und dem anderen die 
RadioNumber 0 gegeben

https://github.com/TMRh20/RF24

Auf dem einen Board scheint alles wie gewünscht zu funktionierten, je 
nach Eingabe (T oder R) versucht er zu senden, oder eben zu empfangen.

Auf dem anderen Board habe ich Probleme! Es reagiert auf keine meiner 
Eingaben. Im Code habe ich noch folgende Ausgaben ergänzt
1
#include <SPI.h>
2
#include "RF24.h"
3
4
/****************** User Config ***************************/
5
/***      Set this radio as radio number 0 or 1         ***/
6
bool radioNumber = 1;
7
8
/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
9
RF24 radio(7,8);
10
/**********************************************************/
11
12
byte addresses[][6] = {"1Node","2Node"};
13
14
// Used to control whether this node is sending or receiving
15
bool role = 0;
16
17
void setup() {
18
  Serial.begin(115200);
19
  Serial.println(F("RF24/examples/GettingStarted"));
20
  Serial.println(F("*** PRESS 'T' to begin transmitting to the other node"));
21
  
22
  radio.begin();
23
24
  // Set the PA Level low to prevent power supply related issues since this is a
25
 // getting_started sketch, and the likelihood of close proximity of the devices. RF24_PA_MAX is default.
26
  radio.setPALevel(RF24_PA_LOW);
27
  
28
  // Open a writing and reading pipe on each radio, with opposite addresses
29
  if(radioNumber){
30
    radio.openWritingPipe(addresses[1]);
31
    radio.openReadingPipe(1,addresses[0]);
32
  }else{
33
    radio.openWritingPipe(addresses[0]);
34
    radio.openReadingPipe(1,addresses[1]);
35
  }
36
  
37
  // Start the radio listening for data
38
  radio.startListening();
39
}
40
41
void loop() {
42
  
43
  
44
/****************** Ping Out Role ***************************/  
45
if (role == 1)  {
46
       Serial.println(F("*** role = 1"));
47
   
48
    radio.stopListening();                                    // First, stop listening so we can talk.
49
    
50
    
51
    Serial.println(F("Now sending"));
52
53
    unsigned long start_time = micros();                             // Take the time, and send it.  This will block until complete
54
     if (!radio.write( &start_time, sizeof(unsigned long) )){
55
       Serial.println(F("failed"));
56
     }
57
        
58
    radio.startListening();                                    // Now, continue listening
59
    
60
    unsigned long started_waiting_at = micros();               // Set up a timeout period, get the current microseconds
61
    boolean timeout = false;                                   // Set up a variable to indicate if a response was received or not
62
    
63
    while ( ! radio.available() ){                             // While nothing is received
64
      if (micros() - started_waiting_at > 200000 ){            // If waited longer than 200ms, indicate timeout and exit while loop
65
          timeout = true;
66
          break;
67
      }      
68
    }
69
        
70
    if ( timeout ){                                             // Describe the results
71
        Serial.println(F("Failed, response timed out."));
72
    }else{
73
        unsigned long got_time;                                 // Grab the response, compare, and send to debugging spew
74
        radio.read( &got_time, sizeof(unsigned long) );
75
        unsigned long end_time = micros();
76
        
77
        // Spew it
78
        Serial.print(F("Sent "));
79
        Serial.print(start_time);
80
        Serial.print(F(", Got response "));
81
        Serial.print(got_time);
82
        Serial.print(F(", Round-trip delay "));
83
        Serial.print(end_time-start_time);
84
        Serial.println(F(" microseconds"));
85
    }
86
87
    // Try again 1s later
88
    delay(1000);
89
  }
90
91
92
93
/****************** Pong Back Role ***************************/
94
95
  if ( role == 0 )
96
  {
97
       Serial.println(F("*** role = 0"));    
98
    unsigned long got_time;
99
    
100
    if( radio.available()){
101
        Serial.println(F("*** Radio Available" ));                                    // While there is data ready
102
      while (radio.available()) {                                   // While there is data ready
103
        radio.read( &got_time, sizeof(unsigned long) );             // Get the payload
104
  Serial.println(F("***" ));       
105
      }
106
      Serial.println(F("*** Radio fertig gelesen" ));       
107
      radio.stopListening();                                        // First, stop listening so we can talk   
108
      radio.write( &got_time, sizeof(unsigned long) );              // Send the final one back.      
109
      radio.startListening();                                       // Now, resume listening so we catch the next packets.     
110
      Serial.print(F("Sent response "));
111
      Serial.println(got_time);  
112
   }
113
 }
114
115
116
117
118
/****************** Change Roles via Serial Commands ***************************/
119
120
  if ( Serial.available() )
121
  {
122
     Serial.println(F("*** Serial Avaiable  ***"));
123
    
124
    char c = toupper(Serial.read());
125
    Serial.println(c);
126
    if ( c == 'T' && role == 0 ){      
127
      Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
128
      role = 1;                  // Become the primary transmitter (ping out)
129
    
130
   }else
131
    if ( c == 'R' && role == 1 ){
132
      Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));      
133
       role = 0;                // Become the primary receiver (pong back)
134
       radio.startListening();
135
       
136
    }
137
  }
138
139
140
} // Loop

Als Ausgabe erhalte ich nur:
"*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"
"*** role = 0"
"*** Radio Available"
"***"
"***"
"***"
"***"
... also in der //Get the Payload-Schleife hänge ich fest!!

Was kann ich tun?!? Ist mein Funkchip defekt?? Die Anschlüsse bin ich 
mehrmals durchgegangen und habs auch nachgemessen.

von Mick (Gast)


Lesenswert?

Versuche mal diesen Befehl, um sicherzustellen, dass das Funkmodul auch 
korrekt erkannt wird.
1
Serial.println(radio.isChipConnected());

von bene_sch (Gast)


Lesenswert?

Habe vor kurzem ein Projekt damit gemacht und auch Probleme beim Senden 
und Empfangen gehabt.
Lösung war eine externe Spannungsversorgung, da die Teile beim 
Senden/Empfangen so hohe Ströme ziehen, dass es den Nano abschaltet 
(dannach kannst du das Modul auf PA_Max stellen) und noch dazu ein 4,7µF 
Transistor zwischen VCC und GND auf den Modulen eben auch wegen hohen 
Spitzenströmen, habe gelesen dass dieser sogar essentiell sein soll, war 
er bei mir auch weil die Teile sonst nur teilweise gesendet/empfangen 
haben, dannach einwandfrei.

von sunshineh (Gast)


Lesenswert?

Ich wollte mich nun nochmal an dieses Problem heranwagen und bin nach 
folgendem Tutorial vorgegangen:
https://www.youtube.com/watch?v=7rcVeFFHcFM


Beim Sender und Empfänger erhalte ich nach dem Setup ne 1 für diese 
Abfrage(Serial.println(radio.isChipConnected());), müsste also gehen.
Ob ich richtig verdrahtet habe, habe ich mehrfach kontrolliert!



Als Kondensator habe ich jeweils 10uF. Ich habe die nRF20L01+ Module mit 
externer SMA Antenne.
Aber leider Empfange ich keine Daten. Angeschlossen habe ich beide 
Boards über den USB Stecker am Notebook.

1)In der Arduino Entwicklungsumgebung kann ich ja immer nur einen 
seriellen Monitor öffnen. Wie kann ich mir den Sender und Empfänger 
gleichzeitig ansehen?

2)Macht es Sinn zusätzlich eine externe Spannung anzuschließen?
Wie kann ich das am sichersten und stabilsten machen?

von EmKo (Gast)


Lesenswert?

Zu 1) Mit Putty zum Beispiel
Zu 2) Ja wie oben schon erwähnt wegen den Spannungsspitzen. Ein Versuch 
ist es Wert. Bei mir funktioniert es ohne eine Externe Spannungsquelle.

von Christian M. (Gast)


Lesenswert?

sunshineh schrieb:
> In der Arduino Entwicklungsumgebung kann ich ja immer nur einen
> seriellen Monitor öffnen.

Zweite Instanz aufmachen...?!

Serial Monitor = jedes beliebige Terminalprogramm - Features

Gruss Chregu

von sunshineh (Gast)


Lesenswert?

Wie mache ich es mit der sauberen externen Spannungsquelle. Aktuell 
werden die beiden Boards über USB aus meinem Notebook versorgt.


Ich habe eine PowerSupply von Voltcraft. Soll ich dann die 3.3V für den 
Funkchip direkt von der holen oder besser den Arduino Nano mit 12V über 
den Vin Pin versorgen?

von Einer K. (Gast)


Lesenswert?

Der Nano bezieht seine 3,3V aus dem FTDI Chip.
Das reicht bei weitem nicht, um den nRF24L01-PA zu versorgen.

von Arduinoquäler (Gast)


Lesenswert?

Arduino F. schrieb:
> Der Nano bezieht seine 3,3V aus dem FTDI Chip.

Käse.

Der Arduino Nano läuft genau wie der Uno mit 5V und hat
seinen eigenen 5V Regler an Bord.

Richtig ist allerdings dass der FTD232 3.3V liefert und
diese Spannung etwas schwächlich sein kann um einen NRF24
zu versorgen, inbesondere wenn es die Version mit Power
Amplifier ist.

Um sauberen Aufbau mit kurzen Leitungen und Abblockung mit
100nF und 10uF nahe am NRF24 wird gebeten.

von Einer K. (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Richtig ist allerdings dass der FTD232 3.3V liefert und
> diese Spannung etwas schwächlich sein kann um einen NRF24
> zu versorgen, inbesondere wenn es die Version mit Power
> Amplifier ist.

Mannoooo...
Nichts anderes habe ich gesagt!

Wieso schreist du dann:
> Käse.
?

Auf Krawall aus?
Oder heute nur etwas Merkbefreit?

von Arduinoquäler (Gast)


Lesenswert?

Arduino F. schrieb:
> Nichts anderes habe ich gesagt!

Nö. Schon wieder Käse.

Arduino F. schrieb:
> Der Nano bezieht seine 3,3V aus dem FTDI Chip.

Und das ist nicht richtig, denn die 3.3V vom FT232
werden auf dem Board gar nicht genutzt.

Der Prozesser bezieht seine Versorgung entweder vom
5V-Regler der über Vin gespeist wird, oder von der
USB Buchse über eine Schottky-Diode.

Von den 5V der USB Buchse bleiben dem Prozessor noch
ca 4.7-4.8V übrig.

von Einer K. (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Arduino F. schrieb:
>> Nichts anderes habe ich gesagt!
>
> Nö. Schon wieder Käse.
>
> Arduino F. schrieb:
>> Der Nano bezieht seine 3,3V aus dem FTDI Chip.
>
> Und das ist nicht richtig, denn die 3.3V vom FT232
> werden auf dem Board gar nicht genutzt.
>
> Der Prozesser bezieht seine Versorgung entweder vom
> 5V-Regler der über Vin gespeist wird, oder von der
> USB Buchse über eine Schottky-Diode.
>
> Von den 5V der USB Buchse bleiben dem Prozessor noch
> ca 4.7-4.8V übrig.

Wenn ich Nano sage, dann meine ich auch Nano!
Der Nano hat einen 3,3V Pin.
Dieser wird vom FTDI gespeist.
Das ist meine Aussage!

Nirgendwo habe ich gesagt, dass der Prozessor auf dem Nano mit 3,3V 
läuft.
Nirgendwo

Wenn du das da rein dichten möchtest, dann nur zu...

Wenn du nicht zwischen Prozessor, und der Baugruppe, auf welcher er 
montiert ist, unterscheiden kannst, dann tust du mir leid.

von sunshineh (Gast)


Lesenswert?

Also ich habe nun an das Funkboard "NRF24L01+ PA LNA SMA mit Antenne" 
3.3V, 180mA angeschlossen und folgenden Code aufgespielt:
1
    #include <SPI.h>
2
    #include <nRF24L01.h>
3
    #include <RF24.h>
4
    RF24 radio(7, 8); // CNS, CE
5
    const byte address[6] = "00001";
6
    void setup() {
7
      Serial.begin(9600);      
8
      radio.begin();
9
      radio.openWritingPipe(address);
10
      radio.setPALevel(RF24_PA_MIN);
11
      radio.stopListening();
12
        Serial.println("Setup SENDER abgeschlossen");   
13
        Serial.println(radio.isChipConnected());         
14
    }
15
    void loop() {
16
      const char text[] = "Hello World";
17
      Serial.println("------In der LOOP");       
18
      radio.write(&text, sizeof(text));
19
      Serial.println("------Daten geschrieben");   
20
      delay(1000);
21
    }

Leider bleibt er in der Zeile "radio.write(&text, sizeof(text))" bzw, 
heißt die Ausgabe:
1
Setup SENDER abgeschlossen
2
1
3
------In der LOOP

Und das Empfänger Board empfängt nichts, warum?

von Arduinoquäler (Gast)


Lesenswert?

sunshineh schrieb:
> Also ich habe nun an das Funkboard "NRF24L01+ PA LNA SMA mit Antenne"
> 3.3V, 180mA angeschlossen

Wie denn? Zeige erst deinen Schaltplan und Aufbau, für Sender
und Empfänger.

> 3.3V, 180mA

Das verstehe ich nicht. Erkläre es bitte.

von sunshineh (Gast)


Lesenswert?

Also ich habe folgendes verdrahtet:

GND -GND von meinem Voltcraft Laboratory Power Supply
VCC -VCC von meinem Voltcraft Laboratory Power Supply 3.3V (max.Strom 
Begrenzung von 180mA)
CSN -D8
CE  -D7
MOSI-D11
SCK -D13
MISO-D12

Beim Empfänger analog, nur die Versorgung über das Arduino NANO.

Mein Problem ist, dass ich in der Endanwendung eigentlich nur 12V zur 
Verfügung habe, also keine 3.3V gesondert.

von Arduinoquäler (Gast)


Lesenswert?

sunshineh schrieb:
> Beim Empfänger analog, nur die Versorgung über das Arduino NANO.

Das haben wir ja schon besprochen dass der Nano den NRF24
wahrscheinlich nicht ausreichend speisen kann, der
erforderliche Strom ist zu hoch!

Arduinoquäler schrieb:
> Zeige erst deinen Schaltplan und Aufbau,
-------------------------------^^^^^^^^^^^^

Arduinoquäler schrieb:
> für Sender und Empfänger.

von sunshineh (Gast)


Lesenswert?

Ich habe nun die mit der OnBoard-Antenne aufgesteckt und die 
funktionieren!
Wie mache ich es nun mit dem erhöhten Strombedarf?

Am Board kommen bei mir 12V an, über den Arduino Nano und die 3.3V 
Schnittstelle funktioniert es ganz offensichtlich nicht. Komischerweise 
selbst mit direkt 3.3V auf der Funkplatine läuft es bei mir nicht. Gibt 
es hier einen günstigen Weg die 12V zu 3.3V direkt abzuzapfen (nicht 
über das Nano-Board)?

von Arduinoquäler (Gast)


Lesenswert?

Bei soviel Bereitwilligkeit zur Kommunikation und zum
Informationsaustausch, und der Flut von Informationen die
hier angeboten wird bin ich raus.

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.