Falscher Output

Hallo Ich bin dabei Ein Modellboot mit Arduino Nanos als steuerung aufzurüsten. Das Boot, die Servos und den Antriebsmotor habe ich von meinem Opa bekommen daher sind die Teile schon sehr alt. Es funktioniert noch alles und die augegebenen Werte (bei den Joysticks) sind halt nicht von 0 bis 1023 oder so sondern von 408/416 bis 612/606 weshalb ich die erstmal mit der map funktion in prozentwerte umgewandelt habe. Soweit funktioniert das auch tadellos, allerdings ist es so, dass wenn ich nun das Pogramm für den Sender mit reinschreibe der Wert des rechten Joysticks auf der X-Achse von 510 auf 5 fällt und da plötzlich -493% steht. Ich habe keine Ahnung warum das so ist. Ich wäre sehr dankbar für jede Rückmeldung.

Hier der Sketch:

#include <SPI.h>
#include <RF24.h>
#include <RF24_config.h>
#include <nRF24L01.h>

#define Xr_Pin A0
#define Yr_Pin A1

#define Xl_Pin A2
#define Yl_Pin A3

int xr_out;
int yar;
int yr_out;
int pitch;

int xl_out;
int roll;
int yl_out;
int throttle;

RF24 radio(9, 10);
const uint64_t pAddress = 0xB00B1E5000LL;  

byte Array[4];

void setup() {
radio.begin();
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
Serial.begin(9600);
}

void loop() {
xr_out = analogRead(Xr_Pin);
yar = map(xr_out,408,612,-100,100);

yr_out = analogRead(Yr_Pin);
pitch = map(yr_out,416,606,-100,100);


xl_out = analogRead(Xl_Pin);
roll = map(xl_out,408,612,100,-100);

yl_out = analogRead(Yl_Pin);
throttle = map(yl_out,416,606,-100,100);

Serial.print("\n\n\n\n");

Serial.print("X Wert R: ");
Serial.print(yar);
Serial.println(" %");
Serial.println(xr_out);

Serial.print("Y Wert R: ");
Serial.print(pitch);
Serial.println(" %");
Serial.println(yr_out);


Serial.print("\n");


Serial.print("X Wert L: ");
Serial.print(roll);
Serial.println(" %");
Serial.println(xl_out);

Serial.print("Y Wert L: ");
Serial.print(throttle);
Serial.println(" %");
Serial.println(yl_out);

Array[0] = (throttle);  
 Array[1] = (yar);
 Array[2] = (pitch);  
 Array[3] = (roll);

 radio.write(&Array, sizeof(Array));
 Serial.println("Sending");
 
delay(800);
}

Serial Monitor:

X Wert R: -492 %
8

Y Wert R: 2 %
513

X Wert L: 0 %
510

Y Wert L: 0 %
511

Sending

Hallo phantox_44

Herzlich Willkommen im weltbesten Arduino Forum.

Constrain könnte helfen, nachdem der Analogwert gelesen worden ist.

Ich wünsche einen geschmeidigen Abend und viel Spass beim Programmieren in C++.

Entweder benutze ich das constrain() falsch oder es Funktioniert einfach nicht.
Danke trotzdem für deinen Vorschlag.

Sollte das nicht besser const uint64_t pAddress = 0xB00B1E5000LLU; heißen?
Oder gar: constexpr uint64_t pAddress {0xB00B1E5000LLU};

Hier schreibst du Vorzeichen behaftete Werte in Vorzeichen lose Array Zellen.
Selbst wenn es funktioniert (impliziter Cast), ist es nicht logisch.

Wenn das plötzlich 8 liefert, hast du ein Problem mit der Verkabelung, mit dem Poti, usw.
Das kann man nicht gesund rechnen.

1 Like

Neu:

xr_out = analogRead(Xr_Pin);
xr_out = constrain(xr_out, 408, 612);
yar = map(xr_out,408,612,-100,100);

Ich würde sogar eher

const char pAddress[] = "BOOTE";

oder sowas verwenden, verschwendet nur ein statt drei Byte,
und die Verwendung ist nicht deprecated, wie bei uint64_t.

So funktioniert der Code und gibt die richtigen Werte auf:

#include <SPI.h>
#include <RF24.h>
#include <RF24_config.h>
#include <nRF24L01.h>

#define Xr_Pin A0
#define Yr_Pin A1

#define Xl_Pin A2
#define Yl_Pin A3

int xr_out;
int yar;
int yr_out;
int pitch;

int xl_out;
int roll;
int yl_out;
int throttle; 

RF24 radio(7, 8);
constexpr uint64_t pAddress {0xB00B1E5000LLU};

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

void loop() {
xr_out = analogRead(Xr_Pin);
yar = map(xr_out,408,612,-100,100);

yr_out = analogRead(Yr_Pin);
pitch = map(yr_out,416,606,-100,100);

xl_out = analogRead(Xl_Pin);
roll = map(xl_out,408,612,100,-100);

yl_out = analogRead(Yl_Pin);
throttle = map(yl_out,416,606,-100,100);

Serial.print("\n\n\n\n");

Serial.print("X Wert R: ");
Serial.print(yar);
Serial.println(" %");
Serial.println(xr_out);

Serial.print("Y Wert R: ");
Serial.print(pitch);
Serial.println(" %");
Serial.println(yr_out);


Serial.print("\n");


Serial.print("X Wert L: ");
Serial.print(roll);
Serial.println(" %");
Serial.println(xl_out);

Serial.print("Y Wert L: ");
Serial.print(throttle);
Serial.println(" %");
Serial.println(yl_out);

delay(800);
}

aber sobald ich das als void setup reinschreibe,

void setup() {
radio.begin();
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();

Serial.begin(9600);
}

was ja für den RF24 benötigt wird wird ein falscher Wert ausgegeben, den ich auch nicht verwenden kann.
Eure Vorschläge habe ich auch ausprobiert und teilweise übernommen aber es hat nicht wirklich was gebracht. Der Wert war zwar anders aber immer noch unbrauchbar.

Nach dieser Anleitung habe ich das gebaut (falls es hilft): How To Make 6 Channel Radio Control For Models. Diy Proportional RC – RC Models, DIY Hobby Elektronics, Arduino projects, RC Airplanes

Mir scheint, dass im setup() noch das Öffnen des Sendekanals fehlt; etwas wie

// set the TX address of the RX node into the TX pipe
  radio.openWritingPipe(address[radioNumber]);

Zusätzlich müsste nach dem, was ich beim Googlen zum RF24 gefunden habe eine Zeile mit der oben genutzten Adresse eingefügt werden:

// Let these addresses be used for the pair
uint8_t address[][6] = { "1Node", "2Node" };

Die Bezeichnungen müssen natürlich an Deine Anwendung angepasst werden (es täte vermutlich auch eine einzelne Adresse! Siehe post #6).

1 Like

Danke aber das ändert trotzdem nichts daran, dass der X Achsen Wert des rechten Joysticks sich verändert. Selbst wenn ich den abstecke ist der Wert nicht 0 sondern schwankt von 984 bis 997.

Hallo,

Wenn du das Poti absteckst hängt der analoge Eingang in der Luft und misst irgendwas etwas undefiniertes. Das ist normal.

Das müßtest du immer haben unabhängig ob RF24 aktiv ist oder nicht. Kabelbruch? Kontaktprobleme? Was passiert wenn du nur die Potiwerte ausgibts? Kommt da schon Unsinn raus? Oder kann es sein das der RF24 in die analogen Pins einstreut?

#include <SPI.h>
#include <RF24.h>
#include <RF24_config.h>
#include <nRF24L01.h>

const byte Xr_Pin {A0};
const byte Yr_Pin {A1};
const byte Xl_Pin {A2};
const byte Yl_Pin {A3};

int xr_out;
int yar;
int yr_out;
int pitch;

int xl_out;
int roll;
int yl_out;
int throttle;

RF24 radio(7, 8);

void setup()
{
  Serial.begin(9600);
  radio.begin();
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop()
{
  xr_out = analogRead(Xr_Pin);
  yr_out = analogRead(Yr_Pin);
  xl_out = analogRead(Xl_Pin);
  yl_out = analogRead(Yl_Pin);
 
  Serial.print("\n\n");

  Serial.print("XR: "); Serial.println(xr_out);
  Serial.print("YR: "); Serial.println(yr_out);
  Serial.print("XL: "); Serial.println(xl_out);
  Serial.print("YL: "); Serial.println(yl_out);

  delay(1000);
}

Ob du den RF24 richtig konfigurierst hast habe ich nicht geprüft. Dafür solltest du die Bsp. der Lib anschauen. Allein auf irgendein fremdes Projekt würde ich mich bei Problemen nicht verlassen.

Wenn ich

radio.begin();
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();

aus void setup() lösche bekomme ich die richtigen werte, wie bei den anderen joysticks auch. Nur, dass das die ganze Zeit klappt.

Unabhängig von den Eintragungen im Setup(), wundert es mich, dass Du mit Deinem Sketch die gewünschten Werte erhältst.

@my_xy_projekt hat die folgenden Zeilen gepostet:

xr_out = analogRead(Xr_Pin);
xr_out = constrain(xr_out, 408, 612);
yar = map(xr_out,408,612,-100,100);

Ohne die Zeile mit constrain() liefert map() auch Werte außerhalb von -100 und 100.

map() ist wie folgt definiert:

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Ist das tatsächlich okay für Dich?

Ja ist es tatsächlich, da die Werte ohne die Sachen im setup() nicht unter oder über 408/416 ,612/606 gehen. Außer wenn ich das setup für den FR24 reinschreibe und dann auch nur der erste Wert und nicht alle. Ich weiß halt einfach nicht mehr weiter, denn wenn ich constrain() verwende ist der wert einfach dauerhaft auf dem Maximum.

Hallo,

dein analoger Potibereich ist ja sehr eng. constrain() kaschiert möglicherweise das tatsächliche Problem bevor noch falschere Werte verarbeitet werden. Wie ist denn der RF24 angeschlossen? Ist das alles geprüft? Der zieht laut meines Wissen Pulsförmig schon einige mA. Falls die 3,3V vom Nano Board verwendet werden könnte der Regler überlastet sein. Das könnte sich auf die 5V Stabilität vom Board auswirken was dann zu anderen Messwerten für analogeRead führt und damit das Mapping Amok läuft. Hast du noch woanders her 3,3V zur Verfügung? Batterie? Ein kleiner Elko ist am RF24 dran?

Ich habe mir jetzt mal den Analogwert direkt ausgeben lassen. Der ist 0 obwohl er eigentlich um die 510 sein müsste ich habe grad mit nem Multimeter nachgeprüft und das hat alles Kontakt. Angeschlossen hab ich das ganze folgendermaßen:


nur ohne die Led und die beiden sachen unten rechts und CE/CSN an 7/8
(Die Batterie ist die selbe)

Hallo,

ich kann am Schaltplan erstmal nichts falsches erkennen. Wie gesagt, kannst du die 3,3V für den RF24 extra versorgen? Also nicht vom Nanoboard.

Ändert leider nichts.

Problem gelöst: Irgendetwas hat mit dem A0 Pin nicht gestimmt statt A0 A4 eingegeben, umgelötet und es hat geklappt.

#include <SPI.h>
#include <RF24.h>
#include <RF24_config.h>
#include <nRF24L01.h>

#define Xr_Pin A4
#define Yr_Pin A1

#define Xl_Pin A2
#define Yl_Pin A3

int xr_out = 0;
int yar = 0;
int yr_out = 0;
int pitch = 0;

int xl_out = 0;
int roll = 0;
int yl_out = 0;
int throttle = 0;

RF24 radio(7, 8);
const uint64_t pipeOut = 0xE9E8F0F0E1LL;   

void setup() {
  radio.begin();
  radio.openWritingPipe(pipeOut);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH);
  radio.stopListening();       

Serial.begin(9600);
}

void loop() {
xr_out = analogRead(Xr_Pin);
yar = map(xr_out,408,612,100,-100);

yr_out = analogRead(Yr_Pin);
pitch = map(yr_out,416,606,-100,100);

xl_out = analogRead(Xl_Pin);
roll = map(xl_out,408,612,100,-100);

yl_out = analogRead(Yl_Pin);
throttle = map(yl_out,416,606,-100,100);

Serial.print("\n\n\n\n");

Serial.print("X Wert R: ");
Serial.print(yar);
Serial.println(" %");
Serial.println(xr_out);

Serial.print("Y Wert R: ");
Serial.print(pitch);
Serial.println(" %");
Serial.println(yr_out);


Serial.print("\n");


Serial.print("X Wert L: ");
Serial.print(roll);
Serial.println(" %");
Serial.println(xl_out);

Serial.print("Y Wert L: ");
Serial.print(throttle);
Serial.println(" %");
Serial.println(yl_out);

delay(1000);
}

Serial Monitor:

X Wert R: 0 %
510

Y Wert R: 0 %
511

X Wert L: 0 %
510

Y Wert L: 0 %
511

und Danke für Eure Hilfe. :grin:

Und alles ignoriert, was Dir mit auf den Weg gegeben wurde.
Las die mal ruhig quatschen.
Is halt fürn :poop:

Hallo,

schön das es funktioniert. Nur irgendwie passt es nicht zum gesamten Threadverlauf wenn es immer ohne RF24 Code im Sketch funktioniert hat. Naja, ich gehe jetzt Eis essen. :yum: