Skip to the content
PCBKitNew board
2 layers63 × 60.8 mmEsp32node wip, the printed circuit board in 3D

One passive crossover board per speaker, so build two. Single-sided, through-hole only, CNC isolation-milled with an 0.8 mm end mill (the DTU 62768 process).

Size
63 × 60.8 mm
Copper layers
2
Thickness
1.6 mm
Parts
32
Nets
56
Pads
183
Tracks, vias
296, 0
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
15 Dec 2025
Updated
3 Oct 2026

Overview

Esp32node wip is an open-source printed circuit board by MadsRudolph, from the MadsRudolph/personal-projects repository on GitHub. It is a 2-layer board of 63 × 60.8 mm with 32 parts on 56 nets, routed with 296 tracks and 0 vias.

It is built around the CH340C, ESP32-WROOM-32 and AMS1117-3.3, with the S8050 among its other parts. Its parts include 11 resistors, 7 capacitors, 5 connectors, 3 ICs and 2 diodes. It belongs with the ESP32 boards of this library.

Main components

4

README

Projects/Illuminate 7Mk2/crossover/README.md

Illuminate 7 Mk2 — crossover board

One passive crossover board per speaker, so build two. Single-sided, through-hole only, CNC isolation-milled with an 0.8 mm end mill (the DTU 62768 process). The topology is the PrintYourSpeakers reference crossover, unchanged; only the component values are substituted for what the DTU component shop actually stocks.

FileWhat it is
illuminate7mk2-crossover.kicad_sch / .kicad_prothe schematic (KiCad 10)
illuminate7mk2-crossover.pdf / .pngrendered sheet
illuminate7mk2-crossover-bom.csvBOM straight out of KiCad
tools/crossover_layout.pythe script that draws the sheet — edit this, not the .kicad_sch
tools/make_coil_footprints.pygenerates the air-core coil footprints
lib/crossover.pretty/those coil footprints
sim/ngspice comparison of reference vs. substituted values
illuminate7mk2-crossover.kicad_pcbthe placed, unrouted board
illuminate7mk2-crossover-pcb.pngrender of the placement
tools/pcb_build.pybuilds and places the board from the netlist — re-run it after changing footprints

Status: schematic done (ERC 0 violations), board routed by hand on B.Cu, 144.5 × 110 mm, four M4 corner holes, DRC clean. Mill and laser files are in production/illuminate7mk2-crossover/ (Gerbers + Excellon for the CAM, _silk_top.dxf for the laser silkscreen). Coils: L102 may be a shop 270 µH if it passes the LCR check; L101, L201 and L202 are to be wound.

Circuit

text
IN+ ─┬─[ C 2u2 ∥ L 0.20mH ∥ R 9R4 ]─ A ─[ C 5u5 ]─ B ─[ C 10u1 ]─ TWEETER +
     │                                             └─[ L 0.25mH ]─┐
     │                                                            │
     └─[ C 41u ∥ L 0.70mH ∥ R 20R ]─ C ─[ L 2.0mH ]─ D ───────────┼─ WOOFER +
                                                    └─[ C 11u5 ]──┤
IN− ─────────────────────────────────────────────────────────────┴─ both −

The GND symbol on the sheet is IN−, the amplifier's negative speaker terminal and the common return for both drivers. It is not chassis earth, and the left and right boards' returns must stay separate — the Fosi V3 is a bridged (BTL) class-D amp and its negative outputs are not ground.

BOM

From the DTU component shop — per board

QtyShop part numberRefsReplaces (design value)
22u2 film capC101, C103C101 = 2.0 µF tank; C103 is half of the 5.6 µF
33u3 film capC102, C105, C207halves of 5.6 µF, 10 µF and 12 µF
16u8 film capC104half of the 10 µF
68u2 film capC201–C205, C2065 in parallel = 40 µF tank; C206 is half of the 12 µF
24R7 5W power resistorR101, R102in series = 9.4 Ω / 10 W (design 10 Ω)
210R 5W power resistorR201, R202in series = 20 Ω / 10 W (design 20 Ω)
32 pol skrueterminalJ1, J2, J3input, tweeter, woofer

For two boards: double every quantity — 4 × 2u2, 6 × 3u3, 2 × 6u8, 12 × 8u2, 4 × 4R7 5W, 4 × 10R 5W, 6 × 2-pole screw terminals.

How the parallel groups add up:

GroupShop partsResultDesign valueError
C1012u22.2 µF2.0 µF+10 %
C102 ∥ C1033u3 + 2u25.5 µF5.6 µF−1.8 %
C104 ∥ C1056u8 + 3u310.1 µF10 µF+1 %
C201…C2055 × 8u241 µF40 µF+2.5 %
C206 ∥ C2078u2 + 3u311.5 µF12 µF−4.2 %
R101 + R1022 × 4R7 5W9.4 Ω / 10 W10 Ω / 10 W−6 %
R201 + R2022 × 10R 5W20 Ω / 10 W20 Ω / 10 Wexact

Coils — buy these, the shop has nothing usable

The shop stocks only small ferrite chokes with no current rating and a few bare toroid cores, and no magnet wire. All four coils are air-core, 0.8 mm (20 AWG) wire. Per board:

RefValueTarget DCRDaytonJantzen (Danish)
L1010.20 mH0.29 ΩAC20-20Air Core 0.20 mH / 0.80 mm
L1020.25 mH0.35 ΩAC20-25Air Core 0.25 mH / 0.80 mm
L2010.70 mH0.60 ΩAC20-70Air Core 0.70 mH / 0.80 mm
L2022.0 mH1.06 ΩAC202Air Core 2.0 mH / 0.80 mm

Buy eight coils in total, two of each. Air-core only: an iron or ferrite core saturates and distorts at woofer levels. Check the DCR on the datasheet — it is part of the design, not a parasitic, and a coil with materially lower DCR shifts the level of that branch.

Or wind them yourself

Air-core coils are just wire on a bobbin, so with enamelled copper wire and an LCR meter they can be wound at home. Use 0.8 mm wire: it is what the Dayton parts use, and it lands the DCR on the design value. Starting points (Wheeler multilayer formula, 3D-printed bobbin, hand-wound with ~15 % slack):

RefValueBobbin core Ø × widthTurnsLayersODWireDCR
L1010.20 mH20 × 10 mm~9110≈40 mm8.5 m≈0.29 Ω
L1020.25 mH22 × 10 mm~9610≈42 mm9.6 m≈0.33 Ω
L2010.70 mH28 × 12 mm~14112≈52 mm17.7 m≈0.60 Ω
L2022.0 mH40 × 14 mm~19514≈68 mm33 m≈1.1 Ω

Total wire for two boards: about 140 m of 0.8 mm. Procedure:

  1. Print a bobbin with the core diameter above, flanges 2 mm taller than the expected winding depth, and a slot in one flange for the start lead.
  2. Wind about 5 % fewer turns than the table, tight and in even layers, keeping the wire under tension. Count turns.
  3. Measure L on the LCR meter at 1 kHz. Inductance goes with turns squared, so add turns as N_new = N × sqrt(L_target / L_measured). Aim for ±3 %.
  4. Measure DCR on the meter's DC-resistance range (or 4-wire if it has it) and compare with the target above. If the coil comes out lower than target, add a shop 5 W resistor in series to make up the difference (0.1–0.68 Ω are stocked); if it is more than ~0.1 Ω higher, the wire is thinner than 0.8 mm or the coil is looser than assumed, and it is better to rewind.
  5. Fix the winding with a few wraps of tape or a drop of glue, and keep the two coils of each branch at least one coil diameter apart, or at right angles, on the board so they do not couple.

Thicker wire (1.0 mm) gives about 30 % lower DCR than the design, so it needs the series-resistor trim in step 4 on every coil; thinner wire (0.6 mm) makes the DCR too high and should not be used for L202.

Capacitor voltage ratings (read off the parts)

The Fosi V3 runs from 48 V and is bridged, so the input can swing about ±45 V. The shop parts, as printed on them:

PartRatingVerdict
2u263 Vat the minimum; accepted, it is the weak point at full power
3u3, 6u8100 Vfine
8u2600 Vfine

Does this make an adequate crossover?

Yes. sim/crossover_ac.cir runs both versions side by side in ngspice with the drivers modelled as plain resistors (4 Ω tweeter, 8 Ω woofer) and the coil DCRs included, and sim/compare.py reports the difference over 100 Hz – 20 kHz:

BranchMax deviation from the referenceRMS
Tweeter+0.54 dB at 12.7 kHz0.23 dB
Woofer+0.42 dB at 1.05 kHz0.23 dB

Nowhere in the band does either branch move more than 0.54 dB, and the woofer stays under 0.5 dB everywhere. That is below the tolerance of the drivers themselves (Dayton quotes ±10 % on Thiele-Small parameters, and 5 % film caps are already worth a few tenths of a dB), and well under what is audible on a broad, smooth deviation like this. The substituted set is fine.

Reproduce it with:

bash
cd sim && ngspice -b crossover_ac.cir && python3 compare.py

Board layout

tools/pcb_build.py builds the .kicad_pcb from the schematic netlist and places it on a fixed floorplan that follows the signal flow, packed from the footprints' real courtyards. 151 × 120 mm on the measured footprints, inside the mill's 203 × 152 mm envelope. Re-run after any footprint change:

bash
kicad-cli sch export netlist --format kicadsexpr -o /tmp/xo.net illuminate7mk2-crossover.kicad_sch
python3 ~/.claude/skills/kicad-laser-pcb/scripts/pcb_netlist_json.py /tmp/xo.net /tmp/xo.json
python3 tools/pcb_build.py /tmp/xo.json illuminate7mk2-crossover.kicad_pcb
text
 row A   L101 pads | C101 R101 R102 | C102 C103 | L102 pads | C104 C105 | J2 TWEETER   (top)
 row C   J1 IN, R201 R202 | C201 C202 C203 C204 C205 | L201 pads                     (middle)
 row B   L202 pads | C206 C207 | J3 WOOFER                                           (bottom)
  • The coils are not on the board. They would not fit the mill envelope, so each coil has only its two lead pads (crossover:L_OffBoard_P10.16mm, 10.16 mm pitch, 1.4 mm holes) at a board edge: L101 left edge top, L202 left edge bottom, L201 right edge middle, L102 top row between the tweeter caps. Mount the coil bodies overhanging the edge next to their pads, or glue them to the enclosure beside the board, and bring the leads to the pads. Keep any two coils at least one coil diameter apart, and never stack one on another.
  • Input on the left edge, tweeter out top-right, woofer out bottom-right.
  • Copper is B.Cu only, single-sided. A GND zone is defined on B.Cu (the return for both drivers) but not filled — fill it after routing.
  • Design rules: 0.85 mm clearance, 1.0 mm minimum track, 2.0 mm default track. Use 2 mm or wider for everything; this board carries amps.
  • Four M4 holes in the corners, 6 mm in. The Illuminate enclosure has five M4 inserts for its own crossover plate; match those positions once you have the printed part, by editing HOLE_INSET / the hole list in the build script.
  • The terminal-block footprints show a small triangle on the wire-entry side. J1 faces left, J2/J3 face right; if the real blocks turn out to open the other way, flip the rotation (90 ↔ 270) in ROW_A/B/C.
  • DRC: 0 violations. Placement score: rotation, spacing and alignment pass; cohesion is 0.43 against a 0.25 threshold, which is the price of pushing the coil pads to the edges.

Routing notes for the hand pass: IN+ is the big net (11 pads, J1 → L101 tank, R101, C101, and the whole woofer tank). Run it as one wide bus along the left side and the middle row. GND has only six pads and the pour carries it. The circuit is series-parallel, so nothing forces a wire bridge: it routes on one layer with zero jumpers if the placement is respected.

Measured footprints

Every shop part was measured with calipers on 2026-09-24 (pitch = leads outside to outside minus one lead Ø). The same table is in the DTU-EKB footprint repo (DTU-EKB/KiCad-components), so these never need measuring again.

PartBody L × W × H (mm)PitchFootprint
2u2 film, 63 V25.7 × 6.2 × 1522.5C_Rect_L26.5mm_W7.0mm_P22.50mm_MKS4
3u3 film, 100 V25 × 8.2 × 17.822.5C_Rect_L26.5mm_W8.5mm_P22.50mm_MKS4
6u8 film, 100 V31 × 11 × 2127.5C_Rect_L31.5mm_W11.0mm_P27.50mm_MKS4
8u2 film, 600 V31.5 × 13.3 × 2827.5C_Rect_L31.5mm_W13.0mm_P27.50mm_MKS4
4R7 5W, axial24 × Ø8.527.94R_Axial_Power_L25.0mm_W9.0mm_P27.94mm
10R 5W, axial18 × 6 × 622.4R_Axial_Power_L20.0mm_W6.4mm_P22.40mm
2-pole screw terminalstock5.0TerminalBlock_MaiXu_MX126-5.0-02P_1x02_P5.00mm

Still open: the coil lead spacing if the wire ends up thicker than 1.0 mm (raise DRILL in tools/make_coil_footprints.py), and the enclosure's M4 insert positions. pcb_build.py drops the bottom edge until the bottom corner holes clear every courtyard by 1 mm.

Notes on manufacturability

Every footprint currently on the board clears the 0.8 mm mill floor with room to spare — the smallest pad-to-pad gap is 2.2 mm on the screw terminals, so no .kicad_dru exceptions are needed. The netclass is already set to the CNC profile (1.0 mm track, 0.85 mm clearance).

The coil footprints live in a project library, registered in fp-lib-table as crossover. KiCad reads that at project load, so open the project rather than the bare .kicad_sch if a footprint shows up as missing.

To redraw the sheet after a change, edit tools/crossover_layout.py and run it — it rewrites both the .kicad_sch and the .kicad_pro, and verifies the netlist against the intended topology before it writes anything. Close KiCad first; it does not notice a .kicad_sch changing underneath it and will overwrite your file from its stale copy on save.

Parts

32
QtyValueFootprintReferences
410kResistor_SMD:R_0805_2012MetricR3, R4, R5, R6
3100nCapacitor_SMD:C_0805_2012MetricC3, C5, C7
310uCapacitor_SMD:C_0805_2012MetricC1, C2, C4
34.7kResistor_SMD:R_0805_2012MetricR9, R10, R11
21kResistor_SMD:R_0805_2012MetricR7, R8
25.1kResistor_SMD:R_0805_2012MetricR1, R2
2S8050Package_TO_SOT_SMD:SOT-23Q1, Q2
11-WireConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ5
11uCapacitor_SMD:C_0805_2012MetricC6
1AMS1117-3.3Package_TO_SOT_SMD:SOT-223-3_TabPin2U2
1BOOTButton_Switch_SMD:SW_SPST_PTS645Sx43SMTR92SW2
1CH340CPackage_SO:SOIC-16_3.9x9.9mm_P1.27mmU3
1ESP32-WROOM-32esp32node:ESP32-WROOM-32_NoViasU1
1GPIO LConnector_PinHeader_2.54mm:PinHeader_1x16_P2.54mm_VerticalJ2
1GPIO RConnector_PinHeader_2.54mm:PinHeader_1x16_P2.54mm_VerticalJ3
1I2CConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ4
1LED blueLED_SMD:LED_0805_2012MetricD2
1LED red (power)LED_SMD:LED_0805_2012MetricD1
1RESETButton_Switch_SMD:SW_SPST_PTS645Sx43SMTR92SW1
1USB-CConnector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_HorizontalJ1

Questions

How big is the Esp32node wip PCB?

It measures 63 × 60.8 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Esp32node wip use?

32 parts, built around the CH340C, ESP32-WROOM-32, AMS1117-3.3 and S8050. 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 Esp32node wip KiCad files?

From the MadsRudolph/personal-projects repository on GitHub, at the commit this page was made from: the board is esp32-node/esp32node/wip_route/esp32node_wip.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Esp32node wip design in my own project?

Its repository states no licence, so its author keeps all rights: ask MadsRudolph before reusing the design.

More from MadsRudolph/personal-projects

7
  • 2 layersMultimeter, the printed circuit board in 3D

    Multimeter

    MadsRudolph/personal-projects

    One passive crossover board per speaker, so build two. Single-sided, through-hole only, CNC isolation-milled with an 0.8 mm end mill (the DTU 62768 process).

    62 parts
  • 2 layers190.5 × 104 mmClassd.autoplaced.refined.routed, the printed circuit board in 3D

    Classd.autoplaced.refined.routed

    MadsRudolph/personal-projects

    One passive crossover board per speaker, so build two. Single-sided, through-hole only, CNC isolation-milled with an 0.8 mm end mill (the DTU 62768 process).

    61 parts
  • 2 layers147 × 99 mmMonitor boost, the printed circuit board in 3D

    Monitor boost

    MadsRudolph/personal-projects

    One passive crossover board per speaker, so build two. Single-sided, through-hole only, CNC isolation-milled with an 0.8 mm end mill (the DTU 62768 process).

    47 parts
  • 2 layers101 × 104 mmSubxo, the printed circuit board in 3D

    Subxo

    MadsRudolph/personal-projects

    One passive crossover board per speaker, so build two. Single-sided, through-hole only, CNC isolation-milled with an 0.8 mm end mill (the DTU 62768 process).

    44 parts
  • 2 layers148 × 100 mmIlluminate7mk2-crossover, the printed circuit board in 3D

    Illuminate7mk2-crossover

    MadsRudolph/personal-projects

    One passive crossover board per speaker, so build two. Single-sided, through-hole only, CNC isolation-milled with an 0.8 mm end mill (the DTU 62768 process).

    27 parts
  • 2 layers53.4 × 40.5 mmRode preamp, the printed circuit board in 3D

    Rode preamp

    MadsRudolph/personal-projects

    One passive crossover board per speaker, so build two. Single-sided, through-hole only, CNC isolation-milled with an 0.8 mm end mill (the DTU 62768 process).

    20 parts
  • 2 layers54 × 45.8 mmEsp32solder.placed, the printed circuit board in 3D

    Esp32solder.placed

    MadsRudolph/personal-projects

    One passive crossover board per speaker, so build two. Single-sided, through-hole only, CNC isolation-milled with an 0.8 mm end mill (the DTU 62768 process).

    17 parts

Similar boards

  • 2 layers85 × 56 mmHB RF ETH, the printed circuit board in 3D

    HB RF ETH

    alexreinert/PCB

    Some of my PCBs

    96 parts104
  • 2 layers35 × 45 mmLVGLDevKit, the printed circuit board in 3D

    LVGLDevKit

    jppang/ESP32_MicroPython_LVGL_ST7789

    Try to build an ESP32 firmware with LVGL and ST7789 drivers inside.

    40 parts2
  • 4 layers100 × 80 mmHackathon board v2, the printed circuit board in 3D

    Hackathon board v2

    Brian-Nziza/ESP32-Hackathon-Board

    KiCad 10 project. Board is 100 × 80 mm, four layers, fabricated by JLCPCB.

    75 parts
  • 2 layers80 × 45 mmKizami, the printed circuit board in 3D

    Kizami

    hasky00/kizami-core

    FPGA side of Kizami — cycle-exact timecode + audio witness on iCE40

    36 partsMIT
  • 2 layers162.8 × 99.9 mmPSU, the printed circuit board in 3D

    PSU

    Sakib-Ansari/Linear_Programmable_Power_Supply

    This repository contains the complete KiCad project for a multi-board linear programmable bench power supply. The design is organized into separate PCBs, including the Power Board, Control Board, Front Panel, Output…

    133 partsMIT
  • 4 layers72 × 53 mmUnijoysticle2 xl800, the printed circuit board in 3D

    Unijoysticle2 xl800

    ricardoquesada/unijoysticle2

    Bluetooth gamepad support for the Commodore 64 / Atari / Amiga, etc.

    58 parts62
  • 2 layers49.4 × 95.7 mmPhysiowand, the printed circuit board in 3D

    Physiowand

    1tsMS/Physiowand

    91 parts