Hallo, ich habe ein schrittmotor auf eine linearführung. an der linearfuhrung sind drei sensoren. sensor 1( startposition), sensor2(mitte), und sensor3. Ein ganzer ablauf läuft so: startsignal aktiv, sensor 1 aktiv, dann fährt er zu sensor 2 bleibt stehen dann zu sensor 3 bleibt stehen und dann zurück zu sensor 1. ich bekomme es einfach nicht hin ein nothalter einzubauen so das er richtig funktioniert. Nothalter anschluss: gnd/pin 40. wenn der not halter aktiv ist muss alles sofort stoppen und die position merken. Beim auslassen muss er von dere selbenstelle ohne weiteres startsignal den ablauf fertig ausführen ohne den ablauf zu behindern. hat wer eine ahnung was ich machen kann, wäre mir sehr hilfreich!
mfg. florin
hier wäre mein code:
#include <AccelStepper.h>
// Pin Definitionen
#define ENA_PIN 10
#define DIR_PIN 11
#define STEP_PIN 12
#define START_PIN A1
#define SIGNAL_PIN A0
#define EMERGENCY_STOP_PIN A7
#define SENSOR1 46
#define SENSOR2 48
#define SENSOR3 52
#define EMERGENCY_STOP_5V_PIN 40 // Not-Halt 5V Pin
#define MAX_SPEED 19000 // Maximalgeschwindigkeit (Schritte pro Sekunde)
#define ACCELERATION 10000 // Beschleunigung (Schritte pro Sekunde^2)
#define PAUSE_DURATION 500 // Wartezeit in Millisekunden zwischen Bewegungen
#define HALF_SECOND 200 // Halbe Sekunde in Millisekunden
// Anzahl der Schritte pro Zentimeter (anpassen je nach Motor und Mechanik)
#define SCHRITTE_PRO_CM_SENSOR2 400 // Schritte pro Zentimeter für Bewegung zu SENSOR2
#define SCHRITTE_PRO_CM_SENSOR3 400 // Schritte pro Zentimeter für Bewegung zu SENSOR3
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
bool emergencyStop = false;
bool startSignalDetected = false;
int currentPosition = 0; // Aktuelle Position des Schrittmotors
int stepsToMove = 0; // Schritte zur Bewegung
bool motionPaused = false; // Flag zur Anzeige, ob die Bewegung pausiert ist
int currentSensor = 0; // Der aktuelle Sensor, zu dem der Motor sich bewegt
int nextSensor = SENSOR2; // Nächster Sensor, zu dem der Motor sich bewegen soll
void setup() {
pinMode(ENA_PIN, OUTPUT);
digitalWrite(ENA_PIN, LOW);
pinMode(START_PIN, INPUT);
pinMode(SIGNAL_PIN, OUTPUT);
pinMode(EMERGENCY_STOP_PIN, INPUT_PULLUP);
pinMode(EMERGENCY_STOP_5V_PIN, INPUT);
pinMode(SENSOR1, INPUT);
pinMode(SENSOR2, INPUT);
pinMode(SENSOR3, INPUT);
stepper.setMaxSpeed(MAX_SPEED);
stepper.setAcceleration(ACCELERATION);
Serial.begin(9600);
}
void checkEmergencyStop() {
if (digitalRead(EMERGENCY_STOP_PIN) == LOW || digitalRead(EMERGENCY_STOP_5V_PIN) == HIGH) {
emergencyStop = true;
stepper.stop();
currentPosition = stepper.currentPosition(); // Aktuelle Position speichern
stepsToMove = stepper.distanceToGo(); // Schritte bis zum Ziel speichern
Serial.println("Emergency Stop Activated");
while (digitalRead(EMERGENCY_STOP_PIN) == LOW || digitalRead(EMERGENCY_STOP_5V_PIN) == HIGH) {} // Warten bis der Not-Aus zurückgesetzt ist
emergencyStop = false;
Serial.println("Emergency Stop Released");
// Bestimme den nächsten Sensor basierend auf der aktuellen Position
if (currentPosition == 0) {
nextSensor = SENSOR2;
} else if (currentPosition == stepsToMove) {
nextSensor = SENSOR1;
} else {
nextSensor = SENSOR3;
}
// Fortsetzen der Bewegung von der aktuellen Position
if (!startSignalDetected) {
motionPaused = true;
moveToSensor(nextSensor);
motionPaused = false;
}
}
}
void moveToSensor(int sensorPin) {
digitalWrite(SIGNAL_PIN, HIGH); // Signal senden
delay(HALF_SECOND); // Halbe Sekunde warten
digitalWrite(SIGNAL_PIN, LOW); // Signal stoppen
int stepsToMove = 0;
if (sensorPin == SENSOR2) {
stepsToMove = SCHRITTE_PRO_CM_SENSOR2 * 15; // 15 cm bis zu SENSOR2
} else if (sensorPin == SENSOR3) {
stepsToMove = SCHRITTE_PRO_CM_SENSOR3 * 15; // 15 cm bis zu SENSOR3
} else if (sensorPin == SENSOR1) {
stepsToMove = -SCHRITTE_PRO_CM_SENSOR3 * 30; // Zurück zu SENSOR1 (negativer Wert für Rückwärtsbewegung)
}
stepper.move(stepsToMove); // Schritte entsprechend der Entfernung bewegen
currentSensor = sensorPin; // Speichern, zu welchem Sensor wir uns bewegen
while (stepper.distanceToGo() != 0) {
stepper.run(); // Stepper kontinuierlich laufen lassen
checkEmergencyStop(); // Während der Bewegung auf Not-Halt prüfen
if (motionPaused) return; // Bewegung pausieren, wenn Not-Halt betätigt wird
}
digitalWrite(SIGNAL_PIN, HIGH); // Signal senden
delay(HALF_SECOND); // Halbe Sekunde warten
digitalWrite(SIGNAL_PIN, LOW); // Signal stoppen
}
void loop() {
checkEmergencyStop();
if (!emergencyStop && !startSignalDetected && motionPaused) {
// Fortsetzen der Bewegung von der gemerkten Position
motionPaused = false;
moveToSensor(nextSensor);
}
if (!emergencyStop) {
if (digitalRead(SENSOR1) == HIGH && digitalRead(START_PIN) == HIGH) {
startSignalDetected = true;
}
if (startSignalDetected) {
moveToSensor(SENSOR2);
moveToSensor(SENSOR3);
moveToSensor(SENSOR1);
startSignalDetected = false; // Ablauf 1 beendet, auf neues Startsignal warten
}
}
}
