SS Stepper Controller v1.0 · WaveForge / StabilityCore
Every connector and component decoded, drawn in the same orientation as your bench photo. Pin map verified against the board silkscreen and the Flux schematic.
| Driver | STEP | DIR | Terminal |
|---|---|---|---|
| A | GPIO 25 | GPIO 26 | J4 |
| B | GPIO 27 | GPIO 32 | J3 |
| C | GPIO 33 | GPIO 18 | J5 |
| D | GPIO 19 | GPIO 23 | J6 |
The ESP32 won't seat in J1 (board footprint is the wrong width — not your fault), so wire it with 10 jumpers. Each colored pin below goes to the matching board terminal. This board lives on the stationary Power Tower (no shaking), so once it's verified you can solder it permanently. ⚠ The GND wire is mandatory — no shared ground, nothing works.
| ESP32 pin | Signal | J1 pad | Buffer | Terminal |
|---|---|---|---|---|
| VIN | 5V power | J2 · right | — | board logic |
| GND | ground | J2 · left | — | common ref |
| D25 | STEP A | L11 | IC1 ch3 · in 9, out 8 | J4 PUL+ |
| D26 | DIR A | L13 | IC1 ch4 · in 12, out 11 | J4 DIR+ |
| D27 | STEP B | L12 | IC1 ch1 · in 2, out 3 | J3 PUL+ |
| D32 | DIR B | R20 | IC1 ch2 · in 5, out 6 | J3 DIR+ |
| D33 | STEP C | R19 ⚠ was listed 27 | IC2 ch1 · in 2, out 3 | J5 PUL+ |
| D18 | DIR C | R27 ⚠ was listed 19 | IC2 ch2 · in 5, out 6 | J5 DIR+ |
| D19 | STEP D | L5 ⚠ was listed 6 | IC2 ch3 · in 9, out 8 | J6 PUL+ |
| D23 | DIR D | L8 | IC2 ch4 · in 12, out 11 | J6 DIR+ |
Holes are named by column and position from the top, not by a single running number. Left column = L1…L15 top to bottom. Right column = R16…R30, R16 at the bottom climbing to R30 at the top. Orientation is anchored to the silkscreen reading right way up.
Why not a plain 1–30: a single running number collides with GPIO numbers — “J1 pin 19” is not “GPIO 19” — and a clockwise/counter-clockwise rule is easy to reverse. L and R can be misread by nobody. ⭐ Mark L1 and R1 on the physical board with a paint pen and the ambiguity is gone for good.
Quick check on any hole: its count from the top plus its count from the bottom always equals sixteen. Fifth down the left column is also eleventh up — that is L5.
Every pad above is now measured, not inferred. Method: a bare unpopulated board from the same fab run, so the working assembly was never disturbed and no chips had to be levered out. With empty sockets every path is bare copper, so continuity means what it says. For each buffer channel: input pin → J1 gives the pad, output pin → screw terminal gives the signal. Sixteen measurements, each confirmed by lifting a probe and hearing the beep stop.
⚠ Two of the eight were wrong in the old map, and both would have bitten:
Why the old numbers drifted: they came from live 5 V injection (2026-07-09) with the ESP32 disconnected, where un-driven ’125 inputs float HIGH and give false positives. That method got the right driver every time but could not see which channel, and it mis-called two pads. Cold continuity on a bare board has neither failure mode. ⭐ This is also the first time this AI-laid-out board has been verified against its own copper rather than against its schematic.
120 × 80 mm, 2 layer, standard 1.6 mm. Everything below on this page describes v1.0, which stays in service as a tester with its three hand fixes. v1.1 needs none of them.
What changed: five driver axes not four — yaw became a stepper after v1.0 was drawn, so it had been running at 3.3 V straight into a DM542T opto. Four SN74AHCT125N (IC1 = A/B, IC2 = C/D, IC3 = ENA A–D, IC4 = E/yaw), 15 of 16 channels used. Eleven 1k 0805 pull-downs, one per buffer input — the enable is a single GPIO21 net so it takes one resistor, not five. Four 0.1 µF 0805 decoupling caps. J11 deleted — driver returns land on the machine's own ground bus, and the six-position terminals carry PUL±/DIR±/ENA± so the returns sit beside their own signals. Eleven test points, one per signal. ESP32 footprint at a measured 25.4 mm row spacing so the module seats and the ten flying jumpers disappear.
⭐ Verified three independent ways before ordering: a parse of the drill coordinates (J1 row spacing 25.4 mm exact, pitch 2.54, span 35.56, drills 1.0 mm, all seven terminals 1.5 mm); a parse of the IPC-D-356 netlist (R1–R11 each on its own isolated net, C1–C4 across 5V/GND, no merged STEP/DIR nets); and OSH Park's own render, made by different software than produced the files.
⚠️ A lesson worth keeping. Across this revision the 3D
render said nine resistors, then eleven, and one export contained none — while the design had them all along,
on the bottom layer. Only the exported manufacturing data is authoritative, and it has to be parsed completely:
an early check of mine read only the IPC 317 records and missed the 327 continuation
records, where the passives live. Same failure as J11 below — a summary that said connected when the copper
had to be asked directly.
⏳ On arrival: measure a terminal header pin with calipers before soldering — the holes are 1.5 mm and nothing has yet confirmed the pluggable Phoenix-style part against them.
The sixteen J11 holes are common with each other but were never tied to the board’s ground net. Measured J11 → J2 GND: 100 kΩ. A ground trace reads under an ohm; 100 kΩ is leakage through the chips, not copper.
⚠️ The earlier note that “all 16 holes = ground, confirmed by continuity” was half a test: it proved the holes were common with each other, never that they reached ground.
Why it would have been brutal to diagnose. The DM542T inputs are optocouplers: the board drives PUL+ from the buffer output and PUL−/DIR− return through J11. With J11 floating, the opto LED has no return path — no current, no signal, four dead axes — while the pin-walker passes perfectly and every terminal measures the correct voltage. The fault only appears once the loop closes through a driver.
✅ FIX (in place): a wire from the ESP32 GND terminal to any J11 hole. It carries the return current for all four drivers, so solder it at both ends — this board lives on the stationary Power Tower, so there is no reason to leave it on a friction fit.
⛔ On the next board revision: tie J11 to the ground net, and add 10 kΩ pull-downs on all eight ’125 inputs — the inputs float high when the ESP32 is unplugged or held in reset, and this board has neither.
Two separate things are wrong with treating J1 as a drop-in socket:
This does not affect anything: the measured map above is ground truth and the board works when wired to it. But it is worth resolving before laying out another board. The check: open the Flux project, read J1’s netlist, and compare it line by line against the eight rows above. Agreement means the board was fabricated as drawn and the old notes were simply wrong. Disagreement means a layout or fab error, and tells you how far to trust the tool next time.
⛔ Until that is settled, do not describe J1 as a socket you can plug an ESP32 into, and do not reuse this footprint on a new board.
Your board is wired common-cathode: the buffered 5 V signals go to each driver's + inputs, and every − input returns to J11 (all common ground). So each driver takes four signal wires.
| Driver | + signals from | − returns to J11 |
|---|---|---|
| A | J4 · PUL+ / DIR+ | PUL_A− / DIR_A− |
| B | J3 · PUL+ / DIR+ | PUL_B− / DIR_B− |
| C | J5 · PUL+ / DIR+ | PUL_C− / DIR_C− |
| D | J6 · PUL+ / DIR+ | PUL_D− / DIR_D− |
The buffer chip that seats in each socket — not the DM542T (that's the external driver). Notch at top = pin 1; count 1→7 down the left, 8→14 up the right. The grounded pins — 1, 4, 7, 10, 13 — are exactly what you measured: GND (7) plus the four output-enables tied low so the buffers stay on.
The driver's two connectors — what every screw terminal is, and how to buzz each connection with the chips still out. Physical left-to-right order varies between DM542T versions; the printed label on your driver is authoritative — the groupings here (control vs. power) are universal.
| Terminal | Connects to | Continuity |
|---|---|---|
| PUL+ | board J[x] · PUL+ (STEP) | beep to that Jx PUL+ |
| DIR+ | board J[x] · DIR+ | beep to that Jx DIR+ |
| PUL− | J11 · common GND | beep to J11 |
| DIR− | J11 · common GND | beep to J11 |
| ENA± | leave open (enabled) | open to everything |
| Terminal | Connects to | Continuity |
|---|---|---|
| +V | PSU +36 V | +V↔GND = open before PSU on |
| GND | PSU − (power ground) | keep off J11 — see note |
| A+ / A− | motor Blk / Grn | A+↔A− = a few Ω (coil 1) |
| B+ / B− | motor Red / Blu | B+↔B− = a few Ω (coil 2); A↔B open |
Set each driver to its own motor's current. Your DM542T tops out at 3.2 A RMS (4.5 A peak) — that's at or below your motor's 4.0 A rating, so you have headroom and can't over-current it. Match the driver's RMS to the motor; start a little low and raise for torque.
| Peak | RMS | SW1 | SW2 | SW3 |
|---|---|---|---|---|
| 1.00 | 0.71 | ON | ON | ON |
| 1.46 | 1.04 | OFF | ON | ON |
| 1.91 | 1.36 | ON | OFF | ON |
| 2.37 | 1.69 | OFF | OFF | ON |
| 2.84 | 2.03 | ON | ON | OFF |
| 3.31 | 2.36 | OFF | ON | OFF |
| 3.76 | 2.69 | ON | OFF | OFF |
| 4.20 | 3.00 | OFF | OFF | OFF |
Highlighted = target zone for your 4.0 A motor. Your driver's top row may read ~3.2 A RMS.
Start at the 2.69 A row (SW1 ON, SW2 OFF, SW3 OFF) — cool and strong for a shake table. Raise toward the driver's max if you want more torque; drop if it runs hot.
= 8 microsteps — smooth default. Set SW5–8 per the driver's microstep table. Use 3200 (16×) for extra smoothness; it just needs more pulses/sec.
Keep each STEP pulse HIGH ≥ 2.5 µs (driver minimum); it accepts up to 200 kHz. SW4 = standstill current — one position halves it after motion stops to run cooler.
SS Stepper Controller v1.0 · 4-Axis Level Shifter + ESP32 · pin map verified 2026-07-02