A4988 + arduino nano Stepper Motor Beschleunigung

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?

MfG

Mobatools?

okay danke, aber wie sähe dann der code aus?

In der Library findest du auch passende Beispiele.

Ich werde nicht schlau aus den Beispielen.
Ist das nicht auch ohne library möglich?

Welches Beispiel verstehst Du nicht? Wenn Du es selbst machen willst, wird es auf jeden Fall wesentlich komplexer.

/* ====== 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.

vgs

Klar, wenn du alles selbst schreiben willst, geht das.
In der Library ist alles fertig, muss nur vom Sketch bedient werden.

Es geht doch bestimmt, dass die Geschwindigkeit (also die Zeit zwischen den Pulsen) bei jedem Durchlauf der Schleifen größer, bzw. kleiner wird?!

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

vgs

Ahh ok danke, habs jetzt verstanden

Hier dein Sketch (aber mit Beschleunigen/Bremsen) mit MobaTools:

#include <MobaTools.h>
// defines pins numbers
const int stepPin = 2;
const int dirPin = 3;
MoToStepper myStepper ( 200, STEPDIR ); // 200 Steps/Umdrehung

void setup() {
  // Sets the two pins as Outputs
  myStepper.attach( stepPin, dirPin );
  myStepper.setSpeedSteps( 10000, 66 ); // = 1000 Steps/sec, Rampenlänge 66 Steps ( 1/3 Umdrehung )
}
void loop() {
  myStepper.doSteps( 200 );
  while( myStepper.moving() );  // Warte bis Bewegung abgeschlossen
  delay(1000);
  myStepper.doSteps( -400 );
  while( myStepper.moving() );  // Warte bis Bewegung abgeschlossen
  delay(1000);
}

Klar, möglich schon...

Du kannst dir die Library ansehen, und eventuell nur Teile davon verwenden.

for (int x = 0; x < 400; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(900-x);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(900-x);
  }

Um auf dem Level deines Codes zu bleiben, ist das auch schon sowas wie eine Rampe.

Alles, was mit library geht, geht auch ohne library :wink: . 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 :sunglasses:

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?

Grüße Uwe