Forum: Mikrocontroller und Digitale Elektronik NRF24L01 | Arduino | Problem


von Nitram E. (slexx)


Angehängte Dateien:

Lesenswert?

Hi ich habe zwei Arduino UNOs zum Testen.
Bei beiden ist ein NRF24L01 RICHTIG angeschlossen!

Wenn ich den RESET am TX gedrückt habe und das Programm anfängt, dann 
empfängt der RX eins bis zwei mal und das wars. Im Seriellen-Monitor 
"scheint" der TX aber weiter zu senden. Habe es jetzt probiert bei den 
NRFs einen 10uF an die VCC(3.3V) zu hängen aber das Problem besteht 
weiter. Funkstrecke getestet von 10cm bis 3m, selbes Problem! Mit 
einfacheren Testprogrammen läuft das Teil ohne Probleme.
Ich habe jetzt diese beiden Codes im Netz gefunden bei denen das Problem 
vorkommt.

Verwende die RF24 Libary

Was könnte die Ursache dafür sein? LG

TX
1
#include <SPI.h>
2
#include <RF24.h>
3
4
// ce,csn pins
5
RF24 radio(9,10);
6
7
// init data buffer to hold a sensor type byte and one uint16_t sensor data
8
unsigned char data[3] = {
9
  0};
10
unsigned long count=0;
11
void setup(void)
12
{
13
  pinMode(2, OUTPUT);
14
  Serial.begin(19200);
15
  Serial.println("**************V1 Send Sensor Data***********");
16
  radio.begin();
17
  radio.setPALevel(RF24_PA_HIGH);
18
  radio.setChannel(8);
19
20
  // open pipe for writing
21
  radio.openWritingPipe(0xE8E8F0F0E1LL);
22
23
  radio.enableDynamicPayloads();
24
  radio.setAutoAck(true);
25
  radio.powerUp();
26
  Serial.println("...Sending");
27
}
28
29
void loop()
30
{
31
  //generate a random number to represent a sensor reading
32
  uint16_t sensorValue = random(10,1001);
33
  //assign 'T' to represent a Temperature reading
34
  data[0] = 'T';
35
  //do the bit shift to put uint16 into uint8 array
36
  data[1] = sensorValue >> 8;
37
  data[2] = sensorValue;
38
  Serial.print(count);
39
  count++;
40
  Serial.print(" data[1]: ");
41
  Serial.print(data[1]);
42
  Serial.print("  |  data[2]: ");
43
  Serial.print(data[2]);
44
  // print and increment the counter
45
  digitalWrite(2, HIGH);
46
  delay(500);
47
  radio.write(data, sizeof(uint16_t)+1);
48
  Serial.print("  | Temperature sent:  ");
49
  Serial.println(sensorValue);
50
  // pause a second
51
  digitalWrite(2, LOW);
52
  delay(500);
53
}

RX
1
#include <SPI.h>
2
#include <RF24.h>
3
4
// ce,csn pins
5
RF24 radio(9,10);
6
// set up the data buffer to receive the sensor type byte and the uint16_t sensorValue
7
unsigned char data[3] = {
8
  0};
9
  unsigned long count=0;
10
void setup(void)
11
{
12
  // init serial monitor and radio
13
  Serial.begin(19200);
14
  Serial.println("**************V1 Receive Sensor Data***********");
15
  radio.begin();
16
  radio.setPALevel(RF24_PA_HIGH);
17
  radio.setChannel(8);
18
19
  // open pipe for reading
20
  radio.openReadingPipe(1,0xE8E8F0F0E1LL);
21
22
  radio.enableDynamicPayloads();
23
  radio.setAutoAck(true);
24
  radio.powerUp();
25
  radio.startListening();
26
  Serial.println("...Listening");
27
}
28
29
void loop(void)
30
{
31
  // if there is data ready
32
  if (radio.available())
33
  {
34
    // dump the payloads until we've got everything
35
    bool done = false;
36
    while (!done)
37
    {
38
      // fetch the payload, and see if this was the last one
39
      done = radio.read(data, sizeof(uint16_t)+1);
40
    }
41
42
    // print the payload
43
    if (data[0] == 'T') {
44
      //put the uint16_t back together
45
      uint16_t sensorValue = data[2] | data[1] << 8;
46
      Serial.print(count);
47
      count++;
48
      Serial.print(" | Temperature Received: "); 
49
      Serial.println(sensorValue);
50
    }
51
    else
52
      Serial.println("Did not receive a value temperature reading");
53
  }
54
}

: Bearbeitet durch User
von Nitram E. (slexx)


Lesenswert?

Wird doch sonst so schnell geantwortet! xD

von Arduinoquäler (Gast)


Lesenswert?

Keine gründliche Analyse deines Codes, aber eine Vermutung:

Dein Empfangsbuffer
1
unsigned char data[3] = {0};

ist sehr klein und es könnten durch die Einstellung
1
radio.enableDynamicPayloads();

bei grösseren empfangenen Paketen RAM-Daten jenseits des Buffers
überschieben werden (sollte eigentlich nicht passieren wenn sich
die Lib richtig verhält).

Lösung wäre den Empfangsbuffer mindestens so gross zu machen wie
die mögliche Payload Size des NRF24 (das wäre 32). Das würde ja
nicht weh tun.

Aber das ist alles - wie gesagt - eine Vermutung da ich nicht
weiss was die Lib genau tut.

von Nitram E. (slexx)


Lesenswert?

Wie bekomme ich denn den Emofangsbuffer bzw Payloadsize auf 32?

:)

von Celle (Gast)


Lesenswert?

Du musst Dir die Werte von SensorValue = random(10,1001) anders 
übertragen, im Sender z.B. so:


byte SensorValue[2];
SensorValue[0] = 10;
SensorValue[1] = 1001;

radio.write(&SensorValue, sizeof(SensorValue))

am Empfänger musst Du dann folgendes schreiben:

byte SensorValue[2];

radio.read(&SensorValue, 2)       // Du erwartest 2 Werte

Serial.print(" | Temperature Received: ");
Serial.print(sensorValue[0]);
Serial.print(".");
Serial.println(sensorValue[1]);

So klappt es bei mir ohne Probleme. Ich sende die Daten eines PS2X Pads 
mit einem Uno und nRF24 an einen Uno mit nRF24 und dahinter über serial 
noch einen Mega.

Viel Glück
Celle

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.