Uncle Magic's Liquid Turntable: Hardware Overview#
How the turntable is built: what the parts are, how they are connected, how power flows, and what protects what. For operating it, see the User Guide. For exact pin-by-pin detail and the history of design decisions, see the README and the changelog; the KiCad files in kicad_mainboard/ are the authority on connections.
1. System overview#
The turntable is built from two printed circuit boards, a stepper motor and the panel controls, fed by two external DC supplies.
| Part | What it is |
|---|---|
| Mainboard | 100 × 100 mm board that carries three plug-in modules, the motor driver, the power protection and every connector. It is the brain of the unit. |
| LED ring board | A separate ring-shaped board with 178 addressable LEDs. It is fixed near the top of the case and does not turn with the platter. |
| Stepper motor | A NEMA 17 bipolar stepper, joined directly to the platter by a flexible shaft coupler. No gearbox. |
| Panel controls | Four rotary encoders (with push buttons) and a tap button, wired to the mainboard through small headers. There is no separate panel board. |
| Power supplies | A 24 V supply (motor and electronics) and a 5 V supply (LEDs), outside the board. |
Three computers share the mainboard, all running at 3.3 V:
| Module | Role |
|---|---|
| Waveshare ESP32-S3-ETH | The main controller. Runs this project's firmware: tempo, speed control, web pages, OSC, encoders. Has wired Ethernet (W5500) and Wi-Fi. |
| BigTreeTech TMC2209 (stepper driver module) | Drives the motor coils. Configured over a one-wire serial link. |
| Espressif ESP32-S3-DevKitC-1 (N16R8) | Runs the open-source WLED software and drives the LED ring. The main controller sends it the colour over a serial link. |
All three are socketed: they plug into female headers, so each can be replaced or reflashed.
Power flow#
Signal flow#
2. The mainboard#
| Size | 100 × 100 mm, two copper layers, 1.6 mm. Order at 2 oz copper for the LED current path. |
| Mounting | Four M3 holes (3.2 mm) at the corners. |
| Design tool | KiCad 10 (kicad_mainboard/Mainboard.kicad_pcb) |
| Schematic | A one-page index plus five function sheets, below. PDF: Mainboard_schematic.pdf |
Schematic sheets#
| Sheet | Contains |
|---|---|
| Power | Power input connector, the two fuse clip pairs, reverse-polarity FET Q5, TVS diode, bulk capacitors, the 3.3 V regulator U2. |
| Controller | Sockets for the ESP32-S3-ETH (J1-H1, J1-H2), the boot-strap resistors, and a series resistor on one encoder line. |
| Motor | Sockets for the TMC2209 (J2-MODE, J2-MOTOR), the UART resistor, and the motor connector J3. |
| LED | Sockets for the WLED DevKitC (J6-J1, J6-J3), the 3.3 V to 5 V data buffer U3, and the ring connector J5. |
| Panel IO | The MCP23017 I/O expander U1, its I2C pull-ups, and every encoder and button header. |
Module orientation#
Each module fits its socket only one way up. The board is silkscreened to match, but a module plugged in backwards would put power on the wrong pins.
| Module | How it goes in |
|---|---|
| ESP32-S3-ETH | RJ45 side up, with the RJ45 and USB-C end at the top edge of the board. The 72.8 × 21 mm module overhangs the board edge by about 16 mm, which is where the network socket and USB port are reached. |
| ESP32-S3-DevKitC-1 | Component side up, USB ports at the top edge. |
| TMC2209 | Standard stepper-driver orientation: the EN and VM pins at the top. |
Key parts#
| Ref | Part | Job |
|---|---|---|
U2 | TRACO TSR 2-2433N | 24 V to 3.3 V converter, 2 A, fixed output, short-circuit protected |
Q5 | SQJ407EP P-channel MOSFET | Blocks reversed 5 V; carries the ring current |
U3 | 74AHCT1G125 | Lifts the LED data signal from 3.3 V to 5 V |
U1 | MCP23017 | I2C input/output expander (address 0x20) |
D1 | 1N5822 Schottky | Stops reverse 24 V and stops motor energy flowing back |
D5 | SMBJ26A | Clamps voltage spikes on the 24 V rail |
D4 | PESD3V3S1UL | Static-discharge protection on 3.3 V |
F1, F3 | T508VS blade-fuse clips | Take standard (ATO) car fuses: 2.5 A in F1, 15 A in F3 |
C6 | 220 µF | Bulk capacitor on the 5 V input |
C8, C11 | 2 × 100 µF, 35 V | Bulk capacitance for the motor driver |
R23, R24, R25 | 1 k, 10 k, 1 k | Hold the motor-control pins at safe levels during boot |
R26 | 10 k | Keeps the LED data line low while WLED starts, so the ring doesn't flash |
R27 | 4.7 k, 1206 | Bleeder across the 24 V capacitors so the rail drains after power-off |
R28 | 1 k | In series with one encoder line (see section 4) |
3. Power#
Rails#
| Rail | Source | Feeds | Protection |
|---|---|---|---|
| +24V_MOTOR | 24 V supply via J-PWR-IN pin 5 | Motor driver supply; regulator U2 | F1 2.5 A fuse; D1; 200 µF bulk; D5 TVS; R27 bleeder |
| +3V3 | U2 from +24V_MOTOR | ESP32-S3-ETH, WLED DevKitC, TMC2209 logic, MCP23017, encoder pull-ups | U2 limits its own current; D4 is static protection only |
| +5V_LED_RING | 5 V supply via J-PWR-IN pins 1 and 3 | LED ring, data buffer U3 | F3 15 A fuse; Q5 reverse-polarity FET |
The three rails do not share a protection path: a fault on one cannot ride through into another. The 5 V supply is used only for the LED ring; everything else runs from the 24 V supply through U2.
Design choices worth knowing#
- 3.3 V is generated on the board. It comes from a fixed-output converter rather than an adjustable module, because three logic chips with a 3.6 V maximum depend on it and a drifting trimpot in a sealed enclosure would be a real overvoltage risk.
U2needs no external capacitors. - Both ESP32 chips run Wi-Fi. Peaks approach 1 A on the 3.3 V rail, which is why the 2 A converter is fitted and why the main board's Wi-Fi power is capped (15 dBm).
- The ESP32-S3-ETH's own 5 V regulator is disabled (its
3V3_ENpin is grounded through the socket) so it doesn't fightU2. Its USB-C port still works for programming but cannot power the board by itself. - Switch-off behaviour. Without
R27the 24 V capacitors would linger at a few volts and leave the processors in brown-out. With it the rail is under 1 V in about 2 seconds. - Switch-on order. 3.3 V can't rise before 24 V. The 5 V rail may arrive at any time; the worst case is a few milliseconds of 3.3 V on the data buffer's input before it has power, limited to about 10 mA by
R18.
Power budget#
| Rail | Typical | Worst case |
|---|---|---|
| 3.3 V logic | 0.6 to 0.75 A, Wi-Fi off | About 1 A, Wi-Fi on in both chips (2 A available) |
| 24 V motor | The motor runs at 800 mA per phase | F1 opens at 2.5 A |
| 5 V ring | Depends on colour and brightness | About 10.7 A at full white (60 mA × 178 LEDs) |
Mains side: two switch-mode supplies together draw about 100 to 120 W in steady state, with a 20 to 60 A inrush for a few milliseconds at switch-on. A slow-blow fuse and a switch rated at 10 A or more are recommended.
Power connector J-PWR-IN#
Molex Mini-Fit Jr, 8 positions, two rows of four. The 5 V is on two pins because of the ring current.
| Pin | Net | Pin | Net |
|---|---|---|---|
| 1 | +5V | 5 | +24V |
| 2 | GND | 6 | GND |
| 3 | +5V | 7 | spare (not connected) |
| 4 | GND | 8 | GND |
These pins connect ahead of the fuses. Never plug or unplug this connector with power on.
4. Signals and control#
Main controller pin use#
| GPIO | Signal | Goes to |
|---|---|---|
| 0 | STEP | TMC2209 step input |
| 45 | DIR | TMC2209 direction input |
| 3 | ENABLE | TMC2209 enable (active low) |
| 39 / 40 | UART TX / RX | TMC2209 one-wire serial, via R9 (1 k) |
| 41 / 42 | UART TX / RX | WLED DevKitC serial link |
| 44 / 48 | I2C SDA / SCL | MCP23017 expander |
| 1 / 2 / 43 | Main encoder A / B / button | Panel (button through R28) |
| 16 / 17 | Hue encoder A / B | Panel |
| 15 / 18 | Saturation encoder A / B | Panel |
| 47 / 38 | Value encoder A / B | Panel |
| 21 | Tap button | Panel |
| 9 to 14 | Ethernet chip | Inside the ESP32-S3-ETH module |
| 19 / 20 | USB | Programming and log port |
Every pin on the ESP32-S3-ETH socket was checked against Waveshare's published pinout, and the TMC2209 and DevKitC sockets against their makers' pinouts.
The motor driver#
- Mode: step and direction, configured over the UART at start-up. The driver's address pins and clock are tied to ground; the carrier's trimpot is ignored because the firmware sets the current.
- Settings: 800 mA RMS (the motor is rated about 1 A), 1/32 microstepping with the driver interpolating to 256, and the quiet StealthChop mode. At 32 microsteps a full turn is 6,400 steps.
- Health checks: every 5 seconds the firmware checks the serial link and the driver's over-temperature and short-circuit flags, and restores the settings if the driver has reset.
- Boot safety: three of the control pins (GPIO 0, 45 and 3) double as the processor's boot "strapping" pins.
R23(1 k to 3.3 V) holds STEP high,R25(1 k to ground) holds DIR low, andR24(10 k to 3.3 V) holds the driver disabled from power-on until the firmware is ready. This makes boot independent of whatever pull-ups the driver module has.
The lighting path#
- The main controller sends the colour as a short text (JSON) message over the serial link at 115,200 baud.
- The WLED DevKitC turns it into LED data on its GPIO 4.
- The data passes through
R18(330 Ω) intoU3, which lifts it from 3.3 V to 5 V (it must be the AHCT part, whose inputs accept 3.3 V as a "high"), and on to the ring. R26holds the data line low while WLED starts, so the ring stays dark rather than flashing.
Panel controls and the expander#
- The four encoders and the tap button go straight to processor pins, and the encoders are read by interrupts so fast turning isn't missed.
- The hue, saturation and value push buttons are on the MCP23017 expander, because the socket has no spare pins. They are read by polling every 20 ms.
- The expander also carries three spare encoder headers (
J-ENC-EXP1to3; the third has no push-button channel). The current firmware does not read them. Two expander pins (GPA7,GPB7) are outputs only, as the chip's errata requires, and are not brought out. - Static protection. Every panel signal pin goes through a 1 k resistor, with a small TVS diode to ground on the connector side, so a spark from a person touching the panel wiring is clamped before it reaches a processor pin. Each encoder's 3.3 V supply pin has a 100 Ω resistor in series, and the LED ring's 5 V supply has its own TVS (
D32) besideJ5. - Encoder modules are the common KY-040 type. Their pull-ups are fed from 3.3 V, never 5 V, because the lines go straight into 3.3 V-only inputs.
R28(1 k) sits between GPIO 43 and the main encoder's push button. That pin is also the processor's boot-log output, so the resistor limits current if the encoder happens to be closed to ground during a reset.
Encoder header pin order#
All eight encoder headers use the same five pins, in this order:
| Pin | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| Signal | +3V3 | SW (push) | DT | CLK | GND |
(The board is silkscreened V, S, D, C, G.) The tap button header has two pins: GND and TAP. Suggested panel wire colours: main encoder blue, hue red, saturation green, value yellow, buttons orange, ground black.
Network#
Wired Ethernet comes from the W5500 chip on the ESP32-S3-ETH module. Wi-Fi is the module's own 2.4 GHz radio. Both are active at once and share the same OSC port and web pages.
5. Connector reference#
| Ref | Connector | Use |
|---|---|---|
J-PWR-IN | Molex Mini-Fit Jr, 8 pin | Power in (see above) |
J3 | JST-XH, 4 pin | Motor: 1 A+, 2 A−, 3 B+, 4 B− (pins 1+2 are one coil, 3+4 the other) |
J5 | Molex Mini-Fit Jr, 6 pin, vertical | LED ring: 1 data (5 V), 2 spare (tied to 5 V), 3 and 4 ground, 5 and 6 +5 V |
J1-H1, J1-H2 | Two 20-pin sockets (1 × 20 each), 2.54 mm | ESP32-S3-ETH |
J6-J1, J6-J3 | 22-pin sockets (a 20 + 2 pin pair each), 2.54 mm | WLED DevKitC-1 (only a few pins are used) |
J2-MODE, J2-MOTOR | 8-pin sockets, 2.54 mm | TMC2209 driver module |
J-ENC-MAIN, -HUE, -SAT, -VAL | 5-pin headers | The four panel encoders |
J-ENC-EXP1 to 3 | 5-pin headers | Spare encoders (unused by the firmware) |
J-BTN-TAP | 2-pin header | Tap button |
The motor connector follows the common stepper wiring, so a motor cable wired black, green, red, blue (A+, A−, B+, B−) plugs straight in. If the platter turns the wrong way, swap two wires of one coil, or tick Reverse motor direction on the settings page.
6. The LED ring board#
| Design | kicad_led_ring_offset/ (KiCad), a separate project |
| Size | About 203 × 203 mm, two layers; order at 2 oz copper |
| LEDs | 178 × SK6812 (RGB, 5 V), in an offset "brick" pattern, wired as one long chain |
| Per LED | One 100 nF capacitor each |
| Other parts | One 1,000 µF bulk capacitor; one 470 Ω resistor in series with the data input |
| Connector | J1, Molex Mini-Fit Jr 6 pin, right-angle (5569-06A2), pin-for-pin the same as the mainboard's J5 |
| Current | 60 mA per LED, about 10.7 A for the whole ring at full white |
| Mounting | Four M3 holes; fixed near the top of the case; does not rotate with the platter |
A straight-through six-wire cable joins J5 on the mainboard to J1 on the ring. Power and ground are spread across the board as copper planes (5 V on the top layer, ground on the bottom) instead of traces; an estimate of the voltage drop to the farthest LED came out under 12 mV. Both boards pass design-rule and electrical-rule checks with no errors.
7. Motor and mechanics#
- Recommended motor: StepperOnline 17HS08-1004S: NEMA 17, 1.8° per step, 1 A per phase, 3.7 Ω, 4.5 mH, 16 N·cm holding torque, 21.5 mm body, 400 mm leads (black, green, red, blue = A+, A−, B+, B−). It is a short ("pancake") motor, which is enough torque for a light platter. A heavy platter would justify a full-length NEMA 17 (40 to 60 N·cm); the electronics suit either.
- Coupling: a flexible shaft coupler joins motor and platter directly. There is no gearbox, so platter inertia is felt straight at the motor. This is why every speed change is ramped.
- Speed: one revolution per 12 beats; default top speed 17 RPM (adjustable). At 1/32 microstepping the platter needs 6,400 steps per turn.
- Layout constraints on the mainboard: the bulk capacitors
C8andC11are 7.7 mm tall and fit between the two plug-in modules, so check clearance if you substitute taller parts.
8. Current, heat and protection notes#
- Ring current path. The 5 V route from the power connector through
F3andQ5toJ5is carried by copper pours 6.5 mm wide or more at the narrowest point, with the return on a full bottom-layer ground plane. The power connector and ring connector each use two pins per supply, so each pin carries about 5.4 A at full white. Q5heat. At full white it dissipates roughly 0.8 to 1.1 W. The firmware's WLED setup (a current limit of about 8 A) keeps this lower in practice.U2heat. It runs only slightly warm at the loads above. No signal traces pass under it.- TMC2209 heat. Fit a heatsink on the module; the maker calls for heat dissipation.
- Fuses.
F1(2.5 A) protects the 24 V side andF3(15 A) the ring. Both clip types take the same standard-size fuse, so the board relies on its silkscreen labels to prevent mix-ups. - Voltage spikes.
D5softens spikes on the 24 V rail, but a TVS cannot clamp as low as the motor driver's 28 V rating, so the design relies on a fixed, well-regulated 24 V supply and on never hot-plugging the power connector. An adjustable supply should not be set above about 26 V. - No hot-plugging. Do not connect or disconnect the motor (
J3), the ring cable (J5), the power connector or any of the plug-in modules with the power on. A motor unplugged live produces a voltage spike that can destroy the TMC2209 (the module's maker says the same about the module itself), and the ring cable carries up to about 11 A. TheD5clamp on the 24 V rail is not designed for this. - USB back-feed. Plugging a USB cable into the WLED DevKitC while main power is off feeds the whole 3.3 V rail through the DevKitC's own regulator. It usually just causes a brown-out, but apply main power first. (A board revision could prevent it with a diode.)
9. Manufacturing and files#
| Item | Where |
|---|---|
| Schematic (sources) | kicad_mainboard/*.kicad_sch, rendered to Mainboard_schematic.pdf |
| PCB | kicad_mainboard/Mainboard.kicad_pcb, renders Mainboard_render_top.png and _bottom.png |
| Manufacturing files | kicad_mainboard/jlc_export/: Gerbers and drill, plus bills of materials and part-placement files in two versions (surface-mount only, or full assembly) |
| Ring board | kicad_led_ring_offset/ with its own jlc_export/ |
| Check reports | erc_report.rpt (electrical rules) and drc_report.rpt (layout rules), in each KiCad folder |
| Part-number tool | kicad_mainboard/tools/build_jlc_assembly.py, which rebuilds the bills of materials from the board |
Ordering from JLCPCB. Surface-mount only: 24 part types, 68 solder joints. Full assembly (through-hole parts too): 49 parts, 267 joints. Every part has an LCSC number (JLCPCB re-checks stock when you upload). Notable ones: regulator U2 C45406999, data buffer U3 C12495, TVS D5 C123820, bulk capacitors C8 and C11 C176683 (an "extended" part: confirm stock when ordering).
Before ordering the board, check:
- 2 oz copper is selected on the order form.
- In JLCPCB's placement preview, the orientation of
Q5,C11andU2looks right. - You have standard or low-profile ATO fuses (a mini fuse needs a different clip spacing).
10. Verification status and limits#
Checked on the computer
- Both boards pass design-rule checks (no violations, nothing unrouted) and the mainboard matches its schematic exactly. The schematic passes electrical-rule checks.
- Socket pin assignments match the manufacturers' published pinouts.
- The board meets JLCPCB's two-layer manufacturing limits (smallest hole 0.3 mm, narrowest track 0.2 mm).
- The speed-control logic has automated tests (
tests/), and the firmware builds with no warnings.
Checked on a bench unit. A standalone ESP32-S3-ETH running the current firmware boots, joins Wi-Fi, announces liquidturntable.local and serves its web pages. The automatic renaming of a taken hostname was tested against a name owned by a PC on the network: the unit detected the clash and announced itself as -1.
Not yet verified. No fully assembled mainboard has been powered up yet. Still to confirm on real hardware: the motor driver link and motor behaviour, the boot straps with the driver module fitted, the WLED link and ring, encoder feel, and the fuse clip fit with real fuses. The project README lists these under "Open items".
Known limits
- The four spare encoder headers and the expansion header are wired but not used by the firmware.
- Wi-Fi shares the 3.3 V rail with the wired network and the WLED chip; its power is capped to keep the rail within budget.
- The panel and ring cabling are made by hand. Check the pin order on the silkscreen, not on the connectors' descriptions in text.