---
# System prepended metadata

title: How to connect stepper motor to Arduino?
tags: [Arduino]

---

Here’s the no-nonsense guide to wiring a [stepper motor](https://www.onzuu.com/category/stepper-motors) to an [Arduino](https://www.ampheo.com/c/development-board-arduino)—covering the three most common setups.
![arduino-stepper-motor_1](https://hackmd.io/_uploads/SkpJNiCoxg.jpg)

**0) Know your parts**

* Motor type
  * Bipolar (most NEMA-17): 4 wires (two coils).
  * Unipolar (e.g., 28BYJ-48): 5 wires + [ULN2003](https://www.onzuu.com/search/ULN2003) driver board.
* Do NOT power the motor from the Arduino 5V pin. Use a separate supply sized for the motor current.
* Always share ground between the motor power supply, driver, and Arduino.

How to find the two coils (bipolar): with a multimeter, the two wires that show continuity belong to one coil (A+ A−), the other pair is the second coil (B+ B−).

**A) Bipolar stepper + A4988 (or [DRV8825](https://www.onzuu.com/search/DRV8825)) — most common (NEMA-17)**
**1) Wiring**

**Power**

* VMOT → motor supply (e.g., 12 V)
* GND (VMOT side) → motor supply ground
* VDD → Arduino 5V
* GND (logic side) → Arduino GND (tie both grounds together!)

**Control pins**

* STEP → any Arduino digital pin (e.g., D3)
* DIR → any Arduino digital pin (e.g., D4)
* ENABLE (optional) → Arduino pin (LOW = enable). If unused, tie to GND (enabled).

**Microstepping (optional)**

* MS1, MS2, MS3 → set HIGH/LOW for 1/2/4/8/16 (A4988) or up to 1/32 (DRV8825).

**Motor coils**

* 1A/1B → Coil A (A+, A−)
* 2A/2B → Coil B (B+, B−)
(It’ll spin the wrong way if swapped—just flip DIR in code or swap a coil pair.)

**Decoupling**

* Put a 100 µF electrolytic across VMOT–GND near the driver. It matters.

**2) Set the current limit (protects the motor & driver)**

* Power the board (VMOT + logic), don’t connect the motor yet.
* Measure Vref on the driver trimpot to GND.

![企业微信截图_20250922181717](https://hackmd.io/_uploads/BkCrzsAsle.png)


(Typical R_sense = 0.05–0.1 Ω; check your module.)

* Set 𝐼𝑚𝑎𝑥≈ motor rated phase current (or a bit lower), then connect the motor.

**3) Minimal Arduino code (step/dir)**
```
const int PIN_STEP = 3;
const int PIN_DIR  = 4;
void setup() {
  pinMode(PIN_STEP, OUTPUT);
  pinMode(PIN_DIR,  OUTPUT);
  digitalWrite(PIN_DIR, HIGH); // direction
}
void loop() {
  // 200 pulses = one rev at full step for a 1.8° motor (microstepping multiplies this)
  for (int i = 0; i < 200; i++) {
    digitalWrite(PIN_STEP, HIGH);
    delayMicroseconds(800);      // step high time
    digitalWrite(PIN_STEP, LOW);
    delayMicroseconds(800);      // sets speed
  }
  delay(500);
  digitalWrite(PIN_DIR, !digitalRead(PIN_DIR)); // reverse
  delay(500);
}
```


For smooth motion and accel/decels, use AccelStepper library (non-blocking).

**Speed math:**
Steps per rev = motor_steps × microstep (e.g., 200 × 16 = 3200).
Pulse frequency (Hz) = target_RPM × steps_per_rev / 60.

**B) Bipolar stepper + TMC2208/2209 (quiet, smart drivers)**

* Wiring is similar to A4988 (STEP/DIR).
* They’re quieter (stealthChop), support UART config (2208/2209), and stallGuard (2209).
* Start in STEP/DIR mode first; add UART later for current/microstep tuning in code.

Quick wiring:

* VMOT + GND (motor PSU), 100 µF cap
* A1/A2, B1/B2 to coils
* VIO → 5V (or 3.3V on some boards)
* STEP/DIR/EN → Arduino pins
* (Optional) UART pin to an [Arduino](https://www.ampheoelec.de/c/development-board-arduino) pin via a resistor for configuration

**C) 28BYJ-48 (5-wire unipolar) + ULN2003 driver board (super cheap kit)**
**1) Wiring**

* ULN2003 IN1..IN4 → Arduino D8..D11 (for example)
* ULN2003 board +5V → external 5V (can be USB 5V if current allows)
* ULN2003 GND → Arduino GND
* 28BYJ-48 5-pin JST → ULN2003 OUT header (just plug it)

**2) Code (Arduino Stepper library)**
```
#include <Stepper.h>
const int STEPS_PER_REV = 2048; // approx for 28BYJ-48
Stepper motor(STEPS_PER_REV, 8, 10, 9, 11); // IN1, IN3, IN2, IN4

void setup() { motor.setSpeed(10); } // RPM
void loop() {
  motor.step(STEPS_PER_REV);   // one rev forward
  delay(500);
  motor.step(-STEPS_PER_REV);  // one rev back
  delay(500);
}
```


ULN2003 has built-in flyback diodes—no extra diodes needed.

**Power & protection checklist**

* Size the power supply for phase current × number of energized phases + margin.
* Heatsink the driver if you run close to rated current.
* Keep motor wires short/twisted; add bulk electrolytic + small ceramic caps near VMOT.
* Use limit switches (NC preferred) and home your axis at startup.
* If you miss steps at speed, add acceleration, increase voltage (within driver spec), and tune current/microstepping.

**Quick “what should I buy?” picks**

* General purpose NEMA-17: A4988 or DRV8825 + 12 V PSU, 100 µF cap.
* Quiet 3D-printer-style motion: TMC2209 + 24 V PSU for headroom.
* Tiny & cheap learning project: 28BYJ-48 + ULN2003 @ 5 V.