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