Nachdem ich mich zwar als alter Mann, dennoch den Neulingen zuzuordnen, wissbegierig mit den Bibliotheken beschäftige, nach ersten Versuchen mit Multistepper aufgrund von Denkfehlern das erste Projekt habe verwerfen müssen, nun eine Frage zu meinem nächsten Projekt.
Hier erst einmal der Code:
// Drei NEMA 17, im gleichschenkligen Dreieck wegen der gleichmäßigen Lastverteilung, sollen synchron laufen und eine etwas schwere Arbeitsbühne anheben
#include <AccelStepper.h>
#include <MultiStepper.h>
// Schrittmotoren initialisieren
AccelStepper motor1(AccelStepper::DRIVER, 2, 5); // Schrittmotor 1 an Pins 2 (Step) und 5 (Direction)
AccelStepper motor2(AccelStepper::DRIVER, 3, 6); // Schrittmotor 2 an Pins 3 (Step) und 6 (Direction)
AccelStepper motor3(AccelStepper::DRIVER, 4, 7); // Schrittmotor 3 an Pins 4 (Step) und 7 (Direction)
// Multistepper initialisieren
MultiStepper steppers;
// Schalter-Pins
const int rechtsPin = 8;
const int linksPin = 9;
const int stopPin = 10;
void setup() {
// Geschwindigkeit und Beschleunigung für alle 3 Motoren definieren
motor1.setMaxSpeed(1000); // Maximale Geschwindigkeit in Schritten pro Sekunde
motor1.setAcceleration(500); // Beschleunigung in Schritten pro Sekunde^2
motor2.setMaxSpeed(1000);
motor2.setAcceleration(500);
motor3.setMaxSpeed(1000);
motor3.setAcceleration(500);
// Schalter-Pins als Eingänge konfigurieren
pinMode(rechtsPin, INPUT);
pinMode(linksPin, INPUT);
pinMode(stopPin, INPUT);
// Motoren zur Multistepper hinzugefügt
steppers.addStepper(motor1);
steppers.addStepper(motor2);
steppers.addStepper(motor3);
}
void loop() {
// Schalterzustände lesen
int rechtsStatus = digitalRead(rechtsPin);
int linksStatus = digitalRead(linksPin);
int stopStatus = digitalRead(stopPin);
// Bewege Motoren basierend auf Schalterzuständen
if (rechtsStatus == HIGH) {
steppers.moveTo(2000); // "Richtige" Schrittzahl wird praktisch ermittelt
} else if (linksStatus == HIGH) {
steppers.moveTo(-2000); // "Richtige" Schrittzahl wird praktisch ermittelt
} else if (stopStatus == HIGH) {
// ===========================================Meine Frage: =====================================================================
// steppers.stop(); ==> gibt es nicht in der Bibliothek, verständlich. Wie bekomme ich aber HIER bei Erreichen des Endschalters
// die 3 Motoren gleichzeitig zum Halten und Zurückfahren um Bsp. 200, um die Schalter/ Taster zu entlasten?
// =============================================================================================================================
}
// Führe die Schritte aus
steppers.runSpeedToPosition();
}
Im letzten Beitrag habe ich gelernt, dass es kein steppers.stop in der Multistepper- Bibliothek gibt.
Wie kann ich bei Anfahren der 3 Stepper am Taster diese synchron stoppen und danach um etwa 200 Steps zurückfahren, um die (den) Taster zu entlasten?
Ohne Multistepper klappt es für jeden einzelnen. Habe noch keine Dauerschleifen Auf/ Ab getestet, inwieweit es Stepperverluste gibt.
Meine Idee war, die aktuelle Tasterposition unabhängig von bsp. steppers.moveTo(2000); abzufragen, und davon 200 sutrahieren, bzw addieren, je nachdem, ob oben oder unten das Ende der Linearführung(en) erreicht ist.
Aber: Die Funktionen in diesen Bibliotheksblöcken können jedoch die Position erst zurückgeben, wenn die Funktionsblöcke vollständig an die gewünschte/eingestellte Position gebracht wurden.
Gibt es hier eine andere Lösung, oder bin ich in meiner Euphorie wieder einem Denkfehler aufgesessen?
Der Sketch zeigt beim Kompilieren keine Fehler, solange eben die Zeile 46 auskommentiert ist.