Go Down

Topic: NRF24L01 LNA PA Probleme (Read 315 times) previous topic - next topic

kevin678

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
Code: [Select]
/*  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
Code: [Select]
/*  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

Whandall

#1
Jul 23, 2017, 10:32 pm Last Edit: Jul 23, 2017, 10:57 pm by Whandall
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?
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

MaHa76

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.

Whandall

Code: [Select]
  //Funk ist inaktiv und gestört


Falsch,

Code: [Select]
  // gerade kein Paket empfangen
wäre richtiger.

Was sollen all die delays in deinen Sketches?
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

kevin678

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.


ElEspanol

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

kevin678

#6
Jul 24, 2017, 08:05 pm Last Edit: Jul 24, 2017, 08:14 pm by kevin678
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


Whandall

#7
Jul 24, 2017, 08:33 pm Last Edit: Jul 24, 2017, 08:35 pm by Whandall
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.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

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.

Whandall

Ein  AMS1117 nahe bei und nur für den NRF funktioniert bei mir.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

kevin678

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

kevin678

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.


hajos118

... und die 3.3V Versorgung für die Module auch schon auf vernünftigen Stand gebracht?
Orthographie und Interpunktion folgen keiner gültigen Norm. Wer Fehler findet darf sie behalten!

RIN67630

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.

ElEspanol

#14
Aug 12, 2017, 09:30 am Last Edit: Aug 12, 2017, 09:32 am by ElEspanol
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

Go Up