Ich arbeite gerade an einer Motorsteuerung via Touchscreen (Arduino Mega2560 mit aufgestecktem Parallel-TFT Display, A4988 Motortreiber und bipolarer Nema 17 Steppermotor) und bin auf eine Limitierung der bisher von mir verwendeten Accelstepper Library von @MicroBahner hingewisen worden. Ich würde als eine der Funktionen des Systems gerne den Motor laufen lassen solange ich einen der Buttons gedrückt halte (und stoppen beim Loslassen), was aber durch den Aufruf von stepper.run() in der Schleife 1x pro Loop nur superlangsam funktioniert.
MicroBahner hat mich dann ->hier auf seine Moba Tools Library verwiesen. Ich bin zwar an sich nicht begeistert von dem Gedanken entweder die komplette Motorsteuerung neu zu schreiben oder Moba und Accelstepper zu mischen, aber er hat da auf alle Fälle nen Punkt - Moba ist nicht an den Loop gekoppelt und würde mir mein gewünschtes Ergebnis liefern können.
Die konkrete Frage
Ich habe mich jetzt in Moba eingelesen und habe auch meinen Motor mit der bestehenden Verkabelung bereits erfolgreich damit zum Laufen gebracht. Was mich jetzt allerdings verwundert ist, dass ich in den Beispielen und der Dokumentation überall nur Ansteuerungen mit STEP & DIR Pin finde. Die Microstepping Pins MS1,MS2,MS3 werden nirgends genutzt. Da für mein Projekt absolute Laufruhe des Motors aber die höchste Priorität hat, geht's ohne Microstepping nicht.
Kann MobaTools Microstepping? Wenn ja, wie stelle ich das ein, welche Parameter verändern sich dadurch? Hardwareseitig ist der A4988 bereits komplett verdratet, ich hatte 16x Microstepping mit Accelstepper bereits erfolgreich in Benutzung.
Weder MobaTools noch AccelStepper interessieren sich für Microstepping. Sie erzeugen einfach Schrittimpulse. Wieviele Pulse letztendlich für eine Umdrehung benötigt werden, ist der Software erstmal egal. Accelstepper interessiert sich gar nicht dafür, und es gibt da auch keine Möglichkeit etwas einzustellen. Da man bei MoToStepper die Geschwindigkeit auch in U/Min einstellen kann, mus für die Berechnung bekannt sein, wieviele Steps/Umdrehung benötigt werden. Das wird beim Einrichten des Stepperobjektes mit angegeben. Ob das nun durch Microstepping, ein Untersetzungsgetriebe oder einfach einen feiner auflösenden Stepper funktioniert ist vollkommen egal.
Das ist prinzipiell keine gute Idee, da dann weder MoToStepper noch AccelStepper wissen, wo der Motor steht, wenn zwischendurch immer wieder einer dem jeweils anderen 'ins Handwerk pfuscht'. Du musst dich schon für eins entscheiden. Da Du aber - bis auf den einen 'kritischen' Fall - alle Bewegungen blockierend realsiert hast, sollte de Umstellung ncht besonders aufwändg sein.
Aktuell hat MoBa aufgrund der Unabhängigkeit vom Loop in der Entscheidung eh die Nase vorne, Mischen möchte ich eigentlich selbst nicht Aber bzgl. Microstepping ganz laienhaft gefragt, ich bin noch kompletter Einsteiger in die Materie: Ich hätte das jetzt so verstanden, dass ich mit M1/M2/M3 alle auf HIGH den Treiber in 1/16 Modus stelle. Aber gut, das hat konkret nichts mit Accelstepper oder Moba zu tun, stimmt. D.h. wenn ich unabhängig von der verwendeten Library diese 3 Pins High stelle habe ich das 1/16 Microstepping und damit die maximale Laufruhe? Und gehe dann wie gehabt mit der Programmierung des Motors weiter, egal mit welcher Library?
Gebe ich dann bei einem Nema17 mit 200 Steps (1.8° Step Angle) als stepsPerRev trotzdem 200 an oder dann 200x16 = 3200?
z.B:
#include <MobaTools.h>
//motor pins
int ENABLE_PIN = 23;
int STEP_PIN = 25;
int DIR_PIN = 27;
const int stepsPerRev = 200; // Steps per Revolution
//microstepping Pins
//pin mappings
int M1 = A8;
int M2 = A9;
int M3 = A10;
//microsteppin
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(M3, OUTPUT);
//1/16 had the lowest vibration
//see table for step values: https://forum.arduino.cc/index.php?topic=415724.0
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
digitalWrite(M3, HIGH);
MoToStepper myStepper ( stepsPerRev, STEPDIR );
bool stepperRunning;
void setup() {
myStepper.attach( STEP_PIN, DIR_PIN );
myStepper.attachEnable (ENABLE_PIN,1,HIGH); // Set Enable Pin and Turn of Motor per Default
myStepper.setSpeed( 600 );
myStepper.setRampLen( 200 );
}
Da MoToStepper nichts über die 'native' Schrittweite denes Steppers und Microstepping weis, musst Du bem Einrichten immer angeben, wieviel Schritte dein Motor tatsächlich für eine Umdrehung braucht - in deinem Fall also 3200. Es ist ja eben vollkommen egal, wie das erreicht wird. In den meisten Fällen werden die MS1...MS3 auch fest verdrahtet ( oder - bei fertigen Boards - über Jumper eingestellt ), da es normalerweise keine gute Idee ist, das im Betrieb zu ändern.
Grundsätzlich ist es aber auch so, dass der Motor umso langsamer läuft, je höher das Microstepping eingestellt ist ( mehr Steps/Umdrehung ). Und das Erhöhen der Schrittfrequenz geht halt auch nicht beliebig...
Wenn Dir ein absolut ruhiger Lauf des Steppers wichtig ist, wären die TMC220x Treiber die bessere Wahl. Da bekommst Du bereits mit 1/4 Microstepping einen praktisch geräuschlosen Lauf hin, da diese Treiber selbstständig zwischen die vom Controller erzeugten Steps bis zu 256 zusätzliche Zwischenschritte einfügen können.
Hab' jetzt mal in das Datenblatt reingeschaut. Hast Du exakt diesn Motor? Der hat ja schon ein Untersetzungsgetriebe mit einer 'krummen' Untersetzung. Da bekommst Du gar kein exaktes Verhältnis steps<-> Umdrehung hin.
Solange Du bei MoToStepper die Geschwindigkeit - wie bei AccelStepper - in Steps/sec einstellst, ist das aber egal. Da sind die Steps/Umdrehung eh irrelevant. Ausserdem dürfte der Fehler bei U/Min eher vernachlässigbar sein. Allerdings dreht der dann nochmal langsamer.
Die hier eingestellte Geschwindigkeit:
long int speed_max = 400*step_multiplier;
erreicht aber AccelStepper auf deiner HW sowieso nicht. AccelStepper kommt auf den AVR's maximal auf 5000 Steps/sec für einen einzelnen Stepper mit Beschleunigung. Und auch bei MobaTools muss man ein wenig 'tricksen' um auf AVR 5000 Steps/sec hinzubekommen.
Ja, genau den Motor habe ich, weil der bei einem vergleichbaren Projekt auch zum Einsatz kam. Ich habe deine Antwort oben jetzt mal als Lösung markiert, vielen Dank für die vielen Inputs! Jetzt muss ich das alles mal aufarbeiten, den Code von Accelstepper auf Moba umbauen und dann, sobald ich das Ding hardwareseitig am Slider habe (warte noch auf 3D Druck Teile dafür) mal am "Patienten" selbst testen. Ob's dann 10,15 oder 20 Umdrehungen oder Steps sind ist an sich unerheblich dann, ich werd mir basierend auf der Länge der Schiene dann die maximal nötigen Steps ausmessen/abfahren und die Fahrdistanzen darauf aufbauen. Aber ich sehe ein Licht jetzt das Rüstzeug dafür zu haben das alles funktionell so hinzubekommen, wie ich es mir ursprünglich vorgestellt habe.
Ich stelle das fertige Projekt dann sicher auch in die Projektvorstellungen nochmals rein, stay tuned
@unwefed Weil ich heute Vormittag hier in diesem thread zum Ersten Mal davon erfahren habe, dass der existiert Ich habe ursprünglich (als noch ziemlicher Arduino Anfänger) eigentlich vorgehabt, ein Projekt laut Step by Step Anleitung nachzubauen. Nachdem das aber nicht hingehauen hat lerne ich gerade ne Menge dazu. An sich eh super, war nur so nicht geplant. Und der Guide benutzte einen A4988, außerdem hatte ich von denen von nem anderen Projekt noch einige rumliegen. Aber nachdem ich jetzt die TFT und Touch Library bereits ausgetauscht habe, jetzt die Stepper Library tausche und das UI auch inzwischen anders gestalte als im Guide...seh ich mich jetzt schon in nem halben Jahr oder so den A4988 mit dem TMC2209 ersetzen