NRF24L01+ probleme

Hallo
Ich habe Probleme eine Funkstrecke zum laufen zu bekommen.
Ich habe bedingt durch die Schule (Schulprojekt) leider zwei Texas Instrument tm4c123gxl hier.
Ich wollte mal mein glück versuchen (ja ich weis es ist arduino hier) ob jemand mir helfen kann den Fehler einzugrenzen.
Im Notfall kann ich auch auf Arduino wechseln meinte unser Lehrer.

Pins 1. Tm4c123gxl (RX): PC_6 (CE), PD_2 (MISO), PD_3 (MOSI), PD_1 (CS), PD_0 (SCK), PE_1 (IRQ)

Pins 2. Tm4c123gxl (TX): PC_7 (CE), PD_2 (MISO), PD_3 (MOSI), PD_1 (CS), PD_0 (SCK), PE_1 (IRQ)

Habe diverse Bibliotheken ausprobiert: Enrf24_v1_8 und RF24 von github.
Bei der letztern habe ich mit gettingStarted etwas auf den Serial.monitor angezeigt bekommen.

Beim Sender steht im Monitor: RF24/examples/GettingStarted *** PRESS 'T' to begin transmitting to the other node Drück ich T passiert nix.

Beim Empfänger steht im Monitor: RF24/examples/GettingStarted *** PRESS 'T' to begin transmitting to the other node
jedoch fängt er sofort an irgend was zu empfangen z.b Sent response 4294901760 usw.

Schließe ich aber nur den Empfänger an zeigt er mir das trotzdem an.
Habe auch schon Sender und Empfänger getauscht, also Hardware mäßig vom Bauteil A in Bauteil B und umgekehrt.

PS: Ich habe auch versucht für Texas was zu finden so gut wie unmöglich :frowning:

Hallo,
hier sitzen die Jung´s die Du brauchst.
Gruß und Spaß
Andreas

Danke :slight_smile:

Hallo,
"Im Notfall kann ich auch auf Arduino wechseln meinte unser Lehrer."

Wenn Du da nicht weiter kommst, dann zum Lehrer- dann wieder hier her.
Dann Deinen Sketch in CodeTags (Editor </>) einfügen. Kein Sketch, keine Hilfe.
Glaskugeln sind noch in den OsterFerien.
Gruß und Spaß
Andreas

Der Lehrer hat keine Ahnung, wir sollen einfach ein Projekt machen und uns selber alles beibringen so zusagen.

/*
* Getting Started example sketch for nRF24L01+ radios
* This is a very basic example of how to send data from one node to another
* Updated: Dec 2014 by TMRh20
*/

#include <SPI.h>
#include "RF24.h"

/****************** User Config ***************************/
/***      Set this radio as radio number 0 or 1         ***/
bool radioNumber = 0;

/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
RF24 radio(PC_6,PD_1);
/**********************************************************/

byte addresses[][6] = {"1Node","2Node"};

// Used to control whether this node is sending or receiving
bool role = 0;

void setup() {
  Serial.begin(115200);
  Serial.println(F("RF24/examples/GettingStarted"));
  Serial.println(F("*** PRESS 'T' to begin transmitting to the other node"));
  
  radio.begin();

  // Set the PA Level low to prevent power supply related issues since this is a
 // getting_started sketch, and the likelihood of close proximity of the devices. RF24_PA_MAX is default.
  radio.setPALevel(RF24_PA_LOW);
  
  // Open a writing and reading pipe on each radio, with opposite addresses
  if(radioNumber){
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
  }else{
    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1,addresses[1]);
  }
  
  // Start the radio listening for data
  radio.startListening();
}

void loop() {
  
  
/****************** Ping Out Role ***************************/  
if (role == 1)  {
    
    radio.stopListening();                                    // First, stop listening so we can talk.
    
    
    Serial.println(F("Now sending"));

    unsigned long time = micros();                             // Take the time, and send it.  This will block until complete
     if (!radio.write( &time, sizeof(unsigned long) )){
       Serial.println(F("failed"));
     }
        
    radio.startListening();                                    // Now, continue listening
    
    unsigned long started_waiting_at = micros();               // Set up a timeout period, get the current microseconds
    boolean timeout = false;                                   // Set up a variable to indicate if a response was received or not
    
    while ( ! radio.available() ){                             // While nothing is received
      if (micros() - started_waiting_at > 200000 ){            // If waited longer than 200ms, indicate timeout and exit while loop
          timeout = true;
          break;
      }      
    }
        
    if ( timeout ){                                             // Describe the results
        Serial.println(F("Failed, response timed out."));
    }else{
        unsigned long got_time;                                 // Grab the response, compare, and send to debugging spew
        radio.read( &got_time, sizeof(unsigned long) );
        unsigned long time = micros();
        
        // Spew it
        Serial.print(F("Sent "));
        Serial.print(time);
        Serial.print(F(", Got response "));
        Serial.print(got_time);
        Serial.print(F(", Round-trip delay "));
        Serial.print(time-got_time);
        Serial.println(F(" microseconds"));
    }

    // Try again 1s later
    delay(1000);
  }



/****************** Pong Back Role ***************************/

  if ( role == 0 )
  {
    unsigned long got_time;
    
    if( radio.available()){
                                                                    // Variable for the received timestamp
      while (radio.available()) {                                   // While there is data ready
        radio.read( &got_time, sizeof(unsigned long) );             // Get the payload
      }
     
      radio.stopListening();                                        // First, stop listening so we can talk   
      radio.write( &got_time, sizeof(unsigned long) );              // Send the final one back.      
      radio.startListening();                                       // Now, resume listening so we catch the next packets.     
      Serial.print(F("Sent response "));
      Serial.println(got_time);  
   }
 }




/****************** Change Roles via Serial Commands ***************************/

  if ( Serial.available() )
  {
    char c = toupper(Serial.read());
    if ( c == 'T' && role == 0 ){      
      Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
      role = 1;                  // Become the primary transmitter (ping out)
    
   }else
    if ( c == 'R' && role == 1 ){
      Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));      
       role = 0;                // Become the primary receiver (pong back)
       radio.startListening();
       
    }
  }


} // Loop

Die werden angepasst, je nach dem auf welches Board ich spiele.

Sender:
bool radioNumber = 1;
RF24 radio(PC_7,PD_1);
bool role = 1;

Empfänger:
bool radioNumber = 0;
RF24 radio(PC_6,PD_1);
bool role = 0;

und dann wird mir das angezeigt, was ich als erstes geschrieben hatte. Hoffe es hilft mehr :slight_smile:

Hallo,
mal probiert?
Gruß und Glück
Andreas

ja, bis auf die kondensatoren alles.
Kondensatoren sind bestellt.
Das problem ist beim Sender steht:

RF24/examples/GettingStarted
*** PRESS 'T' to begin transmitting to the other node

Ich kann jedoch so viel T drücken wie ich will, es passiert nicht.

Beim Empfänger:

RF24/examples/GettingStarted
*** PRESS 'T' to begin transmitting to the other node

Es steht auch da aber er fängt sofort sowas anzuzeigen ohne das ich T oder R gedrückt habe: Sent response 523511232

Ich habe viele Anleitungen / Tutorials mir angeguckt bzw gesehen und dann jedes mal nach gemacht (z.b RF24). Leider waren alle für Arduino nicht direkt für Texas. Deswegen versuche ich mein glück.

Was ich noch mal testen werde, mit Kondensatoren, bloß die kommen die Tage erst. Es könnte ja sein das es auch an was anderen liegt noch.

Entrax:
Ich kann jedoch so viel T drücken wie ich will, es passiert nicht.

Du hast auch auf Senden gedrückt, bzw Enter/Return eingegeben?

Entrax:
Beim Empfänger:

RF24/examples/GettingStarted
*** PRESS 'T' to begin transmitting to the other node

Es steht auch da aber er fängt sofort sowas anzuzeigen ohne das ich T oder R gedrückt habe: Sent response 523511232

Das sieht mir nach einem Kommunikationsproblem auf SPI aus. Ist die Verdrahtung in Ordnung?
Passt sie zum Sketch?

Warum hast du die Module eigentlich unterschiedlich verdrahtet?

Hallo,
wenn es Funk ist, dann braucht es eine "richtige" Antenne. Ist die vorhanden?
Gruß und Spaß
Andreas

Whandall:
Du hast auch auf Senden gedrückt, bzw Enter/Return eingegeben?

Das sieht mir nach einem Kommunikationsproblem auf SPI aus. Ist die Verdrahtung in Ordnung?
Passt sie zum Sketch?

Warum hast du die Module eigentlich unterschiedlich verdrahtet?

  1. Ja habe ich.
  2. Verdrahtung mehrfach kontrolliert also in Ordnung. SPI kommunikationsproblem habe ich mir auch schon
    gedacht bzw raus gelesen. Ich habe auch gelesen man soll Kondensatoren zwischen VCC und GND
    schalten(ist auch bestellt), hilft es gegen das SPI Problem? =/
  3. Sketch dem entsprechen angepasst also RF24 radio(PC_7,PD_1); //CE, CS immer angepasst.
  4. Weil (davon bin ich ausgegangen) ich nach der Pin Map von Texas verdrahtetet habe und dort stehen RX
    und TX mit Pins dahinter und deswegen ist es unterschiedlich vom 1. und 2. Mikrocontroller.

SkobyMobil:
Hallo,
wenn es Funk ist, dann braucht es eine "richtige" Antenne. Ist die vorhanden?
Gruß und Spaß
Andreas

  1. Also eine richtige Antenne (externe) ist nicht dabei nur die beiden Module, da ich auch (bis jetzt) keine
    größen Distanzen überbrücken muss bzw will. nur sehr kurze. In diversen Anleitungen sind auch keine
    extra Antennen mit vorgeführt.

SkobyMobil:
wenn es Funk ist, dann braucht es eine "richtige" Antenne.

Bitte definiere richtig.

Ansonsten ist das eher eine amerikanische Sicht, die hatten immer die schönen
ausziehbaren Antennen an drahtlosen Festnetztelefonen, lange nachdem das noch nötig war.

Auch Handys für den amerikanischen Markt hatten oft einen Antennenstummel.

Entrax:
4. Weil (davon bin ich ausgegangen) ich nach der Pin Map von Texas verdrahtetet habe und dort stehen RX
und TX mit Pins dahinter und deswegen ist es unterschiedlich vom 1. und 2. Mikrocontroller.

Wohl nur wenn man die Pins als serielle Schnittstelle nutzt, als Steuersignal sollte das egal sein.

Kannst du mit einem Logicanalyzer den SPI Bus ansehen?

Beide gleich zu verdrahten hätten den Vorteil, dass du nur einen Sketch hast,
keine Chance einen falschen zu brennen.

Beide Knoten (anfangs sind es beide Receiver) zeigen unterschiedliches Verhalten.

Der Transmitter scheint sich wegzuhängen (keine Ausgabe bei 'T'),
der Receiver liest anscheinend Schrott.

Was macht der Receiver wenn du ein 'T' eingibst?

Whandall:
Beide gleich zu verdrahten hätten den Vorteil, dass du nur einen Sketch hast,
keine Chance einen falschen zu brennen.

Beide Knoten (anfangs sind es beide Receiver) zeigen unterschiedliches Verhalten.

Der Transmitter scheint sich wegzuhängen (keine Ausgabe bei 'T'),
der Receiver liest anscheinend Schrott.

Was macht der Receiver wenn du ein 'T' eingibst?

Ok, dass wusste ich nicht, dann kann ich sie selbst verständlich gleich verdrahten denn CE.
Ich habe beim (Empfänger) T eingeben:

*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK
Now sending
failed
Sent 5293566, Got response 0, Round-trip delay 5293566 microseconds
Now sending
failed
Sent 6305612, Got response 0, Round-trip delay 6305612 microseconds
Now sending
failed
Sent 7317679, Got response 0, Round-trip delay 7317679 microseconds
Now sending
failed

das kam dabei raus.

Habe im dann auch noch mal meinen eigentlich Sender getestet und dort konnte ich nichts mit R oder T machen. Natürlich eingeben und bestätigt.

Logicanalyzer: Sowas habe ich leider nicht zu hause, ich bin relativ neu auf den gebiet. :slight_smile:

Hallo,
mit "richtiger" Antenne meinte ich eine Antenne die seinem Betriebsband
entspricht. z.B. Antenne

Oder wenigstens einen Kupferdraht mit der richtigen Länge.
Auf der Platine befindet sich zwar eine "Antenne", dieser würde ich aber nicht
vertrauen. Bei "Funk" muß alles stimmen- sonst gibt es nur Probleme damit.
Gruß und Spaß
Andreas

Hast du schon mal SPI Devices erfolgreich mit dem Chip betrieben?

Im Arduino Umfeld kannst du mit printDetails() die meisten Register ausgeben
und damit die SPI Kommunikation testen.

Bisher hast du nicht einmal erwähnt welche IDE du benutzt oder welche SPI Library...

SkobyMobil:
Auf der Platine befindet sich zwar eine "Antenne", dieser würde ich aber nicht
vertrauen.

Die entspricht in der Regel 100%ig den "PCB layout examples" von Nordic.
Wenn du dem nicht vertrauen kannst, dann auch dem ganzen Chip nicht.

Es gibt auch Module mit Keramikantenne und/oder Anschluss für eine externe "richtige" Antenne.

Whandall:
Hast du schon mal SPI Devices erfolgreich mit dem Chip betrieben?

Im Arduino Umfeld kannst du mit printDetails() die meisten Register ausgeben
und damit die SPI Kommunikation testen.

Bisher hast du nicht einmal erwähnt welche IDE du benutzt oder welche SPI Library...

Nein, leider noch nicht. Das ist das erste mal. Das einzigste was ich habe war ein i2c lcd display.

printDetails() noch nicht getestet, mache ich noch gleich/nachher.

IDE? Hardware bedingt nehme ich Energia. Wenn du das meints.
SPI Library ist in der Energie software enthalten.
Daher gehe ich von aus dass es die richtige ist.

Ist bei Energia ein Beispiel für eine SPI Benutzung (RFID, SD, Ethernet, TFT, ...) dabei?

Vielleicht braucht man ein paar Zaubersprüche oder eine besondere Initialisierung?

/*
  Digital Pot Control
  
  This example controls an Analog Devices AD5206 digital potentiometer.
  The AD5206 has 6 potentiometer channels. Each channel's pins are labeled
  A - connect this to voltage
  W - this is the pot's wiper, which changes when you set it
  B - connect this to ground.
 
 The AD5206 is SPI-compatible,and to command it, you send two bytes, 
 one with the channel number (0 - 5) and one with the resistance value for the
 channel (0 - 255).  
 
 The circuit:
  * All A pins  of AD5206 connected to +5V
  * All B pins of AD5206 connected to ground
  * An LED and a 220-ohm resisor in series connected from each W pin to ground
  * CS - to digital pin 8  (SS pin) P2.0
  * SDI - to digital pin 14/15 (MOSI pin USI/USCI) P1.6/P1.7
  * CLK - to digital pin 7 (SCK pin) P1.5
 
 created 10 Aug 2010 
 by Tom Igoe
 
 modified 2 May 2012 - changed SS pin
 by Rick Kimball 
 
 Thanks to Heather Dewey-Hagborg for the original tutorial, 2005
 
*/


// include the SPI library:
#include <SPI.h>

// set pin 8 as the slave select for the digital pot:
const int slaveSelectPin = PB_5;

void setup() {
  // set the slaveSelectPin as an output:
  pinMode (slaveSelectPin, OUTPUT);
  // initialize SPI:
  SPI.begin(); 
}

void loop() {
  // go through the six channels of the digital pot:
  for (int channel = 0; channel < 6; channel++) { 
    // change the resistance on this channel from min to max:
    for (int level = 0; level < 255; level++) {
      digitalPotWrite(channel, level);
      delay(10);
    }
    // wait a second at the top:
    delay(100);
    // change the resistance on this channel from max to min:
    for (int level = 0; level < 255; level++) {
      digitalPotWrite(channel, 255 - level);
      delay(10);
    }
  }

}

int digitalPotWrite(int address, int value) {
  // take the SS pin low to select the chip:
  digitalWrite(slaveSelectPin,LOW);
  //  send in the address and value via SPI:
  SPI.transfer(address);
  SPI.transfer(value);
  // take the SS pin high to de-select the chip:
  digitalWrite(slaveSelectPin,HIGH); 
}

Das ist der denn Energia drin hat.
Ich habe im anderen auch direkt SPI.begin(); eingefügt hat trotzdem nichts gebracht :confused:

PS. Ich habe auch eine andere Libirary gefunden wo bezug auf Texas und Energia genommen wurde:

Enrf24_TXdemo

/*
#include <Enrf24.h>
#include <nRF24L01.h>
#include <string.h>
#include <SPI.h>

Enrf24 radio(P2_0, P2_1, P2_2);  // P2.0=CE, P2.1=CSN, P2.2=IRQ
const uint8_t txaddr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x01 };

const char *str_on = "ON";
const char *str_off = "OFF";

void dump_radio_status_to_serialport(uint8_t);

void setup() {
  Serial.begin(9600);

  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);

  radio.begin();  // Defaults 1Mbps, channel 0, max TX power
  dump_radio_status_to_serialport(radio.radioState());

  radio.setTXaddress((void*)txaddr);
}

void loop() {
  Serial.print("Sending packet: ");
  Serial.println(str_on);
  radio.print(str_on);
  radio.flush();  // Force transmit (don't wait for any more data)
  dump_radio_status_to_serialport(radio.radioState());  // Should report IDLE
  delay(1000);

  Serial.print("Sending packet: ");
  Serial.println(str_off);
  radio.print(str_off);
  radio.flush();  //
  dump_radio_status_to_serialport(radio.radioState());  // Should report IDLE
  delay(1000);
}

void dump_radio_status_to_serialport(uint8_t status)
{
  Serial.print("Enrf24 radio transceiver status: ");
  switch (status) {
    case ENRF24_STATE_NOTPRESENT:
      Serial.println("NO TRANSCEIVER PRESENT");
      break;

    case ENRF24_STATE_DEEPSLEEP:
      Serial.println("DEEP SLEEP <1uA power consumption");
      break;

    case ENRF24_STATE_IDLE:
      Serial.println("IDLE module powered up w/ oscillators running");
      break;

    case ENRF24_STATE_PTX:
      Serial.println("Actively Transmitting");
      break;

    case ENRF24_STATE_PRX:
      Serial.println("Receive Mode");
      break;

    default:
      Serial.println("UNKNOWN STATUS CODE");
  }
}

Enrf24_RXdemo

/*
#include <Enrf24.h>
#include <nRF24L01.h>
#include <string.h>
#include <SPI.h>

Enrf24 radio(P2_0, P2_1, P2_2);
const uint8_t rxaddr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x01 };

const char *str_on = "ON";
const char *str_off = "OFF";

void dump_radio_status_to_serialport(uint8_t);

void setup() {
  Serial.begin(9600);

  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  
  radio.begin();  // Defaults 1Mbps, channel 0, max TX power
  dump_radio_status_to_serialport(radio.radioState());

  radio.setRXaddress((void*)rxaddr);
  
  
  radio.enableRX();  // Start listening
}

void loop() {
  char inbuf[33];
  
  dump_radio_status_to_serialport(radio.radioState());  // Should show Receive Mode

  while (!radio.available(true))
    ;
  if (radio.read(inbuf)) {
    Serial.print("Received packet: ");
    Serial.println(inbuf);

    if (!strcmp(inbuf, str_on))
      Serial.println("HIGH");
    if (!strcmp(inbuf, str_off))
      Serial.println("LOW");
  }
}

void dump_radio_status_to_serialport(uint8_t status)
{
  Serial.print("Enrf24 radio transceiver status: ");
  switch (status) {
    case ENRF24_STATE_NOTPRESENT:
      Serial.println("NO TRANSCEIVER PRESENT");
      break;

    case ENRF24_STATE_DEEPSLEEP:
      Serial.println("DEEP SLEEP <1uA power consumption");
      break;

    case ENRF24_STATE_IDLE:
      Serial.println("IDLE module powered up w/ oscillators running");
      break;

    case ENRF24_STATE_PTX:
      Serial.println("Actively Transmitting");
      break;

    case ENRF24_STATE_PRX:
      Serial.println("Receive Mode");
      break;

    default:
      Serial.println("UNKNOWN STATUS CODE");
  }
}

Natürlich muss man vor bei Enrf24 radio(P2_0, P2_1, P2_2); // P2.0=CE, P2.1=CSN, P2.2=IRQ
die richtigen Pins eingeben.

Jedoch hängt er auch dort:

Sender:
Sending packet: ON/OFF
Enrf24 radio transceiver status: NO TRANSCEIVER PRESENT

Empfänger:
Enrf24 radio transceiver status: NO TRANSCEIVER PRESENT

Das sieht ja völlig normal aus.

Womit speist du denn die NRFs?
Die brauchen schon etwas Strom, normalerweise äußert sich ein Mangel dort
aber in Kommunikations- und nicht Betriebsstörungen.

Versuch dich mal an den printDetails, dafür brauchst du

#include <printf.h>
setup(){
 Serial.begin(115200);
 printf_begin();
 ...
}

Das gilt für ManiacBug und TMRh20 Libraries.