NRF24L01 LNA PA Probleme

Hallo ich habe eine Fernsteuerung gebastelt und der Sketch funktioniert auch gut.

Leider macht die Steuerung mit den angeblich besseren NRF24L01 LNA PA nur ärger.

TX= ohne LNA+PA und RX= ohne LNA+PA funktioniert sehr gut
TX= ohne LNA+PA und RX= mit LNA+PA funktionert ebenfalls
TX= mit LNA+PA und RX= ohne LNA+PA keine funktion
TX= mit LNA+PA und RX= mit LNA+PA flackerntes Signal geht mal und mal nicht

könnt ihr mir ein paar Tipps geben? Ich möchte die größt mögliche Reichweite haben.

Hier noch der Sketch:

TX Sender

/*  Pinbelegung 
 *  NRF24L01 zu Arduino
 *  1 GND       GND   
 *  2 VCC       3.3V
 *  3 CE        D9
 *  4 CSN       D10
 *  5 SCLK      D13
 *  6 MOSI      D11
 *  7 MISO      D12
 *  8 IRQ       Frei
 *  
 *  Poti oder Schalter zu Arduino
 *  Poti Ch1      A0
 *  Poti Ch2      A1
 *  Poti Ch3      A2
 *  Poti Ch4      A3
 *  Schalter Ch5  A4
 *  Schalter Ch6  A5
 */

//Library aufrufen
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

//Einstellnung des NRF24l01
RF24 radio(9,10);
uint16_t data[6] ;
const uint16_t buffer_size = sizeof(data);
const uint64_t pipe = 0xE8E8F0F0E1LL;

//Ausgänge, Integer und Servos deklarieren
const int tx_led=2;
const int Ch1_Input = A0;
const int Ch2_Input = A1;
const int Ch3_Input = A2;
const int Ch4_Input = A3;
const int Ch5_Input = A4;
const int Ch6_Input = A5;

int Ch1;
int Ch2;
int Ch3;
int Ch4;
int Ch5;
int Ch6;

bool Sendestatus;
unsigned long starttime;
unsigned long endtime;


void setup(void)
{
  Serial.begin(115200);
  
//Funk aktivieren  
  radio.begin();
  radio.openWritingPipe(pipe);
  
//Diagnose Funkverbindung    
  radio.printDetails();

//Ausgänge für Signale festlegen
  pinMode(tx_led,OUTPUT);
  digitalWrite(tx_led,LOW);
}


void loop(void)
{
  starttime = millis();
  
  //Daten werden erfasst und in Datenpakete gespeichert
  Ch1 =map(analogRead(Ch1_Input),0,1024,1000,2000);
  Ch2 =map(analogRead(Ch2_Input),0,1024,1000,2000);
  Ch3 =map(analogRead(Ch3_Input),0,1024,1000,2000);
  Ch4 =map(analogRead(Ch4_Input),0,1024,1000,2000);
  Ch5 =map(analogRead(Ch5_Input),0,1024,1000,2000);
  Ch6 =map(analogRead(Ch6_Input),0,1024,1000,2000);
  
  data[0] = Ch1;
  data[1] = Ch2;
  data[2] = Ch3;
  data[3] = Ch4;
  data[4] = Ch5;
  data[5] = Ch6;

  //Daten Senden
  Sendestatus = radio.write( data, buffer_size );
  
  //Auswertung der Sendung 
  //Sendung erfolgreich
  if(Sendestatus == true)
  {
    digitalWrite(tx_led,HIGH); 
  }
  //Sendung fehlgeschlagen
  else
  {
    digitalWrite(tx_led,LOW);
  }
  
  endtime = millis();
  
  //Ausgabe der Daten am PC
  Serial.print("Ch1 = ");       Serial.print(data[0]);
  Serial.print("      Ch2 = "); Serial.print(data[1]);
  Serial.print("      Ch3 = "); Serial.print(data[2]);
  Serial.print("      Ch4 = "); Serial.print(data[3]);
  Serial.print("      Ch5 = "); Serial.print(data[4]);
  Serial.print("      Ch6 = "); Serial.println(data[5]);
  Serial.print("Loopdauer ohne Serial print = "); Serial.println(endtime - starttime);
}

RX Empfänger

/*  Pinbelegung 
 *  NRF24L01 zu Arduino
 *  1 GND       GND   
 *  2 VCC       3.3V
 *  3 CE        D9
 *  4 CSN       D10
 *  5 SCLK      D13
 *  6 MOSI      D11
 *  7 MISO      D12
 *  8 IRQ       Frei
 *  
 *  ESC, Servo, Flightcontroller zu Arduino
 *  Ch1         D3
 *  Ch2         D4
 *  Ch3         D5
 *  Ch4         D6
 *  Ch5         D7
 *  Ch6         D8
 *  
 */

//Library aufrufen
#include <Servo.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

//Einstellnung des NRF24l01
const uint64_t pipe = 0xE8E8F0F0E1LL;
uint16_t received_data[6];
uint16_t num_received_data =sizeof(received_data);
RF24 radio(9,10);

//Ausgänge, Integer und Servos deklarieren
const int rx_led=2;
int Ch1;
int Ch2;
int Ch3;
int Ch4;
int Ch5;
int Ch6;

Servo Ch1_Output; 
Servo Ch2_Output;
Servo Ch3_Output;
Servo Ch4_Output;
Servo Ch5_Output;
Servo Ch6_Output;

unsigned long starttime;
unsigned long endtime;


void setup(void)
{
  Serial.begin(115200);
  delay(3000);

  //Funk aktivieren  
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.startListening();
  
  //Diagnose Funkverbindung  
  radio.printDetails();
  
  //Ausgänge für Signale festlegen  
  pinMode(rx_led,OUTPUT);
  Ch1_Output.attach(3);
  Ch2_Output.attach(4);
  Ch3_Output.attach(5);
  Ch4_Output.attach(6);
  Ch5_Output.attach(7);
  Ch6_Output.attach(8);
}


void loop(void)
{
  starttime = millis();
  
  //Funk ist aktiv und störungsfrei
  if (radio.available())
  {
      digitalWrite(rx_led,HIGH);
      radio.read( received_data, num_received_data );
      
      Ch1 = received_data[0];
      Ch2 = received_data[1];
      Ch3 = received_data[2];
      Ch4 = received_data[3];
      Ch5 = received_data[4];
      Ch6 = received_data[5];
  }

  //Funk ist inaktiv und gestört
  else
  {
     //Wen keine Verbindung besteht definierten Zustand herstellen! (zb 1000 für Gas weg) (oder 1500 Joystick mittig)
     digitalWrite(rx_led,LOW);
     Ch1 = 1000; 
     Ch2 = 1000;
     Ch3 = 1000; 
     Ch4 = 1000; 
     Ch5 = 1000; 
     Ch6 = 1000; 
     
  }

  //Schreiben der Empfangen Daten an den Ausgang
  if((received_data[0]>=1000 && received_data[0] <=2000) &&  (received_data[1]>=1000 && received_data[1]<=2000) &&  (received_data[2]>=1000 && received_data[2]<=2000)  &&  (received_data[3]>=1000 && received_data[3]<=2000)  &&  (received_data[4]>=1000 && received_data[4]<=2000)  &&  (received_data[5]>=1000 && received_data[5]<=2000))
  {
    Ch1_Output.writeMicroseconds(Ch1);
    Ch2_Output.writeMicroseconds(Ch2);
    Ch3_Output.writeMicroseconds(Ch3);
    Ch4_Output.writeMicroseconds(Ch4);
    Ch5_Output.writeMicroseconds(Ch5);
    Ch6_Output.writeMicroseconds(Ch6);
  }
  
  delay(5);

  endtime = millis();

  //Ausgabe Daten an PC
 Serial.print("Ch1 = ");       Serial.print(Ch1); Serial.print("  Data 0 = "); Serial.print(received_data[0]);
  Serial.print("      Ch2 = "); Serial.print(Ch2); Serial.print("  Data 1 = "); Serial.print(received_data[1]);
  Serial.print("      Ch3 = "); Serial.print(Ch3); Serial.print("  Data 2 = "); Serial.print(received_data[2]);
  Serial.print("      Ch4 = "); Serial.print(Ch4); Serial.print("  Data 3 = "); Serial.print(received_data[3]);
  Serial.print("      Ch5 = "); Serial.print(Ch5); Serial.print("  Data 4 = "); Serial.print(received_data[4]);
  Serial.print("      Ch6 = "); Serial.print(Ch6); Serial.print("  Data 5 = "); Serial.println(received_data[5]);
  Serial.print("Loopdauer ohne Serial print = "); Serial.println(endtime - starttime);
 
}

Vielen Dank

Die PA's brauchen definitiv eine eigene 3.3V Versorgung und möglicherweise noch zusätzlich einen Kondensator von 2- 5 10 µF an den Anschlusspins.

Wie sieht deine Stromversorgung aus, welche Arduinos verwendest du?

Mit den PA s hab ich gute Erfahrungen. Man nimmt entweder einen separaten 3,3V Regler oder einen Teensy 3.6. Zum Puffern nehm ich Kondensatoren in der Größe wie sie Whandall schon empfohlen hat.

  //Funk ist inaktiv und gestört

Falsch,

  // gerade kein Paket empfangen

wäre richtiger.

Was sollen all die delays in deinen Sketches?

Die 3,3V sind vom Arduino, ich habe aber noch ein paar Spannungsregler rumliegen mal sehen was passiert.

Das mit den Kondesatoren probiere ich auch mal.

Ich melde mich mit dem Ergebniss morgen.

Der Sketch ist aus irgendeiner Libary die ich im Internet gefunden hab. Die Delays waren da schon drin. Ich habe nur vieles verändert.

Der integrierte 3,3V Linearregler ist recht schwachbrüstig, der bringt den benötigten Strom nicht. Besser einen separaten Buck-Konverter

also ich verkünde mal meine Ergbnisse:

  1. Sketch alle Delays entfernt = ohne ergebniss

  2. Spannung gemessen = 2,8 -3,1V das ist zu niedrig

  3. ein akku auf 3,5 V entladen und direkt an das NRF24L01 LNA Pa angepint = Reichweite Verdoppelt auf 10m

Jetzt hab ich die Vermutung das eins der NRF24L01 LNA Pa defekt ist.

Ich habe einen einfaches Modul genommen als Sender und die zwei NRF24L01 LNA PA als Empfänger. Eins hat eine sehr hohe Reichweite (+50m) und eins ohne Funktion

das eine funktioniert bloß als Sender

Dass das Entfernen von delays nur das Programm verbessert,
aber nicht die Stromversorgung ist wohl offensichtlich.

Warum nimmst du keine stabilisierte 3.3V Spannung, sondern stümperst da irgendwie rum?
Hast du inzwischen Kondensatoren an den Anschlusspins?

Wenn du deine Module grundsätzlich so behandelst, sollte mich nicht wundern wenn eines defekt wäre.

Ja 10yF Kondensatoren sind dran.

Ich habe nur AMS1117 gefunden diese sind auch im Arduino verbaut. Also musste ich mir etwas anderes einfallen lassen.

Ein AMS1117 nahe bei und nur für den NRF funktioniert bei mir.

Habe jetzt mehrere Versuche aufgebaut immer unter gleichen Bedingungen festgestellt das ein Modul nur ganz schwach bis gar nicht funktioniert. Ich bestelle mal ein neues und melde mich dann wieder

Hallo melde mich mal wieder zurück. Ich habe mir nochmal ein Satz NRF24l01 geholt und trotzdem komm ich nicht weiter.

Muss ich das LNA und PA irgendwie zuschalten ?

Kann ich die unit64 pipe verringern um so die Qualität zu erhöhen? bzw. allgemein die Datenrate reduzieren?

Brauche nur 4x Unit8 Bytes das reicht auch fürs erste.

... und die 3.3V Versorgung für die Module auch schon auf vernünftigen Stand gebracht?

kevin678:
Ja 10yF Kondensatoren sind dran.

Ich habe nur AMS1117 gefunden diese sind auch im Arduino verbaut. Also musste ich mir etwas anderes einfallen lassen.

Der Im Arduino stabilisiert das 5V aus Vin.
Du brauchst einen zweiten, für 3,3V.
Das 3,3V aus dem USB-Treiber ist zu schwach.

Ich mach immer 2 Universaldioden vor die 5V, z.b. 2N4001
Funktioniert schon seit Monaten bei einem ESP8266 im Dauerbetrieb und aktuell an einem nrl pa in einem RC Sender

RIN67630:
Der Im Arduino stabilisiert das 5V aus Vin.
Du brauchst einen zweiten, für 3,3V.
Das 3,3V aus dem USB-Treiber ist zu schwach.

Oder man nimmt einen Adapter:
http://www.ebay.de/itm/2PCS-Wireless-Transceiver-Socket-Adapter-Plate-for-NRF24L01-Wireless-Module-8/172380236807

das versuche ich als nächstes

das ganze modul mit Alufolie zu umwickeln hat auch sehr gut geholfen