Stepper Motor mit Fußschalter steuern

noch einfacher als
if ( digtalRead(reverseSwitch) ) setdir=0; else setdir=1;
geht:
setdir = digtalRead(reverseSwitch); bzw wenn notwendig negiert: setdir = !digtalRead(reverseSwitch);

if (reverseSwitch) setdir=0; else setdir=1;
funktioniert nicht weil Du den Pin und nicht den Pinzustand nimmst.

linda89:
Hallo Uwe,
was meinst du genau? Deiner Meinung nach NO an Arduino, COM an GND?
Warum denkst du, dass es so eher passt?

COM und NC/NO
@linda89 Meine Frage war eigentlich nicht für Dich bestimmt. Peter-CAD-HST hat seine Antwort so absolut formuliert ( kam es mir rüber MEine Entschuldigung falls es nicht so gemeint war) daß ich wissen wollte wieso es das so sagt.

Es ist elektrisch gesehen egal ob
COM auf GND und NO auf Eingangspin oder
NO auf GND und COM auf Eingangspin.

Auch bei COM auf Eingangspin dann ist der Wechsel von NO zu NC kein großes Problem.

Nur wenn man beides, NO und NC verwendet sehen die Dinge anders aus.

Grüße Uwe

Guten Abend Uwe, danke dass du mich auch unterstüzt.
Leider weiß ich jetzt nicht genau was ich machen soll, ich fasse kurz zusammen:

if ( digtalRead(reverseSwitch) ) setdir=0; else setdir=1; -> das ist ok, aber es geht auch anders, dazu hast du noch zwei Vorschläge geschickt, ist das richtig verstanden?

aber hier muss ich was verndern:
if (reverseSwitch) setdir=0; else setdir=1;

Nur ich weiß nicht wie ich den Quellcode verändern sollte, sodass es funktioniert. ich stehe auf dem Schlauch. wie kann ich den Pinzustand im Quellcode schreiben?

Danke dir.

linda89:
Doch ich habe es unter Void loop eingefügt. Siehe hier nochmal:

Du solltest es nicht zusätzlich einfügen, sondern deine fehlerhafte Zeile entsprechend korrigieren :wink:

Ach ja je Franz-Peter, dann habe ich es falsch gelesen.

if (reverseSwitch) setdir=0; else setdir=1; -> fliegt raus und

if ( digtalRead(reverseSwitch) ) setdir=0; else setdir=1; -> wird dafür eingefügt.

Habe ich es richtig verstanden? Oh man, wie dämlich von mir :smiley:

Ja, so war das gemeint.

Hallo linda89

Ja, genau.

reverseSwitch ist das Pin wo der Fußschalter angeschlossen ist. In Deinem Sketch ist das Pin D2.

digitalRead(reverseSwitch) liest den Zustand des Pins aus. Also ob es Massepotential hat LOW oder Spannungsversorgungspotential HIGH.

Grüße Uwe

Ich danke euch alle!! Wir kommen dem Ziel immer näher.
Ich habe die Anpassungen im Quellcode vorgenommen und hochgeladen. Siehe da, es tut sich was :slight_smile:

Der Motor dreht sich wie gehabt, wenn ich jetzt den Fußschalter betätige, bleibt der Motor aber stehen. Erst wenn ich wieder loslasse, dreht dieser weiter.

Dabei fällt mir auf: wenn ich den Fußschalter drücke, geht das Arduino aus!?!? die Lichter gehen aus und erst beim loslassen vom Fußschalter leuchten beide Lämpchen wieder und der Motor dreht sich.

Das ist jetzt er momentane Code:

// Defin pins
 
int reverseSwitch = 2;  // Push button for reverse
int driverPUL = 7;    // PUL- pin
int driverDIR = 6;    // DIR- pin
int spd = A0;     // Potentiometer
 
// Variables
 
int pd = 500;       // Pulse Delay period
boolean setdir = LOW; // Set Direction
 
// Interrupt Handler
 
void revmotor (){
 
  setdir = !setdir;
 
}
 
 
void setup() {
 
  pinMode (driverPUL, OUTPUT);
  pinMode (driverDIR, OUTPUT);
  pinMode (reverseSwitch, INPUT_PULLUP);
  
 
}
 
void loop() {
 
    pd = map((analogRead(spd)),0,1023,2000,50);
    if (digitalRead(reverseSwitch)) setdir=0; else setdir=1;
    digitalWrite(driverDIR,setdir);
    digitalWrite(driverPUL,HIGH);
    delayMicroseconds(pd);
    digitalWrite(driverPUL,LOW);
    delayMicroseconds(pd);
 
}

Bitte ersatzlos löschen:

// Interrupt Handler
 
void revmotor (){
 
  setdir = !setdir;
 
}

linda89:
Dabei fällt mir auf: wenn ich den Fußschalter drücke, geht das Arduino aus!?!? die Lichter gehen aus und erst beim loslassen vom Fußschalter leuchten beide Lämpchen wieder und der Motor dreht sich.

Das deutet auf einen Kurzschluß hin => Zerstörungsgefahr!

Aussagekräftige scharfe Fotos könnten helfen.

Eigentlich müßte der Sketch funktionieren.

Wie agmue sagt deutet ein ausgehen des Arduino auf einen Kurzschluß. Wie hast Du den Fußschalter angeschlossen?

Wenn Du das Problem mit dem Kurzschluß gelöst hast und es noch nicht funktioniert:
Wenn Du den DIR Pin des Treibers nicht vom Arduino sondern direkt mittels eines Kabels auf GND und danach auf +5V legst funktionieren dann die beiden Richtungen des Motors?

Grüße Uwe

Ich habe euch mal meine Verkabelung gemalt. Sorry wenn es nicht perfekt aussieht, aber ich hoffe ihr könnt alle Vderbindungen erkennen. da wird es bestimmt einen fehler geben…

Wieso verbindest Du 5V mit Pin2 des Arduino, NO des Fußschalters, den Potentiometer und mit PUL+ und DIR+

Wenn Du den Fußschalter betätigst verbindest Du GND mit 5V also Kurzschluß.

5V sollte nur mit dem Potentiometer, und mit PUL+ und DIR+ verbunden sein.

Grüße Uwe

Es funktioniert :slight_smile:
Bin ich happy:) Ich danke euch allen für die Hilfe! Ich seid absolute klasse!

Ich seid absolute klasse!

Wußte ich schon, sonst wäre ich hier nicht Moderator. :wink: :wink: :wink: :wink:

Was war dann der Fehler?

Grüße Uwe

(deleted)

Guten Abend zusammen,
Oje, ich hoffe ich nerve nicht :confused:
manchmal kommt das nächste Projekt schneller als einem vielleicht lieb ist. Aber ich habe gemerkt, dass man mit dem arduino richtig tolle Sachen programmieren und umsetzen kann. Deswegen frage ich nochmal nach Hilfe. Ich überlege schon die ganze Zeit wie Ich es umsetzen könnte, muss aber sagen, dass ich es nicht schaffe :frowning:

Also ich würde nun gerne noch die Umdrehungen vom Motor zählen und festlegen. Bei meinem Schrittmotor heißt es dann, glaube ich, die Schritte zählen.

Wenn der Fußschalter nicht betätigt wird, dreht sich der Motor ja momentan endlos. Die Umdrehungen würde ich gerne einstellen können. Beispiel max.10 Umdrehungen, dann stehen bleiben. Wenn ich den Fußschalter betätige dreht der Motor wieder zurück. Auch Max 10 Umdrehungen dann.

Die Königsdiziplin ist aber dann, wenn der Motor mal nur 5 Umdrehungen macht, da vorher auf den Fußschalter gedrückt wird, darf der Motor auch nur Max. 5 Umdrehungen zurück machen.

Macht der Motor aber nur 3 Umdrehungen zurück da der Fußschalter wieder losgelassen wird, muss der Motor spätestens nach 8 Umdrehungen wieder stoppen ->da die Max. Umdrehungen von 10 dann erreicht sind.

Es geht also um das Festlegen von Umdrehungen/Schritten und das zählen von diesen, um immer den gleichen Start und Endpunkt beizubehalten. Innerhalb dieser festgelegten "Range" bewegen sich die Umdrehungen und der Motor weiß jederzeit wie viel er noch in eine Richtung drehen kann.

Puh, das ist jetzt viel geschriebenes:)

Gerne höre ich von euch.

Dann würde ich dir empfehlen, eine Library zu verwenden, die die Position des Steppers mit verwaltet. Z.B. die Accelstepper oder meine MobaTools. Die Libs kannst Du über den Bibliotheksmanager installieren.

Guten Abend Franz-Peter,

wahnsinn was du bei MobaTools alles bereitstellst und ausführlich beschreibst :slight_smile: Top!

Ich denke, dass ich für meine Anwendung viel im Bereich "MoToStepper" finde.
Ich versuche mich dort man herein zu fuchsen.

Diese Punkte denke ich werden benötigt:

  1. set zero (aktuelle Position als Referenzpunkt)
  2. do steps (Zahl der Schritte festlegen)
  3. read steps (auslesen wieviele Schritte vom Endziel noch entfernt
  4. steps to do (berechnet wie viele Steps zum Ziel noch zu machen sind, von der aktuellen Position aus)
  5. stop (hier werden evtl. der Endpunkt definiert (auf der einen Seite haben wir den Zero Punkt und auf der anderen Seite den Stop Punkt?)

Puh, aber das ist echt zu hoch für mich. Habe keine Ahnung wie ich das in meine Quellcode einbaue :frowning:

linda89:
Puh, aber das ist echt zu hoch für mich. Habe keine Ahnung wie ich das in meine Quellcode einbaue :frowning:

Wie lernt Dein Kind? Durch Spielen!

Also spiele mit den Beispielen der Bibliothek und lies ergänzend die Doku. Arbeite Dich in kleinen Schritten zur Lösung. Wenn Du Dich fit genug fühlst, bastelst Du ein Programm für Dein Vorhaben und beschreibst, was nicht so funktioniert, wie Du es gerne möchtest. Dann kommt Hilfe.

Du kannst das auch ohne Bibliothk machen.
Ich presentiere hier mal meine Lösung obwohl eigentlich hier weitgehen kein Sketch geliefert wird sondern geholfen wird zum Sketch zu kommen.

Ich nehme mal an der Schrittmotor macht 200 Schritte pro Umdrehung.
Hab mal versucht den Sketch nach deinen Vorgaben zu ändern. Er kompiliert fehlerlos, ich weiß aber nicht ob er funktioniert.
Versuch mal zu verstehen was ich da gemacht habe.
Bei Fragen bin ich da.

Ich zähle die Schritte mit.
Ein Schritt darf nur gemacht werden wenn die Schrittanzanl ab Start zwischen 0 und Maximalwert liegt bzw wenn die Bewegung vom Limit weg in den Bereich hinein führt. Das erreicher ich hoffentlich mit dem
if ( !(IstSchritte <= 0 && !setdir) || !(IstSchritte >= MaxSchritte && setdir))

Um weitere if zu vermeiden wende ich etwas Matematik an:
setdir = !digitalRead(reverseSwitch);
Setdir wird LOW wenn der Eingang HIGH ist und umgekehrt. Es ist kein if notwendig sondern nur eine Zuweisung und ein Negieren (Zeichen ! ) des Zustandes. Alternativ könnte als Negation am Fußschalter auch der NC Kontakt statt des NO verwendet werden.

IstSchritte += (1 - (setdir * 2));
Hier wird 1 dazugezählt oder weggezählt je anch Wert von setdir.
Ist setdir LOW, was 0 entspricht, wird daraus +1.
Ist setdir HIGH, was 1 Entspricht wird daraus 2 und 1 -2 ergibt -1.
Mit += spare ich mir die Variable nochmal zu schreiben. a+=1 entspricht a=a+1; ( kleines C einmaleins).

Grüße Uwe

// Defin pins
 int reverseSwitch = 2;  // Push button for reverse
int driverPUL = 7;    // PUL- pin
int driverDIR = 6;    // DIR- pin
int spd = A0;     // Potentiometer

// Variables

int pd = 500;       // Pulse Delay period
boolean setdir = LOW; // Set Direction;   LOW = Rechts bzw erhöht Anzahl Schritte

int IstSchritte = 0; //Aktuell gemachte Schritte.
int MaxSchritte = 2000; // limit maximale schritte ( zb 10 Umdrehungen a 200 schritte pr umdrehung = 2000)

void setup()
{
  pinMode (driverPUL, OUTPUT);
  pinMode (driverDIR, OUTPUT);
  pinMode (reverseSwitch, INPUT_PULLUP);
}

void loop()
{
  pd = map((analogRead(spd)), 0, 1023, 2000, 50);
  setdir = !digitalRead(reverseSwitch);  //LOW ist Rechtsdrehung; Erhöht Schritte.
  if ( !(IstSchritte <= 0 && !setdir) || !(IstSchritte >= MaxSchritte && setdir))  // erlaubt Schritte von 0 bis Maximale Schrittanzahl
  {
    IstSchritte += (1 - (setdir * 2)); // inkementiert oder dekrementiert die Schritte.
    digitalWrite(driverDIR, setdir);
    digitalWrite(driverPUL, HIGH);
    delayMicroseconds(pd);
    digitalWrite(driverPUL, LOW);
    delayMicroseconds(pd);
  }
}

Guten Abend Uwe,
Mensch du bist klasse. Danke ich werde es mal ausprobieren und dir sagen ob es funktioniert.

Ich teste gerade noch am alten Script etwas rum. Kannst du mir sagen was genau die 4 Zahlen beim Speed angeben? Ich habe mal ein Foto beigefügt, welche ich meine.
Ich merke, damit mache ich den Motor schneller oder langsamer… Das macht vor allem die letzte Zahl. Je kleiner desto schneller…
Was sagen die anderen Zahlen aus?