Schrittmotor ansteuern

OP (Firma: Schüler) #4111921
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 :)
(Firma: Bastler aus Mönchengladbach) Persönliche Seite #4111928
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
OP (Firma: Schüler) #4113164
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
Gast #4113218
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)
Gast #4113290
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.
OP (Firma: Schüler) #4113457
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
OP (Firma: Schüler) #4164326
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
Angehängte Dateien:
#4164340
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
OP (Firma: Schüler) #4164343
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.