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.

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 Driver | Arduino Uno |
|---|---|
| STEP | D2 |
| DIR | D3 |
| EN | D4 |
| VIO | 5V |
| GND_LOGIC | GND |
| GND_MOT | GND |
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.
// 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
This guide as plain Markdown. /components/tmc2209-stepper-driver/arduino-uno.md