Schrittmotor: rpm und Schritte im loop setzen

Hallo, bin ein Frischling und somit hoffe ich, dass ich mich verständlich ausdrücke.

Möchte einen Schrittmotor mit dem UNO und dem ADAFRUIT motor shield betreiben.
Abhängig von der veränderbaren Neigung eines Objektes (ein Papierflieger, der an Fäden an zwei Servos hängt) soll sich ein Schrittmotor unterschiedlich schnell aber kontinuierlich drehen.
Bei 30° Neigung beispielsweise mit 2 rpm, bei 15° Neigung nur mit 1 rpm. Man kann ja die rpm’s einstellen.
Wie aber muss der loop aussehen. Ändere ich darin die rpm (in Abhängigkeit von der Neigung, die sich in unregelmäßigen Abständen ändert) und lass den Schrittmotor immer nur einen Schritt pro loop machen? Sind dann die eingestellten rpm‘s verlässlich? Läuft also der Schrittmotor dann wirklich kontinuierlich und gleichmäßig in der gewünschten Geschwindigkeit, auch wenn es in der Schleife Abfragen und Reaktionen auf Eingaben gibt?
(Eine Anzahl von Schritten kann ich nicht angeben, da der Motor kontinuierlich mit den gewünschten rpm’s weiterlaufen soll, bis eine andere Angabe erfolgt).

Zusatzfrage: Wenn eine Schrittzahl angegeben wird, wird der loop dann unterbrochen, bis die Schritte erfolgt sind?

Vielen Dank im Voraus!

Anmerkung: Bitte antwortet mir so einfach wie möglich, da ich elektrotechnisch (noch) nicht sehr gebildet bin...

jogepe:
Zusatzfrage: Wenn eine Schrittzahl angegeben wird, wird der loop dann unterbrochen, bis die Schritte erfolgt sind?

Ja! Einfach genug? :slight_smile:

Du verträgst mehr: "The stepping commands are 'blocking' and will return once the steps have finished." (aus "Adafruit Motor/Stepper/Servo Shield for Arduino kit - v1.2")

Daher vermute ich, Du mußt zumindest wenige Schritte in einer Schleife machen und die Geschwindigkeit anpassen.

agmue:
Daher vermute ich, Du mußt zumindest wenige Schritte in einer Schleife machen und die Geschwindigkeit anpassen.

Die Zusatzfrage scheint somit geklärt. DANKE!

Allerdings würden mich mehrere Schritte pro Loop vor ein Problem stellen, da u. U. nur ein Schritt alle paar Sekunden notwendig sein könnte (wegen der Auflösung von 1,8°) also die rpm's beispielsweise kleiner als 1 sein könnten (wenn sich die rpm's überhaupt im Kommabereich einstellen lassen). Auch kann sich der Wert (abhängig von der Neigung) jederzeit und/oder kontinuierlich ändern.

Warum ein Stepper?
Getriebemotoren sind kleiner, leichter und billiger.

Und lassen sich per PWM beliebig steuern.

Stepper sind dafür erfunden worden, exakt zu positionieren.
Und genau das Verhalten willst du ja gar nicht.
Ja, es steht dir sogar im Wege rum.

Nein, ich muss einen verlässlichen Winkel erhalten, bzw. ansteuern, da damit eine bewegte Grafik am Monitor (mit Processing programmiert) zusammenhängt.

Aus der Doku (s. o.):

"step(steps, direction, style) Step the motor.

Parameters:
• steps - the number of steps to turn
• direction - the direction of rotation (FORWARD or BACKWARD)
• style - the style of stepping"

Hiermit sollten einzelne Schritte möglich sein.

Hallo,

ich glaube Du gehst da falsch ran bzw. hast dich gedanklich verrannt mit "1 Schritt pro Loop" usw.
Eine leere Loop ist in 62ns durch. 1 Takt von 16MHz.

Wenn Du von 1 rpm oder 2 rpm redest, dann meinst Du damit 1 oder 2 Umdrehungen pro Minute. Das heißt der Stepper dreht permanent mit der Drehzahl. Er macht also keine 1 oder 2 Schritte und bleibt dann stehen.
1 oder 2 U/min bedeuten aber für einen Steppermotor mehrere Schritte, dass kommt auf seine Auflösung drauf an, wieviel Schritte er für eine komplette Drehung benötigt.

Wenn Du das verinnerlicht hast, mußt Du dich mit millis() beschäftigen und wie man damit unabhängig vom Programmdurchlauf zeitlich basierte Aktionen steuert. "Blinking ohne delay" ist hier das Stichwort. Damit kannste dann Dein Stepper ansteuern. Sicherlich wird Dir dazu auch die Lib für das Shield helfen.

Inzwischen herzlichen Dank für deine Antwort. Werde mir das überlegen, aber erst morgen, wenn meine Hirnwindungen wieder entspannt sind :roll_eyes:
Gute Nacht!

jogepe:
Allerdings würden mich mehrere Schritte pro Loop vor ein Problem stellen, da u. U. nur ein Schritt alle paar Sekunden notwendig sein könnte (wegen der Auflösung von 1,8°) also die rpm's beispielsweise kleiner als 1 sein könnten (wenn sich die rpm's überhaupt im Kommabereich einstellen lassen).

Aus AFMotor.h: "void setSpeed(uint16_t);" also ein vorzeichenloser Integerwert von 16 Bit, kein Komma.

Dank dir sehr! Werde wohl mit millis() arbeiten, wie mir angeraten wurde.

Möglicherweise sind auch micros notwendig: if (aktMicros - prevMicros >= intervall)