Hallo,
ich brauche eure Hilfe!!
Ich habe seit einem Jahr in meinem Projekt einen funktionierenden Sketch zum Öffnen einer Tür mittels NEMA 17 Stepper, TB6600, verwende die AccelStepper Bibliothek.
Mich stört darin, dass der StepperMotor an den Endstops "über das Ziel hinaus schießt".
Das wollte ich abstellen und ich habe mich in AccelStepper.h orientiert und versucht, einige Anpassungen vorzunehmen.
Das Problem ist:
verwende ich den "alten Code" wie in den Funktionen im Beispiel Tuer1Auf(); und Tuer2Auf();, dann klappt alles gut bis auf das Problem, dass der Stepper über das Ziel an den Endstops hinausfahren will. Bedeutet: trifft der Schlitten auf die Endstops, dann stoppt der Motor nicht sofort, sondern dreht sich weiter.
Mein Ziel ist es, dass der Stepper nicht eine vorher definierte Strecke bis zum Endstop zurücklegt, sondern
step für step bewegt wird,
wenn er Endstop auslöst, sich um wie hier 50 Steps zurückbewegt
und stoppt.
Das habe ich in der Funktion TuerAuf() versucht, indem ich die Zeilen
digitalWrite(enablePin, LOW);
while (digitalRead(endSchalterAuf)) {
stepper.run();
stepper.setCurrentPosition(0);
...
zu realisieren mit der Folge, dass der Motor nur kurz "anruckt" und dann leicht pfeifende Töne von sich gibt und blockiert.
Worin liegt der Fehler?
Ich bitte um eure Unterstützung.
Gruß, Gerhard
Hier der Code:
```cpp
#include <AccelStepper.h>
// PINBELEGUNG Stepper-Motor NEMA 17
const int enablePin = 8;
const int stepPin = 9;
const int dirPin = 10;
// PINBELEGUNG für die Endschalter der Linearführung
#define endSchalterAuf 7
#define endSchalterZu 6
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
void setup() {
pinMode(6, INPUT_PULLUP); // Tür auf
pinMode(7, INPUT_PULLUP); // Tür zu
pinMode(enablePin, OUTPUT);
digitalWrite(enablePin, HIGH);
stepper.setMaxSpeed(1000);
stepper.setAcceleration(500);
Serial.begin(9600);
}
void loop() {
Tuer1Auf();
delay(5000);
Tuer1Zu();
delay(5000);
TuerAuf();
delay(5000);
TuerZu();
delay(5000);
}
// Definieren der Funktion TUER AUF
void TuerAuf() {
digitalWrite(enablePin, LOW);
while (digitalRead(endSchalterAuf)) {
stepper.run();
stepper.setCurrentPosition(0);
}
digitalWrite(enablePin, LOW);
stepper.moveTo(stepper.currentPosition() - 30); // Entprellen
stepper.runToPosition();
digitalWrite(enablePin, HIGH);
}
// Definieren der Funktion TUER 1 ZU
void Tuer1Zu() {
digitalWrite(enablePin, LOW);
stepper.moveTo(-30000);
while (digitalRead(endSchalterZu)) {
stepper.run();
stepper.currentPosition() == 0;
}
digitalWrite(enablePin, HIGH);
digitalWrite(enablePin, LOW);
stepper.moveTo(stepper.currentPosition() + 30);
stepper.runToPosition();
digitalWrite(enablePin, HIGH);
}
// Definieren der Funktion TUER 2 AUF
void Tuer1Auf() {
digitalWrite(enablePin, LOW);
stepper.moveTo(30000);
while (digitalRead(endSchalterAuf)) {
stepper.run();
stepper.currentPosition() == 0;
}
digitalWrite(enablePin, HIGH);
digitalWrite(enablePin, LOW);
stepper.moveTo(stepper.currentPosition() - 30);
stepper.runToPosition();
digitalWrite(enablePin, HIGH);
}
// Definieren der Funktion TUER ZU
void TuerZu() {
Serial.println("Zeile01");
digitalWrite(enablePin, LOW);
digitalWrite(dirPin, LOW);
stepper.move(1);
stepper.run();
while (digitalRead(endSchalterZu)) {
stepper.run();
stepper.setCurrentPosition(0);
}
//digitalWrite(enablePin, LOW);
stepper.moveTo(stepper.currentPosition() + 30); // Entprellen
stepper.runToPosition();
digitalWrite(enablePin, HIGH);
}