Für kleine Hobby-Projekte, wo man von eingesetztem Motor etwas mehr Power und Geschwindigkeit erwartet, werden die
kleinen 28BYJ-48, die so gern für diverse Experimente genommen werden, wohl Platz machen müssen. In dem Beispiel kommt der ACT - Motor
16HS2404L14.5P1-X, der deutlich stärker, schneller und zuverlässiger arbeitet, zum Einsatz.
ACT MOTOR 16HS2404L14.5P1-X
Bei dem Motor handelt es sich um einen Zweiphasenmotor mit vier Anschlussleitungen. Der Schrittwinkel beträgt 1.8°,
die Stromaufnahme liegt bei 400 mA. In dem Beispiel wird der Motor mit dem Treiber DM420 angesteuert. Für die komplette Steuerung des
Motors werden dank dessen nur drei Leitungen benötigt: Freigabe, Drehrichtung, Pulse.
DM420
Der Treiber kann mit einer Spannung von 12 bis 36 VDC eingespeist werden. Auf der Anschlussseite befinden sich sieben
DIP-Schalter für diverse Einstellungen. Mit den Schaltern SW1 bis SW3 kann der Strom eingestellt werden. Mit den Schaltern SW5 bis SW7
kann die Auflösung eingestellt werden. In dem Beispiel wird der Motor mit einer Auflösung von 400 Schritten pro Umdrehung bewegt. Die
Einstellung der DIP-Schalter sieht wie folgt aus: SW5 = OFF, SW6 = ON und SW7 = ON.
Der Schaltplan
Der Schaltplan
Die Testschaltung
Testschaltung
Das Programm (Sketch)
In dem kurzen Sketch werden insgesamt zwei Taster und ein Schalter abgefragt. Mit den beiden Tastern kann man manuell den
Motor nach links bzw. nach rechts drehen lassen. Mit dem Potenziometer P1, der an den analogen Eingang A0 des Arduino angeschlossen ist,
wird die Geschwindigkeit des Motors eingestellt. Es werden bei den Einstellungen (SW5=OFF, SW6=ON, SW7=ON) für eine volle Umdrehung 400
Impulse (Eingang PUL) benötigt. Durch einen zeitlichen Abstand zwischen den einzelnen Impulsen wird die Geschwindigkeit des Motors
beeinflusst. Während des automatischen Ablaufs werden diverse Schritt-Reihenfolgen abgearbeitet. Dabei beträgt die Summe aller Schritte
pro Sequenz 400. Damit bleibt der Motor nach jeder Sequenz an der gleichen (Start-) Position stehen. Die einzelnen Sequenzen werden mit
unterschiedlichen Geschwindigkeiten absolviert.
// *****************************************************************************
// Schrittmotor - Steuerung
// ACT Motor 16HS2404L14.5P1-X / Treiber DM420
// Arduino Mega2560, IDE 1.8.13
// *****************************************************************************
int PUL = 23; // Pulse
int DIR = 25; // Drehrichtung
int ENBL = 27; // Freigabe
int Taster_Hand_Rechts = 2;
int Taster_Hand_Links = 3;
int Schalter_Automatik = 4;
int i, j;
void setup() {
pinMode (PUL, OUTPUT);
pinMode (DIR, OUTPUT);
pinMode (ENBL, OUTPUT);
pinMode (Taster_Hand_Rechts, INPUT_PULLUP);
pinMode (Taster_Hand_Links, INPUT_PULLUP);
pinMode (Schalter_Automatik, INPUT_PULLUP);
digitalWrite (ENBL, HIGH);
}
void Motor_drehen (int Schritte, int Pulslaenge, int Richtung, int Geschwindigkeit) {
if (Richtung) { digitalWrite(DIR,HIGH); }
else
{ digitalWrite(DIR,LOW); }
for (i = 0; i < Schritte; i++) {
digitalWrite(PUL,HIGH);
delayMicroseconds(Pulslaenge);
digitalWrite(PUL,LOW);
delayMicroseconds(Geschwindigkeit); }
}
void loop() {
// Automatik
if (digitalRead(Schalter_Automatik) == LOW) {
for (j = 0; j < 40; j++) {
Motor_drehen (10, 500, HIGH, 5000);
delay (500); }
delay (2000);
for (j = 0; j < 10; j++) {
Motor_drehen (40, 500, LOW, 15000);
delay (500); }
delay (2000);
for (j = 0; j < 4; j++) {
Motor_drehen (100, 500, HIGH, 500);
delay (500); }
delay (2000);
for (j = 0; j < 2; j++) {
Motor_drehen (200, 500, LOW, 10000);
delay (500); }
delay (2000);
for (j = 0; j < 10; j++) {
Motor_drehen (400, 500, HIGH, 500);
delay (500); }
delay (2000);
for (j = 0; j < 10; j++) {
Motor_drehen (400, 500, LOW, 500);
delay (500); }
delay (2000);
// Lauf mit Rampen
for (j=500; j>100; j--) {
Motor_drehen (40, j, HIGH, j); }
for (j=100; j<500; j++) {
Motor_drehen (40, j, HIGH, j); }
delay (2000);
}
int Analog = analogRead (A0); // Geschwindigkeit-Einstellung
int Tempo = Analog * 15 + 500;
// Handbetrieb Rechts
if (digitalRead(Taster_Hand_Rechts) == LOW) {
Motor_drehen (1, 500, HIGH, Tempo);
}
// Handbetrieb Links
if (digitalRead(Taster_Hand_Links) == LOW) {
Motor_drehen (1, 500, LOW, Tempo);
}
}
// *****************************************************************************