Skip to the content
2 layersMultimeter, 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).

Copper layers
2
Thickness
1.6 mm
Parts
62
Nets
135
Pads
306
Tracks, vias
0, 0
Routed
Not yet
KiCad
KiCad 9.0 (file 20241229)
Created
15 Dec 2025
Updated
3 Oct 2026

Overview

Multimeter is an open-source printed circuit board by MadsRudolph, from the MadsRudolph/personal-projects repository on GitHub. It is a 2-layer board with 62 parts on 135 nets.

It is built around the LM358P, LM35DZ and MCP3208-CI/P, with the CD4053BE, DS1307+ and LM311N among its other parts. Its parts include 29 resistors, 8 capacitors, 8 ICs, 4 diodes and 4 switches. It belongs with the sensors and measurement boards of this library.

Main components

8

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

62
QtyValueFootprintReferences
710kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR9, R18, R22, R23, R24, R28, R29
5100nCapacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mmC1, C2, C3, C7, C8
310uCapacitor_THT:CP_Radial_D5.0mm_P2.50mmC4, C5, C6
3330Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR25, R26, R27
2Conn_01x01_PinConnector:Banana_Jack_1PinJ1, J2
10.145Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR14
11.002MResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR15
11.003MResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR17
11.05Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR13
110.03MResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR8
110.04Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR12
110.06MResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR7
1100kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR16
110AFuse:Fuseholder_Clip-5x20mm_Keystone_3517_Inline_P23.11x6.76mm_D1.70mm_HorizontalF1
11N4148Diode_THT:D_DO-35_SOD27_P7.62mm_HorizontalD4
11kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR21
132.768kHzCrystal:Crystal_C38-LF_D3.0mm_L8.0mm_HorizontalY1
14.755MResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR6
148.536kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR4
1497Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR2
1498kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR5
14990Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR3
150.15Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR1
1500mAFuse:Fuseholder_Clip-5x20mm_Keystone_3517_Inline_P23.11x6.76mm_D1.70mm_HorizontalF2
19.09kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR20
199.48Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR19
199.49Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR11
1998Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR10
1Arduino MegaA000067:MODULE_A000067A1
1CD4053BECD4053BE:DIP794W45P254L1969H508Q16U3
1CD74HC4067ECD74HC4067E:DIP254P762X508-24U2
1CR2032Battery:BatteryHolder_Keystone_3034_1x20mmBT1
1DS1307+Package_DIP:DIP-8_W7.62mmU8
1FUNCButton_Switch_THT:SW_PUSH_6mmSW2
1GreenLED_THT:LED_D3.0mmD2
1LM311NLM311N:DIP794W45P254L959H508Q8U5
1LM358PLM358P:DIP794W45P254L959H508Q8U4
1LM35DZLM35DZ:IC_LM35DZU7
1MCP3208-CI_PMCP3208-CI_P:DIP254P762X432-16U1
1MODEButton_Switch_THT:SW_PUSH_6mmSW1
1NE555PNE555P:DIP794W45P254L959H508Q8U6
1OLED_128X64_1.3_I2COLED_128X64_1.3_I2C:LCD_OLED_128X64_1.3_I2CDS1
1PiezoBuzzer_Beeper:Buzzer_12x9.5RM7.6BZ1
1RANGEButton_Switch_THT:SW_PUSH_6mmSW3
1RedLED_THT:LED_D3.0mmD1
1SELECTButton_Switch_THT:SW_PUSH_6mmSW4
1YellowLED_THT:LED_D3.0mmD3

More from MadsRudolph/personal-projects

7
  • 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 layers63 × 60.8 mmEsp32node wip, the printed circuit board in 3D

    Esp32node wip

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

    32 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 layers116.5 × 55.8 mmMedjc hub, the printed circuit board in 3D

    Medjc hub

    Sekimoto-Lab/medjc-esp32-farmware

    $$ \begin{align} VB = \frac{3.3}{4095} \times v \end{align} $$

    42 parts
  • 2 layers66 × 107.5 mmTonwerk haupt tht, the printed circuit board in 3D

    Tonwerk haupt tht

    Marcel-B/Synth

    Die beiden Browser-Synthesizer aus Tonwerk (YuE UI) als Plugins für Logic Pro: Tonwerk Analog und Tonwerk FM, jeder mit Delay und Hall und eigenen Werksklängen.

    81 parts
  • 4 layers160 × 100 mmStep load, the printed circuit board in 3D

    Step load

    AHGure/step_load

    212 parts
  • 2 layers90.7 × 52.5 mmDriver control, the printed circuit board in 3D

    Driver control

    ericbrauer/driver_control

    PCB Design for ETD555 group project

    38 parts
  • 2 layers127.1 × 67.1 mmBlinCAN, the printed circuit board in 3D

    BlinCAN

    metalhead777/blinCAN

    A 24 channel LED driver with CAN bus interface and Arduino-style microcontroller.

    103 partsCC-BY-SA-4.0
  • 2 layers99.1 × 99.1 mmFs6809sbc, the printed circuit board in 3D

    Fs6809sbc

    elekras/fs6809sbc

    A simple 6809 single board computer

    82 parts
  • 2 layers160.5 × 100.5 mmZ80, the printed circuit board in 3D

    Z80

    dennis9819/Z8C-Homebrew-Computer

    To easily develop for my Z80 homebrew system, I designed a simple assempler development environment. This packs the following tasks into one script: zmac assembly object file creation (for xmodem upload) monitor file…

    59 parts2

Questions

What parts does the Multimeter use?

62 parts, built around the LM358P, LM35DZ, MCP3208-CI/P and CD4053BE. 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 Multimeter KiCad files?

From the MadsRudolph/personal-projects repository on GitHub, at the commit this page was made from: the board is Projects/DTU Multimeter/KiCad/Multimeter/Multimeter.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Multimeter design in my own project?

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