Hallo,
Ich habe mir eine Teststrecke Linearführung aufgebaut mit
NEMA 17
TB 6600
2 Endschalter
ArduinoMega
Der Testsketch zum Ausgeben und anschließendem Testen der Steps ist folgender:
#include <AccelStepper.h>
// PINBELEGUNG Stepper-Motor NEMA 17
const int enablePin = 8;
const int dirPin = 9;
const int stepPin = 10;
// PINBELEGUNG für die Endschalter der Linearführung
#define Auf 6 // rot
#define Zu 7 // rot
// Stepper initialisieren
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
long steps[5];
long totalSteps = 0;
void tuerAuf() {
digitalWrite(enablePin, LOW);
stepper.moveTo(30000);
while (digitalRead(Auf)) {
stepper.run();
}
digitalWrite(enablePin, HIGH);
digitalWrite(enablePin, LOW);
stepper.moveTo(stepper.currentPosition() - 80);
stepper.runToPosition();
digitalWrite(enablePin, HIGH);
}
void tuerZu() {
digitalWrite(enablePin, LOW);
stepper.moveTo(-30000);
while (digitalRead(Zu)) {
stepper.run();
}
digitalWrite(enablePin, HIGH);
digitalWrite(enablePin, LOW);
stepper.moveTo(stepper.currentPosition() + 80);
stepper.runToPosition();
digitalWrite(enablePin, HIGH);
}
void setup() {
Serial.begin(9600);
// PINMODUS des STEPPERS Nema 17 festlegen
pinMode(enablePin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
// PINMODUS für Pullup festlegen
pinMode(Auf, INPUT_PULLUP); // Tür auf
pinMode(Zu, INPUT_PULLUP); // Tür zu
// Stepper konfigurieren und aktivieren
digitalWrite(enablePin, LOW); // Treiber aktivieren
stepper.setMaxSpeed(1000); // Maximale Geschwindigkeit
stepper.setAcceleration(2500); // Beschleunigung
}
void loop() {
for (int i = 0; i < 2; i++) {
tuerZu();
delay(2000);
long startPosition = stepper.currentPosition();
tuerAuf();
delay(2000);
long endPosition = stepper.currentPosition();
steps[i] = abs(endPosition - startPosition);
totalSteps += steps[i];
Serial.print("Durchlauf ");
Serial.print(i + 1);
Serial.print(": ");
Serial.println(steps[i]);
}
long averageSteps = totalSteps / 2;
Serial.print("Durchschnittliche Schritte: ");
Serial.println(averageSteps);
// Reset für nächsten Durchlauf
totalSteps = 0;
delay(5000); // Pause vor dem nächsten Zyklus
// ########################################################################################
tuerZu();
digitalWrite(enablePin, LOW);
stepper.setMaxSpeed(500);
// Schritte vor dem Bewegen speichern
long startPosition = stepper.currentPosition();
stepper.moveTo(averageSteps * 0.5);
while (stepper.distanceToGo() != 0) {
stepper.run();
}
// Schritte nach dem Bewegen speichern
long endPosition = stepper.currentPosition();
// Zurückgelegte Schritte berechnen und ausgeben
long stepsMoved = endPosition - startPosition;
Serial.print("Zurückgelegte Schritte: ");
Serial.println(stepsMoved);
digitalWrite(enablePin, HIGH);
digitalWrite(enablePin, LOW);
stepper.moveTo(stepper.currentPosition() - 50);
stepper.runToPosition();
digitalWrite(enablePin, HIGH);
}
Die Ausgabe auf dem ser. Monitor zeigt aber erhebliche Diskrepanz:
17:03:03.461 -> Durchlauf 1: 28141
17:04:07.262 -> Durchlauf 2: 28154
17:04:07.262 -> Durchschnittliche Schritte: 28147
17:05:46.545 -> Zurückgelegte Schritte: 31829
17:07:47.454 -> Durchlauf 1: 28288
averageSteps * 0.5 sollte doch eigentlich etwa 14.000 sein?
Steppertreiber TB6600:
16 | 3200 OFF OFF ON
2A
Wo liegt das Problem/ der Fehler?