Mobatools ungewünschte Zeitverzögerung

ich verwende die Mobatools und habe nach Eingabe der Aktivierung über die Konsole eine Zeitverzögerung von 2-3 Sekunden bis der Stepper Motor eine neue Geschwindigkeit einstellt. Kann ich das anpassen?

Eingabe EXSPEEDSET2000
dann EXSPEEDSET1000

zwischen 2000 und 1000 habe ich 2-3 Sekunden

#include <MobaTools.h>

const byte stepPin = 26;
const byte dirPin = 28;

const int stepsPerRev = 200;    // Steps per revolution - may need to be adjusted

MoToStepper stepper1( 200, STEPDIR );  // create a stepper instance

void setup() {


  Serial.begin(115200); 
  stepper1.attach( stepPin, dirPin );             
}

void loop () {
       
    if(Serial.available()>0){
        val = Serial.readString();
        val.trim(); 
     } 
        
             
        if (val.startsWith("EXSPEEDSET"))
        {
          String convertval=val;
          convertval.replace("EXSPEEDSET", "");
          exspeed=(convertval.toInt());
          stepper1.setSpeed(exspeed );              // rev/min (if stepsPerRev is set correctly)
          stepper1.setRampLen(stepsPerRev / 2);     // Ramp length is 1/2 revolution
            if (exspeed>0)
            {
              stepper1.rotate(-1);                       // start turning, 1=vorward, -1=backwards
            }
            else
            {
               stepper1.rotate(1);                       // start turning, 1=vorward, -1=backwards
            }
        }
}

du schreibst davon das du eine Zeitverzögerung hast.

Ich sehe keine Zeitverzögerung im code.
Ich spekuliere jetzt nicht groß herum.
Beschreibe erst einmal genauer was da ablaufen soll.
Und beschreibe was tatsächlich abläuft.

möglicherweise kommt die Verzögerung vom timeout
https://www.arduino.cc/reference/de/language/functions/communication/serial/readstring/

val was not declared in this scope.

vgs

Ich sende den Befehl EXPEEDSET500 an den Arduino. Ergebnis: Drehzahl Motor wird sofort gesetzt.

Ich sende danach den Befehl EXPEEDSET1000 an den Arduino um die Geschwindigkeit des Motors zu erhöhen. Ergebnis: Der Motor bleibt für weitere 3 Sekunden auf der alten Geschwindigkeit und erhöht erst danach auf 1000

OK jetzt verstehe ich was du beobachtest. Eine Erklärung habe ich nicht.
Aber für die weitere Analyse könntest du mal seriellen Output reinprogrammieren um zu sehen ob die Verzögerung vom Einlesen oder irgendwie intern vom MobaTools-Aufruf kommt.

vgs

Hallo,

liegt es an der 4 Stelle ? was ist bei 999. Ich denke auch es hat was mit einem timeout zu tun. Bau doch mal den Sketch so um das du nacheinander zwei feste Werte benutzt, ohne die serielle Eingabe.

davon mal abgesehen warum hast Du den riesigen Text mit dabei. Ersetze das doch einfach durch eine Zeichen S500 wobei S für Speed steht. Oder schau Dir doch mal das Beispiel aus der IDE an ReadAsciiString und frage auf ein Endzeichen ab.
Heinz

Hallo,

mal was grundsätzliches. Der gezeigte Sketch kompiliert nicht. Wie kann da überhaupt eine Verzögerung festgestellt werden? Verwendete Variablen sind nicht deklariert.

Hallo,
stimmt, vermutlich gibts da noch mehr, der TO hat es rausgenommen , um zu vereinfachen, und dabei den Übeltäter mit gelöscht. Ich habe mal einen simpel Sketch gemacht mit ReadString , dabei aber keinen Verzögerung festgestellt, zumindest nicht mit dem Monitor. Der sendet alles komplett mit CR.

Keine Ahnung was passiert wenn die Zeichenkette bröckchenweise eintrudelt weil sie wer weiß wie abgesendet wird und das abschließende CR noch fehlt. Dann könnte vermutlich ein Timeout auftreten.
Ist readString im Prinzip blokierend ??
Heinz

Ja. Das bricht - standardmäßig - erst ab wenn eine Sekunde lang nichts mehr ankommt. Da sollte man wie oben schon gesagt die Timeout Zeit nach unten setzen

Oder readStringUntil() verwenden

Dann mußt Du schneller schauen oder laß Dir die millis mit ausgeben, dann kannst Du die Verzögerung sehen!

Ok ich rede von 1-3 sekunden die der T0 festgestellt hat.
Heinz

Die MobaTools enthalten da keine Zeitverzögerung.
Es ist auch ein Beispiel dabei, mit dem man die Stepper Methoden über entsprechende Kommandos von der seriellen Schnittstelle aus auslösen kann. Dort kann man auch sehen, wie man das Einlesen der Kommandos blockadefrei realisieren kann. Der Einfachheit halber sind es immer fest 3-stellige Kommandowörter. Auf Geschwindigkeitsänderungen reagiert der Stepper dabei verzögerungsfrei.

es hatte tatsächlich was zu tun mit dem Timeout. Läuft jetzt gut. Allerdings nicht, wenn ich den Stepper auf eine Geschwindigkeit von 0 setze und danach auf 100 zu Beispiel. Den Wert 0 findet er scheinbar nicht so gut. Geschwindigkeit 1 (was natürlich real auch keine Geschwindigkeit ist) funktioniert perfekt. Wenn der Motor in die andere Richtung laufen soll, also der wert als -100 angegeben wird, dreht er aber immer viel zu schnell. Noch einer eine Idee woran das liegen könnte?

Vielleicht ein paar Hinweise zum Verständnis der MoToStepper Klasse.

Schrittmotore sind in erster Linie zum Positionieren da, nicht zum dauerhaften Drehen. D.h. man gibt eine Position vor, der Motor dreht dorthin, und bleibt dann stehen. Speed=0 gibt es deshalb bei den Mobatools auch nicht. Der Motor stoppt, wenn er seine Zielposition erreicht hat. Den Weg dorthin fährt er mit der eingestellten Geschwindigkeit. Auch die Drehrichtung ergibt sich aus der Zielposition, und nicht aus der Geschwindigkeit. Speed ist daher immer ein positiver Wert. Die Zielposition kann aber jederzeit geändert werden, auch wenn die vorherige noch nicht erreicht wurde.

Will man den Motor einfach drehen lassen, kann man dazu die rotate() Methode verwenden. Dann werden intern automatisch entprechende Zielpositionen gesetzt.

  • rotate(1) setzt die maximal möglich positive Zielposition ( Vorwärtsdrehen),
  • rotate (-1) die maximal mögliche negative Zielposition (rückwartsdrehen).
  • rotate(0) die Zielposition wird so gesetzt, dass der Motor sofort bis zum Stillstand (=neue Zielposition) abbremst

Natürlich kann man während des Drehen die Geschwindigkeit ändern. Zum Anhalten muss aber rotate(0) genutzt werden. stop() ist ein Notstop, da wird ohne Rampe sofort angehalten ( = keine Schrittimpulse mehr erzeugt ).