A Simple Dual H-Bridge

H-bridge is frequently used to control DC motors and stepper motors. When controlling a bipolar stepper motor, two full H-bridges are needed. There are many H-bridge ICs (like L298, MPC17529 and SN754410 which is a quad half H-bridge) for just that purpose. But if you are on a budget, you may want to consider building a dual H-bridge yourself.

The following schematic shows a simple dual H-bridge using eight general purpose transistors (2N3904 and 2N3906). Given the maximum Iceo of roughly 200mA, this circuit can be used to drive a small bipolar stepper motor operating between 5V and 12V, such as the stepper motors found in most floppy drives and CD/DVD drives.

A Dual H-bridge

A Dual H-bridge

The four control inputs (1,2,3,4) can be driven with Arduino‘s digital pins (i.e. 2,3,4,5) directly. The following program illustrates how to signal the four leads of a bipolar stepper motor for it to rotate. Of course, there’s already a stepper motor library built for this purpose. The program below is helpful when learning the sequence of the pulses required by bipolar stepper motors.

int coila1 = 2;
int coila2 = 3;
int coilb1 = 4;
int coilb2 = 5;

void setup()
{
  pinMode(coila1, OUTPUT);
  pinMode(coila2, OUTPUT);
  pinMode(coilb1, OUTPUT);
  pinMode(coilb2, OUTPUT);
}

void loop()
{
  digitalWrite(coila1, HIGH);
  digitalWrite(coila2, LOW);
  digitalWrite(coilb1, LOW);
  digitalWrite(coilb2, LOW);
  delay(10);

  digitalWrite(coila1, LOW);
  digitalWrite(coila2, LOW);
  digitalWrite(coilb1, HIGH);
  digitalWrite(coilb2, LOW);
  delay(01);

  digitalWrite(coila1, LOW);
  digitalWrite(coila2, HIGH);
  digitalWrite(coilb1, LOW);
  digitalWrite(coilb2, LOW);
  delay(10);

  digitalWrite(coila1, LOW);
  digitalWrite(coila2, LOW);
  digitalWrite(coilb1, LOW);
  digitalWrite(coilb2, HIGH);
  delay(10);  
}

Here is a picture of an Arduino controlled CD-ROM stepper motor (the one controlling the tray mechanism) powered by the above dual H-bridge (with an added LED for power).

A CD-ROM stepper motor driven by Arduino

A CD-ROM stepper motor driven by Arduino

Update

The PNP transistors in the original schematics had C and E swapped. This has been corrected with the latest schematics update.

Be Sociable, Share!

7 Comments

  1. wojtek says:

    HI man if there is any chance if you could help me, i followed your steps regarding the controlling a stepper motor form cd rom, but im not using arduine but Usb1208fs with matlab, and it starts moving but just for the 3 first steps and then it just stops even that while loop still is under execution
    code for matlab
    clear
    clc
    out=daqhwinfo();
    dio=digitalio(‘mcc’,0);
    set(dio);
    addline(dio,0:7,0,’out’,{‘Output Line Port A’});
    addline(dio,0:7,1,’out’,{‘Output Line Port A’});
    dio;
    count=10;

    k=0.1;
    pause(k)

    while count>=1

    putvalue(dio.Line(1:8),[1 0 0 0 0 0 0 0]);%1
    pause(k)
    putvalue(dio.Line(1:8),[0 1 0 0 0 0 0 0]);%2
    pause(k)
    putvalue(dio.Line(1:8),[0 0 1 0 0 0 0 0]);%3
    pause(k)
    putvalue(dio.Line(1:8),[0 0 0 1 0 1 0 0]);%4
    pause(k)

    count=count-1;
    end
    putvalue(dio.Line(1:8),[0 0 0 0 0 0 0 0]);
    delete(dio);
    clear

  2. wojtek says:

    I send the wrong sequence this is the correct one

    while count>=1

    putvalue(dio.Line(1:8),[1 0 0 0 0 0 0 0]);%1
    pause(k)
    putvalue(dio.Line(1:8),[0 0 1 0 0 0 0 0]);%2
    pause(k)
    putvalue(dio.Line(1:8),[0 1 0 0 0 0 0 0]);%3
    pause(k)
    putvalue(dio.Line(1:8),[0 0 0 1 0 1 0 0]);%4
    pause(k)

    count=count-1;
    end

    • kwong says:

      How long do you pause between each stepping? If you put your fingers on the shaft, you should be able to feel vibration if the stepping sequence is wrong. Otherwise, you might want to increase the delay a little bit and see if it helps.

      I’d check the stepping sequence first.

  3. wojtek says:

    the stepping sequence is the same as yours (as u can see in the correct sequence(posted)), what is quite funny after placing the motor back to the cd-rom housing it start giving me a better response sometimes it was even menage to do around 10 steps, like it need some sort of resistance force on the shaft. Another thing, do you think by soldering cables on the motor coils I could brake the connections, because my one have like thin bus tape connected to the motor coils and what i did i just soldered another cables on top of them to connect my motor to the board.

  4. benmalartre says:

    hello kerry
    it looks like ther is an issue with the circuit
    when both input are set to LOW
    there is a short circuit and I burned one of the NPN transistor
    I’m a beginner in electronic but I would say this is the result of a short circuit…

    I’ve found a working circuit there(at least for the project I’m working on…)
    http://www.talkingelectronics.com/projects/SpotMistakes/SpotMistakesP11.html

    kind regards, ben

  5. Jarvis says:

    Thanks for the diagram of H-Bridge

  6. jessica says:

    hi. can i ask if this circuit would be compatible also with my stepper motor Nema 17?(4500gm-cm)3.6v,1.2mA??

Leave a Reply