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.
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) |
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 |
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