Bird
Raised Fist0
Arduinoprogramming~7 mins

Stepper motor with driver module in Arduino

Choose your learning style10 modes available
Introduction

A stepper motor lets you move things in small, exact steps. Using a driver module helps control the motor easily and safely.

When you want to turn a wheel or arm to a specific position, like in a robot.
When you need to control the speed and direction of a motor precisely.
When building a 3D printer or CNC machine that moves in exact steps.
When you want to open or close a valve or door in small controlled moves.
Syntax
Arduino
1. Connect stepper motor wires to the driver module.
2. Connect driver module pins to Arduino (power, ground, control pins).
3. Use Arduino code to send step and direction signals to the driver.

Example Arduino code structure:

const int stepsPerRevolution = 200;
const int stepPin = 8;
const int dirPin = 9;

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}

void loop() {
  // Forward full revolution
  digitalWrite(dirPin, HIGH);
  for (int i = 0; i < stepsPerRevolution; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000);
  }
  delay(1000);
  // Backward full revolution
  digitalWrite(dirPin, LOW);
  for (int i = 0; i < stepsPerRevolution; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000);
  }
  delay(1000);
}

Stepper motors move in fixed steps, so you control how many steps to turn.

The driver module handles the power and switching for the motor coils.

Examples
This example moves the motor 100 steps forward and then 100 steps back repeatedly.
Arduino
const int stepsPerRevolution = 200;
const int stepPin = 8;
const int dirPin = 9;

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}

void loop() {
  // Move half revolution forward
  digitalWrite(dirPin, HIGH);
  for (int i = 0; i < stepsPerRevolution / 2; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(500);
  }
  delay(500);
  // Move half revolution backward
  digitalWrite(dirPin, LOW);
  for (int i = 0; i < stepsPerRevolution / 2; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(500);
  }
  delay(500);
}
This example uses the AccelStepper library for smoother acceleration and deceleration with a driver module.
Arduino
#include <AccelStepper.h>

AccelStepper stepper(AccelStepper::DRIVER, 3, 4);

void setup() {
  stepper.setMaxSpeed(1000);
  stepper.setAcceleration(500);
}

void loop() {
  stepper.moveTo(200);
  stepper.runToPosition();
  delay(1000);
  stepper.moveTo(0);
  stepper.runToPosition();
  delay(1000);
}
Sample Program

This program controls a stepper motor using a driver module connected to two pins: one for step pulses and one for direction. It moves the motor 200 steps forward, waits, then 200 steps backward, and repeats.

Arduino
#include <Stepper.h>

const int stepsPerRevolution = 200;
// Pins connected to the driver module inputs
const int stepPin = 3;
const int dirPin = 4;

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("Stepper motor control start");
}

void loop() {
  // Rotate motor 200 steps forward
  digitalWrite(dirPin, HIGH); // set direction forward
  for (int i = 0; i < 200; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000);
  }
  Serial.println("Moved 200 steps forward");
  delay(1000);

  // Rotate motor 200 steps backward
  digitalWrite(dirPin, LOW); // set direction backward
  for (int i = 0; i < 200; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000);
  }
  Serial.println("Moved 200 steps backward");
  delay(1000);
}
OutputSuccess
Important Notes

Make sure your power supply matches the motor and driver requirements to avoid damage.

Use delays carefully; too fast stepping can cause the motor to miss steps.

Check wiring twice before powering up to prevent short circuits.

Summary

Stepper motors move in small, exact steps controlled by pulses.

Driver modules make controlling stepper motors easier and safer.

Arduino code sends step and direction signals to move the motor as needed.

Practice

(1/5)
1. What is the main role of a driver module when controlling a stepper motor with Arduino?
easy
A. To store the motor's position data
B. To increase the speed of the Arduino board
C. To safely provide the correct power and signals to the motor
D. To convert analog signals to digital

Solution

  1. Step 1: Understand the function of a driver module

    The driver module acts as a bridge between Arduino and the stepper motor, providing the right voltage and current safely.
  2. Step 2: Identify the correct role

    It controls power and signals to the motor, preventing damage and ensuring proper movement.
  3. Final Answer:

    To safely provide the correct power and signals to the motor -> Option C
  4. Quick Check:

    Driver module = safe power and signals [OK]
Hint: Driver modules protect motor and Arduino by controlling power [OK]
Common Mistakes:
  • Thinking driver speeds up Arduino
  • Believing driver stores position data
  • Confusing driver with signal converter
2. Which Arduino code snippet correctly sets the direction pin to HIGH for a stepper motor driver?
easy
A. digitalWrite(directionPin, low);
B. digitalWrite(directionPin, "HIGH");
C. digitalWrite(directionPin, 0);
D. digitalWrite(directionPin, HIGH);

Solution

  1. Step 1: Check correct syntax for digitalWrite

    The function digitalWrite(pin, value) expects the value to be HIGH or LOW without quotes and case-sensitive.
  2. Step 2: Identify correct usage

    digitalWrite(directionPin, HIGH); uses digitalWrite(directionPin, HIGH); which is correct syntax and case.
  3. Final Answer:

    digitalWrite(directionPin, HIGH); -> Option D
  4. Quick Check:

    digitalWrite with HIGH (uppercase, no quotes) [OK]
Hint: Use uppercase HIGH/LOW without quotes in digitalWrite [OK]
Common Mistakes:
  • Using lowercase 'low' instead of 'LOW'
  • Passing numbers instead of HIGH/LOW constants
  • Using quotes around HIGH or LOW
3. What will be the output behavior of this Arduino code controlling a stepper motor driver?
const int stepPin = 3;
const int dirPin = 4;

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  digitalWrite(dirPin, HIGH);
}

void loop() {
  digitalWrite(stepPin, HIGH);
  delay(2);
  digitalWrite(stepPin, LOW);
  delay(2);
}
medium
A. The code will cause a compile error
B. The motor will rotate continuously in one direction at a slow speed
C. The motor will not move because direction is not set
D. The motor will rotate once and stop

Solution

  1. Step 1: Analyze pin setup and direction

    Direction pin is set to HIGH once in setup, so motor direction is fixed.
  2. Step 2: Analyze loop step pulses

    Loop sends pulses to stepPin with 2ms HIGH and 2ms LOW delays, causing continuous stepping.
  3. Final Answer:

    The motor will rotate continuously in one direction at a slow speed -> Option B
  4. Quick Check:

    Continuous pulses + fixed direction = continuous rotation [OK]
Hint: Continuous step pulses with fixed direction cause continuous rotation [OK]
Common Mistakes:
  • Thinking motor moves once then stops
  • Assuming direction not set means no movement
  • Expecting compile errors from correct code
4. Identify the error in this Arduino code snippet for controlling a stepper motor driver:
int stepPin = 5;
int dirPin = 6;

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  digitalWrite(dirPin, HIGH);
}

void loop() {
  digitalWrite(stepPin, HIGH);
  delay(1);
  digitalWrite(stepPin, HIGH);
  delay(1);
}
medium
A. The stepPin is never set to LOW, so no step pulse is generated
B. The direction pin is not set as input
C. The delay time is too short to move the motor
D. The pinMode calls are missing

Solution

  1. Step 1: Check step pulse signal

    Step pulses require a HIGH then LOW transition to trigger a step.
  2. Step 2: Identify missing LOW signal

    Code sets stepPin HIGH twice without setting it LOW in between, so no pulse occurs.
  3. Final Answer:

    The stepPin is never set to LOW, so no step pulse is generated -> Option A
  4. Quick Check:

    Step pulse = HIGH then LOW [OK]
Hint: Step pulse needs HIGH then LOW transition [OK]
Common Mistakes:
  • Forgetting to set stepPin LOW after HIGH
  • Confusing direction pin mode
  • Assuming short delay fixes pulse issue
5. You want to rotate a stepper motor exactly 200 steps clockwise, then 200 steps counterclockwise using a driver module. Which Arduino code snippet correctly achieves this?
hard
A. for(int i=0; i<200; i++) { digitalWrite(dirPin, HIGH); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); } for(int i=0; i<200; i++) { digitalWrite(dirPin, LOW); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); }
B. digitalWrite(dirPin, HIGH); for(int i=0; i<=200; i++) { digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); } digitalWrite(dirPin, LOW); for(int i=0; i<=200; i++) { digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); }
C. for(int i=0; i<200; i++) { digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); } digitalWrite(dirPin, HIGH); for(int i=0; i<200; i++) { digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); }
D. digitalWrite(dirPin, HIGH); digitalWrite(stepPin, HIGH); delay(200); digitalWrite(stepPin, LOW); delay(200); digitalWrite(dirPin, LOW); digitalWrite(stepPin, HIGH); delay(200); digitalWrite(stepPin, LOW); delay(200);

Solution

  1. Step 1: Set direction before stepping

    Each loop sets direction pin before sending step pulses to control rotation direction.
  2. Step 2: Send exact number of step pulses

    Each for loop sends 200 pulses with HIGH then LOW signals and delays for timing.
  3. Step 3: Verify code correctness

    for(int i=0; i<200; i++) { digitalWrite(dirPin, HIGH); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); } for(int i=0; i<200; i++) { digitalWrite(dirPin, LOW); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); } correctly sets direction inside each loop and sends 200 pulses per direction.
  4. Final Answer:

    for(int i=0; i<200; i++) { digitalWrite(dirPin, HIGH); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); } for(int i=0; i<200; i++) { digitalWrite(dirPin, LOW); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); } -> Option A
  5. Quick Check:

    Set direction before stepping, send 200 pulses each way [OK]
Hint: Set direction before loop, pulse stepPin HIGH then LOW 200 times [OK]
Common Mistakes:
  • Setting direction inside step pulse loop incorrectly
  • Using delay as step count instead of pulse count
  • Not toggling stepPin LOW after HIGH
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard