Ein Schrittmotor soll immer die gleiche Zahl Steps ausführen.

Nachdem das mit dem DRV 8825 nun läuft, hätte ich da gleich eine Anwendung für.

Und zwar soll der Motor immer die selbe Zahl Steps ausführen. Also zum
Beispiel immer eine Viertel Drehung. Das wären dann im Beispielsfall 50 Steps.

Ich verstehe den Treiber ja so, dass er lediglich über den dir Eingang die Richtung
ändert und über Step quasi pro Puls immer einen Step oder 1/8 Step oder was man
eben sonst codiert hat.

Wie kann ich am besten erreichen, dass er eben beispielsweise immer 50 Steps
macht, dann wartet und das immer wiederholt?

Hallo
dafür eignet sich die Prgrammierung einer Schrittkette hervoragend.

Wie muss ich mir das vorstellen?

Ich verstehe ja gerade so das "Basis" Arduino Zeug, aber Stepper sind für mich noch total neu und
leider helfen mir die Videos, wo jemand schnell durch Projekt huscht da nicht weiter.

Daher bräuchte ich erst mal so die Grundidee, wie ich zunächst überhaupt die Schrittzahl vorgebe.
Da muss es ja irgendein "#define set Steps" oder so geben.

Denn dann wäre es doch sicher ein einfacher loop nach dem Schema:

Schrittzahl
delay **** ms
Schrittzahl
delay **** ms

und so weiter halt.

Oder man löst jede Sequenz per Taste aus

Dann wäre man bei einer if Abfrage.

Dafür ist eine Schrittkette etwas 'oversized' :wink:
Du könntest die MobaTools verwenden, dann ist das recht einfach:

#include <MobaTools.h>

const byte stepPin = 9;
const byte dirPin  = 8;
const int stepsProUmdr = 200;
const int stepsProTick = 50;
const int intervallZeit = 1000; // jede Sekunde werden die Schritte ausgeführt

MoToStepper myStepper ( stepsProUmdr, STEPDIR );
MoToTimebase intervall;

void setup() {
    myStepper.attach( stepPin, dirPin );
    myStepper.setSpeed( 600 );  // 60 Umdrehungen/Min
    myStepper.setRampLen( 10 );
    intervall.setBasetime( intervallZeit );
}

void loop() {
    // put your main code here, to run repeatedly:
    if ( intervall.tick() ) myStepper.doSteps( stepsProTick );
    // hier können weitere Aufgaben erledigt werden
    // Der Sketch wird während der Wartezeit und Stepausführung nicht blockiert.

}

( Das werde ich als einfaches Beispiel in die MobaTools aufnehmen :wink: )

Edit: Sketch korrigiert - ( byte-> int bei stepsProUmdr ). Das würde sich bemerkbar machen, wenn Microsteps eingesetzt werden, dann passt das nicht mehr in ein byte

Hallo
lieber etwas "oversized" :slight_smile: , dann kann man noch reinwachsen.

Deshalb würde ich erst mal gerne wissen, wie man eine Schrittkette erstellt.

Bisher habe ich kein brauchbares Beispiel gefunden (das ich verstehe).

Ok, dass ist ein anderes Problem, wenn es gar nicht um die Bewegung des Steppers, sondern um das Verständnis einer Schrittkette geht.

Marino_needing_help:
Bisher habe ich kein brauchbares Beispiel gefunden (das ich verstehe).

Zu Schrittketten gibt es ja nun sowohl hier im Forum als auch im Internet unzählige Beispiele und Tutorials. Bevor wir dir hier das x-te Beispiel vorlegen, dass Du nicht verstehst, schreib doch mal wo dein Verständnisproblem ist. Vielleicht an einem der Beispiele, mit denen Du ein Problem hast.

Ich verstehe unter Schrittkette halt:

Steps ausführen ;
delay (1000) ;
Steps ausführen ;
delay (1000) ;

Aber ich finde halt nichts, was so herunter gebrochen ist, dass ich jetzt
sagen kann "Ah, das ist das und das macht das."

Die Grundidee verstehe ich schon. Man lässt einfach die Schritte linear ablaufen und
wiederholen. Was ich nicht verstehe ist, wie ich jetzt halt 50 Steps abzähle und mit
welchen Befehl ich die dann abrufe. Ich bin halt nicht so weit wie manch andere hier.

Hallo,

wenn Du da jetzt an den Grundlagen rumspielen möchtest, um zu verstehen was da passiert dann schreibe dir doch für dein letztes Beispiel eine Function mit einer for Schleife 1-50 , ausgang H warte 5ms ausgang L warte 5ms. Das ist zwar nicht schön und blokiert aber zeigt Dir was passiert.

Letztlich solltest Du aber eine Lib nehmen , und es so machen wie MicroBahner bereits vorgeschlagen hat.

Sowas in der Art

const byte stpin=2; // Steppin

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(stpin,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly: 
  //Serial.println("Fahre jetzt");
  stepausfueren(50);
  delay(2000);
}

void stepausfueren(int anz) {
  Serial.println("'\n\'fahre jetzt");
  for (int i = 1; i <= anz; i++) {
    digitalWrite ( stpin, HIGH);
    Serial.print(HIGH);
    delay(5);
    digitalWrite(stpin, LOW);
    Serial.print(LOW);
    delay(5);
  }
}

Marino_needing_help:
Ich verstehe unter Schrittkette halt:

Steps ausführen ;
delay (1000) ;
Steps ausführen ;
delay (1000) ;

Nein, das ist nicht wirklich das, was man unter einer Schrittkette versteht. Das ist einfach eine lineare Abfolge von Anweisungen. Eine Schrittkette oder auch Ablaufsteuerung, ist was anderes und schon etwas komplexer. Wichtig sind dabei die Übergangsbedingungen, die vom einen Schritt zum nächsten führen.

Ja, aber wie zähle ich nun die Steps aus?

Gehe bei meinem Kenntnisstand von einem Grundschüler aus.

Marino_needing_help:
Ja, aber wie zähle ich nun die Steps aus?

Gehe bei meinem Kenntnisstand von einem Grundschüler aus.

Hallo,

wie meinst Du das, schau Dir doch mal mein Beispiel an , da wir eine Funktion aufgefufen stepausfueren(50) und die Anzahl der zu fahrenden Steps mit übergeben (50), in die Klammer kannst Du auch 100 rein schreiben.

Wenn Du das Beispiel mal auf deinen Arduino lädst , auch ohne Motor , wird für jedes fahren 50 mal eine 1 und eine 0 mit auf dem Monitor angezeigt. Das sind jeweils die Impulse, Steps die auf den Treiber gehen. Das eigentliche Zählen passiert hier in der for... Schleife.

Schau dir das Beispiel mal an , das ist so einfach , das verstehst Du ganz bestimmt.

Heinz

Rentner:
Schau dir das Beispiel mal an , das ist so einfach , das verstehst Du ganz bestimmt.

Heinz

Habs gerade mal drauf gezogen und so etwa verstanden habe ich es schon.
Hätte nur so 1-2 Fragen, die offen sind.
Wo ist in dem Code die Step Geschwindigkeit (Drehgeschwindigkeit) hinterlegt?
Und wie genau ginge es nun "eleganter"?
Wurde ja gesagt, dass das etwas sperrig sein soll.

Marino_needing_help:
Wo ist in dem Code die Step Geschwindigkeit (Drehgeschwindigkeit) hinterlegt?

Die 2 delay(5) bestimmen die Drehgeschwindigkeit.

Marino_needing_help:
Und wie genau ginge es nun "eleganter"?

Zur Stepperansteuerung verwendet man normalerweise eine Lib - Z.B. MobaTools ( s.o. ) oder die Accelstepper. Es gibt aber auch noch andere (kenne ich aber nur vom 'Hörensagen' ). Da Stepper für einen vernünftigen Betrieb in der Regel eine Anfahr- und Bremsrampe brauchen, ist das schon etwas komplexer, da muss man sich nicht selbst mit rumschlagen.

MicroBahner:
Da Stepper für einen vernünftigen Betrieb in der Regel eine Anfahr- und Bremsrampe brauchen, ist das schon etwas komplexer, da muss man sich nicht selbst mit rumschlagen.

Naja, erst mal sollte es reichen für das, was ich vorhabe. Erst mal schauen, ob es überhaupt geht, ehe man
viel Zeit rein tut.
Im Grunde soll der Motor auf eine Welle mit Adapter übertragen, auf den eine runde Holzplatte
kommt, in die dann entsprechend gebohrt wird. Also zum Beispiel ein Kreis mit 16er Durchmesser
wird 16 mal gebohrt, also muss man für diese Teilung immer 200er Steps machen. Das ist weitaus
genauer als per Hand drehen.

Hallo,

die Geschwindigkeit steckt in der Frequenz mit der die Impulse ausgegeben werden, in meinem simplen Beispiel kannst Du mal die beiden delay(5) in delay(2) ändern um es zu verstehen.

Aber für eine halbwegs vernünftige Anwendung nimmst Du besser,wie bereits mehrfach vorgeschlagen, eine Lib. Da kannst Du dann alles vernüftig einstellen und blockadefrei nutzen.

Heinz

Marino_needing_help:
Und zwar soll der Motor immer die selbe Zahl Steps ausführen. Also zum
Beispiel immer eine Viertel Drehung. Das wären dann im Beispielsfall 50 Steps.

Ich verstehe den Treiber ja so, dass er lediglich über den dir Eingang die Richtung
ändert und über Step quasi pro Puls immer einen Step oder 1/8 Step oder was man
eben sonst codiert hat.

Wie kann ich am besten erreichen, dass er eben beispielsweise immer 50 Steps
macht, dann wartet und das immer wiederholt?

Im anderen Thread verwendest du den AccelStepper
Dem kannst du durchaus sagen, wieviel Schritte er zu gehen hat.

combie:
Im anderen Thread verwendest du den AccelStepper
Dem kannst du durchaus sagen, wieviel Schritte er zu gehen hat.

Könntest du mich dann kurz aufschlauen, wie das geht?

Doku nicht gelesen, Beispiele nicht angeschaut?

#include <AccelStepper.h>
 
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1

AccelStepper stepper {motorInterfaceType, stepPin, dirPin};


void setup() 
{ 
   stepper.setMaxSpeed(150);
   stepper.setAcceleration(42);
}

int steps = 50/2;

void loop() 
{ 
  if(not stepper.distanceToGo())
  {
    steps *= -1;
    stepper.moveTo(steps);
  }
  stepper.run();
}

ungetestet

Marino_needing_help:
Im Grunde soll der Motor auf eine Welle mit Adapter übertragen, auf den eine runde Holzplatte
kommt, in die dann entsprechend gebohrt wird. Also zum Beispiel ein Kreis mit 16er Durchmesser
wird 16 mal gebohrt, also muss man für diese Teilung immer 200er Steps machen. Das ist weitaus
genauer als per Hand drehen.

Jetzt hast Du 2 Möglichkeiten, schau, dass Du was draus machst:

#include <MobaTools.h>

const byte stepPin = 9;
const byte dirPin  = 8;
const byte tasterPin = A5;      // Taster zwischen Pin und Gnd anschließen

const int stepsProUmdr = 800;   // Steps pro Umdrehung ( mit 1/4 microsteps )
int stepsProTaster = 200;       // Schritte um die sich der Motor pro Tastendruck dreht.
                                // Bei Dauerdruck dreht er sich ständig weiter
MoToStepper myStepper ( stepsProUmdr, STEPDIR );

void setup() {
    myStepper.attach( stepPin, dirPin );
    myStepper.setSpeed( 600 );  // 60 Umdrehungen/Min
    myStepper.setRampLen( 20 );
    pinMode( tasterPin, INPUT_PULLUP );
}

void loop() {
    if ( digitalRead(tasterPin) == LOW && not myStepper.moving() ) {
        myStepper.doSteps( stepsProTaster );
    }
    
}