nrf24 + Arduino vs. nrf24 - Teensy - brauche Hilfe ...

Hallo in die Runde,

ich hoffe auf Unterstützung von den nrf24- Profis :wink:

Ich habe in den letzten Jahren schon einige (ca. 50) nrf24 verbaut- typischerweise mit Arduino nano - die laufen auch alle ohne Probleme...

Für ein aktuelles Projekt wo ich ein paar andere Anforderungen habe möchte ich nun Teensys einsetzen (LC, 3.2, 3.6), mit der RF24- library.

Ich habe nun schon einiges probiert, bekomme das ganze mit einem Teensy aber nicht zum laufen. Bei der Verkabelung bin ich mir recht sicher, dass die stimmt- der Sketch an sich funktioniert auf einem nano ohne Probleme- sollte also auch OK sein...

Nun hab ich mich schon durch diveres englisch- sprachige Foren gekämpft... scheiter aber doch an sprachlichen Hürden.

Kann es irgendwelche Unterschiede wie 32bit vs. 8bit oder hinsichtlich der höheren Taktung geben, die verhindern dass der Teensy läuft?

MaHa76:
Kann es irgendwelche Unterschiede wie 32bit vs. 8bit oder hinsichtlich der höheren Taktung geben, die verhindern dass der Teensy läuft?

Ja, der Datentyp Interger ist beispielsweise bei Uno und Teensy unterschiedlich.

In der Bibliothek TMRh20/RF24 sehe ich #include "utility/Teensy/RF24_arch_config.h", was auf eine Unterstützung des Teensys deuten könnte.

Ich hänge mal eben eine Testsketch an... auf der Gegenseite hab ich zum testen einen nano mit nrf24....

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
//#include "printf.h"

RF24 radio(17, 18); // (CE, CSN)

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

byte Sensor[6];
byte Status[6]; 
byte Sende[6];

void setup()
{
  Serial.begin(115200);
  Serial.print("einfacher Empfänger zum Testen für Teensy Boards");
    
  radio.begin();
  radio.openWritingPipe(addresses[0]);
  radio.openReadingPipe(1, addresses[0]);
  radio.openReadingPipe(2, addresses[1]);
  radio.openReadingPipe(3, addresses[2]);
  radio.openReadingPipe(4, addresses[3]);
  radio.openReadingPipe(5, addresses[4]);
  radio.openReadingPipe(6, addresses[5]);

  radio.setRetries(20,20);        
  radio.setPALevel(RF24_PA_MAX);       
  radio.setDataRate(RF24_1MBPS); 
  radio.startListening(); 
}

void loop()
{
  if (radio.available()) 
  {
    radio.read( &Sensor, sizeof(Sensor) );
    EmpfangsInfos();
  
  Status[2]++;
  
  radio.stopListening();
  radio.write(Status, sizeof(Status));
  SendeInfos();
  radio.startListening();
  }
}

void EmpfangsInfos()
{
  Serial.println("empfange:  ");  
  Serial.print(Sensor[0]);
  Serial.print(" / ");
  Serial.print(Sensor[1]);
  Serial.print(" / ");
  Serial.print(Sensor[2]);
  Serial.print(" / ");
  Serial.print(Sensor[3]);
  Serial.print(" / ");
  Serial.print(Sensor[4]);
  Serial.print(" / ");
  Serial.println(Sensor[5]);
}  

void SendeInfos() 
{
  Serial.println("sende:  ");  
  Serial.print(Status[0]);
  Serial.print(" / ");
  Serial.print(Status[1]);
  Serial.print(" / ");
  Serial.print(Status[2]);
  Serial.print(" / ");
  Serial.print(Status[3]);
  Serial.print(" / ");
  Serial.print(Status[4]);
  Serial.print(" / ");
  Serial.println(Status[5]);
}
  radio.openReadingPipe(1, addresses[0]);
  radio.openReadingPipe(2, addresses[1]);
  radio.openReadingPipe(3, addresses[2]);
  radio.openReadingPipe(4, addresses[3]);
  radio.openReadingPipe(5, addresses[4]);
  radio.openReadingPipe(6, addresses[5]);

Pipes gehen von 0 bis 5.

radio.setRetries(20,20);

Ist der Maximalwert für Retries nicht 15?

 radio.stopListening();
  radio.write(Status, sizeof(Status));
  SendeInfos();
  radio.startListening();

Das Ausdrucken der Infos und das startListening würde ich tauschen , um die Zeit ohne Empfang zu minimieren.
Ein Auswerten des Rückgabewertes von write() wird oft als nützlich betrachtet. :wink:

Ansonsten kann ich zu den Teensys nichts sagen, ich habe zwar einen 3.6, aber noch nicht wirklich betrieben.

Auf einem ESP32 läuft der Treiber nach minimalen Änderungen für die Platform/Architektur Defines.

agmue:
Ja, der Datentyp Interger ist beispielsweise bei Uno und Teensy unterschiedlich.

Wenn du als Datentyp für deine Integers int16_t oder uint16_t beutzt, kannst du dem obigen Problem begegnen.

Hi Whandall,

danke für deine Antworten :slight_smile:

Integers habe ich ja keine genutzt (oder?)

Wie funktioniert das den mit write()

Mir ist übrigens auch aufgefallen, dass der Teensy nur eher sporadisch mal was über den seriellen Monitor ausspuckt...

write()

bool hatGeklappt = radio.write(Status, sizeof(Status));

OK, verstehe.... ist eines der Themen in die ich mich jetzt mal einlese. So bald ich weiß was ich mache und ein Ergebnis habe, meld ich mich damit zurück. :slight_smile:

vielen Dank Whandall!

Juchhu... hab mich mal ins englisch-sprachige Teensy- Forum gewagt und von Paul Stoffregen den entscheidenden Hinweis bekommen. Davon abgesehen, dass ich hier noch einen Schreibfehler bzgl. des SCK- Pins reingeschmissen habe, muss dieser nochmal vor "radio.begin()" zugewiesen werden.

Mein funktionierende Beispielsketch sieht nun so aus:

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

#define RF24_MOSI 11
#define RF24_MISO 12
#define RF24_SCLK 14

RF24 radio(17, 18); // (CE, CSN)

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

byte Sensor[6];
byte Status[6]; 
byte Sende[6];

const int ledPin =  13; 

void setup()
{
  Serial.begin(115200);
  Serial.print("einfacher Empfänger zum Testen für Teensy Boards");
  
  SPI.setSCK(14);  
  radio.begin();
  radio.openWritingPipe(addresses[0]);
  radio.openReadingPipe(1, addresses[0]);
  radio.openReadingPipe(2, addresses[1]);
  radio.openReadingPipe(3, addresses[2]);
  radio.openReadingPipe(4, addresses[3]);
  radio.openReadingPipe(5, addresses[4]);

  radio.setRetries(15,15);        
  radio.setPALevel(RF24_PA_MIN);       
  radio.setDataRate(RF24_1MBPS); 
  radio.startListening(); 
  pinMode(ledPin, OUTPUT);  
}

void loop()
{
  if (radio.available()) 
  {
    radio.read( &Sensor, sizeof(Sensor) );
    EmpfangsInfos();
  }
  
  Status[2]++;
  
 /* radio.stopListening();
  radio.write(Status, sizeof(Status));
  radio.startListening();
  SendeInfos();*/
}

void EmpfangsInfos()
{
  Serial.println("empfange:  ");  
  Serial.print(Sensor[0]);
  Serial.print(" / ");
  Serial.print(Sensor[1]);
  Serial.print(" / ");
  Serial.print(Sensor[2]);
  Serial.print(" / ");
  Serial.print(Sensor[3]);
  Serial.print(" / ");
  Serial.print(Sensor[4]);
  Serial.print(" / ");
  Serial.println(Sensor[5]);
}  

void SendeInfos() 
{
  Serial.println("sende:  ");  
  Serial.print(Status[0]);
  Serial.print(" / ");
  Serial.print(Status[1]);
  Serial.print(" / ");
  Serial.print(Status[2]);
  Serial.print(" / ");
  Serial.print(Status[3]);
  Serial.print(" / ");
  Serial.print(Status[4]);
  Serial.print(" / ");
  Serial.println(Status[5]);
}

Pin 14 statt Pin 13 nutze ich, weil ich mir eine handvoll Adapter-Platinen gemacht habe, wo ich PIN 13 anderweitig nutze... anbei mal 2 Bilder davon... Zum Paket gehört dann noch eine weitere Platine auf der 3 LED- Treiber für max. 1A und 40V sitzen, sowie ein DC-DC-Converter, der aus max. 40V, Teensy- freundliche 5V macht...