MobaTools Parameter steps360 zur Laufzeit veränderbar?

Hallo Franz-Peter,

kann man bei den MobaTools den Parameter steps360 während der Laufzeit verändern?
Ich programmiere gerade eine Schrittmotorsteuerung bei der man diesen Parameter über die Folientastatur und Display ändern können soll.
Der Parameter wird ja beim Erzeugen des Objektes angegeben.

MoToStepper MyStepMotor(ImpulseProUmdr,A4988);

Oder erfordert das die "Lieblingsbeschäftung aller modernen elektronischen Geräte"?
(jetzt bin ich mal gespannt wer draufkommt was ich damit meine ;-)))
viele Grüße Stefan

Hallo Stefan,
das ist nicht vorgesehen. Das führt auch zu Problemen, wenn man die aktuelle Position in Winkelgeraden auslesen ('read') oder eine absolute Zielposition in Winkelgeraden ansteuern will ('write' ).
P.S. Wenn man das wollte, musste man zumindest die aktuelle Stellung auch als neuen Referenzpunkt definiern. Ob's noch weitere Probleme dabei gibt, müsste man mal durchdenken.

Wenn es keinen Setter gibt, kannst du das nicht zur Laufzeit IN DER INSTANZ ändern,

Aber da der Instanz Zuweisungsoperator nicht verboten wurde kannst du jederzeit eine neue Instanz zuweisen!
Da kann man dann nur hoffen, dass ein Destruktor existiert, wenn er denn nötig ist

Also:
Ein testbares Beispiel war dir zuviel Arbeit.

Also liefere ich dir auch kein Beispiel!
Denn das ist mir dann auch zuviel Arbeit.

Aha. Macht Sinn. Na gut dann geht es halt doch nur über die

"Lieblingsbeschäftung aller modernen elektronischen Geräte**"**

oder man könnte es auch so ausdrücken:
Was ist die erste Frage des Support-Mitarbeiters wenn man wegen Unterstützung zu einem modernen elektronischen Gerät anruft?

viele Grüße Stefan

combie:
Wenn es keinen Setter gibt, kannst du das nicht zur Laufzeit IN DER INSTANZ ändern,
Aber da der Instanz Zuweisungsoperator nicht verboten wurde kannst zu jederzeit eine neue Instanz zuweisen!

Also:
Ein testbares Beispiel war dir zuviel Arbeit.

Also liefere ich dir auch kein Beispiel!
Denn das ist mir dann auch zuviel Arbeit.

Das ich kein Beispiel gepostet habe liegt schlicht und ergreifend daran, dass ich viel weniger Ahnung von Instanzen, Klassen und objektorientiertem Programmieren habe als du. Aber das macht nichts wenn niemand ein Beispiel postet.

Über die "Lieblingsbeschäftung aller modernen elektronischen Geräte"
müsste es gehen.
viele Grüße Stefan

Hallo Stefan,
Die erste Frage lautet: Wie ist die Nummer ihres Sevice-Tickets, nur die letzten drei Ziffern. Und dafür musstest du Dir beim call in eine 25 Stellige Nummer notieren. ;-))

LG Stefan

Hallo Namensvetter,

ja das ist auch ein viel gehörtes Beispiel.

Ich meinte damit: "Haben Sie das Gerät schon einmal neu gestartet?

Windoof hat es vorgemacht. Und mittlerweile machen es fast alle so. Noch einmal neu starten.

viele Grüße Stefan

das ist nicht vorgesehen.

Vorschlag:
Dann solltest du auch die 2 Copy Constructoren und die beiden Zuweisungsoperatoren verbieten.
Alternativ, einen Destructor einfügen.

Siehe, dieses ist möglich, endet aber fehlerhaft:

#include <MobaTools.h>

MoToStepper s1(2048, FULLSTEP);
MoToStepper s2(400, FULLSTEP);


void setup()
{
  MoToStepper s = MoToStepper(360, FULLSTEP);
  s = s2;
  MoToStepper s3 = MoToStepper(s1);
}

void loop()
{
}

Wenn Du die Mikroschritte umschalten möchtest, könntest Du beim Erzeugen des Objektes die Maximalzahl angeben und dann die Sollschritte bei Bedarf teilen. Bei write geht das eventuell mit dem Faktor.

Das ist eine gute Idee.

agmue:
Wenn Du die Mikroschritte umschalten möchtest, könntest Du beim Erzeugen des Objektes die Maximalzahl angeben und dann die Sollschritte bei Bedarf teilen. Bei write geht das eventuell mit dem Faktor.

Das ist eine gute Idee. Vielen Dank für die Anregung. Ich bin kein Schrittmotorspezialist. Ich meine irgendwo gelesen zu haben, dass mit Mikroschritten das Drehmoment abnimmt. Weiß das jemand genauer wie das ist?

viele Grüße Stefan

StefanL38:
Ich bin kein Schrittmotorspezialist.

Ich auch nicht, aber ich hätte Lesestoff, den Du daraufhin durchsuchen könntest:

Schrittmotoren
Schrittmotor und -treiber
[Stepper-Stromregelung mit A4988&Co von MicroBahner](Stepper-Stromregelung mit A4988&Co - Teil2: Stepper in Bewegung - Deutsch - Arduino Forum auch Stepper)

Im Thema Mehrere bipolar Schrittmotoren Ansteuern, aber wie ???? habe ich in der Klasse für zwei Achsen eine Schrittmotorinstanz angelegt. Möglicherweise geht dies auch für eine Achse mit unterschiedlcher Schrittzahl, wenn man genügend Speicher zur Verfügung hat und sauber mit attach und detach arbeitet. Prozedural wäre das dann ein Zeiger oder eine Referenz auf ein Objekt, so wie bei einer Zeichenkette. Nicht getestet ohne Gewähr!

combie:
Vorschlag:
Dann solltest du auch die 2 Copy Constructoren und die beiden Zuweisungsoperatoren verbieten.
Alternativ, einen Destructor einfügen.

Danke für den Tip. Es ist sicher gut, wenn man nicht vorgesehene Lücken auch schließt. Da muss ich mich aber erstmal schlau machen, damit habe ich mich bisher noch nicht beschäftigt ( bin halt eher alter 'C' Recke :wink: ). Steht auf jeden Fall jetzt mal auf der ToDo Liste.

agmue:
Wenn Du die Mikroschritte umschalten möchtest, könntest Du beim Erzeugen des Objektes die Maximalzahl angeben und dann die Sollschritte bei Bedarf teilen. Bei write geht das eventuell mit dem Faktor.

Grundsätzlich ist es ja so, dass die MobaTools intern immer mit Schritten rechnen, und von Winkeln und Steps/Umdr. gar nichts wissen. Das ist eine reine Umrechnung beim Aufruf der Winkel-orientierten Methoden. Im Prinzip könnte man das auch immer im Sketch selber machen ( So wie man das bei der AccelStepper ja auch machen müsste - die weis garnichts von Steps/Umdr. ). Aber egal ob man es selber macht oder in den MobaTools realisieren würde. Wenn Die Steps/Umdr. geändert werden, sollte man auf jeden Fall auch den Referenzpunkt nullen. Sonst wird's kompliziert. Und das Tempo in Umdr./Min stimmt dann natürlich auch nicht mehr und müsste neu geseetzt werden.

Da muss ich mich aber erstmal schlau machen,

Ich kann dir ein Beispiel liefern!

Da siehst du die 4 abgeschalteten Dinger, den Rest kannste wohlwollend ignorieren.

#pragma once

/**
 *
 * Implementiert:
 * https://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)
 * 
 */

template<typename ClientClass>
class Singleton
{
     
  private:
    static ClientClass *client;
    
  protected:
    Singleton(){}
    Singleton(const Singleton<ClientClass>&)              =delete;
    Singleton(Singleton<ClientClass>&&)                   =delete;
    Singleton & operator=(const Singleton<ClientClass>&)  =delete;
    Singleton & operator=(Singleton<ClientClass>&&)       =delete;

  public:
    static  ClientClass &instance()
    {
      if (!client) client = new ClientClass;
      return *client;
    }
     
    virtual ~Singleton()
    {
       delete client;
       client = nullptr;
    }
  };
 
template<typename ClientClass> ClientClass* Singleton<ClientClass>::client = nullptr;

Danke, schau ich mir an.

MicroBahner:
Das ist eine reine Umrechnung beim Aufruf der Winkel-orientierten Methoden.

Wenn man die Winkel-orientierten Methoden nicht verwendet, dürfte die Angabe der Schritte pro Umdrehung für die Bibliothek unerheblich sein. Möchte man mit Winkeln rechnen, muß man das halt unter Berücksichtigung der aktuellen Auflösung sebst tun. Das hat auch den Vorteil, daß die Bibliothek die Position nicht verliert.

    Singleton(const Singleton<ClientClass>&)              =delete;[color=#222222][/color]
Singleton(Singleton<ClientClass>&&)                   =delete;[color=#222222][/color]
Singleton & operator=(const Singleton<ClientClass>&)  =delete;[color=#222222][/color]
Singleton & operator=(Singleton<ClientClass>&&)       =delete;

mit "abschalten" sind wohl diese Zeilen gemeint.
Wie man das jetzt auf eine andere library anwendet? : Keine lilablassblaue Verschimmerung.
Ein Link zu den Grundlagen wäre hilfreich. Oder eben gleich für die Mobatools umgesetzt

agmue:
Wenn man die Winkel-orientierten Methoden nicht verwendet, dürfte die Angabe der Schritte pro Umdrehung für die Bibliothek unerheblich sein.

Richtig.

agmue:
Möchte man mit Winkeln rechnen, muß man das halt unter Berücksichtigung der aktuellen Auflösung sebst tun. Das hat auch den Vorteil, daß die Bibliothek die Position nicht verliert.

Das wird dann nur beliebig kompliziert. Wenn man beim Umstellen der Steps/Umdr. die absolute Position nicht nullt, muss man sich merken, wann man umgestellt hat, und dies beim Umrechnen Stepposition/Winkelposition berücksichtigen. Denn für einen Teil des Weges gelten dann andere Umrechnungsfaktoren. Wenn man dann mehrfach umstellt ohne zu nullen - viel Spaß.

In meiner Anwendung würde es darum gehen nicht mitten im laufenden Betrieb etwas umzustellen
im Sinne von Motor ist jetzt eine Teilstrecke gefahren und jetzt wird steps360 umgestellt und dann weitergefahren, sondern auf der Ebene:
Programm läuft man ruft den Einstellungsmodus auf ändert Einstellungen und dann schaltet man wieder auf "Automatik"-Modus um. Und dabei wäre dann Nullpunkt neu setzen OK weil es sowie eine Refrenzfahrt am Anfang gibt.
Damit wäre es möglich die Schrittauflösung zu über Display und Tastatur zu ändern ohne den Quelltext ändern zu müssen. Die andere Variante wäre sozusagen die "Windows-Update"-Methode:

Einstellungen ändern und im EEPROM abspeichern.
Dann die "Windows-Update"-Methode: Ausschalten und wieder einschalten neue Einstellung wird wieder aus dem EEPROM eingelesen noch bevor der Stepmotor-objekt-erzeuge-Aufruf gemacht wird.

StefanL38:
sondern auf der Ebene:
Programm läuft man ruft den Einstellungsmodus auf ändert Einstellungen und dann schaltet man wieder auf "Automatik"-Modus um. Und dabei wäre dann Nullpunkt neu setzen OK weil es sowie eine Refrenzfahrt am Anfang gibt.

Unter den Randbedingungen kann das durchaus Sinn machen. Ich schreib das mal auf meine ToDo Liste ( die wird auch immer länger... ). Eine Methode 'Steps/Umdr ändern+Position nullen' sollte recht einfach machbar sein. Die Steprate würde ich in dem Fall konstant lassen. Die Geschwindigkeit in Umdr/Min ändert sich dann natürlich, aber das kann man ja bei Bedarf auch gleich wieder neu setzen.

Ein Link zu den Grundlagen wäre hilfreich.

Du könntest dir ein modernes C++ Buch kaufen.

Grundlagen

Oder eben gleich für die Mobatools umgesetzt

Warum soll ich eine Umsetzung bauen, welche ich nicht uneingeschränkt befürworte, für eine Klasse, die ich nicht wirklich kenne oder gar voll verstanden habe?
Ich persönlich halte es für besser, die Elemente zuzulassen, und dann aber korrekt abzuhandeln.
Da hängt also (etwas) MEHR dran, als du dir offensichtlich vorstellen kannst.

Außerdem:
Selber machen, macht selber schlau.

Dein Posting übersetze ich mal mit:

Mach du mal für mich, weil ich zu doof, oder zu faul bin, mir das selber zu erarbeiten.
Natürlich für lau.