TMC2209 Stepper Driver with an Arduino Uno

The TMC2209 is a silent StealthChop2 microstepping driver for bipolar stepper motors, controlled by STEP/DIR or single-wire UART.

TMC2209 Stepper Driver, The TMC2209 is a silent StealthChop2 microstepping driver for bipolar stepper motors, controlled by STEP/DIR or single-wire UART.
In short

The TMC2209's logic supply VIO takes 3.0 V to 5.25 V, so on an Arduino Uno it runs from the 5V pin and STEP, DIR and EN connect straight to D2, D3 and D4 with no resistors. Left in standalone mode at its 1/8 microstep default, it needs 1,600 steps per revolution of a 200-step motor, which is where the Uno's step rate matters.

Wiring the TMC2209 Stepper Driver to the Arduino Uno

Pin by pin.

TMC2209 Stepper DriverArduino Uno
STEPD2
DIRD3
END4
VIO5V
GND_LOGICGND
GND_MOTGND

What to know on the Arduino Uno

  • VIO on the Uno's 5V sits inside the driver's 3.0 V to 5.25 V logic range; the motor runs from VM, 4.75 V to 29 V, from its own supply with at least 100 µF across it and its ground joined to the Uno's.TMC2209 datasheet rev 1.08, pp. 1, 11
  • At 1/8 microstepping AccelStepper's ceiling of about 4000 steps per second on the Uno means about 2.5 revolutions per second; at 1/64 it is about 0.3. The sketch's setMaxSpeed(1200) stays well inside that.AccelStepper library documentation; TMC2209 datasheet rev 1.08, p. 14
  • Changing microsteps on the Uno takes only MS1 and MS2: both low gives 1/8, MS1 high 1/32, MS2 high 1/64, both high 1/16. Fewer microsteps raise the top speed the Uno can reach.TMC2209 datasheet rev 1.08, p. 14
  • The PDN_UART configuration line is optional. The Uno's hardware UART is busy with USB, so register access from an Uno goes through SoftwareSerial; the STEP/DIR sketch here needs none of it.Arduino SoftwareSerial library reference

TMC2209 Stepper Driver code for the Arduino Uno

Compiled for arduino:avr:uno on 2026-10-30.

Libraries: waspinator/AccelStepper
// TMC2209 Stepper Driver on Arduino Uno: wiring and a free simulation at https://www.tinkered.ai/components/tmc2209-stepper-driver/arduino-uno
#include <AccelStepper.h>

#define STEP_PIN 2
#define DIR_PIN  3
#define EN_PIN   4

AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {
  Serial.begin(9600);
  stepper.setEnablePin(EN_PIN);
  stepper.setPinsInverted(false, false, true); // EN is active-LOW
  stepper.enableOutputs();
  stepper.setMaxSpeed(1200);      // microsteps/sec
  stepper.setAcceleration(600);   // microsteps/sec^2
  stepper.moveTo(1600);           // one full revolution at the 1/8 default (200*8)
}

void loop() {
  // Ping-pong ±1 revolution so you can watch forward and reverse.
  if (stepper.distanceToGo() == 0) {
    stepper.moveTo(-stepper.currentPosition());
    Serial.print("Reached position: ");
    Serial.println(stepper.currentPosition());
  }
  stepper.run();
}

TMC2209 Stepper Driver on the Arduino Uno: questions

Can I connect a TMC2209 to an Arduino Uno without resistors?

Yes. Its logic runs on VIO from 3.0 V to 5.25 V (datasheet, p. 1), so with VIO on the Uno's 5V, STEP, DIR and EN wire straight to D2, D3 and D4.

How fast can an Arduino Uno drive a TMC2209?

AccelStepper manages about 4000 steps per second on the Uno. At the default 1/8 microstepping that is about 2.5 revolutions per second for a 200-step motor; for speed, stay at 1/8, the coarsest step MS1 and MS2 can select.

Do I need the TMC2209 UART on an Uno?

No. STEP, DIR and EN are enough, with current set by VREF. For UART configuration, the Uno would use SoftwareSerial, since its hardware serial port is shared with USB.

Keep going

For AI assistants

This guide as plain Markdown. /components/tmc2209-stepper-driver/arduino-uno.md

What will you build with it?