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

Naja, so oder so huílft es auf jeden Fall!

So bekomme ich etwas mehr Gespür für diese ganzen Zusammenhänge.

Dann habe ich für die nächste Spätschichtwoche genug "Futter".

Ich habe mir heute mal den tollen Sketch von Microbahner rein getan.

Eine tolle Programmierung und nach etwas Reindenken auch mir verständlich.

Das hat sogar solche Kreise gezogen, dass das jemand selber ebenfalls für Privat
will. Nur mit dem Zusatz, zwischen Automatik und dem hier programmierten Tastermodus
über einen Kippschalter wählen zu können.

Ich habe selber etwas herumprobiert, aber es kam nichts bei raus.

ich habe versucht es über eine "else" Variante zu lösen, aber das scheint irgendwie nicht der rechte Weg zu sein.

Wie müsste ich da für das gewünschte Ergebnis eher ansetzen?

Dann zeig mal deine bisherigen Versuche. Und wie soll der 'Automatikbetrieb' dann ablaufen? Zeitgesteuert, also so wie in meinem ersten Sketch aus #3?

Ich habe den Sketch ehrlich gesagt erstmal wieder gelöscht, weil da am Ende
so viel nicht mehr ging, dass ich neu angefangen habe.

ich habe erst mal versucht, die Richtung über den dirPin zu ändern.
Also über einen Wahlschalter links oder rechts rum.

So sieht es aus:

#include <MobaTools.h>

const byte stepPin = 3;
const byte dirPin  = 2;
const byte tasterPin = 4;      // Taster zwischen Pin und Gnd anschließen
const byte tasterPin2 = 5;

const int stepsProUmdr = 800;   // Steps pro Umdrehung ( mit 1/4 microsteps )
int stepsProTaster = 400;       // 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( 700 );  // 60 Umdrehungen/Min
    myStepper.setRampLen( 80 );
    pinMode( tasterPin, INPUT_PULLUP );
}

void loop() 
{ 
  
    if ( digitalRead(tasterPin2) == LOW) {
    digitalWrite (dirPin,HIGH);
    }
    if ( digitalRead(tasterPin) == LOW && not myStepper.moving() ) {
        myStepper.doSteps( stepsProTaster );
    }
     
   
}

Es geht trotzdem nicht.

Ich verstehe aber auch gerade nicht, wo der Fehler steckt.

Marino_needing_help:
ich habe erst mal versucht, die Richtung über den dirPin zu ändern.

Vom Dir-Pin solltest Du die Finger lassen - den verwalten die MobaTools :wink: .

Wenn Du bei 'doSteps' die Richtung wechseln willst gib die Stepzahl negativ an.

Es gibt auch eine Doku dazu.

Wer liest denn heute noch Doku, auch wenn sie so gut ist, wie Deine?

Gruß Tommy

Du meinst das übliche Verfahren: Lieber 2 Stunden rumprobieren, als 10 Minuten lesen... :wink:

Genau und dann das Forum vollmüllen mit Fragen, die es bei 10 Minuten Lesen nie in der Form gegeben hätte. Dann wären sinnvolle Fragen zu konkreten Problemen gekommen.

Gruß Tommy

Ich habe mir das jetzt mal durch gelesen und versucht, so zu lösen:

#include <MobaTools.h>

const byte stepPin = 3;
const byte dirPin  = 2;
const byte tasterPin = 4;      // Taster zwischen Pin und Gnd anschließen
const byte tasterPin2 = 5;

const int stepsProUmdr = 800;   // Steps pro Umdrehung ( mit 1/4 microsteps )
int stepsProTaster = 800;       // 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( 1000 );  // 60 Umdrehungen/Min
    myStepper.setRampLen( 100 );
    pinMode( tasterPin, INPUT_PULLUP );
}

void loop() 
{ 
  
    if ( digitalRead(tasterPin2) == LOW) {
   void myStepper.rotate( int 1)
    }
     if ( digitalRead(tasterPin2) == LOW) {
   void myStepper.rotate( int -1)
    }
    if ( digitalRead(tasterPin) == LOW && not myStepper.moving() ) {
        myStepper.doSteps( stepsProTaster );
    }
     
   
}

Den Void myStepper.rotate Befehl habe ich so verwendet wie in der Doku erklärt wurde.

Aber es geht trotzdem nicht.

Was willst Du damit bezwecken:

   if ( digitalRead(tasterPin2) == LOW) {
   void myStepper.rotate( int 1)
    }
     if ( digitalRead(tasterPin2) == LOW) {
   void myStepper.rotate( int -1)
    }

Wenn Tasterpin2 auf LOW ist, wird nacheinander ständig rotate(1) und rotate(-1) aufgerufen. ( Das 'int' gehört da weg - dir scheinen schon noch ein paar Grundlagen zu fehlen ).

Du solttest erstmal ganz klar überlegen, was der Taster an Pin2 denn überhaupt machen soll?

MicroBahner:
Du solttest erstmal ganz klar überlegen, was der Taster an Pin2 denn überhaupt machen soll?

Gut wäre wenn ich drei Bedingungen in ein IF rein packen könnte.

Dann würde ich das etwa so schreiben:

if ( digitalRead(tasterPin) == LOW && not myStepper.moving() && digitalRead(tasterPin2) == HIGH) {

void myStepper.rotate(1)

Bloß so funktioniert es nicht

Ich verstehe halt immer nochnicht, was Du eigentlich bezwecken willst. Das sollte erstmal klar sein.

Es ging darum, auf eine Welle eine Holzscheibe zu spannen und durch das Verfahren
radial Löcher zu bohren. Wahlweise stirnseitig außen rein oder einfach von oben, um diese Holzzahnräder mit Stiften zu bauen.

Das geht auch, nur wollte ich jetzt in Nachgang noch eine Klemmvorrichtung haben. Also soll ein baugleicher Motor einfach durch eine Viertel Drehung einen Stümpel aus ABS auf das Holz drücken.

Ich müsste also einen Stepper getrennt vom ersten parametrieren und steuern können.

Und da habe ich in der Doku zu den MoBa Tools nicht so recht die Lösung gefunden.

Hast du da eine Idee?

Du musst für den 2. Stepper eine eigene MoToStepper Instanz anlegen. Dann kannst Du beide Stepper vollkommen unabhängig voneinader steuern.
Im den Beispielen Stepper_Reference_2 und Stepper_01 werden mehrere Stepper angesteuert.

Hallo Marino,

eine Doku dokumentiert im wesentlichen die einzelnen Befehle. Wenn die Doku gut ist gibt es auch noch Beispiele. Aber eine Doku kann niemals alle denkbaren Anwendungen in Beispiele reinpacken. Das ist dann genau die Stelle wo es mit Fragen in einem Userforum losgeht.

Aus deinem oben geposteten Sketch kann man schlussfolgern, dass du noch nicht all zu viel über Programmieren weißt. Wie viel Fragen entstehen hängt mit davon ab wie viel du über Programmiergrundlagen gelernt hast.

Hier ist ein Einsteiger-Tutorial
https://www.hobbyelektroniker.ch/roboter/arduinoprogrammierung/

Noch ein Hinweis zum DRV8825. Dieser und auch alle anderen Schrittmotortreiber sind empfindlich gegenüber Spannungsspitzen.
Man sollte die Leitungen zum Schrittmotor immer nur im stromlosen Zustand an- und abklemmen. Wenn durch die Motorpulen strom fließt und du öffnest den Kontakt dann hasst du einen 1b Elektroweidezaun mit einer Spannungsspitze die den Schrittmotortreiber zerstören kann.

Deshalb immer erst Spannung abschalten bevor man den schrittmotor anschließt oder abklemmt.

viele Grüße Stefan

Wenn der 'erste Teil' mit dem Drehen für die Löcherpositionen funktoniert, solltest Du den Sketch mal zeigen. Dann kann man auch Hinweise zur Erweiterung geben.
Sinnvoll wäre auch, wenn Du mal - ganz unabhängig von der Programmierung - den Ablauf des Ganzen mit den jeweiligen Bedienschritten beschreibst. So wie Du dir das vorstellst.

So sieht es bisher aus

#include <MobaTools.h>

const byte stepPin = 3;          // Taster zwischen Pin und Gnd anschließen
const byte dirPin  = 2;
const byte tasterPin = 4;      
const byte tasterPin2 = 5;

const int stepsProUmdr = 800;   // Steps pro Umdrehung ( mit 1/4 microsteps )
int stepsProTaster = 400;       // Schritte um die sich der Motor pro Tastendruck dreht.
int stepsProTaster2 = -400;

                                // Bei Dauerdruck dreht er sich ständig weiter
MoToStepper myStepper ( stepsProUmdr, STEPDIR );

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

void loop() 
{  

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

Jetzt soll beim Taste drücken erst der Stepper für den
Spannhebel aufmachen, dann drehen und dann wieder
zu machen.

Also Stepper 1 dreht, dann dreht Stepper 2 das Teil und dann
dreht der Stepper 1 wieder anders herum den gleichen Weg.

Ok, wie sieht das denn mechanisch aus? Ich kann mir im Moment noch nicht so recht vorstellen, dass ein Stepper für einen Spannhebel so ideal ist. Bei einem Spannhebel hast Du ja definierte Positionen was 'offen' und 'gespannt' ist. Und er soll dann ja auch ordentlich andrücken, damit beim Bohren nichts verrutscht. Oder wird der Spanndruck dann z.B. durch eine Feder erreicht? Beim Starten des Systems weist Du nicht, wo dein Stepper steht. Da müsstest Du den erstmal in die richtige Position bringen ( Referenzfahrt ).
Ich denke deine Platte drehst Du einfach erstmal von Hand in die erste Position, oder wie kann ich mir das vorstellen? Wie soll das jetzt beim Spannhebel funktionieren?
Hast Du mal ein Bild von der ganzen Vorrichtung?

Das ist noch nicht so weit gebaut, weil ich da eh noch überlegen muss.

Aber ja, da kommt ein gefederter Stift hin und der Motor würde einmal manuell auf "Auf" bewegt, dann vor dem Anfangen per Taste auf "zu" gefahren und ab da kann man den Automatismus starten.

Dann kommen wir jetzt endgültig zum Post #2 :sunglasses: - denn jetzt wird's eindeutig eine Schrittkette. Hast Du dich da schon mal ein wenig schlau gemacht?