Motorsteuerung mit einem H-Bridge IC

Made with Fritzing.org

Made with Fritzing.org

H-Bridge steuert einen Motor

Da eine selbst gebaute H-Bridge relativ viele Teile benötigt, bietet es sich an, einen IC zu verwenden. Gängiges Modell ist der L293D, der zwei Motoren unabhängig von einander steuern kann. Es handelt sich um einen IC im DIL16 Gehäuse, d.h. er hat 16 Beinchen.

Auf einer Platine werden die inneren Beinchen (Pin 4,5,12,13) mit dem GND verbunden und dienen der Wärmeableitung. Auf dem Breadboard muss nur eines der vier mit dem GND verbunden werden.

Im Beispiel werden zwei Motoren vom Arduino gesteuert. Der Strom kommt aus einer Batterie. Natürlich kann hier auch Netzteil verwendet werden. Wenn es sich um kleine Motoren handelt (z.B. Vibrationsmotoren), können diese auch direkt vom Arduino mit Strom versorgt werden. Hierfür muss in der Schaltung lediglich das orange Kabel an der H-Brigde mit dem 5V+ verbunden werden.

Die H-Bridge L293D hält einen kurzzeitigen Strom von 1,2 A und einen dauerhaften Storm von 600 mA pro Kanal aus.

Ein großer Vorteil der L293D sind die integrierten Dioden, die Induktionsströme abfangen, die beim Nachdrehen des Motors entstehen.

Sollten höhere Ströme erreicht werden, sollte man auf die Verwendung eines alternativen ICs zurückgreifen. Hier bietet sich z.B. der L6205N an.

Ein Beispielcode:

int motor1_A=11;
int motor1_B=10;
int motor1_Speed=9;
 
int motor2_A=5;
int motor2_B=4;
int motor2_Speed=3;
 
void setup(){
  pinMode(motor1_A,OUTPUT);
  pinMode(motor1_B,OUTPUT);
 
  pinMode(motor2_A,OUTPUT);
  pinMode(motor2_B,OUTPUT);
}
 
void loop(){
  // motor1
  for (int i=0; i>256; i+=5){
    digitalWrite(motor1_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor1_B,LOW);
    analogWrite(motor1_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  for (int i=255; i>0; i-=5){
    digitalWrite(motor1_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor1_B,LOW);
    analogWrite(motor1_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  // motor2
  for (int i=0; i<256; i+=5){
    digitalWrite(motor2_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor2_B,LOW);
    analogWrite(motor2_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  for (int i=255; i>0; i-=5){
    digitalWrite(motor2_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor2_B,LOW);
    analogWrite(motor2_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
 
  // turn vice versa
 
  // motor1
  for (int i=0; i<256; i+=5){
    digitalWrite(motor1_A,LOW); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor1_B,HIGH);
    analogWrite(motor1_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  for (int i=255; i>0; i-=5){
    digitalWrite(motor1_A,LOW); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor1_B,HIGH);
    analogWrite(motor1_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  // motor2
  for (int i=0; i<256; i+=5){
    digitalWrite(motor2_A,LOW); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor2_B,HIGH);
    analogWrite(motor2_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  for (int i=255; i>0; i-=5){
    digitalWrite(motor2_A,LOW); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor2_B,HIGH);
    analogWrite(motor2_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
}

67 Comments

  1. Das hilft schon mal etwas weiter, jedoch gibts jetzt Probleme, den wiper anzuschließen. Laut Datenblatt ist das einer der vorderen PINs, die jedoch nur 0 oder 1023 bzw 0 und 255 zurückgeben, was ja nicht Sinn der Sache ist. Das Datenblatt ist hier zu finden : http://www.reichelt.de/Schiebepotis/RSA0N11M9-LIN10K/3/index.html?;ACTION=3;LA=5;ARTICLE=73884;GROUPID=3713;artnr=RSA0N11M9-LIN10K;SID=11UOwLs38AAAIAAFoDPBY386576c6b36b4fca83731a99609e6ec8

    Der wiper ist meines Erachtens nach Terminal 2 (Seite 4/7 des pdf-Dokuments). Tut mir leid, ich bin total neu auf diesem Gebiet und hab quasi keine Ahnung von der Hardware ;( Wäre super, wenn ich da Hilfe bekommen würde :)

    LG

  2. @Kevin: Der Fader ist ja eigentlich ein Potentiometer und muss genau so angeschlossen werden, also Plus an Terminal 3, GND an Terminal 1 und der Abgriff (T2) muss mit dem Analog In verbunden werden. Dann bekommst Du beim Arduino einen Wert zwischen 0 und 1023. Liebe Grüße

  3. Hi, habe mir die benötigten Teile gekauft und wollte deine Schaltung nachbauen.
    Du schreibst: “Die äußeren Beinchen sollten mit dem 5V+ verbunden werden.” Heißt für mich: Pin 1 & Pin 16 auf +5V.
    Nach dem Schaltbild vom L293D ist Pin 1 mit “1,2EN” bezeichnet und PIN 16 mit VCC1.

    In meinen Augen müssten (zumindest nach Schaltbild) die Pins 8 & 16 mit +5V versorgt werden. Diese sind mit VCC1 und VCC2 im Schaltbild bezeichnet.

    Habe ich jetzt einen Denkfehler?!

    Gruß Micha

  4. Hi Micha, also Pin 1 ist der Enable Pin für die Schaltstufen 1 und 2, Pin 16 ist die Stromversorgung für die Logik (also hier 5V). Der Pin 9 ist der Enable für die Stufen 3 und 4. Der Pin 8 (VCC2) ist die Stromversorgung für den Motor. Kann also 5V oder mehr sein. Liebe Grüße, Stefan”

  5. Aaaah, vielen Dank für die schnelle Antwort. Fazit: Habs wie oben erklärt ausprobiert, und es hat funktioniert ;-)

  6. Hallo Stefan,

    vielen Dank für die sehr hilfreiche Seite. Die Schaltung funktioniert problemlos, allerdings hätte ich eine Frage zur Programmierung: ich möchte gerne einen Getriebemotor in die eine Richtung langsam anlaufen lassen, dann abbremsen bis zum Stop, die Richtung umkehren und dann mit dem gleichen Anfahrverhalten und abbremsen/stoppen in die andere Richtung laufen lassen. Bisher bin ich beim programmieren jedesmal gescheitert, der Motor lief nach dem Umschalten sofort los, bremste etwas ab und fuhr wieder an. Könntest Du mir vielleicht einen Tip geben wie man das programmiert?
    Vielen Dank!

    Grüsse,
    Mathias

  7. Hallo Stefan,
    vielen Dank für die schnelle Beantwortung und die Aktualisierung des Beitrages! Jetzt funktioniert die Schaltung, bzw. das Programm :-)

    Viele Grüsse,
    Mathias

  8. Kleine Korrektur: beim Motor 1 (dem oberen im Plan) müsste das grüne Kabel doch zum Output 4 (PIN 14) des L293D gehen, oder?

    Viele Grüsse,
    Mathias

  9. Hey, ich habe die Schaltung oben 1 zu 1 abgebaut, allerdings haben wir 2 6V Motoren dran und nur 4 LR6 Batterien zur Verfügung, im Moment tut sich bei uns gar nichts.
    Gibt es irgendeine Chance, es so zum laufen zu bekommen?

    Viele Grüße
    Anton

  10. Hallo Stefan,
    ich hab momentan ein Projekt, in dem ich versuche ein Auto zu steuern (sowohl Lenkung,als auch Geschwindigkeit). Jedoch will ich mein Auto anderst bauen als Sie(Steuerung seperat versuchen mit einem Servo Motor zu lenken).
    Ich hab vor den Motor ebenfalls über eine H-Bridge anzusteuern, jedoch möchte ich nur EINEN Motor benutzen, über den ich dann die Geschwindigkeit regeln kann.
    Meine Frage wäre es dann, wie eine Beispielschaltung dafür aussehen könnte ( einfach Motor 2+Kabel und Lenkung von Motor 1 weglassen), sodass dann nur noch Pin 9 benutzt wird, oder muss das anderst abgeändert werden?
    Eine ähnliche Frage stellt sich dann bei dem Programm (einfach alle Zeilen weglassen, die sich nicht auf die Geschwindigkeit des ersten Motors beziehen?).
    Vielleicht sind diese Fragen jetzt komisch formuliert und unverständlich, jedoch bin ziemlich neu in diesem Forum und weiterhin habe ich gerade erst angefangen mit Elektronik, in Form dieses Projektes, zu arbeiten. Ich hoffe, dass Sie mir bei meinem Problem weiterhelfen können, das würde mich in meinem Projekt ein großes Stück weiterbringen! :)
    Hoffe auf baldige Antwort! ;)
    LG Fadmir

  11. Hallo Stefan,

    bei mir wird der IC zu heiß, deswegen habe ich überlegt eine ähnliche Schaltung mit dem L6205N aufzubauen. Ist die Schaltung und das Programm da einfach übetragbar?

    Gruß
    Sebastian

  12. @Sebastian: Nee, leider nicht und darüber hinaus braucht die H-Bridge auch noch ein paar andere Bauteile. Findest Du aber im Datenblatt. Bestimmt gibt es aber auch noch einfachere Bausteine.

  13. Hallo,
    ich würde gerne einen DC-Motor über einen Poti in beide Richtungen steuern. Also bei Werten kleiner als Mittelstellung 512 nach links, be Werten größer als 512 nach rechts. In der Umgebung von 512 bräuchte ich wohl einen offset Bereich (vielleicht von 500 bis 524, Motor bleibt aus) wg. umgenauer Mittellage des Potis, dann sollte er aber in beiden Richtungen via Poti beschleunigt werden können.
    Gibt es so ein Programmteil für den Arduino schon?
    Oder ein Tip für die Umsetzung mit dem L293?

    Viele Grüße vom Bodensee
    Jürgen

  14. @Jürgen: Nee, den gibt es noch nicht, der kann aber nicht so schwierig sein. Irgendwie so ähnlich wie:

    value = analogRead(potPin);
    if (value>512) {
    digitalWrite(motor1_A,LOW);
    digitalWrite(motor1_B,HIGH);
    analogWrite((value-512)/2,i);
    } else {
    digitalWrite(motor1_A,HIGH);
    digitalWrite(motor1_B,LOW);
    analogWrite(value/2,i);
    }

    Ich hoffe, das hilft Dir weiter :)

  15. Hey hab ne Frage dazu..

    int motor1_A=7;
    int motor1_B=13;
    int motor1_Speed=12;

    int motor2_A=8;
    int motor2_B=9;
    int motor2_Speed=11;

    int Taster1=2; //vorwärts
    int Taster2=4; //links
    int Taster3=3; //rechts
    int Taster4=5; //rückwärts

    int zustand1;
    int zustand2;
    int zustand3;
    int zustand4;
    int zustand5;

    void setup(){
    Serial.begin(9600);
    pinMode(motor1_A,OUTPUT);
    pinMode(motor1_B,OUTPUT);

    pinMode(motor2_A,OUTPUT);
    pinMode(motor2_B,OUTPUT);

    }

    void loop(){
    // motor1

    zustand3=digitalRead (Taster3);
    if (zustand3== HIGH){
    digitalWrite(motor1_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor1_B,LOW);
    analogWrite(motor1_Speed,200); // speed counts from 0 to 255
    digitalWrite(motor2_A,LOW);
    digitalWrite(motor2_B,HIGH);
    analogWrite(motor2_Speed,200);
    }
    /*zustand=digitalRead (Taster3);

    if (zustand3== HIGH){
    digitalWrite(motor1_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor1_B,LOW);
    analogWrite(motor1_Speed,200); // speed counts from 0 to 255
    */
    // motor2
    zustand2=digitalRead (Taster2);
    if (zustand2== HIGH){
    digitalWrite(motor2_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor2_B,LOW);
    analogWrite(motor2_Speed,200); // speed counts from 0 to 255
    digitalWrite(motor1_A,LOW);
    digitalWrite(motor1_B,HIGH);
    analogWrite(motor1_Speed,200);
    }
    /*
    zustand3=digitalRead (Taster2);
    if (zustand3== HIGH){
    digitalWrite(motor2_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor2_B,LOW);
    analogWrite(motor2_Speed,200); // speed counts from 0 to 255
    }
    */

    // turn vice versa

    // motor1
    zustand1=digitalRead (Taster1);
    if (zustand1== HIGH){
    digitalWrite(motor1_A,LOW); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor1_B,HIGH);
    analogWrite(motor1_Speed,200); // speed counts from 0 to 255
    digitalWrite(motor2_A,LOW);
    digitalWrite(motor2_B,HIGH);
    analogWrite(motor2_Speed,200);
    }

    /*
    zustand3=digitalRead (Taster2);
    if (zustand3== HIGH){
    digitalWrite(motor1_A,LOW); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor1_B,HIGH);
    analogWrite(motor1_Speed,200); // speed counts from 0 to 255
    }
    */
    // motor2
    zustand4=digitalRead (Taster4);
    if (zustand4== HIGH){
    digitalWrite(motor2_A,HIGH); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor2_B,LOW);
    analogWrite(motor2_Speed,200); // speed counts from 0 to 255
    digitalWrite(motor1_A,HIGH); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor1_B,LOW);
    analogWrite(motor1_Speed,200); // speed counts from 0 to 255
    }
    /*
    zustand3=digitalRead (Taster2);
    if (zustand3== HIGH){
    digitalWrite(motor2_A,LOW); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor2_B,HIGH);
    analogWrite(motor2_Speed,200); // speed counts from 0 to 255
    }/*/

    }

    wenn ich die taster drücke, dreht der motor abgeschwächt… lass ich ihn los geht er aus
    ich will dass er wenn ich taster 3 drücke dass er rechts geht… ist da irgendein fehler?(natürlich ist was falsch aber komme nicht drauf was)

Leave a Comment.