Forum: Mikrocontroller und Digitale Elektronik RF24L01+ Modul an RPI


von Hannes H. (hannes31)


Angehängte Dateien:

Lesenswert?

Hallo liebe Community,

ich versuche schon das ganze Wochenende ein Raspberry PI Model B mit 
einem RF24L01+ Modul zu verbinden und Daten zu senden sowie zu 
empfangen. Als Libary nutze diese RF24 (https://tmrh20.github.io/RF24/).

SPI aktivieren:
Wurde über "rasp-config" aktiviert. Habe dazu noch ein kleinen Test 
gefunden (https://gist.github.com/chrismeyersfsu/3317805), es konnten 
Daten gesendet und empfangen werden also denke ich das man den SPI-Port 
als Fehlerquelle ausschließen kann.

Verkabelung des Modules an den RPI (Laut Lib. Dokumentation):
PIN   NRF24L01   RPI   RPi -P1 Connector
1   GND   rpi-gnd   (25)
2   VCC   rpi-3v3   (17)
3   CE   rpi-gpio22   (15)
4   CSN   rpi-gpio8   (24)
5   SCK   rpi-sckl   (23)
6   MOSI   rpi-mosi   (19)
7   MISO   rpi-miso   (21)
8   IRQ   -   -

Installation der Libary:
    Download the install.sh file from 
http://tmrh20.github.io/RF24Installer/RPi/install.sh
    wget http://tmrh20.github.io/RF24Installer/RPi/install.sh
    Make it executable:
    chmod +x install.sh
    Run it and choose your options
    ./install.sh
    Run an example from one of the libraries
    cd rf24libs/RF24/examples_RPi
    make
    sudo ./gettingstarted

Nachdem die Libary kompieliert wurde, kann man ein Beispiel aufrufen was 
direkt wür den RPI ist. Deren Ausgabe habe ich etwas hier aufgeführt, 
also wenn kein Modul angeschlossen ist kommen bei den "ADDR" nur 000, 
also so falsch kann es nicht angeschlossen sein, denn es wird ja was 
angezeigt. In diesen Menü kann ich dann wählen ob ich etwas senden 
möchte, wenn ich etwas sende habe ich folgende Ausgabe:

Now sending...
failed. (Ich denke das dieses failed dafür steht das nichts gesendet 
werde konnte, dies habe ich den Code entnommen, der hier zu sehen ist)
Failed, response timed out.


printf("Now sending...\n");
unsigned long time = millis();

bool ok = radio.write( &time, sizeof(unsigned long) );

if (!ok){
    printf("failed.\n");
}


================ SPI Configuration ================
CSN Pin          = CE0 (PI Hardware Driven)
CE Pin           = Custom GPIO22
Clock Speed      = 8 Mhz
================ NRF Configuration ================
STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7
RX_ADDR_P0-1     = 0x65646f4e32 0x65646f4e31
RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
TX_ADDR          = 0x65646f4e32
RX_PW_P0-6       = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA            = 0x3f
EN_RXADDR        = 0x02
RF_CH            = 0x4c
RF_SETUP         = 0x07
CONFIG           = 0x0e
DYNPD/FEATURE    = 0x00 0x00
Data Rate        = 1MBPS
Model            = nRF24L01+
CRC Length       = 16 bits
PA Power         = PA_MAX

 ************ Role Setup ***********
Choose a role: Enter 0 for pong_back, 1 for ping_out


Ich habe versucht alles so gut wie möglich wiederzugeben ein kleines 
Pinout vom Modul habe ich noch mit angehängt, ich hoffe des es mit der 
Größe passt. Leider bin ich mit meinen Latein am Ende, und hoffe das ihr 
mit etwas helfen könnt.


Es stehen zur verfügung:
Multimeter
2x Raspberry pi
2x Module RF24L01+
Bauteile wie Kondensatoren Widerstände
Leider kein Oszi

: Bearbeitet durch User
von DokuLeseVerweigerer (Gast)


Lesenswert?

Und watt is mit der Gegenstation?

von Hannes H. (hannes31)


Lesenswert?

Tut mir leid hab ich vergessen zu erwähnen, diese ist genau gleich 
aufgebaut. Auch ein Rpi mit dem gleichen Modul und selbigen Fehler.

von Smeat (Gast)


Lesenswert?

Ich habe bisher nur RF24Network (welches auf RF24 aufbaut) benutzt.
Ein schneller Test zeigt, dass bei mir das "GettingStarted" aus RF24 
auch nicht funktioniert das "helloworld" Beispiel aus RF24Network jedoch 
schon.

Ob der Fehler nun am Beispielprogramm oder etwas anderem liegt, kann ich 
dir leider nicht sagen.
Aber vielleicht bringt dich diese Information ja ein wenig weiter.

Viel Erfolg ;)

von jk (Gast)


Lesenswert?

Wie sieht Deine Initialisierung aus? Bei mir funktionierte

RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, 
BCM2835_SPI_SPEED_8MHZ);

ansonsten habe ich die gleiche Library und die Anschlussbelegung; 
allerdings nutze ich den Teil mit dem "Mesh"

vg

Joachim

von Hannes (Gast)


Lesenswert?

Daneke für die Tipps hat aber leider nichts gebracht, habe es mit der 
Network lib versucht leider auch innerhalb des Sendevorganges ein 
Fehler. Dann habe ich die Initialisierung mal so gelegt wie @jk, aber da 
bekomm ich leider "RF24 HARDWARE FAIL: Radio not responding, verify pin 
connections, wiring, etc.". Ich weiß echt nicht mehr weiter. Hab gestern 
auch einen älteren Kernel getestet glaub 3.18.7, dachte es liegt daran 
aber auch kein Erfolg.

von Hannes (Gast)


Lesenswert?

Meine init. sieht so aus:


RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, 
BCM2835_SPI_SPEED_8MHZ);

von jk (Gast)


Lesenswert?

ok; da sind unsere Hardwareeinstellungen etwas anders:
meine (mit der eben beschriebenen Initialisierung) sind:
CE -> 22
mosi -> 19
miso ->21
sck-> 23
csn-> 24
der CE-pin unterscheidet sich bei uns. Eigentlich müsste es mit Deiner 
Konfiguration dann auch klappen; aber das mag wirklich am Programm 
liegen. Ich kann morgen evtl einen zweiten rpi mit dem 
gettingstartet.cpp ausprobieren, ob das Programm überhaupt vernünftig 
funktioniert.

Ansonsten habe ich mit dem Modulen relativ wenig Probleme; sie arbeiten 
auch mit arduinos mit der tmrh20 library vernünftig zusammen

von Hannes (Gast)


Lesenswert?

Würde mich sehr freuen wenn du das für mich testen könntest, am besten 
mit einer aktuellen wheezy oder Jessi version von Raspian. Und der 
neusten RF24 Lib. Hast du nen anderen RPI oder warum unterscheiden sich 
die Pins? Ich hab das B Model.

von jk (Gast)


Lesenswert?

bei mir läuft jessie; und das Modell ist auch B. Die Pins kann man ja 
wahlfrei nehmen (falls das Betriebssystem das nicht irgendwie anders 
nutzt); und bei mir hat es aus der Historie heraus mit dem PIN22 
(=GPIO25) funktioniert. Die lib ist relativ aktuell; allerdings habe ich 
sie nicht über den Installer, sondern "zu Fuß" installiert. Sollte aber 
identisch sein.

von Hannes (Gast)


Lesenswert?

Dann versuche ich mal schnell noch deine Konfiguration der Pins.

von Hannes (Gast)


Lesenswert?

Redest du von PIN 22 wenn du 22 schreibst oder GPIO 22?

von Hannes (Gast)


Lesenswert?

jk schrieb:
> ok; da sind unsere Hardwareeinstellungen etwas anders:
> meine (mit der eben beschriebenen Initialisierung) sind:
> CE -> 22
> mosi -> 19
> miso ->21
> sck-> 23
> csn-> 24
> der CE-pin unterscheidet sich bei uns. Eigentlich müsste es mit Deiner
> Konfiguration dann auch klappen; aber das mag wirklich am Programm
> liegen. Ich kann morgen evtl einen zweiten rpi mit dem
> gettingstartet.cpp ausprobieren, ob das Programm überhaupt vernünftig
> funktioniert.
>
> Ansonsten habe ich mit dem Modulen relativ wenig Probleme; sie arbeiten
> auch mit arduinos mit der tmrh20 library vernünftig zusammen

Habe das mal so versucht, aber leider auch das gleiche Ergebnis. FEHLER 
beim senden :(.

von Mehmet K. (mkmk)


Lesenswert?

Hannes H. schrieb:
> RF_CH            = 0x4c

Dein Problem könnte von dieser Einstellung herrühren.
Bei meinen Modulen geht ab 30 (dezimal) nichts mehr.
Liegt vermutlich an den lausigen Quarzen.

: Bearbeitet durch User
von Hannes (Gast)


Lesenswert?

Bin mir nicht sicher wo ich das einstellen kann, aber ich such mal in 
der gettingstarted danach und stell es unter 40. Danke :)

von Mario (Gast)


Lesenswert?

Hi,

wie hast du das Modul verkabelt ? Steckbrett ?

Meine Erfahrung mit dem Modul war das wenn die Kabelzulang oder man ein 
Steckbrett verwendet das ganze nicht stabil funktioniert.

Da die initialisierung bzw. das auslesen des Modules klappt vermute ich 
eher in diese Richtung.

Versuch doch mal die Übertragung mit kleinster Geschwindigkeit.
Aktuell nutzt du ja 1MBPS, 125kBPS ist glaube ich die kleinst mögliche 
Einstellung.

Das die RX und TX Adresse gleich ist macht nix ??? (Habe meinen Code 
gerade nicht hier)
>RX_ADDR_P0-1     = 0x65646f4e32 0x65646f4e31
>TX_ADDR          = 0x65646f4e32


Grüße,
Mario

von Hannes (Gast)


Lesenswert?

Hab es ohne Steckbrett verkabelt, aber mit ca 25cm langen Kabeln. Ich 
werde mal nach den RF_Ch und den MBPS schrauben wenn ich finde wo. 
Danach wenn es nicht geht Kabel kürzen. Das die Adresse gleich ist bei 
RX TX gleich ist kann ich mir jetzt nicht erklären.

von Mehmet K. (mkmk)


Lesenswert?

Hannes schrieb:
> stell es unter 40.

Ich würde mit 2 anfangen.
Wie bereits oben schon erwaehnt: ab 30 geht bei mir nichts mehr.

von Mehmet K. (mkmk)


Lesenswert?

Hannes schrieb:
> aber mit ca 25cm langen Kabeln.

Bei mir sind die Dinger ebenfalls mit ca. 25cm langen Kabeln an ein 
Discovery Board angeschlossen. Keinerlei Probleme.

von jk (Gast)


Lesenswert?

Ich hatte gestern versprochen, meine beides raspberries mit 
gettingstarted zu verbinden. Nun, das merkwürdige ist, dass, obwohl 
beide Systeme gleich konfiguriert sind, das Senden nur von pi_1 nach 
pi_2 funktioniert; starte ich das Programm neu und nehme die umgekehrte 
Richtung geht es nicht mehr.....
Da muss ich mal nachsehen, warum das passiert; momentan bin ich ratlos

Ansonsten: ich hatte es auch eine Zeitlang auf breadboards aufgebaut; 
jetzt hängen die Funker an ca. 20cm langen Kabeln am pi. Wie schon 
gesagt, alles relativ problemlos

von Hannes (Gast)


Lesenswert?

Also als erstes habe ich versucht an den Übertragungsrate etwas zu 
ändern mit der kleineren bekahm ich auch nur beim senden ein Fehler, bei 
der ganz kleinen Rate wurde irg. wie das Modul garnicht mehr erkannt, 
kann mir nicht vorstellen wie das in zusammenhang liegen kann.

RF_CH konnte ich bis jetzt nicht ändern, ich habe bis jetzt nicht 
gefunden wo oder wie ich das festsetzen kann. Habe noch probiert an das 
Modul einen 22uF Elko dran zu hängen aber auch kein Erfolg damit gehabt 
das eine änderung eintritt.

von Hannes (Gast)


Lesenswert?

Konnte den Channel ändern siehe hier meine Detailausgabe: Leider hier 
auch keine Besserung, kannst du mir mal deine Ausgabe von den RPI geben 
der funktioniert mit dem Modul?


================ SPI Configuration ================
CSN Pin          = CE0 (PI Hardware Driven)
CE Pin           = Custom GPIO22
Clock Speed      = 8 Mhz
================ NRF Configuration ================
STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1     = 0x65646f4e32 0x65646f4e31
RX_ADDR_P2-5     = 0x33 0xce 0x3e 0xe3
TX_ADDR          = 0x65646f4e32
RX_PW_P0-6       = 0x20 0x20 0x20 0x20 0x20 0x20
EN_AA            = 0x3f
EN_RXADDR        = 0x3e
RF_CH            = 0x02
RF_SETUP         = 0x0f
CONFIG           = 0x0e
DYNPD/FEATURE    = 0x00 0x00
Data Rate        = 2MBPS
Model            = nRF24L01+
CRC Length       = 16 bits
PA Power         = PA_MAX

Now sending...
failed.
Failed, response timed out.
Now sending...
failed.
Failed, response timed out.

von jk (Gast)


Lesenswert?

Empfänger:
================ SPI Configuration ================
CSN Pin          = CE0 (PI Hardware Driven)
CE Pin           = Custom GPIO25
Clock Speed      = 8 Mhz
================ NRF Configuration ================
STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1     = 0x65646f4e32 0x65646f4e31
RX_ADDR_P2-5     = 0x33 0xce 0x3e 0xe3
TX_ADDR          = 0x65646f4e32
RX_PW_P0-6       = 0x20 0x20 0x20 0x20 0x20 0x20
EN_AA            = 0x3e
EN_RXADDR        = 0x3e
RF_CH            = 0x4c
RF_SETUP         = 0x07
CONFIG           = 0x0e
DYNPD/FEATURE    = 0x00 0x00
Data Rate        = 1MBPS
Model            = nRF24L01+
CRC Length       = 16 bits
PA Power         = PA_MAX

 ************ Role Setup ***********
Choose a role: Enter 0 for pong_back, 1 for ping_out (CTRL+C to exit)
>0
Role: Pong Back, awaiting transmission

Got payload(4) 4293148516...
Got payload(4) 4293149719...


Sender:
================ SPI Configuration ================
CSN Pin          = CE0 (PI Hardware Driven)
CE Pin           = Custom GPIO25
Clock Speed      = 8 Mhz
================ NRF Configuration ================
STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1     = 0x65646f4e31 0x65646f4e32
RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
TX_ADDR          = 0x65646f4e31
RX_PW_P0-6       = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA            = 0x3f
EN_RXADDR        = 0x02
RF_CH            = 0x4c
RF_SETUP         = 0x07
CONFIG           = 0x0e
DYNPD/FEATURE    = 0x00 0x00
Data Rate        = 1MBPS
Model            = nRF24L01+
CRC Length       = 16 bits
PA Power         = PA_MAX

 ************ Role Setup ***********
Choose a role: Enter 0 for pong_back, 1 for ping_out (CTRL+C to exit)
>1
Role: Ping Out, starting transmission

Now sending...
Failed, response timed out.

Die Response fehlt; aber das stört mich erst mal nicht. Im Programm muss 
auch noch die Variable radioNumber gesetzt werden
 if(myChar == '0'){
                radioNumber=0;

entsprechend 1 für den else-Zweig

von Hannes (Gast)


Lesenswert?

Aber bei dir kommt dieser Fehler nicht beim senden, das versteh ich 
einfach nicht warum das nicht auch bei mir geht. Dumm gesagt aber kannst 
du evtl. deine gettingstartet.cpp hochladen und mir deine genaue 
verkabelung mitteilen, dann mach ich es ganau wie du. Was anderes fällt 
mir gerade nicht mehr ein :(.

von jk (Gast)


Angehängte Dateien:

Lesenswert?

versuch auch mal die Sende-Empfangsrichtung zu tauschen

von Hannes H. (hannes31)


Lesenswert?

Ich wollt nur kurz los werden das ich erstaunt bin wie hier alle meinem 
Fehler so annehmen Danke! Ich versuch es weiter..

von Hannes (Gast)


Lesenswert?

Habe es mit deiner gettingstartet zum laufen bekommen kann jetzt nicht 
direkt beurteilen an was es alles gelegen haben könnte. Werde mich noch 
etwas damit beschäftigen müssen um ein brauchbaren Sketch entwickeln zu 
können für mein Attiny. Aber besten Dank an alle!

von jk (Gast)


Lesenswert?

dann poste mal, was es mit dem attiny gegeben hat. Ich hatte es zwar 
schon mal mit dem attiny84 geschafft, nach einer Rechnerneuinstallation 
aber die passenden libraries (SPI) resp. die Controllerdefinitionen 
nicht mehr gefunden; was immer einen Fehler beim Übersetzen/Linken 
lieferte

von Hannes H. (hannes31)


Lesenswert?

Bin noch am bastelln, aber hab komplett neu angefangen ohne dieses hin 
und her gepinge. Einfach nur dauer empfangen und dauer senden. Werde 
wohl heut noch eine ganze Weile senden.

von Hannes (Gast)


Lesenswert?

Läuft super mit dem ATtiny, bin begeistert. Es werden Temperatur sowie 
die Spannung zum Empfänger geschickt und in eine Datenbank gespeichert. 
Sitze gerade an der optimierung der Sketches, um evtl. hier und da noch 
ein paar mA zu sparen. Betreibe das RF-Modul mit 3V also 2AA Batterien, 
es wundert mich da vom Modul mindestens 3,3-3,6 gefordert werden das es 
überhaupt gehtS.

von Mehmet K. (mkmk)


Lesenswert?

Hannes schrieb:
> es wundert mich da vom Modul mindestens 3,3-3,6 gefordert werden das es
> überhaupt gehtS.

nRF24L01 hat ein supply range von 1,9V - 3,6V. Aber wenn Du Batterien 
hast, achte daruf, dass die Angabe von 900nA im Powerdown-Mode von den 
China-Imitaten nicht eingehalten wird.
Mit meinen Modulen komme ich bei weitem nicht auf diese Werte und habe 
deshalb ein Highside-Switch, mit dem ich das Modul ganz abschalte.

Darf ich fragen, welchen Kanal Du eingestellt hast?

von Hannes H. (hannes31)


Lesenswert?

Ich werd heut noch ein paar Messungen machen, habe gestern nur mal grob 
durchgemessen und den Sleepmodus für den Attiny getestet. Den Kanal hab 
ich jetzt nicht im Kopf könnt ich später erst berichten.

von Hannes H. (hannes31)


Lesenswert?

Für den Fall das mein Modul im Powerdown Modus auch so viel schluckt, 
wäre es auch möglich es über ein Transistor zu deaktivieren?

von Hannes H. (hannes31)


Lesenswert?

Also heute sind die Module aus China gekommen, gehen leider nicht mit 
meiner Konfiguration.

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.