Forum: Mikrocontroller und Digitale Elektronik Schrittmotor ansteuern


von Steve K. (Firma: Schüler) (bub)


Lesenswert?

Hallo allerseits,

ich habe vor ein paar Tagen einen Schrittmotor NEMA 17 mit einen 
Mikrocontroller Arduino Mega und einen Steppershield Ramp 1.4 bekommen.

Der Schrittmotor dient um einen Rahmen zu ziehen, mittels Zahnriemen. 
Der Rahmen soll dabei immer um 10 mm weitertakten.
Leider bin ich ziemlich nackt was die Programmierung betrifft. Gesehen 
(und funktioniert auch) habe ich bis jetzt nur dass es die Möglichkeit 
gibt den Schrittmotor mit einer Zeit anzusteuern, gibt es vielleicht 
auch die Möglichkeit das ganze über Schritte zu takten?

Das ist gerade mein Projekt über das Wochenende und freue mich über jede 
Hilfe.

LG :)

von Noch einer (Gast)


Lesenswert?

> Das ist gerade mein Projekt über das Wochenende

Da hat sich schon so mancher verschätzt. Projekte mit Schrittmotoren 
brauchen meist Jahre, bis sie so wirklich überzeugend funktionieren.

von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Lesenswert?

Noch einer schrieb:
> Da hat sich schon so mancher verschätzt. Projekte mit Schrittmotoren
> brauchen meist Jahre, bis sie so wirklich überzeugend funktionieren.

Man kann es sich aber auch einfacher machen und hat alles in spätestens 
einer Stunde am laufen:

https://github.com/grbl/grbl/wiki

https://github.com/grbl/grbl/wiki/Connecting-Grbl

von Steve K. (Firma: Schüler) (bub)


Lesenswert?

Danke !

Also das Ding bewegt sich schon einmal: Habe diesen Code gefunden
1
#define X_STEP_PIN         54
2
#define X_DIR_PIN          55
3
4
void setup() {
5
  pinMode(X_STEP_PIN  , OUTPUT);
6
  pinMode(X_DIR_PIN    , OUTPUT);
7
8
}
9
10
void loop () {
11
  
12
  if (millis() %4000 <1000) {
13
    digitalWrite(X_DIR_PIN    , HIGH); 
14
  }
15
  else {
16
    digitalWrite(X_DIR_PIN    , LOW); 
17
  }
18
  
19
    digitalWrite(X_STEP_PIN    , HIGH);
20
21
  delay(1);
22
    
23
    digitalWrite(X_STEP_PIN    , LOW);
24
  }

Kann den vielleicht jemand erklären? Bin bis jetzt noch nichts fündig 
geworden was DIR usw eigentlich heisst

von Noch einer (Gast)


Lesenswert?

Die Schrittmotortreiber haben normalerweise nur 2 Eingänge.

DIR Direction für die Drehrichtung

STEP macht einen Schritt. Ja nach Karte Vollschritt, Halbschritt, 
Mikroschritt. Manchmal beim Wechsel von High nach Low. Manchmal 
umgekehrt.

Diese Endlosschleife macht so ungefähr 1000 Schritte pro Sekunde. 
digitalWrite(X_STEP_PIN)

Nebenbei schaltet sie von Zeit zu Zeit die Drehrichtung um.
digitalWrite(X_DIR_PIN)

von Wolfgang (Gast)


Lesenswert?

Steve Korn schrieb:
> Kann den vielleicht jemand erklären?

Da solltest du schon ein bisschen genauer fragen. Du wirst hier jetzt 
keinen persönlichen Grundkurs "in Alles" bekommen.
Meist gibt es zu Arduino Komponenten Beispielcode auf der Web-Site des 
Anbieters, auch für deine Schrittmotorabtrennung.

von sven (Gast)


Lesenswert?

Steve Korn schrieb:
> Kann den vielleicht jemand erklären? Bin bis jetzt noch nichts fündig
> geworden was DIR usw eigentlich heisst

http://www.arduino.cc/en/Reference/HomePage DIR bedeutet Direction.

von Steve K. (Firma: Schüler) (bub)


Lesenswert?

Hallo und Vielen Dank! In meinem Fall (Ramp1.4 und Nema 17) ist es 
anscheinend egal ob ich von Low-High oder High-Low stelle. Deine 
Erklärung ist die Basis für mein Projekt und ich habe 1/3 geschafft.
Zwei Dinge habe ich noch zu tun.
1. Ich kümmere mich jetzt darum, wie ich ein Sensorsignal einlesen kann 
um damit die Drehrichtung vom Schrittmotor steuern zu können.
2. Und wie man anhand vom Drehschritt die Länge der Linearbewegung 
umrechnen kann. Weil ich ja mit Hilfe vom Zahnriemen immer 40 mm 
weitertakten möchte

von Steve K. (Firma: Schüler) (bub)


Angehängte Dateien:

Lesenswert?

Hallo ich bin nun etwas weiter!

Mit folgenden Code kann ich bei der Betätigung des Schalters eine 
Bewegung erzeugen:
1
void setup() {
2
  pinMode(X_STEP_PIN  , OUTPUT);
3
  pinMode(X_DIR_PIN    , OUTPUT); 
4
}
5
6
void loop () 
7
   if((READ(X_MIN_PIN) == LOW))    
8
   {
9
      digitalWrite(X_DIR_PIN    , HIGH); 
10
      digitalWrite(X_STEP_PIN    , HIGH);
11
      delay(1);
12
      digitalWrite(X_STEP_PIN    , LOW);
13
      delay(1);
14
   }
15
}

Angeschlossen habe ich den Endschalter auf dem Ramp wie auf dem Bild.

Wenn ich nun das delay(1) auf delay(0.1) ändere, passiert leider 
garnichts mehr, und der Schrittmotor (Nema 17) beginnt zu surren.

Ich habe mit einen anderen Code getestet und da funktioniert es ohne 
Probleme:
1
if ( millis() %600000 < 30000) {
2
digitalWrite(X_DIR_PIN , HIGH);
3
}
4
else {
5
digitalWrite(X_DIR_PIN , LOW);
6
}
7
digitalWrite(X_STEP_PIN , HIGH);
8
delay(0.1);
9
digitalWrite(X_STEP_PIN , LOW);
10
delay(0.1);
11
}

kann mir jemand hier vielleicht weiterhelfen ? Ich sitze schon eine 
Ewigkeit an diesem Problem :(

LG

von Steve K. (Firma: Schüler) (bub)


Lesenswert?

Ich habe nun statt delay(0.1) diesen Teil eingefügt und es funktioniert:

1
for(int i=0; i < 50; i++)
2
  {
3
    delay(0.001);
4
  }

Das beste Beispiel für, "Mein Code funktioniert, und ich habe KEINE 
Ahnung warum"

von Walter S. (avatar)


Lesenswert?

Steve Korn schrieb:
> Wenn ich nun das delay(1) auf delay(0.1) ändere, passiert leider
> garnichts mehr, und der Schrittmotor (Nema 17) beginnt zu surren.

dann steuerst du den Motor vermutlich zu schnell an und er kann gar 
nicht  deinen Schritten zu folgen. Stichwort dazu: Rampe

ein Problem auf das du später vielleicht noch stoßen wirst:
einige Controller erwarten das nach Änderung der Richtung erst ein paar 
usec vergehen bis ein Step kommen darf

von Steve K. (Firma: Schüler) (bub)


Lesenswert?

Das dachte ich auch, es ist nur komisch dass es bei dem anderen Code

(bei diesem )
1
if ( millis() %600000 < 30000) {
2
digitalWrite(X_DIR_PIN , HIGH);
3
}
4
else {
5
digitalWrite(X_DIR_PIN , LOW);
6
}
7
digitalWrite(X_STEP_PIN , HIGH);
8
delay(0.1);
9
digitalWrite(X_STEP_PIN , LOW);
10
delay(0.1);
11
}

funktioniert

von Wolfgang (Gast)


Lesenswert?

Steve Korn schrieb:
> Wenn ich nun das delay(1) auf delay(0.1) ändere, passiert leider
> garnichts mehr, und der Schrittmotor (Nema 17) beginnt zu surren.

Dazu kann man nur sagen: "RTFM"
http://www.arduino.cc/en/Reference/Delay

Was meinst du, was gemeint ist, wenn beim Parameter angegeben ist
"ms: the number of milliseconds to pause (unsigned long)"

von Steve K. (Firma: Schüler) (bub)


Lesenswert?

Das habe ich gelesen, aber anscheinend funktioniert es ja mit 0.1 ms bei 
dem anderen code

von Wolfgang (Gast)


Lesenswert?

Steve Korn schrieb:
> Das habe ich gelesen, aber anscheinend funktioniert es ja mit 0.1 ms bei
> dem anderen code

Wie lange braucht denn
1
delay(0)
 und wie lange braucht der Rest auf deinem µC für die Ausführung?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.