Wie baue ich einen Puffer bei der Steuerung von Stepper Motoren mit einem Joystick ein ?

Hallo wie bereits erwähnt möchte ich mit einem Joystick zwei Stepper Motoren ansteuern welche dann an die vom Joystick angegebene Position fahren.
Also z.B. ich lese vom Joystick die Analog werte X:500 und Y:300 aus dann soll ein Motor an Position 500 und der andere an Position 300 fahren.
An sich habe ich das in dem beigelegten Code jedoch nur für die X Achse versucht zu verwirklichen da ich noch gar keine Erfahrung mit Arduino und Coding im allgemeinen habe.
Also einfach der Übersichtshalber für mich.

Das Problem:

Mein größtes Problem ist jetzt aktuelle das die Werte des Joystick auch wenn ich ihn nicht bewege schwanken (so ca. zwischen 490 und 515). Daher zuckt der Stepper Motor die ganze zeit rum. Dies möchte ich jetzt irgendwie unterbinden habe das auch mit dem aktuellen Code versucht es funktioniert aber nicht.
Also ich möchte in den folgenden Code irgendwie eine Art Puffer verbauen der verhindert das der Stepper Motor sich bei kleinen Veränderungen des Analogwertes bewegt.

Es würde mich sehr freuen wenn mir irgendwer mit diesem Problem helfen könnte, da ich wirklich nicht weiter weiß.

MfG

Niklas



#include "AccelStepper.h"
// Library created by Mike McCauley at http://www.airspayce.com/mikem/arduino/AccelStepper/
// AccelStepper Setup
AccelStepper stepperX(1, 2, 5);
AccelStepper stepperY(1, 4, 3);


#define home_switch 9 // Pin 9 connected to Home Switch 

bool targetReached = true;
int SensorWert = 0;


int min_joystick_value = 800; // Minimaler Joystick-Wert 
int max_joystick_value = 200; // Maximaler Joystick-Wert 
bool joystickInRangeX = false; // Merker für X-Joystick-Bereich


// Neue Variablen für Joystick
int joystick_x_pin = A0;  // Annahme: Der Joystick X-Achsen-Wert wird am Analogen Pin A0 angeschlossen
int joystick_y_pin = A1;  // Annahme: Der Joystick Y-Achsen-Wert wird am Analogen Pin A1 angeschlossen

// Stepper Travel Variables
long TravelX;  // Used to store the X value entered in the Serial Monitor
int move_finished = 1; // Used to check if move is completed
long initial_homing = -1; // Used to Home Stepper at startup


void setup() {
  Serial.begin(9600);  // Start the Serial monitor with speed of 9600 Bauds

  pinMode(home_switch, INPUT_PULLUP);

  // Initialisierung des Joysticks
  pinMode(joystick_x_pin, INPUT);
  pinMode(joystick_y_pin, INPUT);

  delay(5);  // Wait for EasyDriver wake up

  //  Set Max Speed and Acceleration of each Steppers at startup for homing
  stepperX.setMaxSpeed(1000.0);      // Set Max Speed of Stepper (Slower to get better accuracy)
  stepperX.setAcceleration(1000.0);  // Set Acceleration of Stepper


  // Start Homing procedure of Stepper Motor at startup

  Serial.print("Stepper is Homing . . . . . . . . . . . ");

  while (digitalRead(home_switch)) {  // Make the Stepper move CCW until the switch is activated
    stepperX.moveTo(initial_homing);  // Set the position to move to
    initial_homing--;  // Decrease by 1 for next move if needed
    stepperX.run();  // Start moving the stepper
    delay(5);
  }

  stepperX.setCurrentPosition(0);  // Set the current position as zero for now
  stepperX.setMaxSpeed(100.0);      // Set Max Speed of Stepper (Slower to get better accuracy)
  stepperX.setAcceleration(100.0);  // Set Acceleration of Stepper
  initial_homing = 1;

  while (!digitalRead(home_switch)) { // Make the Stepper move CW until the switch is deactivated
    stepperX.moveTo(initial_homing);
    stepperX.run();
    initial_homing++;
    delay(5);
  }

  stepperX.setCurrentPosition(0);
  Serial.println("Homing Completed");
  Serial.println("");
  stepperX.setMaxSpeed(1000.0);      // Set Max Speed of Stepper (Faster for regular movements)
  stepperX.setAcceleration(1000.0);  // Set Acceleration of Stepper

  // Print out Instructions on the Serial Monitor at Start
  Serial.println("Enter Travel distance (Positive for CW / Negative for CCW and Zero for back to Home): ");
}


void loop() {
  SensorWert = analogRead(A0);   // Auslesen des Wertes, der an A0 anliegt. Hier : VRx - X-Achse

  Serial.print("X:");  // Darstellung des Wertes im Seriellen Monitor
  Serial.print(SensorWert, DEC); // Darstellung des Wertes als Dezimalzahl

  SensorWert = analogRead(A1); // Auslesen des Wertes, der an A1 anliegt. Hier : VRy - Y-Achse

  Serial.print(" |Y:");
  Serial.print(SensorWert, DEC);

  int joystick_x_value = analogRead(joystick_x_pin);
  int joystick_y_value = analogRead(joystick_y_pin);

  if (joystick_x_value >= 490 && joystick_x_value <= 515) {
    joystickInRangeX = true; // Markiere, dass der Bereich erreicht wurde
  }

  if (joystickInRangeX) {
    if (abs(joystick_x_value - 500) >= 15) {  // Hier prüfst du, ob der Wert deutlich von der Mitte abweicht
      long TravelX = map(joystick_x_value, min_joystick_value, max_joystick_value, 0, 200);

      if (targetReached) {
        targetReached = false;
        stepperX.moveTo(TravelX * 4);
      }
    }
  } else {
    long TravelX = map(joystick_x_value, min_joystick_value, max_joystick_value, 0, 200) * 4;

    if (targetReached) {
      targetReached = false;
      stepperX.moveTo(TravelX * 4);
    }
  }

  if (!targetReached) {
    stepperX.run();

    if (stepperX.distanceToGo() == 0) {
      targetReached = true;
    }
  }
}

Also ist Dein Problem die unkonstante Meßwerte des Joysticks?
Abhilfe:
Mittelwertbildung von mehreren Messungen;
Totbereich um den Nullwert bei nicht betätigten Joystick dh zwischen zB 480 und 520 wird immer 512 angenommen.
Grüße Uwe

Das ist allerdings sehr viel. Da solltest du versuchen herauszufinden, woher diese große Schwankungsbreite kommt.

Sind die Potis sehr hochohmig und überlagern heftige Störungen die Messung ?
Mach mal einen Sketch der nur die Joystick-Stellung im SerialPlotter anzeigt.

PS: Du meinst vermutlich "Filter", nicht "Puffer".

Hallo niklas1357

Viel Spass beim Lesen und Spass bei der Umsetzung.

Hast du schon mal über den Einsatz von Servos nachgedacht?

Hi danke
schonmal für die schnelle Rückmeldung.

Hier ein Bild von dem Serial Plotter:

Die Werte schwanken hier jetzt nur leicht Problem ist aber das die werte wenn ich den Joystick bewegt habe und er dann in die Ausgangsposition zurückkehrt die hohen Abweichungen aufweist .
Außerdem hatte ich als ich die Werte im Serial monitor überprüft hatte teilweise auch einzelne größere Sprünge gesehen.
Aber weiß nicht wo die jetzt hin sind.

Aber auch bei so kleinen Änderungen zuckt der Stepper Motor stark rum ich verstehe halt nicht ganz warum.

MfG
Niklas

Danke für die Idee werde ich auf jedenfall einmal testen.

MfG Niklas

Ist doch normal das der nicht abrupt stehen bleibt nur zuckt ein wenig hin und her.
Hat der Joy Null Stellfeder ?, wen ja dann ist das normal.

Erstmal danke für die ganzen Tipps.

Ok also gewisse Schwankungen bei den Analogwerten scheinen damit ja normal zu sein.
In dem Fall würde ich dann ganz gerne eine Art Totbereich um den zuletzt vom Stepper Motor angefahrenen Wert einrichten.
Also z.B. der Stepper Motor hat gerade die Position X:760 angefahren nun soll er erst fahren wenn er an eine Position anfahren soll die mehr als 5 von dem Wert abweicht.
Also bei dem Wert X:764 würde er nicht verfahren sondern erst wenn der Wert X:766 wäre.

Hätte dazu irgendwer eine Idee wie ich sowas machen könnte oder kennt da irgendwelch Turtorials oder so die mir da weiterhelfen könnten.

MfG Niklas