# Hackers – Controlling Motors with an Arduino and H-Bridge

Previously in Hackers we have studied how transistors work, and made a transistor-based circuit to control a motor from an Arduino: Hackers – a Joule Thief and Controlling Motors.

When you write to a pin on the Arduino, it outputs a voltage. However, you can’t use this directly to drive an electric motor, because they require too much current, and it would damage the Arduino. The solution is to use a 6V battery as an external power supply, and connect it to the motor via a transistor circuit. When you apply a signal with small current to the middle leg of the transistor, a much larger current can flow from the battery to the motor.

While this works, a more elaborate circuit is needed if you want to be able to control two motors, and make them go backwards and forwards. This circuit is called a Dual H-Bridge. The Wikipedia page has technical details: https://en.wikipedia.org/wiki/H_bridge

We are using a pre-built integrated circuit for our H-Bridge, as they are low-cost, small, and work well. Here is the one we are using:

It has several connectors:

• [+] and [-] are where the external battery is connected
• [IN1] and [IN2] control Motor A (details below)
• [IN3] and [IN4] control Motor B
• [Motor A] and [Motor B] each have two pins that are connected directly to motors

To control Motor A, connect [IN1] and [IN2] to two pins of the Arduino, such as 6 and 7:

• [IN1] HIGH and [IN2] LOW: Motor A goes forward full speed
• [IN1] LOW and [IN2] HIGH: Motor A goes backward full speed
• Both LOW: Motor A does not turn (no power, it coasts)
• Both HIGH: Motor A does not turn (is braked)
• To control speed, use a value for the pins connected to [IN1] or [IN2] in the range 0-255 (0=LOW, 255=HIGH)

Here is Arduino code to control a motor with a H-Bridge, written by Luke, one of our Hackers:

```// Luke Madden, CoderDojo Athenry
// Control motors using a H Bridge

// The H bridge has 4 input pins: in1-in4
#define in1 6
#define in2 7

int fast = 100;// range 1-255
int slow = 50;// slower speed
int hyperspeed = 255;// hits the hyperdrive

void setup() {
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
Serial.begin(9600);
}

void loop() {
drive();
}

void drive() {
// Test the functions
Serial.println("move forward");
forward();
delay(2000);

Serial.println("hit the hyperdrive");
hyperdrive();
delay(2000);

Serial.println("go backwards");
backwards();
delay(2000);
}

void forward() {
//makes motor go forwards
analogWrite(in1, fast);
analogWrite(in2, 0);
}

void hyperdrive() {
//hits the hyperdrive
analogWrite(in1, hyperspeed);
analogWrite(in2, 0);
}

void backwards() {
//makes motor go backwards
analogWrite(in1, 0);
analogWrite(in2, slow);
}

void stopping(){
//makes it stop
analogWrite(in1, 0);
analogWrite(in2, 0);
}
```