#include <AccelStepper.h>
// Pin-Definitionen
#define DIR_PIN 2
#define STEP_PIN 3
#define REFERENCE_SWITCH_PIN 4 // Pin für den Referenzschalter
#define ANALOG_LIMIT A0 // Analoger Eingang für die Positionsbegrenzung
#define RESET_SWITCH_PIN 6 // Pin für den Reset-Schalter
#define MOVE_SWITCH_PIN 7 // Pin für die Bewegungsauslösung
#define MOVE_CW_PIN_1 8 // Pin für die Bewegung im Uhrzeigersinn (CW)
#define MOVE_CCW_PIN_1 9 // Pin für die Bewegung gegen den Uhrzeigersinn (CCW)
// Initialisiere den Schrittmotor mit der AccelStepper-Bibliothek
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
// Geschwindigkeiten für die Bewegungen (in Schritten pro Sekunde)
int ccwSpeed = 200; // CCW (Gegen-Uhrzeigersinn) Geschwindigkeit
int cwSpeed = 200; // CW (Uhrzeigersinn) Geschwindigkeit
int startupSpeed = 100; // Geschwindigkeit für die Referenzfahrt beim Starten des Systems
int lowSpeed = 20; // Zusätzliche Geschwindigkeit für die Bewegung mit D8 und D9
// Bereich für den Verfahrweg
int minPosition = 0; // Minimal erlaubte Position
int maxPosition = 1000; // Maximal erlaubte Position
// Variablen zur Speicherung der Zielposition und ob eine Bewegung ausgelöst wurde
int targetPosition = 0;
bool movementTriggered = false;
void setup() {
pinMode(REFERENCE_SWITCH_PIN, INPUT_PULLUP); // Aktiviere den internen Pull-Up Widerstand für den Referenzschalter
pinMode(RESET_SWITCH_PIN, INPUT_PULLUP); // Aktiviere den internen Pull-Up Widerstand für den Reset-Schalter
pinMode(MOVE_SWITCH_PIN, INPUT_PULLUP); // Aktiviere den internen Pull-Up Widerstand für den Bewegungsauslösung
pinMode(MOVE_CW_PIN_1, INPUT_PULLUP); // Aktiviere den internen Pull-Up Widerstand für die Bewegung im Uhrzeigersinn
pinMode(MOVE_CCW_PIN_1, INPUT_PULLUP); // Aktiviere den internen Pull-Up Widerstand für die Bewegung gegen den Uhrzeigersinn
stepper.setMaxSpeed(1000); // Setze die maximale Geschwindigkeit in Schritten pro Sekunde
stepper.setAcceleration(500); // Setze die Beschleunigung in Schritten pro Sekunde pro Sekunde
// Starte die Bewegung des Motors in CCW-Richtung beim Einschalten
stepper.setSpeed(-startupSpeed);
while (digitalRead(REFERENCE_SWITCH_PIN) == HIGH) {
stepper.runSpeed();
}
stepper.stop();
// Setze die Schritte des Motors auf 0, wenn der Referenzschalter betätigt wird
stepper.setCurrentPosition(0);
}
void loop() {
// Wenn der Reset-Schalter betätigt wird, fahre den Motor zur Startposition zurück
if (digitalRead(RESET_SWITCH_PIN) == LOW) {
// Setze die Geschwindigkeit und fahre den Motor in CCW-Richtung zur Startposition
stepper.setSpeed(-startupSpeed);
stepper.moveTo(0);
stepper.runToPosition();
}
// Wenn der Bewegungsauslöser betätigt wird, setze die Zielposition entsprechend dem analogen Wert von A0
if (digitalRead(MOVE_SWITCH_PIN) == LOW) {
int analogValue = analogRead(ANALOG_LIMIT);
// Begrenze den analogen Wert auf den Bereich
targetPosition = constrain(analogValue, minPosition, maxPosition);
movementTriggered = true;
}
// Wenn eine Bewegung ausgelöst wurde, fahre den Motor zur Zielposition
if (movementTriggered) {
// Überprüfe, ob die Zielposition innerhalb des Bereichs liegt
if (targetPosition >= minPosition && targetPosition <= maxPosition) {
// Bestimme die Richtung basierend auf der aktuellen Position des Motors im Vergleich zur Zielposition
if (stepper.currentPosition() < targetPosition) {
stepper.setSpeed(cwSpeed);
} else {
stepper.setSpeed(-ccwSpeed);
}
stepper.runSpeed();
// Wenn die Zielposition erreicht wurde, stoppe den Motor und setze den Auslöser zurück
if (stepper.currentPosition() == targetPosition) {
stepper.stop();
movementTriggered = false;
}
}
}
// Wenn der Taster für die zusätzliche Geschwindigkeit (D8) betätigt wird und die Zielposition im Bereich liegt, setze die Geschwindigkeit entsprechend und starte die Bewegung
if (digitalRead(MOVE_CW_PIN_1) == LOW && targetPosition >= minPosition && targetPosition <= maxPosition) {
stepper.setSpeed(lowSpeed);
stepper.runSpeed();
}
// Wenn der Taster für die zusätzliche Geschwindigkeit (D9) betätigt wird und die Zielposition im Bereich liegt, setze die Geschwindigkeit entsprechend und starte die Bewegung
else if (digitalRead(MOVE_CCW_PIN_1) == LOW && targetPosition >= minPosition && targetPosition <= maxPosition) {
stepper.setSpeed(-lowSpeed);
stepper.runSpeed();
}
}