Darlington-Transistor Array ULN2003

Darlington-Transistor Array ULN2003

Spezifikationen

Der ULN2003 für eine Vielzahl von Anwendungen verwendet werden, z.B. Betrieb von Schritt- und Gleichstrommotoren, Lampen/Leuchten (LED, Entladungslampen). Er besteht aus 7 Kanälen mit NPN-Darlington-Transistoren und Freilaufdioden, die den Betrieb von induktiven Lasten ermöglichen. An jedem Eingang (Basis des Transistors) hängt ein 2,7kΩ-Widerstand, der es ermöglicht, direkt mit 5V-Logik betrieben zu werden, z.B. von den Ausgängen eines Arduinos.

Oft kann man den ULN2003 als Modul z.B. in Kombination eines Schrittmotors 28BYJ-48 mit Treibermodul finden. Hier wollen wir jedoch nur den Chip separat über den Arduino ansteuern.

Verwendete Bauteile

Anschlüsse

Anschlüsse des ULN2003
Pin-Name Pin-Nr. Typ Beschreibung
COM 9 - Gemeinsame Kathode für Flyback-Dioden (erforderlich für induktive Lasten, z.B. Motoren)
E 8 - Gemeinsamer Emitter für alle Kanäle (normalerweise an GND angeschlossen)
1B, 2B, 3B, 4B, 5B, 6B, 7B 1, 2, 3, 4, 5, 6, 7 Input Eingänge für Kanal 1 bis 7 (Basis der Darlington-Transistoren)
1C, 2C, 3C, 4C, 5C, 6C, 7C 16, 15, 14, 13, 12, 11, 10 Output Ausgänge für Kanal 1 bis 7 (Kollektor der Darlington-Transistoren)

Verbinden mit dem Arduino

Der Arduino wird nur zum Programmieren an den PC angeschlossen und zum Betrieb des Schrittmotors dann an eine externe 5V-Stromquelle (hier ein 18650-Lithium-Akku). Diese externe Stromquelle ist wichtig, damit der Arduino keinen Schaden nimmt, denn beim Drehen des Schrittmotors fließen ca. 200mA.

ULN2003 Arduino
E GND
COM Vin
1B 8
2B 9
3B 10
4B 11

Sketch

Der folgenden Sketch soll den Schrittmotor testen, indem er im 3-Sekunden-Interval den Motor zunächst stoppt, dann nach recht rotieren lässt, dann wieder stoppt und schließlich links herum rotieren läßt.

#define PIN_IN1 8  // blue
#define PIN_IN2 9  // pink
#define PIN_IN3 10 // yellow
#define PIN_IN4 11 // orange

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 % 4) {
        case 0: stopMotor();       break;
        case 1: rotateRight(1000); break;
        case 2: stopMotor();       break;
        case 3: rotateLeft(1000);   break;
    }
}

void rotateRight(unsigned int motorSpeed)
{
    setMotor(LOW, LOW, LOW, HIGH, motorSpeed);
    setMotor(LOW, LOW, HIGH, HIGH, motorSpeed);
    setMotor(LOW, LOW, HIGH, LOW, motorSpeed);
    setMotor(LOW, HIGH, HIGH, LOW, motorSpeed);
    setMotor(LOW, HIGH, LOW, LOW, motorSpeed);
    setMotor(HIGH, HIGH, LOW, LOW, motorSpeed);
    setMotor(HIGH, LOW, LOW, LOW, motorSpeed);
    setMotor(HIGH, LOW, LOW, HIGH, motorSpeed);
}

void rotateLeft(unsigned int motorSpeed)
{
    setMotor(HIGH, LOW, LOW, LOW, motorSpeed);
    setMotor(HIGH, HIGH, LOW, LOW, motorSpeed);
    setMotor(LOW, HIGH, LOW, LOW, motorSpeed);
    setMotor(LOW, HIGH, HIGH, LOW, motorSpeed);
    setMotor(LOW, LOW, HIGH, LOW, motorSpeed);
    setMotor(LOW, LOW, HIGH, HIGH, motorSpeed);
    setMotor(LOW, LOW, LOW, HIGH, motorSpeed);
    setMotor(HIGH, LOW, LOW, HIGH, motorSpeed);
}

void stopMotor()
{
    setMotor(LOW, LOW, LOW, LOW, 0);
}

void setMotor(byte in1, byte in2, byte in3, byte in4, unsigned int motorSpeed)
{
    digitalWrite(PIN_IN1, in1);
    digitalWrite(PIN_IN2, in2);
    digitalWrite(PIN_IN3, in3);
    digitalWrite(PIN_IN4, in4);
    delayMicroseconds(motorSpeed);
}
zurück