Eine Frage zu MobaTools

Normal stellt man in den Deklartuionen die Schrittweite mit folgenden Zeilen ein.
Hier für drei Motoren:

const int STEPS_REVOLUTION = 800;

MoToStepper myStepperX( STEPS_REVOLUTION, STEPDIR );  // 800 Steps/ Umdrehung
MoToStepper myStepperY( STEPS_REVOLUTION, STEPDIR );  // 800 Steps/ Umdrehung
MoToStepper myStepperZ( STEPS_REVOLUTION, STEPDIR );  // 800 Steps/ Umdrehung

Jetzt möchte ich aber im LOOP die Schrittweite umstellen können.
Kann ich also im Loop, wenn die Motoren gerade nicht laufen die Schrittweite mit den selben Zeilen wie oben umstellen?

Servus
Franz

Also es scheint nicht möglich zu sein. Beim erstenmal umstellen ändert sich nichts an der Schrittweite. Beim zweiten mal umstellen macht das Programm nichs mehr. :roll_eyes:
Hier unten habe ich die Änderung.
Taster7 gedrückt ändert den Merker "schrittweiteHigh"
Taster7 loslassen macht die Änderung abhängig von schrittweiteHigh == 1 oder 0

if (button.pressed(Button7) ) {
    //Taster7 gedrückt
    schrittweiteHigh = ! schrittweiteHigh;
    Serial.println(schrittweiteHigh);
  }
if ( button.released(Button7) ) {
    //Taster7 losgelassen
    if (schrittweiteHigh == 0) {
      //Stepper einrichten ( 800 Schritte / Umdrehung - 1/2 Microstep )
      MoToStepper myStepperX( STEPS_REVOLUTION, STEPDIR );  // 800 Steps/ Umdrehung
      MoToStepper myStepperY( STEPS_REVOLUTION, STEPDIR );  // 800 Steps/ Umdrehung
      MoToStepper myStepperZ( STEPS_REVOLUTION, STEPDIR );  // 800 Steps/ Umdrehung
      Serial.println("schrittweiteHigh = 0");
    }
    if (schrittweiteHigh == 1) {
      //Stepper einrichten ( 1600 Schritte / Umdrehung - 1/4 Microstep )
      MoToStepper myStepperX( STEPS_REVOLUTION2, STEPDIR );  // 1600 Steps/ Umdrehung
      MoToStepper myStepperY( STEPS_REVOLUTION2, STEPDIR );  // 1600 Steps/ Umdrehung
      MoToStepper myStepperZ( STEPS_REVOLUTION2, STEPDIR );  // 1600 Steps/ Umdrehung
      Serial.println("schrittweiteHigh = 1");
    }
  }

Ich habe zwar keine Ahnung von den Mobatools aber so kann es nicht klappen,
weil Du mit der Zeile

ein neues Objekt myStepper vom Typ MoToStepper anlegst und die übergebenen Argumente zum initialisieren des Objektes verwendet werden.

Beim wiederholten Aufrufen legst Du jedes mal ein neues Objekt an. Es müsste dafür schon eine Setter-Methode wie myStepper.setStepsPerRevolution() oder so etwas geben.

Ab Seite 7.

den @MicroBahner abwarten und ihn ersuchen, dass er

  • dir einen setter macht
  • oder die .initialize() public macht ...
  • oder die member Variable stepsRev zumindest protected stellt, dann kannst dir deine eigene Klasse davon ableiten und den setter selber schreiben.

wobei ich nicht verstehe warum zur Laufzeit ein stepper DIESEN Parameter ändern soll.

Nicht zur Laufzeit. Immer nur wenn alle Motoren stehen. Aber ich möchte die Schrittweite ändern können weil der Motor mit 1600 Schritte doppelt so schnell läuft, wie mit 800 Und wenn ich den Kreuztisch mit dem Joystick schnell mal auf eine andere Position fahren möchte, wäre es schön, wenn ich dafür diese Einstellung auf 1600 ändern könnte. Wenn der Tisch dann wieder Arbeiten soll, soll er wieder die 800 je Umdrehung fahren.

Dem schliess ich mich an.
Das macht nur Sinn, wenn der Antrieb im laufenden Betrieb getauscht wird. :face_with_peeking_eye:

das solltest aber mit einer Geschwindigkeit bei einer Bewegung als solches auch hinbekommen...

P.S.: "zur Laufzeit" heißt zur Programmlaufzeit. Auch wenn der Stepper nicht läuft ist es "zur Laufzeit".

OK. Dann zur Laufzeit.

wenn ich auf 800 Schritte einstelle und die Treiber auch auf 800 Schritte, dann ist der Tisch bei Vollgas sehr langsamm. Auch wenn das Tempo auf Vollgas steht. Wenn ich da mit 1600 Initialisiere, dann ist das eine Geschwindigkeit mit der man besser zurecht kommt, beim Tisch mit Joystick auf Position gewünschte fahren.

dann nimm .setSpeed() für deine Schnellfahrt und danach setz sie wieder runter.

Da bin ich schon auf Vollspeed. Ich habe 10:1 Getriebe an den Motoren, weil der Tisch mehr Kraft braucht.

Der Wert STEPS_REVOLUTION ändert absolut nichts an der Schrittweite des Motors. Die wird allein von der Hardware (Motor und Treiber) bestimmt. Der Wert sollte immer den tatsächlichen Verhältnisse der HW entsprechen. Wichtig is der Wert letztendlich nur, wenn man die Geschwindigkeit in U/min und/oder die Positon in Umdrehungen vorgeben will. Wenn man rein in 'Steps' arbeitet ist er irrelevant. Die maximal erreichbare Geschwindigkeit kann man damit auch nicht beeinflussen.
Wenn Du schneller fahren willst, erhöhe dafür einfach die Geschwindgkeit - wie @noiasca schon geschrieben hat.

Ich habe es jetzt mal so ausprobiert. Da kann ich die Schritte pro Umdrehung ändern. Und es scheint zu funktionieren.

if (button.pressed(Button7) ) {
    //Taster7 gedrückt
    schrittweiteHigh = ! schrittweiteHigh;
    Serial.println(schrittweiteHigh);
  }
  if ( button.released(Button7) ) {
    //Taster7 losgelassen
    if (schrittweiteHigh == 0) {
      //Stepper einrichten ( 800 Schritte / Umdrehung - 1/2 Microstep )
      myStepperX.setZero(0, STEPS_REVOLUTION);
      myStepperY.setZero(0, STEPS_REVOLUTION);
      myStepperZ.setZero(0, STEPS_REVOLUTION);
      Serial.println("schrittweiteHigh = 0");
    }
    if (schrittweiteHigh == 1) {
      //Stepper einrichten ( 1600 Schritte / Umdrehung - 1/4 Microstep )
      myStepperX.setZero(0, STEPS_REVOLUTION2);
      myStepperY.setZero(0, STEPS_REVOLUTION2);
      myStepperZ.setZero(0, STEPS_REVOLUTION2);
      Serial.println("schrittweiteHigh = 1");
    }
  }

Sicher ist, dass der Motor wesentlich schneller fährt, wenn ich die Schrittweite hochstelle und am Treiber nicht ändere. Mir ist klar, dass ich eigentlich auch die Schrittweite am Treiber anpassen muss. Aber dann ändert sich die Geschwindigkeit nicht. Ich habe das ganze zufällig festgestellt, weil ich mal die Schritte im Programm verändert habe und vergessen habe, auch den Treiber daran anzupassen. Aber es ist jedenfalls so, dass bei Treiber auf 800 und Progamm auf 1600 der Motor dann etwa doppelt so schnell rennt. Und sogar trotzdem offenbar die Schritte auf 800 pro Umdrehung bleiben, mur schneller. Und komischerweise auch noch sehr genau. Also ich kann den Tisch damit automatisch hin und her rennen lassen, so oft ich will, er hat am Ende trotzdem keine Schritte verloren. :pleading_face:

Ja, das ist klar, und in dem Fall gut.

Das ist mir auch klar, deshalb bin ich nur durch einen Fehler bei mir drauf gekommen, dass ich damit wesentlich schneller werden kann. Dass trotzdem keine Schrittfehler kommen, ist verwunderlich, aber gut. Bei der Fahrt mit dem Joystick geht es eigentlich gar nicht um Genauigkeit. Nur um schnell auf Pos. zu kommen. Wenn der Tisch dann arbeiten soll, gehe ich wieder zurück auf die 800 Schritte.

Sorry, aber das ist Unsinn. Dann machst Du noch was anderes falsch. Die maximal erreichbare Geschwindigkeit hat absolut nichts mit diesem Wert zu tun. Glaub's mir - ich kenne die Lib recht gut :wink:

Die Möglichkeit das in setZero umstellen zu können ist einer Anforderung geschuldet, bei der auch die HW-Microsteps per Software geändert werden konnten.

Was ist denn da die 'Vollspeed'? Und von welchen Arduino reden wir überhaupt?

Speed ist glaube ich 2 bis 180, einzugeben x10, also 20 bis 1800. Und Vollspeed ist daher 1800.
Und ich haben ein Poti dran, mit dem ich den Speed beim Fahren mit den Joystick einstelle.
Wenn ich Automatisch fahre, wird der Speed von der Speicherkarten mit übergeben.

Der Arduino ist der Mega.

Ja, dann kann man wohl die Pins mit übergeben über die Hardwaremässig die Schritte am Treiber eingestellt werden. Ist gut, aber brauche ich nicht.

Es ist def. so, dass ich 800 Schritte je Umdrehung am Treiber eingestellt habe, 800 Schritte im Programm, dann ist es durch das 10:1 Plantengetriebe zu langsamm. Wenn ich dann das Programm mit 1600 Schritte aktiviere, läuft der Motor wesentlich schneller, ich denke 2x so schnell. Das könnte ich mal überprüfen, indem ich die Zeit für eine bestimmte Strecke mit 800 und mit 1600 vergleiche. Die gefahrene Strecke bleibt exakt gleich.

Aus Sicht der Lib ist das noch nicht Vollspeed, allerdings fast. Vermutlich hast Du die CYCLETIME in der MobaTools.h verändert? Nur dann könntest Du noch deutlich mehr Geschwindigkeit erreichen. Dann brauchst Du aber nur den speed-Wert erhöhen, wie es @noiasca schon schrieb. Bei CYCLETIME = 100 kannst Du da bis 375 U/min gehen, also bis zum Wert 3750.
Die Lib rechnet aus den Umdrehungswerten die Steps/10sec aus und arbeitet dann intern nur noch mit den Step-Werten. Die Formel für das Umrechnen ist:
rpm10 * STEPS_REVOLUTION / 60
Daraus kannst Du erkennnen. das es vollkommen egal ist, ob Du den Wert STEPS_REVOLUTION
oder rpm10 verdoppelst. Das Ergebnis ist immer das Gleiche und wird gegebenenfalls noch auf dem Maximalwert begrenzt.

Hööö, Danke. Teste ich morgen. Ich habe hier nur eine zweite Steuerung liegen, mit 2 Motoren am Tisch im Büro. Den eigetlichen kompletten Kreuztisch habe ich in der Werkstatt. da bin ich morgen wieder.

Ja, das habe ich schon dauernd so eingestellt.

Dachte ich mir, denn sonst würde es auch mit dem Ändern der STEPS_REVOLUTION nicht funktionieren.