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;
}
}
}
