Skip to the content
PCBKitNew board
2 layers48 × 46.6 mmStepper blinds driver, the printed circuit board in 3D

An ultra-quiet NEMA 17 retrofit driver for beaded-chain roller blinds.

Size
48 × 46.6 mm
Copper layers
2
Thickness
1.6 mm
Parts
6
Nets
26
Pads
50
Tracks, vias
65, 58
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
24 Jul 2026
Updated
31 Oct 2026

Overview

Stepper blinds driver is an open-source printed circuit board by xavier-phillips, from the xavier-phillips/stepper-blinds-driver repository on GitHub, published under the MIT licence. It is a 2-layer board of 48 × 46.6 mm with 6 parts on 26 nets, routed with 65 tracks and 58 vias.

Its parts include 1 capacitor and 1 connector. It belongs with the robots and motor control boards of this library.

README

README.md

stepper-blinds-driver

An ultra-quiet NEMA 17 retrofit driver for beaded-chain roller blinds.

Xavier Phillips

Status Type Motor Interface MCU PCB CAD

Finished device The stepper blinds driver with the top lid removed, showing the main sprocket and the custom PCB.


Contents


Overview

Problem

Opening blinds automatically has a range of benefits:

  • Easier to wake up in mornings, and aligns circadian rhythm
  • Provides more sunlight during day (for an office, this helps improve mood, among other health benefits)

Commercial options have some limitations:

  • Can be very expensive
  • Almost all commercial devices use geared DC motors, and are very loud when in operation (>50dB)

Goal

  1. Low-cost (<$100)
  2. Compatible with beaded-chain blinds
  3. Near-silent (<40dB)

Features

  1. Actuate beaded-chain with positional control (e.g. set to 50%) 2. High precision is not crucial, aside from the start and end positions. However, end position is a mechanical limit (blinds cannot go further than highest position).
  2. Controlled via Google Home or Home Assistant for scheduled automations.
  3. Device should be compact
  4. Powered externally with power supply (extremely clean, minimal, easy to hide cable)
  5. Buttons should be minimised for aesthetic 7. Possible structure
    1. Ver. 1 - up/down pushbuttons, power toggle. accessible port for microcontroller. no PCB (wires)
    2. Ver. 2 - power toggle only - small, hidden same-colour micro latch switch. hidden port for microcontroller (possibly a friction fit soft tpu plastic cover for it or similar, like a port cover, same colour). PCB.
  6. Easily replaceable components (motor, PCB, microcontroller). highest priority for replicability is the cog/sprocket for the beaded chain which MUST be hot swappable in seconds
  7. Custom PCB for final product
  8. Clean, minimal box design with all internals hidden, mountable to a wall with standard screws

Project Snapshot

Details

TypePersonal project (no course/folio behind it)
DurationStarted ~30 June 2026, ongoing
Budget$79.11 true project cost (target: <$100)
MechanismBeaded-chain actuation, positional control (e.g. set to 50%)
MCU / ControlESP32-C6 Mini Dev Board (Serial CLI Firmware v1.0)
Motor / driverNEMA 17 Stepper Motor (34mm, 1.5A) + TMC2209 V2.0 Stepper Driver
PCBCustom 2-layer PCB for all electrical components
Mechanical CADOnshape
Manufacturing3D printing

Specifications

SpecValue
Required pulling force1.8kg (bucket-tested - see build log)
Noise target<40dB (commercial cheap models are >50dB)
Travel rangeUnlimited
Holding torqueN/A, designed for counterbalanced or friction-balanced household blinds
Power supply12V 3A 36W power supply
Ecosystem tested againstGoogle Home or Home Assistant (per scope - not yet tested)

Technical Skills

AreaSkills and tools
Mechanical designOnshape CAD - hot-swappable cog/sprocket mount for the beaded chain, compact enclosure
PCB designKiCad - custom two-layer PCB, manufactured by JLCPCB; the first prototype used off-the-shelf breakouts (TMC2209 driver module, MP1584EN buck converter) on a perfboard
Embedded programmingC++ / Arduino on ESP32 (Non-blocking stepper driver integration)
Smart home integrationGoogle Home or Home Assistant, for scheduled automations
Manufacturing3D printing

Key Design Decisions

DecisionOptions consideredReasoning
Motor + driverRanked 10 motor setups against the <40dB noise / <$100 cost constraints (full comparison below); shortlisted NEMA 17 + TMC2209, JGY-370 Worm Gear Motor, NEMA 17 (5:1 Planetary Geared) + TMC2209This motor is extremely well documented and has a low noise level when paired with the TMC2209 controller.
PCB / prototyping approachOff-the-shelf breakout modules (TMC2209 driver, MP1584EN buck converter) on a prototype board vs. a from-scratch custom PCBV1 is on protoboard for now; custom PCB for final product is goal #7
Button / enclosure interfaceMinimal-none. The device is intended to be controlled wirelessly in the final iteration. Prototypes are controlled via serial CLI.Buttons should be minimised for aesthetic (goal #5)
Full motor comparison (from motor research notes)

The biggest constraints for the motor are the <40dB requirement and the cost (total cost <$100)

What impacts motor noise?

  • DC Brushed Motors - Brush scratching
  • Geared Motors - Vibrations and friction
  • Magnetic hum & coil whine

Overall, the magnitude of these sounds is also proportional to the RPM of the motor, so a slower RPM motor is ideal (and has the additional advantage of making the change in light level more gradual)

RankMotor SetupCategoryTorque (Nm)Max RPMRPM NotesSelf-LockingApprox. Noise Level (dB)Dimensions (mm)Volume (cm³)
1NEMA 17 (Standard 42mm) + TMC2209Stepper0.40400VariableNo3842.3 x 42.3 x 40.071.57
2JGY-370 Worm Gear Motor (12V)Brushed DC1.0040Gearbox FixedYes4276.8 x 32.0 x 25.261.93
3NEMA 17 (5:1 Planetary Geared) + TMC2209Stepper1.5080VariableNo4342.3 x 42.3 x 61.3109.68
435BYJ46 Geared Stepper (12V)Stepper0.3030VariableNo3835.0 x 35.0 x 17.221.07
5BGM4108 Gimbal Motor + SimpleFOCBLDC0.20400VariableNo3246.0 x 46.0 x 24.050.78
612V 28BYJ-48 (Modified to Bipolar)Stepper0.1015VariableNo3528.0 x 28.0 x 19.014.90
725GA-370 Gear Motor (12V)Brushed DC0.5060Gearbox FixedNo4525.0 x 25.0 x 52.032.50
8NEMA 14 + TMC2209 DriverStepper0.15400VariableNo3835.0 x 35.0 x 26.031.85
9N20 Micro Gearmotor (12V, 60 RPM)Brushed DC0.2560Gearbox FixedNo4526.0 x 12.0 x 10.03.12
10MG996R Continuous Rotation ServoServo0.90100VariableNo5040.7 x 19.7 x 42.934.40

Shortlist

1. NEMA 17 + TMC2209 - This motor is extremely well documented and has a low noise level when paired with the TMC2209 controller.

2. JGY-370 Worm Gear Motor - This is a slightly louder, more powerful alternative to the NEMA, the second best option if the NEMA turns out to be underpowered in torque (0.40 Nm vs 1.00 Nm). Has an additional benefit of being self-locking. Slightly above the noise limit by 2dB which is an acceptable margin.

3. NEMA 17 (5:1 Planetary Geared) + TMC2209 - Same motor as Option 1, but geared to increase torque and reduce max RPM. Similar noise level and torque to Option 2, but ranked lower due to increased complexity.


Hardware

Mechanical (Onshape)

The main mechanical component is the mount, featuring two compartments. A thick-walled compartment which is load-bearing and contains the NEMA17, in addition to a thin-walled circuit compartment.

To connect the NEMA17 to the mount, there is a face plate, which also features guides for the beaded-chain to be routed through.

There's also a cosmetic lid which is friction-fit using two pins for alignment and security, hiding the internal circuit while being easy to remove.

The sprocket is parametrically designed based on the following formulas.

The box features hexagonal ventilation holes which balance structural integrity and FDM manufacturability with sufficient surface area for thermal convection to prevent overheating.

Electronics (KiCad)

The electronics involved in this project are for controlling and powering the motor. The ESP32 is the brain, allowing programmed movement logic and eventually communication with Google Home and other smart home systems via Matter over WiFi. The TMC2209 acts as an interface between the ESP32 and the NEMA17, and via the StealthChop2 feature, it allows ultra-quiet motor movement. The MP1584EN is a simple buck converter to step down the 12V from the power supply to the 5V required for the ESP32.

I decided to use a custom PCB because I wanted to make multiple of the device, and eventually open-source it, so I decided inserting components into a PCB would be much easier than wiring spaghetti and frustrating breadboarding. It also gave me a chance to upskill KiCAD and learn about circuit schematics, rule checkers, and the PCB development and manufacturing process.

BOM

ComponentSourcePack Size (Bought)Qty RequiredPack Cost (AUD)True Project Cost (AUD)
ESP32-C6 Mini Dev BoardAmazon AU11$25.01$25.01
12V 3A 36W Power SupplyAmazon AU11$21.99$21.99
NEMA 17 Stepper Motor (34mm, 1.5A)Amazon AU11$20.99$20.99
TMC2209 V2.0 Stepper DriverAmazon AU51$37.03$7.41
MP1584EN 3A DC-DC Buck ConverterAmazon AU151$18.87$1.26
Custom 2-Layer PCBJLCPCB51$2.00$0.40
M3 Button Head Screw KitAmazon AU3008$10.99$0.29
M3 Nylon Standoffs & Nuts KitAmazon AU3204$12.99$0.16
3M VHB Double Sided TapeAmazon AU33m10 cm$12.99$0.04
2.1mmx5.5mm DC Power Jack (Panel Mount)Amazon AU301$16.89$0.56
100µF 50V Electrolytic Capacitor (Polarized)Jaycar Electronics11$1.00$1.00
60/40 Rosin Core Solder 0.71mmWorkshop15gVariable$0.00$0.00
24 AWG Solid Core Hookup WireWorkshopN/AVariable$0.00$0.00
Totals$180.75$79.11

Control Software

I wanted to keep this deliberately simple and write it fully myself so I could understand how the stepper control loop works, rather than relying on agentic tools to write something complex that I wouldn't fully understand under the hood.

What it does:

  • Serial-based control to move to a pre-defined top and bottom position for the blinds
  • Pause command to cancel movement with smooth acceleration.

What it deliberately doesn't do (and why):

  • Other features (e.g. Matter over WiFi, auto calibration) have been left out due to time constraints for now and will be developed further in the future.

Walkthrough

  • read_int(): Serial user input parser that checks for user commands and accepts valid inputs as commands (0: Stop, 1: Top, 2: Bottom).
  • FastAccelStepper Engine: Asynchronously drives the STEP/DIR signal generation using ESP32 hardware timers, allowing smooth acceleration and deceleration ramps in the background.

Build Log

2026-06-30 - Measuring required pull force

alt text

  • Used a water bucket attached to the blinds to measure the force required to move them.
  • At 1.7 kg, the blinds remained stationary. At 1.8 kg, the blinds were able to move.
  • The 20 mm NEMA17 was determined to have insufficient torque, leading to the decision to use the 34 mm NEMA17 instead.

2026-07-02 - Initial CAD design

Initial CAD design

alt text

  • This design has a removable circuit box area, using dovetail cutouts. It also has removable guides for the beaded chains, secured by M2 screws.

2026-07-05 - Perfboard Assembly

Perfboard Assembly

  • Image of the components laid out on a perfboard. I've cut the perfboard down to a smaller size for compactness in this image, but for later perfboard iterations I used the full size, just for ease of wiring and troubleshooting (since it was only a prototype, the compactness was evaluated as somewhat irrelevant)

2026-07-07 - PCB Design 1

PCB Design 1

2026-07-10 - PCB Design 2

PCB Design 2

  • Modified the PCB schematic in KiCAD to flip the footprint of the ESP32C6 by 180 degrees. This ensures that it can be wired correctly while having the USB port point towards the edge of the board, instead of the centre. Code was also updated to reflect the new pins.

2026-07-21 - Control Software Draft

cpp
#include <Arduino.h>
#include <FastAccelStepper.h>

constexpr int PIN_EN = 14;
constexpr int PIN_SPREAD = 15;
constexpr int PIN_UART = 18;
constexpr int PIN_STEP = 20;
constexpr int PIN_DIR = 21;

constexpr int SPEED = 500;  // step per sec
constexpr int ACCEL = 1000; // step per sec^2

constexpr int TOP_POSITION = 0;       // steps
constexpr int BOTTOM_POSITION = 1000; // steps

enum user_input
{
  PAUSE,
  TOP,
  BOTTOM,
  OPTIONS_COUNT
};

user_input command = PAUSE;
  • Just a basic serial-control script for testing basic functionality (movement up, down, and pausing)

2026-07-24 - CAD Design 2

CAD Design 2

  • This was a major transition. The two-box dovetail architecture was replaced with a single box with two compartments.

2026-07-30 - Motor Testing

  • Upon arrival of the board (2026-07-30) and initial basic testing of roller blind movement (a short test program), I determined that the NEMA17 tended to stall quite easily. Upon closer inspection and troubleshooting (including verifying that it did work with a much lighter, smaller roller blind), I determined that the cause was simply insufficient current. The 12V wall adapter I was using only had a rated current of 1A, much less than the planned 3A.
  • Order a 12V 3A power supply ASAP, in order to provide sufficient power for the NEMA17 to lift basic blinds.

Testing

TestResult
Bucket test - required pulling force1.8kg confirmed
Noise level (<40dB target)Not yet tested

What's Next

  • The next step is writing the implementation that includes Matter, rather than the basic hard-coded values the script currently uses.
    • For the implementation, I want to keep it buttonless for aesthetics and simplicity of circuitry. So I'm planning to use StallGuard to determine increased resistance at the top of the range of motion (ROM) for calibration, as well as a reduced resistance at the bottom of ROM.

Reflection

I learned a massive amount from this project. On the CAD side, I learned about using variables in my designs, rather than "magic numbers" for dimensions, so everything in my design is fully adjustable via the variables table. I also learned about a lot more Onshape's sketch tools (tangent, normal, and perpendicular constraints), as well as their 3D tools (Featurescripts like Grid Extrude for ventilation, alongside operations like revolve which I used for the sprocket).

I also learned KiCAD from scratch during this project, which was a great learning experience and upskilling opportunity into a new field. Historically I used graphical software like Canva or Illustrator for circuit diagrams, but learning how to write proper, verified schematics was really enjoyable, and seeing my own custom-designed PCB arrive was extremely rewarding. Contrary to what I used to assume about PCBs, it actually saved me time, as I used to have to spend weeks fiddling with breadboards because I didn't take the time to plan my circuit thoroughly. That, combined with the time saved from soldering (only took ~10min to solder the entire PCB!), allowed me to finalise all electronics in about a week.


Documentation

Acknowledgements & License

gin66/FastAccelStepper: A high speed stepper library for Atmega 168/328p (nano), Atmega32u4, Atmega 2560, ESP32, ESP32S2, ESP32S3, ESP32C3, ESP32C6, Atmel SAM Due, Raspberry pi pico and pico 2

This project is licensed under the MIT License. See the LICENSE file for details.

Personal project, July 2026.

Parts

6
QtyValueFootprintReferences
1100µFCapacitor_THT:C_Radial_D10.0mm_H20.0mm_P5.00mmC1
1Barrel_JackTerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2-5.08_1x02_P5.08mm_HorizontalJ1
1Stepper_Motor_bipolarTerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-4-5.08_1x04_P5.08mm_HorizontalM1
1~auto-blinds:ESP32-C6-Super-Mini-HeaderESP32-C6-Super-Mini1
1~auto-blinds:TMC2209-ModuleTMC2209
1~auto-blinds:MP1584EN-ModuleMP1584EN1

Questions

How big is the Stepper blinds driver PCB?

It measures 48 × 46.6 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Stepper blinds driver use?

6 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Stepper blinds driver KiCad files?

From the xavier-phillips/stepper-blinds-driver repository on GitHub, at the commit this page was made from: the board is hardware/pcb/kicad/kicad.kicad_pcb and its schematic hardware/pcb/kicad/kicad.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Stepper blinds driver design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers18.5 × 11.1 mmSwitch, the printed circuit board in 3D

    Switch

    byrantech/laptop

    anyon_e, a highly integrated, high end, open source laptop. Attempt the impossible.

    6 parts4.3kMIT
  • 2 layers14.6 × 33 mmBrain board SD Card 1, the printed circuit board in 3D

    Brain board SD Card 1

    rusefi/rusefi

    rusefi - GPL internal combustion engine control unit

    6 parts1.2k
  • 2 layers9 × 9 mmDpoint, the printed circuit board in 3D

    Dpoint

    Jcparkyn/dpoint

    Open-source digital stylus using camera tracking and inertial measurements

    6 parts1.1kMIT
  • 2 layers51.5 × 16.6 mmMicroswitchXY Endstop, the printed circuit board in 3D

    MicroswitchXY Endstop

    VoronDesign/Voron-Hardware

    Cool Hardware designed by the Voron Design group

    6 parts1.1kGPL-3.0
  • 2 layers21.9 × 76.7 mmAmiga External, the printed circuit board in 3D

    Amiga External

    hoglet67/RGBtoHDMI

    Bare-metal Raspberry Pi project that provides pixel-perfect sampling of Retro Computer RGB/YUV video and conversion to HDMI

    6 parts1kGPL-3.0
  • 2 layers88.9 × 50.8 mmBusinesscard, the printed circuit board in 3D

    Businesscard

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    6 parts915
  • 2 layers20.3 × 15.2 mmL0 RGB led, the printed circuit board in 3D

    L0 RGB led

    Luos-io/luos_engine

    Open-source and real-time orchestrator for cyber-physical-systems, to easily design, test and deploy embedded applications and digital twins.

    6 parts546MIT
  • 2 layers9 × 3.6 mmOpticalEncoder, the printed circuit board in 3D

    OpticalEncoder

    adamb314/ServoProject

    Getting the most out of your hobby servo

    6 parts545