Ja, Titel ist reichlich nichtssagend. Den solltest Du mal ändern. Etwa 'Stepper bleibt am Endschalter nicht stehen' oder so ähnlich.
Auch ein paar Kommentare in deinem Sketch wären sehr hilfreich. Aber nicht kommentieren, was die jeweilige Anweisung macht - das sehen wir auch so. Schreibe dazu was Du damit bezwecken willst.
Zum Einen: Dein Interrupt ist unnötig, und vollkommen falsch eingesetzt. Eine Interruptroutine muss immer möglichst kurz sein, und darf auch prinzipiell kein delay() enthalten.
Den Endschalter musst Du direkt im loop abfragen.
Zum anderen: Die for-Schleife ist auch fehl am Platz. Du hast mit 'loop' bereits eine Schleife - die ist vollkommen ausreichend.
Vorschlag ( wenn Du bei deinem Weg ohne Stepper-Lib bleiben willst und auch keine Rampen brauchst ):
Grundstellung ist dein Endschalter. Sobald der Taster gedrückt wurde, fährst Du deine 20000 Steps ( oder eben so viele wie Du bis zum Ende brauchst ) in die eine Richtung. Die Steps zählst Du im loop mit.
Sind die 20000 Steps erreicht, änderst Du die Drehrichtung, und fährst solange, bis der Endschalter wieder aktiv ist. Dann bist Du wieder am Ausgangspunkt.
In etwa nach dem Prinzip ( ungetesteter Peudocode ):
void loop() {
if (digitalRead(tasterPin) == HIGH) {
startFlag = true; // Merken, dass der Taster gedrückt wurde und die Bewegung gestartet ist
vorwaerts = true; // Stepper dreht zunächst in Vorwärtsrichtung
Index = 0;
digitalWrite(dirPin , LOW );
}
if ( startFlag ) {
// mach einen Step
digitalWrite(5, HIGH);
delayMicroseconds(500);
digitalWrite(5, LOW);
delayMicroseconds(500);
if ( vorwaerts ) {
// in Vorwärtsrichtung zähle die Steps
if ( ++Index > 20000 ) {
// nach 2000 Steps umkehren
vorwaerts = false;
digitalWrite(dirPin , HIGH );
}
} else {
// in Rückwärtsrichtung warte auf Endschalter
if ( digitalRead( Endschalter ) == LOW ) {
// Wenn Endschalter erreicht, bewegung stoppen
startFlag = false;
}
}
}
}
Beim Zurückfahren macht es gegebenenfalls Sinn, die Steps auch mitzuzählen, damit der Stepper bei Ausfall des Endschalters nicht ewig dreht. Und im Setup musst Du dann noch kontrollieren, ob der Stepper am Endschalter steht, und ihn gegebenenfalls dorthin fahren.
Edit: Code korrigiert ( ist aber immer noch 'roh' und ungetestet

)