SS Stepper Controller v1.0 · WaveForge / StabilityCore

4-Axis Level Shifter — Board Map

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.

Board layout

H3 J2 · POWER 5V/GND J1 ESP32 30-pin J11 · GND BUS all 16 holes = ground land any PUL−/DIR− here C2 0.1µF IC2 C + D SN74AHCT125N IC1 A + B SN74AHCT125N C1 0.1µF J6 · DRV D PUL+/DIR+ J5 · DRV C PUL+/DIR+ J4 · DRV A PUL+/DIR+ J3 · DRV B PUL+/DIR+
Same orientation as your photo · green = screw terminals · gold = pads/header

Verified pin map

ESP32 GPIO → level-shifter → driver. All four silkscreen-confirmed.
DriverSTEPDIRTerminal
AGPIO 25GPIO 26J4
BGPIO 27GPIO 32J3
CGPIO 33GPIO 18J5
DGPIO 19GPIO 23J6

Connector guide

  • J1ESP32 30-pin DevKit v1 was meant to plug in here. ⚠ It does not — see the note below.
  • J2Power in — the GND pin connects to the ground bus (J11); the 5 V pin connects to Vcc (chip pin 14). Confirmed by continuity 2026-07-07. Go by the +5V/GND silkscreen, not left/right (orientation flips it).
  • J3–J6Driver outputs (PUL+/DIR+) → J3=B, J4=A, J5=C, J6=D.
  • J11Ground bus — all 16 holes are common ground (you buzzed it out). Land any driver PUL−/DIR− on any hole.
  • IC1SN74AHCT125N buffer for drivers A & B.
  • IC2SN74AHCT125N buffer for drivers C & D.
J11 · 16-HOLE GROUND BUS
All 16 holes = GND (confirmed by continuity). The 8 labels (PUL_A− … DIR_D−) just keep wiring tidy — electrically you can land any minus wire on any hole.

Before you solder

  • C1 / C2: use the 0.1 µF ceramic discs (found) — non-polarized, drop in either way.
  • DIP sockets: match the notch to the silkscreen (pin 1), then the chip's notch to the socket.
  • ESP32: must be the 30-pin module to seat in J1 — not the 38-pin sensor board.

Connecting the ESP32 — jumper wiring

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 USB EN VP VN D34 D35 D32DIR B D33STEP C D25STEP A D26DIR A D27STEP B D14 D12 D13 GND→ J2 GND VIN→ J2 5V D23DIR D D22 TX0 RX0 D21 D19STEP D D18DIR C D5 TX2 RX2 D4 D2 D15 GND 3V3
Your ESP32, USB at the bottom. Colored pins = the 10 you jumper.
The 10 jumpers — ESP32 pin → J1 pad  MEASURED 2026-09-17
ESP32 pinSignalJ1 padBufferTerminal
VIN5V powerJ2 · rightboard logic
GNDgroundJ2 · leftcommon ref
D25STEP AL11IC1 ch3 · in 9, out 8J4 PUL+
D26DIR AL13IC1 ch4 · in 12, out 11J4 DIR+
D27STEP BL12IC1 ch1 · in 2, out 3J3 PUL+
D32DIR BR20IC1 ch2 · in 5, out 6J3 DIR+
D33STEP CR19 ⚠ was listed 27IC2 ch1 · in 2, out 3J5 PUL+
D18DIR CR27 ⚠ was listed 19IC2 ch2 · in 5, out 6J5 DIR+
D19STEP DL5 ⚠ was listed 6IC2 ch3 · in 9, out 8J6 PUL+
D23DIR DL8IC2 ch4 · in 12, out 11J6 DIR+
How to count J1 — the L/R convention (adopted 2026-09-17)

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.

✅ RESOLVED 2026-09-17 — traced cold, on a bare spare board

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:

  • Driver C was swapped. The map had STEP C on 27 and DIR C on 19. Measured, R19 is STEP and R27 is DIR. Wired from the old table, driver C would have had step and direction crossed — a motor that buzzes and will not turn.
  • Driver D’s step pad was off by one. The map said 6; it is L5. Pad 8 was right.

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.

✅ v1.1 ORDERED 2026-09-17 — OSH Park fB58RrsE, 3 boards, $74.40

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.

🛑 BOARD DEFECT — J11 GROUND BUS IS NOT CONNECTED TO GROUND (found 2026-09-17)

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.

⚠ OPEN — J1 is drawn as an ESP32 socket, but it does not behave like one

Two separate things are wrong with treating J1 as a drop-in socket:

  • Known and confirmed: the footprint is the wrong width, so a DevKit will not physically seat. That is why this board is wired with ten jumpers.
  • New, 2026-09-17, and unexplained: the measured pads do not line up with a standard 30-pin DevKit pinout in either orientation. A standard board puts D25 eighth down the left column; we measured D25’s signal arriving at L11. Checked with the ESP32 both ways up — neither fits.

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.

Four things to know:
  • Ground is mandatory — the GND jumper gives the ESP32 and board a shared reference. Skip it and nothing moves.
  • Power: the VIN→J2 wire runs the whole board off your ESP32's USB. (Or feed a separate 5 V into J2 — just tie all grounds together.)
  • Finding each J1 hole: buzz continuity from a buffer-chip input pin to J1 (chips out = a direct trace) to see which hole carries which signal.
  • Attach — verify, then commit: headers + jumpers first, run the pin-walker sketch to confirm each signal hits the right driver, fix any wrong wire — then solder the wires straight into the J1 pads (permanent, nothing to loosen). Ferrules on the ESP32 screw-terminal ends.

Wiring each driver — both ends of the wire

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.

The four signal wires per driver — board → DM542T
Driver+ signals from− returns to J11
AJ4 · PUL+ / DIR+PUL_A− / DIR_A−
BJ3 · PUL+ / DIR+PUL_B− / DIR_B−
CJ5 · PUL+ / DIR+PUL_C− / DIR_C−
DJ6 · PUL+ / DIR+PUL_D− / DIR_D−
At the DM542T · control side
PUL+board J[x] PUL+
DIR+board J[x] DIR+
PUL−J11 · common GND
DIR−J11 · common GND
ENA+leave open = enabled
ENA−leave open
Not on this board — the DM542T still needs these, or nothing moves:
  • Motor power: your JoyNano 36 V / 10 A → the driver's VDC / GND. The DM542T takes 18–50 V (36 V typical), so it's spot-on. Separate supply from the board's 5 V logic.
  • Motor coils (23HS32-4004S): Black→A+, Green→A−, Red→B+, Blue→B− on the DM542T.
  • DIP switches: current + microstepping — see the panel below.

SN74AHCT125N pinout · the socket chips (IC1 / IC2)

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.

SN74AHCT125N 11OE → GND 21A · in 31Y · out 42OE → GND 52A · in 62Y · out 7GND 14VCC · +5V 134OE → GND 124A · in 114Y · out 103OE → GND 93A · in 83Y · out
Grounded (chip out): 1, 4, 7, 10, 13 · Vcc: 14 · inputs 2/5/9/12 take 3.3 V from the ESP32 · outputs 3/6/8/11 drive 5 V to the drivers. Notch = pin-1 end, matches the board silkscreen.

DM542T pinout · test map

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.

DM542T DIGITAL STEPPER DRIVER CONTROL / LOGIC — to your board (5 V signals) PUL+ STEP in PUL− → J11 DIR+ DIR in DIR− → J11 ENA+ open ENA− open MOTOR + POWER — to PSU + motor (NOT on your board) +V 36 V + GND PSU − A+ BLK A− GRN B+ RED B− BLU
Notch (right edge) = orientation reference — line it up with the matching end of your driver so the terminals read the same direction. Grouped by connector; colors match the tables below — confirm each by its printed label.
Control side — buzz these with the chips OUT
TerminalConnects toContinuity
PUL+board J[x] · PUL+ (STEP)beep to that Jx PUL+
DIR+board J[x] · DIR+beep to that Jx DIR+
PUL−J11 · common GNDbeep to J11
DIR−J11 · common GNDbeep to J11
ENA±leave open (enabled)open to everything
Motor + power side (separate supply)
TerminalConnects toContinuity
+VPSU +36 V+V↔GND = open before PSU on
GNDPSU (power ground)keep off J11 — see note
A+ / A−motor Blk / GrnA+↔A− = a few Ω (coil 1)
B+ / B−motor Red / BluB+↔B− = a few Ω (coil 2); A↔B open
Two things to respect: (1) the DM542T's control inputs are opto-isolated — its signal ground (PUL−/DIR− → J11) is isolated from the motor power GND, so don't tie those two together. (2) You can verify all of this with the chips out — the board's J-terminals sit downstream of the sockets, so board-terminal ↔ driver-terminal is just wire continuity, chip or no chip.

DIP-switch settings · DM542T

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.

Current · SW1/2/3 — typical DM542T (confirm on your driver's label)
PeakRMSSW1SW2SW3
1.000.71ONONON
1.461.04OFFONON
1.911.36ONOFFON
2.371.69OFFOFFON
2.842.03ONONOFF
3.312.36OFFONOFF
3.762.69ONOFFOFF
4.203.00OFFOFFOFF

Highlighted = target zone for your 4.0 A motor. Your driver's top row may read ~3.2 A RMS.

Your NEMA 23 · 23HS32-4004S · 4.0 A
≈ 2.7 – 3.0 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.

Microstepping · SW5–8
1600 pulse/rev

= 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.

Firmware notes

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.

Verify on the driver: current/microstep tables vary slightly between DM542T versions — the one printed on your driver is authoritative. Confirm whether your motor's rating is RMS or peak before pushing to the top of the range.

SS Stepper Controller v1.0 · 4-Axis Level Shifter + ESP32 · pin map verified 2026-07-02