Riemenantrieb mit Schrittmotor und L293D

Zuerst einmal ein Hallo an alle,

Ich würde mir gerne einen Kameraschlitten bauen welcher über einen Schrittmotor angesteuert wird. Das ganze will ich dabei so simpel wie möglich halten. Der Schrittmotor soll dabei einfach in eine Richtung fahren und wenn er an einem Ende angekommen einen Taster auslösen und so wieder in die andere Richtung fahren.

Ich bin soweit, dass ich den Motor mit einem Starttaster starten kann und durch einen Interrupt mittels Taster bleibt er stehen. Wenn ich den Starttaster danach wieder drücke tut sich nichts. Hab mir schon viele Videos etc. darüber angeschaut wo Interrupts verwendet werden und wo das Programm danach wieder weiterläuft.

Ich bin mir nicht sicher ob Interrupts für mein Problem überhaupt die beste Lösung wären und wäre auch für andere mögliche Möglichkeiten sehr dankbar. Ich weiß nicht ob ich irgendwas essentielles dabei übersehe oder falsch mache aber ich glaube mit eurer Hilfe komm ich am schnellsten zu meinem Ziel.

Wenn alles funktioniert, sollte hier drunter noch mein derzeitiger Code sein. Dieser ist aufgrund einiger Tests nicht gerade schön und übersichtlich, doch ich denke ihr könnt damit gut erkennen was für Sachen ich bereits ausprobiert habe.

LG Lukas :slight_smile:

EDIT: Hat nicht so funktioniert wie erwartet. Kopiere den Code hier hinein, damit ihr ihn nicht downloaden müsst. Hoffe das ist Okay.

#include <Stepper.h>

//int inlPin = 13;
const int stepsU = 200;

//Taster Start-Stop
const int pin_start = 2;
const int interrupt_stop = 3;

//Variablen
volatile bool taster_start = LOW;
volatile bool taster_stop = LOW;
int i, k = 0;


Stepper myStepper(stepsU,9,10,11,12);

void setup()
 {
   //pinMode(inlPin, OUTPUT);
   myStepper.setSpeed(100);
   
   pinMode(pin_start, INPUT_PULLUP);  
   
   pinMode(interrupt_stop, INPUT_PULLUP);
   attachInterrupt(digitalPinToInterrupt(interrupt_stop), STOP, CHANGE);

 }

void loop()
 {
   taster_start = !digitalRead(pin_start);
   taster_stop = !digitalRead(interrupt_stop);

   
   i = 0;
   if (taster_start){
     do{
       myStepper.step(HIGH);
      
       //if (taster_stop){
        // return 0;               
      // }
       i++;
     } while (i < 1000);
     i = 0;
   }
   /*if (interrupt_stop){
     myStepper.step(-HIGH);
   }*/
 }

void STOP(){
 myStepper.step(HIGH);

}

start_stop.ino (989 Bytes)

Du solltest Dich erst einmal mit dem Entprellen von Schaltern befassen (Debounce, StateChangeDetect), und dann auf unpassende Interrupts verzichten.

Die Verwendung von HIGH zur Angabe der Anzahl von Schritten ist sehr kreativ, beeinträchtig aber die Lesbarkeit.

Danke erstmals für die rasche Antwort!

Danke für den Debouncing Tipp etc. Ich weiß, dass HIGH sicherlich nicht die beste Lösung ist, aber gibt es sonst eine andere Möglichkeit um den Motor drehen zu lassen?
Mit dem Befehl "myStepper.step(xy)" wüsste ich keine andere Lösung, da ich ja nicht im vorhinein sagen kann wie viele Schritte der Motor machen muss bis er auf der anderen Seite ankommt. Bei anderen Einträgen war auch mal die rede von "myStepper.setSpeed(0)" damit der Motor stehen bleibt. Wenn ich das bei mir anwende, komme ich gar nicht ins Interrupt hinein.

LG Lukas

Wenn Du flexibel und kooperativ bleiben möchtest, dann mache immer nur 1 Schritt mit dem Stepper. HIGH ist zufällig 1, die Angabe der gewünschten Schrittzahl als Zahl wäre aber verständlicher. Dann kannst Du zwischen zwei Schritten prüfen was immer Du möchtest, ganz ohne Interrupt.