Gleichstrommotor (DC-Motor) ansteuern
Ein DC Motor benötigt eine relativ hohe Stromstärke, so dass wir diese Motoren nicht direkt über die Arduino Pins betreiben können. Man verwendet daher Transistoren und eine externe Stromquelle. Die Transistoren kann man in einer H-Schaltung so anordnen, dass man die Stromrichtung durch den Motor ändern kann. Mit geänderter Stromrichtung ändert sich auch die Laufrichtung des DC Motors.
Funktionsweise H-Brücke (Bsp. L293)
Die oberen beiden PNP Transistoren der Schaltung sind, sobald die Basis mit GND verbunden ist, leitfähig. Die unteren beiden NPN-Transistoren sind leitfähig wenn die Basis mit VCC verbunden ist. Legt man nun an IN1 GND und an IN2 VCC an bewegt sich der Motor rechts herum. Schließt man hingegen an IN1 VCC und an IN2 GND an ändert sich die Stromrichtung und damit auch die Drehrichtung des Motors.
Bei der oben abgebildeten H-Brücke mit Transistoren kann es bei einer Laufrichtungsänderung des Motors (Änderung der Spannung an IN1 und IN2) kurzzeitig dazu kommen, dass beide in Reihe geschalteten Transistoren leitfähig sind (Wenn der Spannungsverlauf nicht schlagartig erfolgt kommt es im Bereich um 0,7V zu unklaren zuständen). Da dadurch die Transistoren beschädigt werden, verwendet man in einem H-Brücken Baustein wie dem hier verwendeten Model L293D komplette Transistortreiber die dies verhindern. Diese Treiber haben zusätzlich noch einen „Enable“ Eingang. Erst wenn dieser auf HIGH gesetzt wird, werden die vorher geschalteten IN1 und IN2 Eingänge auf die Ausgänge OUT1 und OUT2 durchgeschaltet. Der EN Eingang kann auch mit einem PWM Signal betrieben werden, wodurch die Ausgänge OUT1 und OUT2 ebenfalls gepulst werden und sich Motordrehzahl entsprechend der anliegenden geringeren mittleren Motorspannung reduziert.
Haben IN1 und IN2 das gleiche Potential (beiden GND oder beide VCC) steht der Motor still. Unabhängig vom Enable Eingang.
Schaltung und Programmcode
#define EN 11
#define IN1 7
#define IN2 6
// Drehrichtung cw=clockwise
const bool cw = true;
// v=velocity (150-255)
const byte v = 150;
void setup() {
pinMode(EN, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
}
void loop() {
if (cw == true){
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
} else {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
}
while(1) analogWrite(EN, v);
}