Probleme beim steuern von Nema Motor

Hallo.

ich komme nicht mehr weiter bei meinem Problem und hoffe mir kann jemand helfen.
Und zwar baue ich gerade an einem Projekt wo ich einen Stepper-Motor per Taster betätigen möchte aber der Motor nur unter Strom ist wenn gedrückt wird und wenn nicht dann Stromlos ist.

wenn ich an die Tasterpins ein kabel anschließe dann zuckt der Stepper all 1/2 sec einmal hin oder herr und ich verstehe nicht warum. wenn kein kabel dran ist ist alles ruhig und ich die Pins mit einem schraubenzieher schliese läuft er. was ist falsch muss ein wiederstand in den Taster oder so?

Weiss jemand Rat? Bin über jede Hilfe dnkbar.

Habe man eine kleine Zeichnung meines PCB boards angehängt.
Der Arduino nano ist folgendermaßen Programmiert:

#define dir1  5 //  D5 am Arduino = Direction am Treiber
#define step1  6 //  D6 am Arduino = Step am Treiber
 #define RST  8 //  D8 am Arduino = Reset am Treiber
 #define MS3  9 //  D9 am Arduino = Microstepping 3 am Treiber
 #define MS2 10 // D10 am Arduino = Microstepping 2 am Treiber
 #define MS1 11 // D11 am Arduino = Microstepping 1 am Treiber
 #define EN  12 // D12 am Arduino = Enable am Treiber
  #define G1 A3 //  A3 am Arduino = GND Taster
  #define G2 A5 //  A5 am Arduino = GND Taster

void setup() {
Serial.begin(9600);
pinMode(dir1, OUTPUT);
pinMode(step1, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(MS3, OUTPUT);
pinMode(MS2, OUTPUT);
pinMode(MS1, OUTPUT);
pinMode(G1, OUTPUT);
pinMode(G2, OUTPUT);
} 
void step(boolean dir,int steps){
digitalWrite(RST, LOW);        // Treiber AUS
digitalWrite(G1, LOW);         // GND an Taster
digitalWrite(G2, LOW);         // GND an Taster
   digitalWrite(MS1, HIGH);    //  5V an Microstepping 1
   digitalWrite(MS2, HIGH);    //  5V an Microstepping 2
   digitalWrite(MS3, LOW);     // GND an Microstepping 3
digitalWrite(dir1,dir);
delay(50);

while (!analogRead(A2))        // Wenn der Taster gedrückt wird dann aufuehren
for(int r=0;r<steps;r++){
  digitalWrite(RST, HIGH);     // Treiber AN
  digitalWrite(dir1, HIGH);    // Dreh-Richtung
  digitalWrite(step1, HIGH);
  delayMicroseconds(200);      // Geschwindigkeit
  digitalWrite(step1, LOW); 
}
 while (!analogRead(A4))       // Wenn der Taster gedrückt wird dann ausfuehren
 for (int l=0;l<steps;l++){
  digitalWrite(RST, HIGH);     // Treiber AN
  digitalWrite(dir1, LOW);     // Dreh-Richtung
  digitalWrite(step1, HIGH);
  delayMicroseconds(200);      // Geschwindigkeit
  digitalWrite(step1, LOW);
}
}
void loop(){
 step(true,1);                 // Dreh-Richtung HIGH
 step(false,1);                // Dreh-Richtung LOW
 delay(50);
}

Weshalb verbindest Du deine Taster nicht fest mit GND?
Den Zustand der Taster musst Du mit digitalRead einlesen, analogRead macht hier keinen Sinn und führt zu falschen Ergebnissen. Ausserdem musst Du den Eingang bei offenem Taster auf ein festes Potential legen, sonst fängt der offene Eingang beliebige Störungen auf.
Da Du den Taster eh gegen GND geschaltet hast geht das am einfachsten mit

pinMode( A2, INPUT_PULLUP);
pinMode( A4, INPUT_PULLUP );

Du solltest aber auch den Tastereingängen sinnvolle Namen zuordnen.

P.S. Du solltest Code immer in Code-Tags einbinden. Dann ist er besser lesbar, und es werden auch betimmte Zeichenfolgen nicht versehentlich als Formatierungszeichen interpretiert. Das kannst Du auch noch nachträglich machen: Den Code markieren, und oben links im Editor den </> Button drücken.

oh danke für den Tip ich bin noch ein absoluter Neuling in der Sache :slight_smile:
kannst du mir da auf die Sprünge helfen was ich alles ändern muss dann?
Ich nehme an den pinmode setzen und analogread auf digitalread ändern?

Den Ground durch den Arduino zu machen ist ein Problem weil habe es so gemacht um Kabel wirwar zu vermeiden.
Den Taster benennen dann auch oben bei define oder?
Post mit dem Code ist bearbeitet.

#define dir1  5 //  D5 am Arduino = Direction am Treiber
#define step1  6 //  D6 am Arduino = Step am Treiber
  #define RST  8 //  D8 am Arduino = Reset am Treiber
  #define MS3  9 //  D9 am Arduino = Microstepping 3 am Treiber
  #define MS2 10 // D10 am Arduino = Microstepping 2 am Treiber
  #define MS1 11 // D11 am Arduino = Microstepping 1 am Treiber
  #define EN  12 // D12 am Arduino = Enable am Treiber
   #define UP A2 //  A2 am Arduino = Taster Hoch
   #define DN A4 //  A4 am Arduino = Taster Runter

void setup() {
Serial.begin(9600);
 pinMode(dir1, OUTPUT);
 pinMode(step1, OUTPUT);
 pinMode(RST, OUTPUT);
 pinMode(MS3, OUTPUT);
 pinMode(MS2, OUTPUT);
 pinMode(MS1, OUTPUT);
 pinMode(G1, OUTPUT);
 pinMode(G2, OUTPUT);
 pinMode(A2, INPUT_PULLUP);
 pinMode(A4, INPUT_PULLUP);
 }
 
void step(boolean dir,int steps){
 digitalWrite(RST, LOW);        // Treiber AUS
 digitalWrite(G1, LOW);         // GND an Taster
 digitalWrite(G2, LOW);         // GND an Taster
    digitalWrite(MS1, HIGH);    //  5V an Microstepping 1
    digitalWrite(MS2, HIGH);    //  5V an Microstepping 2
    digitalWrite(MS3, LOW);     // GND an Microstepping 3
 digitalWrite(dir1,dir);
 delay(50);
 
 while (!digitalRead(UP))        // Wenn der Taster gedrückt wird dann aufuehren
 for(int r=0;r<steps;r++){
   digitalWrite(RST, HIGH);     // Treiber AN
   digitalWrite(dir1, HIGH);    // Dreh-Richtung
   digitalWrite(step1, HIGH);
   delayMicroseconds(200);      // Geschwindigkeit
   digitalWrite(step1, LOW); 
 }
  while (!digitalRead(DN))       // Wenn der Taster gedrückt wird dann ausfuehren
  for (int l=0;l<steps;l++){
   digitalWrite(RST, HIGH);     // Treiber AN
   digitalWrite(dir1, LOW);     // Dreh-Richtung
   digitalWrite(step1, HIGH);
   delayMicroseconds(200);      // Geschwindigkeit
   digitalWrite(step1, LOW);
 }
}

void loop(){
  step(true,1);                 // Dreh-Richtung HIGH
  step(false,1);                // Dreh-Richtung LOW
  delay(50);
}

Den Ground durch den Arduino zu machen ist ein Problem?

Ja. Signalausgänge sollen nie für Spannungsversorgung verwendet werden.
Grüße Uwe

uwefed:
Ja. Signalausgänge sollen nie für Spannungsversorgung verwendet werden.
Grüße Uwe

ok dann werde ich den Ground des Tasters direkt auf Ground legen.
Danke lerne gerne dazu - wie gesagt bin neu in der Thematik.

vinu-snake:
ok dann werde ich den Ground des Tasters direkt auf Ground legen.
Danke lerne gerne dazu - wie gesagt bin neu in der Thematik.

Ist sicher die beste Lösung.
Grüße Uwe

vinu-snake:
kannst du mir da auf die Sprünge helfen was ich alles ändern muss dann?

Willst Du Microstepping umschalten? Wenn nicht, können MS1 bsi MS3 auf ein festes Potential (5V/GND) gelegt werden.

RST könntest Du mit RST vom Nano verbinden.

Step, Dir und /EN sind OK.

Mit einer Bibliothek wie den MobaTools kannst Du Dir die Programmierung vereinfachen. Der Autor dieser Bibliothek hat Dir schon geschrieben, ist aber zu bescheiden, seine Künste anzupreisen, darum mache ich das jetzt mal :slight_smile:

Ich möchte mich Bedanke für die 2 Durchschlagenden Tips die mein Problem in Luft aufgelöst haben - Code anpassen + Schalter fix auf GND legen.
Hätte ich mal früher gefragt hätte ich mir 2 Abende des Kopfzerbrechens ersparen können.

Das sind meine finalen configs und es funktioniert einwandfrei nach meinen Wünschen - falls jemand ein Ähnliches Projekt verfolgt.

Und zwar zur Erklärung: Ich möchte mit einem Nema-Motor etwas nach oben und unten bewegen können auf Knopfdruck. Im Stillstand kann man den Motor nicht verdrücken somit brauche ich keinen Dauerstrom am Motor und Ich möchte weitgehend sämtliche Hitzeentwicklung vermeiden deswegen Strom nur beim Knopfdruck.

Die Microsteppingoption habe ich am Anfang so aufgelötet am Board, da ich mir nicht sicher war wie ich den Stepper betreiben möchte - da er auch leise sein soll und mit 1/8 ist es ganz gut.

vielen Dank nochmal für Eure Hilfe

 #define dir1  5 //  D5 am Arduino = Direction am Treiber
#define step1  6 //  D6 am Arduino = Step am Treiber
  #define RST  8 //  D8 am Arduino = Reset am Treiber
  #define MS3  9 //  D9 am Arduino = Microstepping 3 am Treiber
  #define MS2 10 // D10 am Arduino = Microstepping 2 am Treiber
  #define MS1 11 // D11 am Arduino = Microstepping 1 am Treiber
  #define EN  12 // D12 am Arduino = Enable am Treiber
   #define UP A2 //  A2 am Arduino = Taster Hoch
   #define DN A4 //  A4 am Arduino = Taster Runter

void setup() {
Serial.begin(9600);
 pinMode(dir1, OUTPUT);
 pinMode(step1, OUTPUT);
 pinMode(RST, OUTPUT);
 pinMode(MS3, OUTPUT);
 pinMode(MS2, OUTPUT);
 pinMode(MS1, OUTPUT);
 pinMode(UP, INPUT_PULLUP);
 pinMode(DN, INPUT_PULLUP);
 }
 
void step(boolean dir,int steps){
 digitalWrite(RST, LOW);        // Treiber AUS
    digitalWrite(MS1, HIGH);    //  5V an Microstepping 1
    digitalWrite(MS2, HIGH);    //  5V an Microstepping 2
    digitalWrite(MS3, LOW);     // GND an Microstepping 3
 digitalWrite(dir1,dir);
 delay(50);
 
 while (!digitalRead(UP))        // Wenn der Taster gedrückt wird dann aufuehren
 for(int r=0;r<steps;r++){
   digitalWrite(RST, HIGH);     // Treiber AN
   digitalWrite(dir1, HIGH);    // Dreh-Richtung
   digitalWrite(step1, HIGH);
   delayMicroseconds(200);      // Geschwindigkeit
   digitalWrite(step1, LOW); 
 }
  while (!digitalRead(DN))       // Wenn der Taster gedrückt wird dann ausfuehren
  for (int l=0;l<steps;l++){
   digitalWrite(RST, HIGH);     // Treiber AN
   digitalWrite(dir1, LOW);     // Dreh-Richtung
   digitalWrite(step1, HIGH);
   delayMicroseconds(200);      // Geschwindigkeit
   digitalWrite(step1, LOW);
 }
}

void loop(){
  step(true,1);                 // Dreh-Richtung HIGH
  step(false,1);                // Dreh-Richtung LOW
  delay(50);
}

Hi

#define kannst Du durch const byte ersetzen - bei const byte x; muß aber ein ; ans Zeilenende - beim #define darf Keines hin.
Hat den Vorteil, daß der Kompiler den Kram mit prüfen kann - ein #define ist eine reine Text-Übersetzung (vor dem Kompilieren).

Was soll das delay()?
Wenn der Arduino den ganzen Kram 50ms ignorieren soll, kann Der in dieser zeit auch 'egal was, aber mit Sinn' machen.
Bei delay() macht der Arduino (nahezu) Nichts - zumindest Nichts an Deinem Sketch!

MfG

Hallo,
noch ein paar Anmerkungen zu deinem aktuellen Stand aus #7:
Zur HW: Du solltest zwar die Taster direkt mit GND verbinden, aber keinesfalls die Anschlüsse A5 und A3 des Arduino. Die bleiben einfach ungenutzt.

Wenn Du im Stillstand ( bei nicht gedrücktem Taster ) den Strom im Stepper abschalten willst, solltest Du dazu den EN-Eingang verwenden, und nicht RST. Mit RST setzt Du den Treiber intern komplett zurück und verlierst auch deine Microstep-Position. Mit EN schaltest Du nur den Motorstrom ab, aber sonst bleibt der interne Zustand des Treibers erhalten.

Du solltest die Step-erzeugung vom Starten/Stoppen per Taster trennen. D.h. im loop fragst Du die Taster ab, aktivierst deine Motorausgänge, und erzeugst dann Steps mit der richtigen Richtung solange der jeseilige Taster gedrückt ist. In der eigentliche Step-Erzeugung haben dann das Stromeinschalten und Tasterabfragen nichts zu suchen ( da könntest Du dann auch meine MobaTools nutzen :wink: ).

vinu-snake:
Und zwar zur Erklärung: Ich möchte mit einem Nema-Motor etwas nach oben und unten bewegen können auf Knopfdruck. Im Stillstand kann man den Motor nicht verdrücken somit brauche ich keinen Dauerstrom am Motor und Ich möchte weitgehend sämtliche Hitzeentwicklung vermeiden deswegen Strom nur beim Knopfdruck.

Wobei sich die Frage stellt, ob dafür nicht ein einfacher DC-Motor - evtl. mit Getriebe - die bessere Alternative wäre. Stepper setzt man eigentlich da ein, wo es es um eine axakte Positionierung geht. Wenn es nur um Motor ein/aus geht ist i.A. der DC-Motor besser geeignet. Da hast Du das Problem mit dem Strom im Stillstand garnicht.

Wunn Du den Treiber durch ENable ausschaltest ist nicht sicher daß der Motor in der letzten position bleibt und nicht bis zum nächsten bzw vorigen Vollschritt weiterdreht. Die Drehrichtung hängt vom Moment der Last ab.
Wenn Du den Treiber wieder einschaltest dann dreht sich der Motor wieder in die Microstepposition zurück.
Grüße Uwe

Das ist aber bei Abschalten durch RST genauso. Nur dass er dabei auch den internen Schrittzähler verliert.
Bei seiner Anwendung ist das aber wahrscheinlich sowieso egal - weshalb da auch m.M.n. ein einfacher Getriebemotor besser wäre.
Das findet man hier ziemlich oft, dass Schrittmotore eingesetzt werden, obwohl gar nichts zu Positionieren ist und damit ein Stepper nicht wirklich Sinn macht.

postmaster-ino:
Was soll das delay()?

Wenn ich beim void step keine delay am schluss setze brummt der motor und habe mich da einfach an eine Vorlage gehalten die ich im Netz gefunden habe mit dem delay von 50. Im Loop unten werde ich es mal testen ohne delay ja das stimmt. wie gesagt bin noch neu in der Materie und lerne da immer mehr dazu.

MicroBahner:
Du solltest zwar die Taster direkt mit GND verbinden, aber keinesfalls die Anschlüsse A5 und A3 des Arduino. Die bleiben einfach ungenutzt.

Wenn Du im Stillstand ( bei nicht gedrücktem Taster ) den Strom im Stepper abschalten willst, solltest Du dazu den EN-Eingang verwenden, und nicht RST. Mit RST setzt Du den Treiber intern komplett zurück und verlierst auch deine Microstep-Position. Mit EN schaltest Du nur den Motorstrom ab, aber sonst bleibt der interne Zustand des Treibers erhalten.

Wenn ich den Taster fest auf Ground lege ist natürlich jeder zweite A frei aber ist ja kein Problem da ich den nano nur für diese Projekt so nutze und nicht alle Schaltanschlüsse benötige … oder?.

Mit Enable habe ich es nicht hinbekommen da der Treiber/Stepper sich nicht einschaltet wenn ich auf enable 5V oder GND gebe. Viele anderen schließen sleep- und reset-pin zusammen das der Steppertreiber strom liefert. Allerdings dann dauerhaft. Nach messen mit dem Multimeter habe ich festgestellt das sleep 5V sendet und somit dachte ich - super wenn ich 5V mit den Nano schalte dann kann ich den Treiber an und aussschalten. Bei enable hab ichs nicht hinbekommen irgendwie aber hatte davor alles mit brücken so auf meinem PCB aufgelegt siehe Anhang allerding ist das Bild entstanden bevor ich die Schalter auf GND fix gelegt habe (IMG_4) und habe noch Ausgänge 5V/3.3V gelegt und 12V an VN das alles Autark mit 12V läuft - habe gerade kein Bild vom Finalzustand.

uwefed:
Wenn Du den Treiber durch ENable ausschaltest ist nicht sicher daß der Motor in der letzten position bleibt und nicht bis zum nächsten bzw vorigen Vollschritt weiterdreht. Die Drehrichtung hängt vom Moment der Last ab.
Wenn Du den Treiber wieder einschaltest dann dreht sich der Motor wieder in die Microstepposition zurück.

Habe es nicht hinbekommen über Enable den Treiber an und auszuschalten. über reset-pin geht es ja an und aus - verstehe da jetzt nicht ganz den Unterschied :confused:

MicroBahner:
Bei seiner Anwendung ist das aber wahrscheinlich sowieso egal - weshalb da auch m.M.n. ein einfacher Getriebemotor besser wäre.
Das findet man hier ziemlich oft, dass Schrittmotore eingesetzt werden, obwohl gar nichts zu Positionieren ist und damit ein Stepper nicht wirklich Sinn macht.

Habe mich einfach für den Stepper entschieden da ich einen GT2 Zahnriemen und Adapter nutze und man das alles einfach bekommt im 3D-Druckbedarf.

Grüße

Hi

Mit enable schaltet man den Treiber - also nur Das, was den Strom hinten raus drückt - an oder aus.
Unbeschaltet ist AN - ob nach Vcc oder GND gezogen werden muß für AUS, steht im Datenblatt.

Du hast die Möglichkeit, Microsteps zu benutzen - irgend Einer muß Diese ja mitzählen - Das macht der Treiber - aber nur, solange Er 'lebt'.
Wenn Du Den per Reset einen in die Fr*sse haust, vergisst Der die aktuelle Position.
In Deinem Fall wohl kein Problem - schön ist aber anders.

Bekommst Du diesen Motor mit diesem Treiber in einem minimalem Sketch zum Drehen?
Also was in der Art:

while(1){
 digitalWrite(PULS,HIGH);
 delay(100);
 digitalWrite(PULS,LOW);
 delay(100);
};

Dann können wir langsam anfangen, den Kram in Funktion zu bekommen.
Sollte auch hier nur ein Zucken heraus kommen - tausche die mittleren beiden Drähte, dann hast Du wahrscheinlich die beiden Spulen vermischt.

MfG

PD: Ich gehe davon aus, daß Du das setup() selber zusammen bekommst und die paar Zeilen in loop() reinkopierst.

bin etwas irretiert da ja viele das so machen sleep und reset verbinden aber dann kommt ja auch dazu das der treiber heiss wird wenn er nur den strom der rausgeht schaltet oder?
Ich möchte so wenig Hitzeentwicklung wie nötig.

Andere Frage: Der Treiber muss die steps nicht mitzählen weil?

Und ich verstehe noch ganz wie dann der code aussehen muss bzw wo das while rein muss oder was es ersetzt - wie gesagt habe noch nicht viel Ahnung davon.
Aber Danke für deine Hilfe

Grüße

Andere Frage: Der Treiber muss die steps nicht mitzählen weil?

Wenn der Treiber mit STEP und DIR angesteuert wird bzw Microschritte macht muß er die Schritte mitzählen.
Ob das dann notwendig ist, daß er die momentane Schrittposition behalten soll, weil es nicht zulässig ist nach dem Wiedereinschalten bis zu 3 Ganz-Schritte verliert, ist dem projektbauer überlassen.

Grüße Uwe

OK ..

noch eine Frage zu meinem Projekt:
Kann mann ein Endstop einbinden das es automatisch stoppt - wenn man den Endpunkt erreicht?

Ich denke mal man schliest 5v an den schalter und wenn er kontakt hat und 5v fliesen erkennt der nano das oder? aber die frage als Neuling ist - Wie programmiert man das?

wäre jetzt noch die Krönung was eine Sicherheitsabschaltung betrifft :slight_smile:

danke schonmal und LG

Hi

Zuerst: Spannung fließt nicht und Strom liegt nicht an.

Der Arduino kann digitale Signale erkennen und entsprechend darauf reagieren.
Ein End-Stop bewirkt normal das DIREKTE Stilllegen des Motor - da ein Weiterfahren mechanisch Brocken gibt.

Dreht Dein Motor überhaupt schon? Der letzte Status dazu war, daß der Kram nur zuckt - von Endabschaltung und Sicherheit wären wir damit noch eine gute Ecke entfernt.

MfG

postmaster-ino:
Hi

Zuerst: Spannung fließt nicht und Strom liegt nicht an.

Der Arduino kann digitale Signale erkennen und entsprechend darauf reagieren.
Ein End-Stop bewirkt normal das DIREKTE Stilllegen des Motor - da ein Weiterfahren mechanisch Brocken gibt.

Dreht Dein Motor überhaupt schon? Der letzte Status dazu war, daß der Kram nur zuckt - von Endabschaltung und Sicherheit wären wir damit noch eine gute Ecke entfernt.

MfG

Post #7 seitdem geht es ja ... habe das delay im loop noch entfernt.
Sorry für meine unfachmännischen Aussagen - wie sagt man es richtig?

Dachte - vlt ist das nur ne kleine Sache und ich Frag mal.

Stelle es mir jetzt auf anhieb nicht ganz so einfach vor. da der Motor ja wenn er am Endstop ist in die andere Richtung aber fahren soll um wieder weg zu kommen vom Endstop.

vinu-snake:
Sorry für meine unfachmännischen Aussagen - wie sagt man es richtig?

Strom fließt, weil sich Ladungen durch den Leiter bewegen. Spannung liegt an und ist die Trennung von Ladungen unterschiedlicher Polarität und deren Verlangen, die Trennung rückgängig zu machen.

Bei einem Endstopp muß die Bewegung kurz vor Bruch stoppen. Das muß sowohl durch die Steuerung erfolgen, wie auch durch ein Abschalten der Motoren. Dieser Fehlerfall darf nur nach Überprüfung der Fehlerursache durch eine berechtigte Person im manuellen Betrieb, nicht aber automatisch beendet werden. Also nix mit automatisch Zurückfahren!

Anders ist das bei Aktionspunkten, die die Steuerung zu irgendwelchen Aktionen veranlassen können, auch einer Richtungsumkehr.

Wenn Du Dir den Finger quetschen könntest, dann mußt Du Sicherheitsvorschriften einhalten, sonst zahlt keine Versicherung.