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); }