Inhaltsverzeichnis
Arduino Schrittmotorsteuerung mit dem SparkFun EasyDriver
Für mein Super 8 Schmalfilm Scanner Projekt musste ich mit einem Arduino einen Schrittmotor ansteuern, um die Mechanik des Projektors immer um ein Einzelbild weiter / zurück zu bewegen. Um mir eine Eigenbaulösung einer Schrittmotorsteuerung zu sparen, fiel die Wahl auf den EasyDriver Schrittmotortreiber, der von SparkFun produziert wird, da er recht einfach anzusteuern ist. In Deutschland ist er u.a. bei Watterott zu bekommen. An den Schrittmotor hatte ich keine weiteren Anforderungen, ausser, dass er mit dem EasyDriver zusammenarbeiten sollte, also einen Spulenstrom von unter 750mA benötigt.
EasyDriver
Die von mir verwendete Version des EasyDriver ist v4.4. Er unterstützt Schrittmotoren, die einen maximalen Spulenstrom von 750mA benötigen. Durch die einfache Ansteuerung des Boards über den „Step“ und „Dir“ Eingang, ist die Nutzung des Treibers mit einem Arduino sehr einfach. Üblicherweise wird der Treiber mit einer Versorgungsspannung von 7-30V betrieben, wobei höhere Spannungen auch höhere Temperaturen des Treibers und des Schrittmotors im laufenden Betrieb bedeuten. In meinem Projekt verwende ich ein 12V Netzteil mit 2A.
Wichtig: Der EasyDriver unterteilt einen Einzelschritt in 8 Mikroschritte, d.h. dass bei meinem Schrittmotor mit 200 Schritten pro Umdrehung insgesamt 1600 Mikroschritte (Impulse am Step Eingang) für eine Umdrehung benötigt werden.
Schrittmotor
Technische Daten:
- Schrittwinkel: 1,8° - 200 Schritte / Umdrehung
- 2 Phasen
- Spannung: 12V
- Strom: 0.33A
- 42x42mm
- NEMA 17
EasyDriver am Arduino
Beim Anschluss an den Arduino habe ich mich ganz nach einem Tutorial auf Bildr.org gerichtet. Da noch ein Arduino Uno zur Verfügung stand und im Projektor auch noch genug Platz war, sprach nichts dagegen sich genau an die Anleitung zu halten. Selbst die Farben der Kabel meines Schrittmotors stimmen mit der Anleitung überein. Hier also der Schaltplan für die Verbindung des Arduino Uno mit dem EasyDriver und einem Schrittmotor:
In meinem Setup habe ich zusätzlich noch ein paar Stecker und Buchsen verbaut, um einfachere Kabeldurchführungen in den Projektor zu ermöglichen und um evtl. später selbst Teile einfach austauschen zu können.
Einstellung der Spulenstrombegrenzung
Die technischen Daten oben zeigen, dass mein Schrittmotor üblicherweise mit 330mA arbeitet. Wenn man ein Netzteil am EasyDriver verwendet, das auch die Spannung erzeugt, die der Schrittmotor benötigt, braucht man am EasyDriver den Ausgangsstrom für die Spulen nicht begrenzen, da der Innenwiderstand des Schrittmotors den Strom begrenzt. Verwendet man aber ein Netzteil mit einer höheren Spannung als der Schrittmotor benötigt, muss man den Strom begrenzen, damit man den Schrittmotor nicht zerstört. Zum Einstellen wird ein Multimeter mit TP1 und GND verbunden und die Spannung an diesem Punkt gemessen. 1V entspricht einer Begrenzung von 150mA und 5V einer Begrenzung von 750mA. Durch simplen Dreisatz erhält man dann den einzustellenden Spannungswert. In meinem Fall waren das 2.2V.
Ansteuerung (Quellcode)
Glücklicherweise hat Bildr zwei Routinen für den Arduino unter MIT Lizenz zur Verfügung gestellt, mit der man ganz einfach einen Schrittmotor mit dem EasyDriver ansteuern kann. Die Pins lassen sich, wie bei Arduino Sketches üblich, gleich zu Beginn festlegen, sodass man die Routinen schnell an die eigenen Bedürfnisse anpassen kann. Mit der Methode „rotateDeg“ kann man den Schrittmotor um einen zu übergebenden Winkel weiterdrehen (bspw. 90 für 90 Grad), wobei negative Winkel den Schrittmotor zurückdrehen. Mit der Methode „rotate“ kann man den Schrittmotor um die zu übergebende Anzahl an Microsteps weiterbewegen, wobei durch das Design des EasyDrivers ein Schritt des Schrittmotors 8 Microsteps sind (siehe oben). Auch hier gilt, dass negative Werte den Schrittmotor rückwärts laufen lassen.
Beiden Methoden kann man zusätzlich noch einen „Speed“ Wert mit übergeben. Dieser Wert liegt zwischen 0 und 1, wobei 1 eine schnelle Bewegung, die aber weniger kraftvoll ist, beschreibt und 0.01 der langsamste Wert, dafür aber kraftvoller, ist.
In der „loop“ Methode kann man die Verwendung der beiden Methoden sehen.
- 1
////////////////////////////////////////////////////////////////// //©2011 bildr //Released under the MIT License - Please reuse change and share //Using the easy stepper with your Arduino //use rotate and/or rotateDeg to control stepper motor //speed is any number from .01 -> 1 with 1 being fastest - //Slower Speed == Stronger movement ///////////////////////////////////////////////////////////////// #define DIR_PIN 2 #define STEP_PIN 3 void setup() { pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); } void loop(){ //rotate a specific number of degrees rotateDeg(360, 1); delay(1000); rotateDeg(-360, .1); //reverse delay(1000); //rotate a specific number of microsteps (8 microsteps per step) //a 200 step stepper would take 1600 micro steps for one full revolution rotate(1600, .5); delay(1000); rotate(-1600, .25); //reverse delay(1000); } void rotate(int steps, float speed){ //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement) //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger int dir = (steps > 0)? HIGH:LOW; steps = abs(steps); digitalWrite(DIR_PIN,dir); float usDelay = (1/speed) * 70; for(int i=0; i < steps; i++){ digitalWrite(STEP_PIN, HIGH); delayMicroseconds(usDelay); digitalWrite(STEP_PIN, LOW); delayMicroseconds(usDelay); } } void rotateDeg(float deg, float speed){ //rotate a specific number of degrees (negitive for reverse movement) //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger int dir = (deg > 0)? HIGH:LOW; digitalWrite(DIR_PIN,dir); int steps = abs(deg)*(1/0.225); float usDelay = (1/speed) * 70; for(int i=0; i < steps; i++){ digitalWrite(STEP_PIN, HIGH); delayMicroseconds(usDelay); digitalWrite(STEP_PIN, LOW); delayMicroseconds(usDelay); } }