Jump to content

Idee zur Stepper API


Recommended Posts

Hallo,

ich baue gerade eine CNC Fräse. Dabei ist mir aufgefallen, dass mir da eine Methode fehlt die so lange blockiert, bis die mit setSteps gesetzte Position erreicht wurde. Ich kann das zwar über die Callback Funktion lösen, dass ist aber sehr umständlich. Schöner wäre es wenn ich eine direkte Methode in der API hätte.

Link zu diesem Kommentar
Share on other sites

Obwohl ich noch nicht ganz verstehe wie du diese Funktion nutzen willst, wenn du mehr als eine Achse zur gleichen Zeit bewegst (diagonale Bewegung).

 

In welcher Sprache implementierst du das ganze eigentlich? Denke die Bindings lassen sich da auf einfache Weise erweitern.

Das Problem an den aktuellen Bindings ist halt, dass du für alle Bricks/Bricklets im wesentlichen nur beschränkte Funktionen anbieten kannst (da ja alles aus Config-Dateien automatisch erzeugt wird):

- Funktionsrufe ohne Rückgabewert

- Funktionsrufe mit Rückgabewert

- Callbacks

 

Die Funktionsrufe kehren alle so schnell wie sie können zurück, warten aber auch nur maximal ~2 Sekunden. Das heißt also so eine Funktion ist meines Erachtens nicht ohne weiteres für alle Sprachen implementierbar, sondern würde viel (strukturelle) Arbeit erfordern.

 

Je nachdem welche Sprache du nutzt könnte ich anbieten mal eine "erweiterte" TF-Bibliothek dafür zusammenzustellen. Da könnte dieser Vorschlag drin umgesetzt werden, aber auch sowas wie die LCD-Umlaut Geschichte besser verpackt werden.

Link zu diesem Kommentar
Share on other sites

Das hat er ja geschrieben, dass es den Callback gibt.

 

Was thunderbird möchte ist sowas:

xStepper.setStepsAndWait(10);
yStepper.setStepsAndWait(10);
xStepper.setStepsAndWait(10);

 

Das würde semantisch jetzt bedeuten, dass erst 10 Steps auf der x-achse laufen. SObald die dann fertig sind laufen 10 auf der y, danach dann wieder 10 auf der x. Würde man diesen Code "nur" mit setSteps ausführen, dann würde sich alles diagonal bewegen (x und y gleichzeitig).

 

Er wünscht sich also nur eine bequeme Variante für das was anders schon geht.

Link zu diesem Kommentar
Share on other sites

Die gleiche Problematik hatte ich mit meinem Stepper-Fahrzeug auch. Gelöste habe ich das Ganze, indem ich mir eine Steuerklasse (StepperController) geschrieben habe, die mir das schön löst. ZB muss ich dem Controller nur noch angeben, dass ich 100mm gerade aus fahren möchte und er macht das. Das gleiche für eine Drehbewegung (Winkel) und eine Kurve (Winkel und Radius).

 

Der Controller selbst verwaltet eine Queue, welche solche Bewegungen abarbeitet. Sobald der Callback für einen Move ausgelöst wurde, wird (falls weitere vorhanden) die nächste Bewegung gestartet.

Link zu diesem Kommentar
Share on other sites

@AuronX

Ist natürlich richtig das man so nicht alle Achsen gleichzeitig fahren kann. Deswegen würde ich das ganze auch trennen.

 

xStepper.setSteps(10);
yStepper.setSteps(10);
zStepper.setSteps(10);

xStepper.waitPositionReached();
yStepper.waitPositionReached();
zStepper.waitPositionReached();

 

So könnte man auf alle Achsen warten. Ist die Achse schon an der richtigen Position kommt die Funktion sofort zurück. Ist also so eine Art Join für Stepper.

Wegen so einer erweiterten API können wir gerne mal drüber spreche ich hätte da auch noch Sachen für einige Bricklets.

 

 

@gagahhag

So in der Art habe ich es im Moment auch gelöst. Fände es aber schöner wenn es in der API wäre, ist ja doch recht elementar ist.

 

Ich schreibe meinen Code in JAVA

 

Link zu diesem Kommentar
Share on other sites

Da bin ich eher der Meinung, das die API elementar gehalten werden sollte. Die Bibliotheken darum herum kann man ja schreiben und öffentlich zugänglich machen -> Wiki?

 

Ich weiss, das zur Zeit jeder seine Sachen schreibt, aber da kann ich mich auch selbst an der Nase nehmen. Ich habe meine Sachen ja auch (noch) nicht ins Wiki gestellt...

Link zu diesem Kommentar
Share on other sites

Jop... man sollte da definitiv mehr teilen :D

 

Für Java fällt mir auf Anhieb keine Gute Erweiterungsmöglichkeit ein, abgesehen von Vererbung. Also sowas wie ExtendedBrickStepper extends BrickStepper. Ansonsten wäre ein Decorator gut, aber der braucht ein Interface, also in dieser Art:

public class DecoratedBrickStepper implements IBrickStepper {

    ...

    public DecoratedBrickStepper(IBrickStepper realStepper) {
        this.RealStepper = realStepper;
    }

    public void setSteps(int i) {
        RealStepper.setSteps(i);
    }

    ...
}

Link zu diesem Kommentar
Share on other sites

Ah, eine Queue oder Stepper-Controller. Nur ist jeder Anwendungsfall u.U. verschieden, ob man das mit einem Controller so einfach lösen kann, die Möglichkeiten wie n-Motoren voneinander in ihrern Sequenzen abhängig sein können, sind umfangreich.

 

Das stimmt, deshalb muss man das je nach Anwendungsfall ausprogrammieren. Bei mir sind es 2 Motoren, die ich gleichzeitig steuern muss, dies macht mein Controller, wobei dieser eine Move-Queue hat, wo die nacheinander folgenden Bewegungen gespeichert werden.

Link zu diesem Kommentar
Share on other sites

Ich selbst habe eine Priority-Queue von Move-Objektion genommen. Ein Move ist bei mir eine Klasse, welche die Art der Bewegung (Strecke von x mm, Drehung um x Grad, Kurve von Radius x um y Grad, etc.) Diese stelle ich die Queue, welche dann Schritt für Schritt abgearbeitet wird.

 

Wenn ich dazu komme, werde ich meinen Code ein bisschen dokumentieren und dann hier mal reinstellen. Aber ist (noch) nicht so schön, wie ich mir das wünsche -> Prototyping ;)

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...