Arduino UNO und A4988

Beim Umbau meines 3D-Druckers sind ein paar Schrittmotor-Treiber übergeblieben, die hab ich jetzt erstmal am Arduino UNO angeschlossen um mich ein bisschen damit zu spielen. Unglaublich wie einfach das Ganze ist, wenn man erstmal einen Anfang gefunden hat. Genau den möchte ich euch hier geben.

Die benötigte, bzw. von mit verwendete, Hardware ist also:

Ich gehe davon aus dass ihr prinzipiell wisst wie man mit dem Arduino umgeht.

Allgemeines PinOut des A4988

Wie ihr seht gibt es 2 mal 8 Pins, diese sind:

  1. ¬EN: (not) Enable
  2. MS1: Microstep-Setings 1
  3. MS2: Microstep-Setings 2
  4. MS3: Microstep-Setings 3
  5. ¬RST: (not) Reset
  6. ¬SLP: (not) Sleep
  7. STP: Step
  8. DIR: Direction
  9. VMOT: Voltage Motor (im Schaltplan VMM)
  10. GND: Ground (Motor)
  11. 2B: Spule 2, Anschluss B
  12. 2A: Spule 2, Anschluss A
  13. 1A: Spule 1, Anschluss A
  14. 1B: Spule 1, Anschluss B
  15. VDD: Voltage Circuit
  16. GND: Ground Circuit

Hier noch ein kleiner Schaltplan damit ihr wisst wie die Pins intern mit dem IC verdrahtet sind

Auf die Funktion der einzelnen Pins möchte ich anhand eines konkreten (und einfach nachzubauenden) Beispiels näher eingehen, beginnen wir mit einer relativ minimalen Belegung.

Minimaler Anschluss

Die folgende Grafik wurde mit Fritzing erstellt und zeigt eine minimale Anschlussbelegung

Die rechte Seite des Anschlusses ist wohl relativ selbst erklärend, der A4988 braucht eine Spannungsversorgung für den Motor (VMOT, GND) und eine für Bauteile auf der Platine (VDD, GND). Für letzere (oder "zweitere" - interessantes Wort!) bietet sich die vom Arduino an, außerdem muss GND sowieso mit dem Arduino verbunden sein). Die restlichen Anschlüsse gehen zu den Spulen des (bipolaren) Schrittmotors, wenn ihr nicht wisst welche Anschlüsse zu welcher Spule gehört, so könnt ihr einfach den Widerstand zwischen jeweils zwei Leitungen messen. Die Anschlüsse mit einem Widerstand gegen Null gehören zusammen und müssen dann auch bei 1A und 1B bzw. 2A und 2B angeschlossen werden.

Links belegen wir bei diesem minimalen Anschluss nur vier der acht Pins. Zu den Funktionen dieser und den Sinn der gegebenen Verdrahtung möchte ich hier nun ein paar Worte verlieren:

STP (Step) ist jener Anschluss der dem Treiber den Befehl gibt er solle doch bitte den angeschlossenen Motor um einen Schritt weiterbewegen (und zwar immer dann wenn eine steigende Flanke ankommt, d.h. ein Wechsel von LOW zu HIGH stattfindet), DIR zeigt dabei die Richtung an, in die der Schrittmotor für diesen Schritt bewegt werden soll. Beides (STP und DIR) können wir direkt mit dem Arduino verbinden.

Weiterhin sind ¬RST und ¬SLP verbunden, was hat denn das für einen Sinn? Zuerst einmal sei gesagt, dass bei einem logischen LOW-Pegel an SLP, sich die Treiber in einen Stromsparmodus begeben, in der Regel ist das natürlich nicht gewollt. Deswegen wird auf dem A4988 mittels PullUp-Widerstand der Pegel immer auf HIGH gezogen. Kurz: Wenn wir es nicht ausdrücklich ändern, befindet sich der Treiber also nicht im Schlafzustand.

Der entscheidende PullUp-Widerstand ist hier verdeutlicht.

Wenn wir nun also ¬RST mit ¬SLP verbinden, so hängt auch ¬RST am PullUp-Widerstand und wird dauerhaft auf HIGH gezogen. Und wieso ist das notwendig? Was macht dieser ¬RESET bei HIGH denn? Ganz einfach: solange ¬RESET nicht auf HIGH ist, werden alle Signale die am STP-Eingang (also dem Eingang der den Motor weiterdreht) ankommen, einfach ignoriert.

Der Code auf dem Arduinio könnte nun folgendermaßen aussehen:

int x;
int steps;
int waitms;

const int STP=4;
const int DIR=3;

void setup() {
  pinMode(STP,OUTPUT); // Step
  pinMode(DIR,OUTPUT); // DIR
}

void loop() {

  waitms = 500; // Wie schnell soll sich der Motor drehen? Umso kürzer die Wartezeit, umso schneller dreht sich der Motor.
  steps = 200;  // Anzahl der Schritte die gemacht werden sollen, 200 entsprechend bei einem Schrittmotor mit 1.8° einer vollen Umdrehung
  
  digitalWrite(STP, LOW);
  digitalWrite(DIR, HIGH);
    
  for(x = 0; x < steps; x++){
    delayMicroseconds(waitms);
    digitalWrite(STP, HIGH);    // LOW->HIGH führt den Schritt aus...
    delayMicroseconds(waitms);
    digitalWrite(STP, LOW);     // ...und wieder auf LOW um wieder eine steigende Flanke generieren zu können
  }

  exit(0);  // Loop nur einmal durchlaufen

}

Erweiterter Anschluss

todo: MS1-3 mit Jumper oder direkt, EN, RST mit Pulldown (von EN) als Unterbrechung während des Starts.

Quellen