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?
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.
Nein, ich muss einen verlässlichen Winkel erhalten, bzw. ansteuern, da damit eine bewegte Grafik am Monitor (mit Processing programmiert) zusammenhängt.
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.
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.