Lab: DC Motor Control Using an H-Bridge
In this lab I learned to control the functions of a DC motor through a motor driver board that handles power functions for the motor and communicates with an Arduino.
The motor controller on hand was a A4988 Stepper Motor Driver Carrier from Pololu. The A4988 board pinout and basic wiring diagram here:
My setup with the Arduino Mega and a 12-volt DC computer fan looked like this:
While the motor controller was designed for a stepper motor, which has two separate coils, the DC motor I was using only had one so I only need to wire up the “A” motor pins.
Next I added a switch to the circuit that would be read by the Arduino Mega to then set the DC motor to ON or OFF.
Using a tutorial from MarkerGuides.com as a starting point I revised their Arduino sketch into the code below and was able to turn the DC fan motor ON and OFF. I a not entirely sure why but it was necessary toggle the digitalWrite() for the motor driver pin multiple times in the code to set the state to ON or OFF.
/*Example sketch to control a stepper motor with A4988 stepper motor driver and Arduino without a library. More info: https://www.makerguides.com */
// Define stepper motor connections and steps per revolution:
#define dirPin 2
#define stepPin 3
#define switchPin 4
#define stepsPerRevolution 200
int switchState = LOW;
void setup() {
// configure the serial connection:
Serial.begin(9600);
// Declare pins as output:
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(switchPin, INPUT);
}
void loop() {
// if the switch is high, motor will turn on one direction:
if (digitalRead(switchPin) == HIGH && switchState == LOW) {
digitalWrite(stepPin, LOW); // set motor driver high
digitalWrite(stepPin, HIGH); // set motor driver high
digitalWrite(stepPin, LOW); // set motor driver low
digitalWrite(stepPin, HIGH); // set motor driver high
Serial.println("HIGH");
switchState = HIGH;
}
// if the switch is low, motor will turn in the other direction:
else if(digitalRead(switchPin) == LOW && switchState == HIGH) {
digitalWrite(stepPin, LOW); // set motor driver low
digitalWrite(stepPin, HIGH); // set motor driver high
digitalWrite(stepPin, LOW); // set motor driver high
digitalWrite(stepPin, HIGH); // set motor driver high
Serial.println("LOW");
switchState = LOW;
}
delay(10);
}



