Forum: HF, Funk und Felder nRF24L01+ - Pi2 & Arduino UNO klappt nicht :-(


von Ralphi M. (ralphi_m)


Angehängte Dateien:

Lesenswert?

Hi all,

erst jetzt hab ich die Transceiver nRF24L01+ bei ebay für ein paar Cent 
entdeckt, leider bekomme ich die Dinger nicht zum miteinander 
kommunizieren :-(
Ich habe
- einen Arduino UNO und
- Raspi's vorzugsweise den gerade freien Pi2.
- 2x nRF24L01+ (Elko angelötet)

Die Lib für den UNO hat von Anfang keine Probleme beim kompilieren 
gemeldet.
Ich nutze derzeit: http://tmrh20.github.io/RF24/

Die Lib's für den Raspi Jessy war schon aufwendiger zum laufen zu 
bringen.
Der SPI in der /boot/config.txt aktivieren.
Pinbelegung CE-> GPIO25, CSN->CE0
1
RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);

Die einzige Lib die bei mir keine Probleme hat:
        https://github.com/stanleyseow/RF24
(wobei die readme's im Verzeichnis irgendwie bei allen Libs gleich ist.)

WICHTIG für Pi2 SPI: vorm kompilieren: in den MAKEFILE's
    -march=armv6zk in -march=armv7-a ändern und
in der bcm2835.h
1
    #define BCM2835_PERI_BASE               0x20000000
    in 0x3F000000 ändern

Wenn ich jetzt die gettingstarted.cpp oder transfer.cpp starte.
Vorher hab ich noch:
- die nodes bei beiden festgelegt:
1
uint64_t addresses[] = { 0x65646f4e31,0x65646f4e32};
- und
1
    printf_begin(); // bei arduino
2
    radio.printDetails();

bekomme ich:
    **** ARDUINO
1
STATUS         = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
2
RX_ADDR_P0-1     = 0x65646f4e31 0x65646f4e32
3
RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
4
TX_ADDR         = 0x65646f4e31
5
RX_PW_P0-6     = 0x20 0x20 0x00 0x00 0x00 0x00
6
EN_AA         = 0x3f
7
EN_RXADDR     = 0x02
8
RF_CH         = 0x4c
9
RF_SETUP     = 0x07
10
CONFIG         = 0x0e
11
DYNPD/FEATURE     = 0x00 0x00
12
Data Rate     = 1MBPS
13
Model         = nRF24L01+
14
CRC Length     = 16 bits
15
PA Power     = PA_MAX

    ** Pi2
1
================ SPI Configuration ================
2
CSN Pin          = CE0 (PI Hardware Driven)
3
CE Pin           = Custom GPIO25
4
Clock Speed      = 8 Mhz
5
================ NRF Configuration ================
6
STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
7
RX_ADDR_P0-1     = 0x65646f4e32 0x65646f4e31
8
RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
9
TX_ADDR          = 0x65646f4e32
10
RX_PW_P0-6       = 0x20 0x20 0x00 0x00 0x00 0x00
11
EN_AA            = 0x3f
12
EN_RXADDR        = 0x03
13
RF_CH            = 0x01
14
RF_SETUP         = 0x07
15
CONFIG           = 0x0e
16
DYNPD/FEATURE    = 0x00 0x00
17
Data Rate        = 1MBPS
18
Model            = nRF24L01+
19
CRC Length       = 16 bits
20
PA Power         = PA_MAX
Sowohl Senden als auch Empfangen geht ins Leere.
    Rate: 0.00 KB/s
    Payload Count: 0
  etc
    Now sending
    failed
    Failed, response timed out.
  usw..
Kann mir jemand weiterhelfen?
Was muss beim Sender / Empfänger identisch sein?
Und mit welchem Befehl kann ich was anpassen?
Grüße aus LA
ralphi

von Ralphi M. (ralphi_m)


Angehängte Dateien:

Lesenswert?

Hi all,
endlich gelöst.
Ihr seit ja welche. Etliche Posts, wie man es optimieren kann, aber 
einem Anfänger zu zeigen, wie  man überhaupt eine Verbindung zustande 
bekommt, zeigt einem keiner :-0 grr

Nach dem ich nicht weiter gekommen bin, hab ich (was erst zum Schluss 
lösen wollte) einen ATTiny84 zum senden gebracht.
Beim Raspi, hab ich dann auch alle Einstellungen weggelassen (also 
default). Waren nicht nötig - hab ich nicht gewusst :-(
Erst mal nur den Empfänger (Pi2):
1
// speichern als mytest.cpp 
2
// kompilieren
3
//g++ -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv7-a -mtune=arm1176jzf-s -Wall -I../ -lrf24-bcm mytest.cpp -o test2
4
5
#include <cstdlib>
6
#include <iostream>
7
#include <sstream>
8
#include <string>
9
#include <RF24/RF24.h>
10
using namespace std;
11
12
// Setup for GPIO25 PIN22 CE -CE0 PIN24 CSN       with SPI Speed @ 8Mhz
13
// Der Rest: MOSI MISO CLK 3.3 GND wie bekannt
14
RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
15
16
const uint64_t addresses[] = { 0x65646f4e31,0x65646f4e32};
17
18
//uint8_t data[32];
19
20
unsigned long startTime, stopTime, counter, rxTimer=0;
21
22
int main(int argc, char** argv){
23
24
  printf("start\n");
25
26
  radio.begin();                           // Setup and configure rf radio
27
  //radio.setChannel(1);
28
  //radio.setPALevel(RF24_PA_MAX);
29
  //radio.setDataRate(RF24_1MBPS);
30
  //radio.setAutoAck(1);                     // Ensure autoACK is enabled
31
  //radio.setRetries(2,15);                  // Optionally, increase the delay between retries & # of retries
32
  //radio.setCRCLength(RF24_CRC_16);
33
  radio.printDetails();
34
/********* Role chooser ***********/
35
36
      radio.openWritingPipe(addresses[1]);
37
      radio.openReadingPipe(1,addresses[0]);
38
        radio.startListening();
39
    unsigned long data;
40
    
41
    // forever loop
42
     while (1){
43
         while(radio.available()){
44
          radio.read(&data,sizeof (data));
45
         cout << "Data: " << data  << endl;
46
       }
47
    } // loop
48
} // main


Schreib ich gleich noch was zum ATTiny84:
Ich nutze hierfür den älteren Arduino SDK 1.5.8 (wegen Digispark als 2. 
SDK installiert)
Diese Anleitung war gut:
http://www.madebymarket.com/blog/dev/attiny-and-nrf24l01.html
Hierfür benötige ich den bootloader Attiny84 8MHz: 
http://code.google.com/p/arduino-tiny/
dadurch ändern sich die Pins wie im Bild.
Folgende Libs brauchts noch:
https://github.com/jscrane/RF24
https://github.com/jscrane/SPI  ** ATTiny ist diesmal Master (MISO, 
MOSI)
einfach die Zip als Bibliothek importieren
DI   4   // PA6
DO   5   // PA5
USCK 6   // PA4
SS   3   // PA7

Senden zum Test:
1
#include <RF24.h>
2
#include <SPI.h>
3
4
RF24 radio(8, 7); // CE_PIN, CSN_PIN laut Bild
5
const uint64_t pipes[] = { 0x65646f4e31,0x65646f4e32 };
6
7
void setup(void) {
8
  SPI.begin();
9
  radio.begin();
10
11
  radio.begin();
12
  radio.openWritingPipe(pipes[0]);
13
  radio.openReadingPipe(1, pipes[1]);
14
  radio.startListening();
15
}
16
  
17
void loop(void) {
18
  radio.powerUp(); 
19
  float txval = 90.8;
20
  radio.write( &txval, sizeof(float) );
21
  radio.powerDown();
22
  delay(1000);
23
}
Grüße aus LA
ralphi

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.