Hey,
ich möchte einen Stepper Motor mit dem a4988 Driver drehen lassen...
Der Code dafür sieht wie folgt aus:
// defines pins numbers
const int stepPin = 2;
const int dirPin = 3;
void setup() {
// Sets the two pins as Outputs
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop() {
digitalWrite(dirPin, HIGH); // Enables the motor to move in a particular direction
// Makes 200 pulses for making one full cycle rotation
for (int x = 0; x < 200; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
delay(1000); // One second delay
digitalWrite(dirPin, LOW); //Changes the rotations direction
// Makes 400 pulses for making two full cycle rotation
for (int x = 0; x < 400; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
delay(1000);
}
Jetzt will ich jedoch nicht, dass der Motor so abrupt anfängt zu drehen, sondern der soll langsam beschleunigen und langsam langsamer werden, um dann wider langsam in die andere Richtung zu beschleunigen.
Wie muss dafür die for-Schleifen aussehen?
/* ====== minimumStepper =======================================
* Bare minimum to get a stepper with step/dir driver turning
*/
#include <MobaTools.h>
// Stepper connections - Please adapt to your own needs.
const byte stepPin = 6;
const byte dirPin = 5;
const int stepsPerRev = 200; // Steps per revolution - may need to be adjusted
MoToStepper stepper1( stepsPerRev, STEPDIR ); // create a stepper instance
void setup() {
stepper1.attach( stepPin, dirPin );
stepper1.setSpeed( 300 ); // 30 rev/min (if stepsPerRev is set correctly)
stepper1.setRampLen( stepsPerRev / 2); // Ramp length is 1/2 revolution
stepper1.rotate(1); // start turning, 1=vorward, -1=backwards
}
void loop() {
}
Man nennt das beschleunigen = Drehzahl langsam steigern / abbremsen = Drehzahl langsam verringern "Rampe"
english "ramp"
Man fährt eine Geschwindigkeitsrampe hinauf bzw. hinunter
Mit dem Befehl
stepper1.setRampLen( stepsPerRev / 2);
kann man die Beschleunigung festlegen.
Der Parameter ist die Anzahl der Schritte die angibt innerhalb wie vieler Schritte auf die Maximalgeschwindigkeit beschleunigt / abgebremst werden soll.
Die Maximalgeschwindigkeit wird mit
setSpeed( 300 );
festgelegt.
Die MoBa-Tools haben eine relativ ausführliche Doku.
Ja sicher geht das aber nicht durch einfügen einer weiteren Schleife und dann wäre schon alles fertig.
Man muss Fallunterscheidung machen zwischen Gesamtschritte größer / kleiner als die Rampenlänge du musst evtl. eine quadratische Funktion für die Frequenzänderung programmieren usw.
Da ist es schon deutlich einfacher 15 Minuten MobaTools-Doku zu lesen und wenn immer noch Fragen offen sind im Forum spezifische Fragen zu posten
Alles, was mit library geht, geht auch ohne library . Schließlich ist eine Library auch nur ein c++ Programm, was in deinem Sketch aufgerufen wird. Das kann man also grundsätzlich immer auch selbst machen. Wieviel Aufwand das dann ist, welches Wissen man dafür braucht und ob es sich deshalb lohnt ist eine andere Frage ....
In den meisten Fällen dürfte es effektiver sein, sich mit der eigentlichen Aufgabe zu befassen, die der Sketch lösen soll. Erfahrungsgemäß gibt's da immer noch genug Probleme
Eine Library - Bibliothek ist eine Sammlung von Funktionen, die bei Einbindung der Bibliothek Dir zur verfügung stehen. Unbewußt benutzt Du bereits eine Menge an Biblotheken die die Arduino IDe automatisch einbindet oder glaubst Du daß C/C++ den Arduino und seine Funktion wie pinMode(), digitalWrite() oder digitalRead() kennt?