zurück zur Übersicht...
16.02.2019

Schrittmotor 28BYJ-48 mit Treibermodul ULN2003

Schrittmotor 28BYJ-48 mit Treibermodul ULN2003

Bei diesem Motor kann es vorkommen, dass die Übersetzung nicht exakt ist, d.h. sie sollte eigentlich 1:64 sein, ist aber meist ein Bruchteil darunter (z.B. 1:63,68395). Damit ergibt sich in diesem Beispiel, dass nicht 4096 Schritte pro Umdrehung nötig sind, sondern nur 4075,772. Für viele Anwendungen ist das wohl egal, aber wenn der Motor fortlaufend in eine Richtung drehen soll (z.B. als Sekundenzeiger einer Uhr), muss dieser Umstand berücksichtigt werden.

Anschlüsse

Anschlüsse des Schrittmotors 28BYJ-48
Abb.: Anschlüsse des Schrittmotors 28BYJ-48
Anschlüsse des Treibermoduls ULN2003
Abb.: Anschlüsse des Treibermoduls ULN2003
Anschluss am Arduino
Abb.: Anschluss am Arduino

Anschluss des Treibermoduls am Arduino

Im Folgenden habe ich die digitalen Pins 8..11 des Arduino zum Anschluss des Motortreibers verwendet. Für Versuche reicht die Strom-Versorgung aus dem USB-Port (5V). Für echte Anwendungen sollte eine externe Stromquelle verwendet werden, damit der Arduino keinen Schaden nimmt.
Der Jumper auf dem Motortreiber (rechts neben dem VCC-Pin) muss gesteckt bleiben. Durch Entfernen dieses Jumpers wird die Stromversorgung zum Motor unterbrochen.

Pin (ULN2003) Pin (Arduino)
IN1 8
IN2 9
IN3 10
IN4 11
IN5 -
IN6 -
IN7 -
Vcc (+5..12V) 5V
GND (-5..12V) GND

Verwendete Bauteile

Betrieb ohne externe Library

Laut Datenblatt soll der Motor in folgender Sequenz angesteuert werden:

In 1 In 2 In 3 In 4
0 0 0 1
0 0 1 1
0 0 1 0
0 1 1 0
0 1 0 0
1 1 0 0
1 0 0 0
1 0 0 1
#define PIN_IN1 8  // blue
#define PIN_IN2 9  // pink
#define PIN_IN3 10 // yellow
#define PIN_IN4 11 // orange
                   // red (VCC)

unsigned int lowSpeed  = 10000; // max: 16000
unsigned int highSpeed =  1000;

void setup()
{
    pinMode(PIN_IN1, OUTPUT);
    pinMode(PIN_IN2, OUTPUT);
    pinMode(PIN_IN3, OUTPUT);
    pinMode(PIN_IN4, OUTPUT);
}

void loop()
{
    unsigned long n = millis() / 3000; // 3 seconds

    switch(n % 8) {
        case 0: stopMotor();            break;
        case 1: rotateRight(lowSpeed);  break;
        case 2: stopMotor();            break;
        case 3: rotateLeft(lowSpeed);   break;
        case 4: stopMotor();            break;
        case 5: rotateRight(highSpeed); break;
        case 6: stopMotor();            break;
        case 7: rotateLeft(highSpeed);  break;
    }
}

void rotateRight(unsigned int motorSpeed)
{
    // 1
    digitalWrite(PIN_IN4, HIGH);
    digitalWrite(PIN_IN3, LOW);
    digitalWrite(PIN_IN2, LOW);
    digitalWrite(PIN_IN1, LOW);
    delayMicroseconds(motorSpeed);

    // 2
    digitalWrite(PIN_IN4, HIGH);
    digitalWrite(PIN_IN3, HIGH);
    digitalWrite(PIN_IN2, LOW);
    digitalWrite(PIN_IN1, LOW);
    delayMicroseconds(motorSpeed);

    // 3
    digitalWrite(PIN_IN4, LOW);
    digitalWrite(PIN_IN3, HIGH);
    digitalWrite(PIN_IN2, LOW);
    digitalWrite(PIN_IN1, LOW);
    delayMicroseconds(motorSpeed);

    // 4
    digitalWrite(PIN_IN4, LOW);
    digitalWrite(PIN_IN3, HIGH);
    digitalWrite(PIN_IN2, HIGH);
    digitalWrite(PIN_IN1, LOW);
    delayMicroseconds(motorSpeed);

    // 5
    digitalWrite(PIN_IN4, LOW);
    digitalWrite(PIN_IN3, LOW);
    digitalWrite(PIN_IN2, HIGH);
    digitalWrite(PIN_IN1, LOW);
    delayMicroseconds(motorSpeed);

    // 6
    digitalWrite(PIN_IN4, LOW);
    digitalWrite(PIN_IN3, LOW);
    digitalWrite(PIN_IN2, HIGH);
    digitalWrite(PIN_IN1, HIGH);
    delayMicroseconds(motorSpeed);

    // 7
    digitalWrite(PIN_IN4, LOW);
    digitalWrite(PIN_IN3, LOW);
    digitalWrite(PIN_IN2, LOW);
    digitalWrite(PIN_IN1, HIGH);
    delayMicroseconds(motorSpeed);

    // 8
    digitalWrite(PIN_IN4, HIGH);
    digitalWrite(PIN_IN3, LOW);
    digitalWrite(PIN_IN2, LOW);
    digitalWrite(PIN_IN1, HIGH);
    delayMicroseconds(motorSpeed);
}

void rotateLeft(unsigned int motorSpeed)
{
    // 1
    digitalWrite(PIN_IN1, HIGH);
    digitalWrite(PIN_IN2, LOW);
    digitalWrite(PIN_IN3, LOW);
    digitalWrite(PIN_IN4, LOW);
    delayMicroseconds(motorSpeed);

    // 2
    digitalWrite(PIN_IN1, HIGH);
    digitalWrite(PIN_IN2, HIGH);
    digitalWrite(PIN_IN3, LOW);
    digitalWrite(PIN_IN4, LOW);
    delayMicroseconds(motorSpeed);

    // 3
    digitalWrite(PIN_IN1, LOW);
    digitalWrite(PIN_IN2, HIGH);
    digitalWrite(PIN_IN3, LOW);
    digitalWrite(PIN_IN4, LOW);
    delayMicroseconds(motorSpeed);

    // 4
    digitalWrite(PIN_IN1, LOW);
    digitalWrite(PIN_IN2, HIGH);
    digitalWrite(PIN_IN3, HIGH);
    digitalWrite(PIN_IN4, LOW);
    delayMicroseconds(motorSpeed);

    // 5
    digitalWrite(PIN_IN1, LOW);
    digitalWrite(PIN_IN2, LOW);
    digitalWrite(PIN_IN3, HIGH);
    digitalWrite(PIN_IN4, LOW);
    delayMicroseconds(motorSpeed);

    // 6
    digitalWrite(PIN_IN1, LOW);
    digitalWrite(PIN_IN2, LOW);
    digitalWrite(PIN_IN3, HIGH);
    digitalWrite(PIN_IN4, HIGH);
    delayMicroseconds(motorSpeed);

    // 7
    digitalWrite(PIN_IN1, LOW);
    digitalWrite(PIN_IN2, LOW);
    digitalWrite(PIN_IN3, LOW);
    digitalWrite(PIN_IN4, HIGH);
    delayMicroseconds(motorSpeed);

    // 8
    digitalWrite(PIN_IN1, HIGH);
    digitalWrite(PIN_IN2, LOW);
    digitalWrite(PIN_IN3, LOW);
    digitalWrite(PIN_IN4, HIGH);
    delayMicroseconds(motorSpeed);
}

void stopMotor()
{
    digitalWrite(PIN_IN4, LOW);
    digitalWrite(PIN_IN3, LOW);
    digitalWrite(PIN_IN2, LOW);
    digitalWrite(PIN_IN1, LOW);
}

Test mit Library Stepper.h

Das folgende Experiment verwendet die Library Stepper.h und soll den Schrittmotor jeweils um 360° nach links und rechts drehen.
Stellenweise hakte der Motor ein wenig, aber die Drehung wurde durchgeführt.

#include <Stepper.h>

// number of steps in one revolution of your motor
#define STEPS 2038

// set the speed in rpm
#define MOTOR_RPM 6

Stepper stepper(STEPS, 8, 10, 9, 11);

void setup()
{
}

void loop()
{
    stepper.setSpeed(MOTOR_RPM);
    stepper.step(STEPS);
    delay(1000);

    stepper.setSpeed(MOTOR_RPM);
    stepper.step(-STEPS);
}

Test mit Library CheapStepper.h

Das folgende Experiment verwendet die Library CheapStepper.h und soll den Schrittmotor jeweils um 360° nach links und rechts drehen.
Das Resultat war sehr gut und die Drehung flüssig!

#include <CheapStepper.h>

CheapStepper stepper (8, 9, 10, 11);

// let's create a boolean variable to save the direction of our rotation
boolean moveClockwise = true;

void setup()
{
}

void loop()
{
    // move a full rotation (4096 mini-steps)
    for (int s=0; s<4096; s++){
        stepper.step(moveClockwise);
    }

    delay(1000);
    moveClockwise = !moveClockwise;
}