Forum: Mikrocontroller und Digitale Elektronik Problem mit dem NRF24L01


von DerFragende (Gast)


Lesenswert?

Hallo allerseits

Ich habe ein kleines Problem. Ich möchte Daten von meinem Arduino an 
meinen Raspberry Pi senden mit einem NRF24L01 Funkmodul.
Die Kommunikation zwischen zwei Arduinos funktioniert einwandfrei. Auch 
der "GettingStarted" Sketch funktioniert tadellos mit Arduino und Pi. 
Wenn ich anschliessend meinen Code auf den Arduino lade und auf dem Pi 
überprüfen möchte, ob es läuft, dann klappt das ebenfalls. ABER, als ich 
den Pi ausgeschaltet und zu einem späteren Zeitpunkt wieder angeschalten 
habe und mir den "Datenstrom" der vom Arduino gesendet wird, ansehen 
wollte, ging das nicht mehr (es findet den Sender nicht).

Ich bin mir jetzt nicht sicher wo genau das Problem liegt. Ich habe 
bereits einige Websites durchforstet, bin aber auf keine Lösung des 
Problems gestossen. Was ich bereits mehrfach nachkontrolliert habe, ist, 
dass die Anschlüsse stimmen. Das Problem kann also nicht dort liegen, 
sonst hätte es zuvor auch nicht funktioniert.
Es scheint, als könnte er die Pipe nicht finden. Hatte da mal wer schon 
ähnliche Vorkomnisse?

Hier noch der Arduino Sketch:
1
#include <Wire.h>
2
#include <SPI.h>
3
#include <nRF24L01.h>
4
#include <RF24.h>
5
#include <OneWire.h>
6
#include <DallasTemperature.h>
7
8
#define ONE_WIRE_BUS 3
9
10
OneWire oneWire(ONE_WIRE_BUS);
11
12
DallasTemperature sensors(&oneWire);
13
14
byte tempSensor[8] = {0x28, 0xFF, 0x2B, 0x45, 0x4C, 0x04, 0x00, 0x10};
15
//const uint64_t pipes[2] = {0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
16
const uint64_t pipes[2] = { 0xABCDABCD71LL, 0x544d52687CLL };
17
float temp, tempC;
18
char storage[10];
19
20
RF24 radio(7,8);
21
22
void setup(){
23
  Serial.begin(115200);
24
  radio.begin();
25
  sensors.begin();
26
  radio.setPayloadSize(11);
27
  radio.openWritingPipe(pipes[0]);
28
  radio.enableDynamicPayloads();
29
  
30
}
31
32
void loop(){
33
34
  sensors.getAddress(tempSensor, 0);
35
36
  sensors.requestTemperatures();
37
  temp = sensorValue(tempSensor);
38
39
  dtostrf(temp, 5, 2, storage);
40
41
  radio.write(&storage, sizeof(storage));
42
43
  Serial.println(storage);
44
  delay(3000); 
45
}
46
47
float sensorValue(byte deviceAddress[]){
48
  tempC = sensors.getTempC(deviceAddress);
49
  return tempC;
50
}

und hier der Code vom Pi:
1
import RPi.GPIO as GPIO
2
from lib_nrf24 import NRF24
3
import time
4
import spidev
5
6
GPIO.setmode(GPIO.BCM)
7
8
pipes = [[0xAB,0xCD,0xAB,0xCD,0x71],[0x54,0x4D,0x52,0x68,0x7c]]
9
10
radio = NRF(GPIO, spidev.SpiDev())
11
radio.begin(0,17)
12
13
radio.setPayloadSize(11)
14
radio.setDataRate(NRF24.BR_1MBPS)
15
radio.setPALevel(NRF24.PA_MIN)
16
radio.setAutoAck(True)
17
radio.enableDynamicPayloads()
18
radio.enableAckPayload()
19
20
radio.openReadingPipe(0, pipes[1])
21
radio.printDetails()
22
radio.startListening()
23
24
try:
25
    while True:
26
27
        while not radio.available(0):
28
            time.sleep(1)
29
            print("radio not available")
30
31
        receivedMessage = []
32
        radio.read(receivedMessage, radio.getDynamicPayloadSize())
33
        print("received: {}".format(receivedMessage))
34
35
        print("translate...")
36
        string = ""
37
38
        for n in receivedMessage:
39
            if (n>=32 and n<=126):
40
                string += chr(n)
41
42
        print("message decodes to: {}".format(string))
43
44
        time.sleep(3)
45
46
except KeyboardInterrupt:
47
    GPIO.cleanup()

Der Arduino ist lediglich per USB Kabel an einer Steckdose 
angeschlossen, wie auf der Pi. Den Pi steuere ich übers Heimnetzwerk mit 
Putty an und die NRF24 Module sind direkt am Arduino/Pi angeschlossen 
mit Kabeln von ca. 10cm länge.

Freundliche Grüsse
DerFragende

von DerFragende (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch ein Bild der Ausgabe von radio.printDetails(). Was ich hier 
auch sehr merkwürdig finde, ist dass was bei TX_ADDR angezeigt wird. 
Woher kommt plötzlich diese Adresse? Könnte sein, dass ich beim 
Ausprobieren mal die benutzt habe, aber wie kann die jetzt noch da 
rumschwirren?

von Arduinoquäler (Gast)


Lesenswert?

Hat denn der DerFragende auch schön brav Abblock-Kondensatoren
verwendet wie z.B. in

Beitrag "NRF24L01+ test program for Arduino Uno"

beschrieben?

Du sagst das braucht es nicht? Gut, dann braucht es sie nicht.

von DerFragende (Gast)


Lesenswert?

Nein, habe ich noch nicht, die Kondensatoren sind auf dem Weg. Es 
verwundert mich jedoch trotzdem, dass es zwischen zwei Arduinos ohne 
ging, auch über längere Distanzen und mit dem Pi macht es nach einem 
Reboot Schwierigkeiten.
Du gehts also davon aus, dass die fehlenden Kondensatoren das Problem 
sind?

von Arduinoquäler (Gast)


Lesenswert?

DerFragende schrieb:
> Du gehts also davon aus, dass die fehlenden Kondensatoren das Problem
> sind?

Nein. Wie soll ich das wissen? Ich konnte ja deine Schaltung
nicht durchmessen welche Störungen auftreten.

Ich gehe davon aus dass fehlende Kondensatoren eine beträchtliche
potentielle Fehlerquelle darstellen.

von Einer K. (Gast)


Lesenswert?

DerFragende schrieb:
> Du gehts also davon aus, dass die fehlenden Kondensatoren das Problem
> sind?

Ich sage:
Je länger die Kabel oder/und je schwächer die Versorgung, desto 
wichtiger die Kondensatoren.

DerFragende schrieb:
> Woher kommt plötzlich diese Adresse?
Wenn es nicht die default Adressen sind, dann wirst du sie da wohl rein 
geschrieben haben.
Oder?

von DerFragende (Gast)


Lesenswert?

Arduino F. schrieb:
> Je länger die Kabel oder/und je schwächer die Versorgung, desto
> wichtiger die Kondensatoren.

Ok, in dem Fall werde ich das mit den Kondensatoren ausprobieren, sobald 
sie ankommen. Ich habe mir 100uF 16v Kondensatoren bestellt. Zuhause 
habe ich gerade nur 22pF 50V.


Arduino F. schrieb:
> Wenn es nicht die default Adressen sind, dann wirst du sie da wohl rein
> geschrieben haben.
> Oder?

Ja, irgendwann beim ausprobieren. Ich hab jetzt dem Arduino Sketch noch 
folgendes hinzugefügt, obwohl ich eigentlich nichts lesen will:
1
radio.openReadingPipe(0, pipes[0]);

und dem Pi Code:
1
radio.openWritingPipe(pipes[0])

Dies hat nun die TX_ADDR zu 0xABCDABCD71 geändert. Aber er empfängt 
immernoch nichts.

von Arduinoquäler (Gast)


Lesenswert?

DerFragende schrieb:
> Ich habe mir 100uF 16v Kondensatoren bestellt. Zuhause
> habe ich gerade nur 22pF 50V.

Obwohl ich dich auf eine zuverlässige Quelle hingewiesen
habe scheint dies nicht zu reichen.

Offensichtlich muss ich dich auch noch darauf hinweisen
dass du die Schaltung lesen und verstehen sollst.

Aber du reihst dich damit nahtlos ein in die Masse der
Maker die auf Minimalismus stehen. Auch scheinbar
seriöse Bauvorschläge von Arduino-Schaltungen vermeiden
es mit grosser Ignoranz diesen "unnötigen Ballast"
in geeigneter Weise vorzusehen.

von DerFragende (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Obwohl ich dich auf eine zuverlässige Quelle hingewiesen
> habe scheint dies nicht zu reichen.

Ich weiss es nicht. Ich werde es erst mit den Kondensatoren ausprobieren 
müssen. Ich werde dir dann aber ein Feedback geben, ob deine Schaltung 
funktioniert :P

Und falls du dich wunderst, wieso ich 200uF bestellt habe, an einer 
anderer Stelle (im Internet) wurde das gesagt, mit dem Hinweis es seie 
dann wie "hardwired". Dies war jedoch bevor ich hier ein neues Thema 
eröffnet habe :)

> Offensichtlich muss ich dich auch noch darauf hinweisen
> dass du die Schaltung lesen und verstehen sollst.

Habe ich und in der Tat habe ich eine Frage. Was ich nicht verstehe, 
wieso einen 10uF und einen 100nF Kondensator? Damit es keine 
unzulässigen Spannungsschwankungen gibt, OK. Aber wie muss ich mir das 
genau vorstellen? Hast du das irgendwie ausgerechnet oder einfach 
herumprobiert bis es lief?

> Aber du reihst dich damit nahtlos ein in die Masse der
> Maker die auf Minimalismus stehen. Auch scheinbar
> seriöse Bauvorschläge von Arduino-Schaltungen vermeiden
> es mit grosser Ignoranz diesen "unnötigen Ballast"
> in geeigneter Weise vorzusehen.

Nein, einfach ohne dem Material kann ich auch deine Schaltung nicht 
nachbauen. Es leben nicht alle im Baumarkt bzw. haben alle Teile bei 
sich Zuhause. Ausserdem, vielleicht gibt es ja auch andere 
Lösungsansätze ausser deiner?

von Arduinoquäler (Gast)


Lesenswert?

Noch ein Fettnapf zum Hineintreten speziell beim NRF24:

Der Baustein hat keinen Reset-Pin. Da bedeuted: alles
was man in die diversen Register hineingeschrieben hat
(inklusive Fehlern) bleibt darin bestehen solange der
Chip unter Versorgungsspannung steht. Erst ein Power-
Zyklus versetzt den Chip wieder in einen vergleichbaren,
reproduzierbaren Ausgangszustand.

Aufgrund dieses Sachverhalts können aneinandergereihte
Versuche mit leicht veränderten Sketches in den absoluten
Dschungel führen.

Auch Störungen auf der Betriebsspannung sowie auf
unsauberen SPI-Leitungen können zu solchen undefinierten
Zuständen führen.

von Arduinoquäler (Gast)


Lesenswert?

DerFragende schrieb:
> Aber wie muss ich mir das genau vorstellen?

Ein Elko (10uF) dient für die Stützung von starken
Spannungseinbrüchen hervorgerufen durch schwankende
Sstromaufnahme des Chips. Und zur zusätzlichen
Stabilisierung der "Quelle", in diesem Fall ein Arduino
oder ein RapBerry.

Ein keramischer Kondensator 100nF dient zur Glättung
von schnellen Pulsen die entweder durch das Arbeiten
des Chips verursacht werden oder ebenfalls auf der
Versorgungsspannung vom steuernden Controller kommen
können. Ein Elko kann dies nicht leisten.

Man beachte auch die Anordnung der Kondensatoren. Nicht
zufällig ist der keramische Kondensator ganz nahe am
NRF24, der Elko sollte auch (zumindest) in der Nähe sein.

von Arduinoquäler (Gast)


Lesenswert?

DerFragende schrieb:
> Ausserdem, vielleicht gibt es ja auch andere
> Lösungsansätze ausser deiner?

Da bin ich mir ganz sicher. Die vielen Maker die ohne
auskommen beweisen es. HTML ist geduldig.

von DerFragende (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Der Baustein hat keinen Reset-Pin. Da bedeuted: alles
> was man in die diversen Register hineingeschrieben hat
> (inklusive Fehlern) bleibt darin bestehen solange der
> Chip unter Versorgungsspannung steht. Erst ein Power-
> Zyklus versetzt den Chip wieder in einen vergleichbaren,
> reproduzierbaren Ausgangszustand.

Heisst das, wenn ich den Arduino ausstecke, reseted er diese Register 
nicht? Er würde dann ja nicht mehr unter Versorgungsspannung stehen.

Arduinoquäler schrieb:
> Aufgrund dieses Sachverhalts können aneinandergereihte
> Versuche mit leicht veränderten Sketches in den absoluten
> Dschungel führen.

Das würde die merkwürdige Adresse erklären.

Danke fürs erklären der beiden Kondensatoren! :)

von Sebastian S. (amateur)


Lesenswert?

Die Parallelschaltung eines Kondensators mit relativ hoher Kapazität und 
eines mit geringer Kapazität ist ein beliebtes Verfahren diesen zu 
"verbessern".

Kondensatoren mit hoher Kapazität haben meist schlechte Werte, bei 
höheren Frequenzen. Keramischen Kondensatoren geht schnell die Puste 
aus, wenn es um energetisch höhere Ansprüche geht. Also Teamwork ist 
alles.

Habe das schon in Schaltungen - nicht von mir - mit drei Typen gesehen. 
2 X 22000µ + 1µ + 47n. Sozusagen etwas für alle.

von DerFragende (Gast)


Lesenswert?

Sebastian S. schrieb:
> Die Parallelschaltung eines Kondensators mit relativ hoher Kapazität und
> eines mit geringer Kapazität ist ein beliebtes Verfahren diesen zu
> "verbessern".
>
> Kondensatoren mit hoher Kapazität haben meist schlechte Werte, bei
> höheren Frequenzen. Keramischen Kondensatoren geht schnell die Puste
> aus, wenn es um energetisch höhere Ansprüche geht. Also Teamwork ist
> alles.
>
> Habe das schon in Schaltungen - nicht von mir - mit drei Typen gesehen.
> 2 X 22000µ + 1µ + 47n. Sozusagen etwas für alle.

Auch dir danke für die gute Erklärung :)

Ich werde hier ein Update posten, sobald die Bauteile angekommen sind 
und ich es ausprobiert habe.

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.