Skip to the content
6 layers160 × 100 mmBuslab, the printed circuit board in 3D

HILprobe: multi-function UUT probe for hardware-in-the-loop testing - RS-485, CAN FD, logic analyzer, 4-ch scope, two programmable UUT supplies. KiCad 10, 6 layers, RP2350B + ESP32-S3.

Size
160 × 100 mm
Copper layers
6
Thickness
1.6 mm
Parts
429
Nets
393
Pads
1,761
Tracks, vias
3,758, 1,441
Pours
54
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
6 Oct 2026
Updated
6 Oct 2026

Overview

Buslab is an open-source printed circuit board by tombueng, from the tombueng/hilprobe repository on GitHub. It is a 6-layer board of 160 × 100 mm with 429 parts on 393 nets, routed with 3,758 tracks and 1,441 vias.

It is built around the THVD2450D, 74HCT541D and OPA2365AID, with the TCA9534PW, GAQY212GS and SN74LVC1G3157DCKR among its other parts. Its parts include 147 capacitors, 119 resistors, 49 ICs, 20 diodes and 10 transistors. It belongs with the sensors and measurement and interfaces and adapters boards and the ESP32 and RP2350 boards of this library.

Main components

12

README

README.md

HILprobe

A multi-function probe for a unit under test (UUT), made to be driven by hardware-in-the-loop and automated test tooling. One board powers the UUT, talks on its buses, watches its pins and measures what it draws, all on one timebase, remote-controlled over USB, WiFi or Ethernet. Internal project name: BusLab.

HILprobe, raytraced render of the top side

Status (2026-10-06): schematic, placement and routing done, pre-fab review and rework done (docs/PREFAB_REVIEW.md); KiCad DRC, the JLCPCB DFM check and an EMC field check are clean. Not yet manufactured or tested. Firmware is not written yet: the hardware numbers below are the design's, the functions marked firmware are planned (docs/FIRMWARE_NOTES.md, spec/).

What you can do with it

  • Power the UUT and watch what it draws. Two programmable supplies, 0.8-5.0 V at 500 mA each, switched on and off by firmware, with current measurement from sleep currents (0.25 µA steps) to 540 mA, ranging automatically within microseconds. Power-cycle tests, supply steps, brown-out tests, sleep-current and wake-up profiles.
  • Sit on its buses. Three RS-485 ports and one CAN FD port, listening all the time (own frames included) and sending, every byte timestamped on the capture timebase. Termination and fail-safe bias are switched per port by firmware, so the probe can be the end of a bus or a tap in the middle of one.
  • Capture its pins. Ten digital inputs as a logic analyzer (TTL thresholds, 3.3 V and 5 V logic, ±30 V tolerant) and four analog channels as a small scope (±10 V / ±30 V, 1 MΩ, 12 bit).
  • Catch what the ADC is too slow for. Two fast comparators per analog channel (9-21 ns, 12-bit thresholds) timestamp every crossing: voltage dips shorter than one ADC sample are caught and measured. Triggers on edges, patterns, analog levels, RS-485 bytes and an external input, combinable into sequences (firmware).
  • Stimulate it. Four outputs and a trigger output at 1.8 / 2.5 / 3.3 / 5.0 V (set by firmware): UART, PWM, button presses, reset lines.
  • Let a script or an AI agent run the test. SCPI over USB, WiFi and Ethernet; a Python driver and an MCP server let an LLM agent configure, capture and decode on its own (firmware).

Technical data

Analog inputs4 channels A1-A4, 1 MΩ ∥ 19 pF, DC coupled, ranges ±10 V and ±30 V per channel by firmware (×10 probe compensation holds on both); max ±50 V continuous, ±100 V peak. About 10 MHz bandwidth to the ADC, more to the comparators. RP2350 ADC: 12 bit (9.2 ENOB), 500 kS/s shared (125 kS/s per channel with all four), 1 LSB 5.4 mV (±10 V) / 16 mV (±30 V). Assembly option: 4 × ADS7883, 2 MS/s per channel, sampled simultaneously
Comparators2 per analog channel (threshold and window), TLV3502, 9-21 ns, 6 mV hysteresis, 12-bit thresholds (2 × MCP4728): dips from 100 ns are caught
Digital inputs10 channels D1-D10 through 74HCT541, TTL thresholds (low < 0.8 V, high > 2.0 V: 3.3 V and 5 V logic), signals to 10 MHz, sampled up to 100 MS/s (firmware), 10 kΩ ∥ 47 pF series input, max ±24 V continuous, open inputs read low
OutputsOUT1-4 (ESP32-S3) and TRIG OUT (RP2350) through SN74LVC8T245, level off / 1.8 / 2.5 / 3.3 / 5.0 V by firmware (TLV75801P), 330 Ω series, Schottky clamps, high-impedance at power-up
RS-4853 ports, THVD2450 (50 Mbit/s, 1/8 unit load, ±70 V fault, ±25 V common mode), half duplex; 120 Ω termination and 330 Ω fail-safe bias per port behind photoMOS switches, all off at power-up (passive listener); TVS on every line
CANCAN FD up to 5 Mbit/s, TCAN1051HGV (±70 V fault, ±30 V common mode), switchable 120 Ω, listen-only at power-up
UUT power2 outputs, 0.8-5.0 V in 1.2 mV steps, 500 mA each, an AP7361C-ADJ LDO per output fed from a 5.28 V boost (TPS61023), set by a 12-bit DAC (MCP4822). Step up ~0.2 ms, down 0.2-1.3 ms (discharge FET). Current: INA236 + INA190 with automatic range switching, 0.25 µA steps to 8 mA, 17 µA steps to 540 mA. Protection: firmware trip, 1.1 A hard limit, over-current alert switches the LDO off in hardware, off at power-up; dissipation (5.3 V − Vout) × I ≤ 1.5 W per output. Not for feeding an external supply back
TriggerTRIG IN (TTL, ±30 V), TRIG OUT (pulse at the trigger, at the output level); sources: TRIG IN, comparators, windows, digital patterns, RS-485 / CAN frames, the ESP32-S3. One timebase for analog, digital, RS-485 and CAN
Instrument MCURP2350B (chip-down, Raspberry Pi's reference circuit), 150 MHz, PIO capture of all inputs on one clock, 16 MB QSPI flash, 8 MB PSRAM for long captures
Gateway MCUESP32-S3-WROOM-1-N16R8 (16 MB flash, 8 MB PSRAM): USB, WiFi, Ethernet, CAN, the outputs, scripts; SPI link to the RP2350, updates it over SWD
NetworkWiFi (ESP32-S3); Ethernet 10/100 with a USR-ES1 (W5500) module soldered on, optional
USBtwo USB-C sockets: ESP32-S3 (USB serial / JTAG, control) and RP2350 (hold BOOTSEL and plug in: UF2 drive; development and standalone use)
Power5 V from either USB-C socket (TPS2121 power mux, highest input wins); cut-off above 5.2-5.7 V, TVS and USB ESD on both, 220 µF hold-up; about 0.37 A typical, 1.2 A peak, 2.4 A with both UUT outputs at 500 mA (a 3 A USB-C source)
ExpansionI²C, 3 spare GPIOs (100 Ω series; E1 is a 3.3 V-only RP2350 pin), 3.3 V and 5 V out through 200 mA PTCs
DebugSWD and RUN of the RP2350, ESP32-S3 console; test pads for 5 V, 3V3 IO, 3V3 S3, 3V3 RP, VA, VA CMP, GND
Connectorsseven JST SH 12-pin, 1.0 mm pitch (board: SM12B-SRSS-TB; cable: housing SHR-12V-S or SHR-12V-S-B, contacts SSH-003T-P0.2-H for AWG 32-28); pins 11 and 12 are GND on every one except EXPANSION
Board160 × 100 mm (Eurocard), 6 layers (JLC06161H-2116A, two solid GND planes), all parts on the top side for machine assembly, four M3 holes; the back carries the pin table and a data sheet of the board

Connectors

All seven are JST SH 12. The table is printed on the back of the board.

PinRS-485 / CANDIGITAL INOUTPUTSANALOG INUUT POWEREXPANSIONDEBUG
11AD1OUT1A1UUT2SDASWCLK
21BD2GNDGNDUUT2SCLGND
3GNDD3OUT2A2UUT2GNDSWDIO
42AD4GNDGNDGNDE1GND
52BD5OUT3A3GNDE2RUN
6GNDD6GNDGNDGNDE3GND
73AD7OUT4A4UUT1GNDS3 TX
83BD8GNDGNDUUT1GNDS3 RX
9CANLD9TRIG OCALUUT1GNDGND
10CANHD10GNDTRIG IGNDGNDGND
11GNDGNDGNDGNDGND3V3GND
12GNDGNDGNDGNDGND5VGND

CAL is a 2.500 V ±0.1 % reference (LM4040A) for calibrating the analog channels.

HILprobe, raytraced render of the back side with the pin table

Repository

PathWhat
hw/KiCad 10 project: schematic sheets, board, design rules, custom footprints and symbols, 3D models
export/fab/Gerbers and drill (buslab-gerber.zip), pick-and-place for JLCPCB (buslab-cpl.csv)
export/bom/BOMs: JLCPCB assembly (jlcpcb-reduced.csv, jlc-all-bom.csv), self-sourced (Reichelt, TME), hand-fitted parts
export/schematic PDF, STEP model, raytraced renders
docs/design and decisions, analog front end, PCB rules, placement, routing, EMC checklist, pre-fab review, firmware notes, toolchain
ASSEMBLY.md, BRINGUP.mdassembly options and the bring-up sequence for the first board
tools/the generators: circuit in Python to schematic and netlist, footprints, placement, an own router, checks, BOM / CPL, shop lookups, SPICE simulations, the EMC field-check scenario
spec/the original requirements for hardware and software

Everything in hw/ and export/ is generated by tools/ (see docs/TOOLCHAIN.md): the circuit is written in Python, placement and routing are scripts, and tools/pcb/fab.sh turns the board into the fabrication outputs. Requires KiCad 10 (kicad-cli and the pcbnew Python module), Python 3 and ngspice; tools/setup.sh sets up the rest.

EMC field check

The board was run through emcvisual, with 28 sources (clocks, buses, USB, switching regulators) whose values come from the datasheets (hw/buslab.scenario.json, written by tools/emc/buslab_scenario.py). To look at it in 3D: open the board in emcvisual, then "Load scenario" with hw/buslab.scenario.json. Results and what was changed: docs/EMC_CHECKLIST.md.

Not included

Datasheets, application notes and the TI SPICE models the design was checked against belong to their makers and are not redistributed here. hw/datasheets/SOURCES.md lists every document by name (with a link where one is known), tools/frontend/models/README.md where to get the SPICE models.

License

  • Hardware design and documentation (hw/, export/, docs/, the Markdown files): CERN Open Hardware Licence Version 2 - Permissive (LICENSES/CERN-OHL-P-2.0.txt).
  • Software (tools/): MIT (LICENSES/MIT.txt).
  • Third-party parts keep their own licenses: footprints and 3D models derived from the KiCad libraries (CC-BY-SA 4.0 with the KiCad library exception), the Waveshare Core2350B KiCad files in hw/datasheets/core2350b/thirdparty_kicad/ (MIT, see its LICENSE.md).

Copyright 2026 Thomas Büngener.

Parts

429
QtyValueFootprintReferences
70100nCapacitor_SMD:C_0402_1005MetricC103, C106, C111, C114, C117, C119, C120, C1001, C1002, C1005, C1101, C1201, C1301, C1501, C1502, C1607 +54
251uCapacitor_SMD:C_0402_1005MetricC101, C102, C109, C112, C115, C118, C203, C506, C511, C512, C1003, C1004, C1605, C1606, C1702, C1802 +9
19100kResistor_SMD:R_0402_1005MetricR107, R109, R110, R403, R508, R1602, R1704, R1710, R1711, R1712, R1715, R1804, R1810, R1811, R1812, R1815 +3
152.0kResistor_SMD:R_0402_1005MetricR401, R402, R505, R506, R507, R605, R606, R607, R705, R706, R707, R805, R806, R807, R1401
1210kResistor_SMD:R_0402_1005MetricR203, R205, R206, R215, R303, R1107, R1207, R1307, R1503, R1603, R1713, R1813
1147pCapacitor_SMD:C_0402_1005MetricC901, C902, C903, C904, C905, C906, C907, C908, C909, C910, C911
10GAQY212GSPackage_SO:SO-4_4.4x4.3mm_P2.54mmU1101, U1102, U1103, U1201, U1202, U1203, U1301, U1302, U1303, U1501
822uCapacitor_SMD:C_0603_1608MetricC108, C110, C113, C116, C201, C204, C402, C404
8330RResistor_SMD:R_0402_1005MetricR1001, R1103, R1105, R1203, R1205, R1303, R1305, R1502
8330pCapacitor_SMD:C_0402_1005MetricC503, C505, C603, C605, C703, C705, C803, C805
8470kResistor_SMD:R_0603_1608MetricR501, R502, R601, R602, R701, R702, R801, R802
84x33RResistor_SMD:R_Array_Convex_4x0402RN201, RN202, RN206, RN207, RN502, RN602, RN702, RN802
733RResistor_SMD:R_0402_1005MetricR213, R214, R301, R510, R610, R710, R810
74x330RResistor_SMD:R_Array_Convex_4x0402RN907, RN908, RN909, RN1001, RN1101, RN1201, RN1301
6BAT54SWPackage_TO_SOT_SMD:SOT-323_SC-70D1001, D1002, D1003, D1004, D1005, D1601
6SMF28CADiode_SMD:D_SOD-123FD1101, D1102, D1201, D1202, D1301, D1302
510uCapacitor_SMD:C_0805_2012MetricC104, C107, C1601, C1602, C1603
52N7002Package_TO_SOT_SMD:SOT-23Q1002, Q1701, Q1704, Q1801, Q1804
54.7kResistor_SMD:R_0402_1005MetricR112, R217, R304, R1707, R1807
547kResistor_SMD:R_0402_1005MetricR1002, R1702, R1708, R1802, R1808
54x100kResistor_SMD:R_Array_Convex_4x0402RN901, RN903, RN905, RN1002, RN1003
54x10kResistor_SMD:R_Array_Convex_4x0402RN203, RN204, RN902, RN904, RN906
5JST SH 12BusLabCustom:JST_SH_SM12B-SRSS-TB_1x12-1MP_P1.00mm_Horizontal_EdgeOverhangJ1401, J1402, J1403, J1404, J1405
4105kResistor_SMD:R_0402_1005MetricR504, R604, R704, R804
410uCapacitor_SMD:C_0603_1608MetricC1701, C1703, C1801, C1803
4120RResistor_SMD:R_0805_2012MetricR1101, R1201, R1301, R1501
418p/100VCapacitor_SMD:C_0603_1608MetricC501, C601, C701, C801
44.7pCapacitor_SMD:C_0402_1005MetricC504, C604, C704, C804
44.7uCapacitor_SMD:C_0402_1005MetricC312, C313, C314, C318
45.1kResistor_SMD:R_0402_1005MetricR101, R102, R103, R104
495.3kResistor_SMD:R_0402_1005MetricR503, R603, R703, R803
4ADS7883Package_TO_SOT_SMD:SOT-23-6U503, U603, U703, U803
4BAV199WPackage_TO_SOT_SMD:SOT-323_SC-70D501, D601, D701, D801
4INA236Package_TO_SOT_SMD:TSOT-23-8U1702, U1703, U1802, U1803
4M3MountingHole:MountingHole_3.2mm_M3_Pad_ViaH1401, H1402, H1403, H1404
4OPA2365Package_SO:SOIC-8_3.9x4.9mm_P1.27mmU501, U601, U701, U801
4SN74LVC1G3157Package_TO_SOT_SMD:SOT-363_SC-70-6U502, U602, U702, U802
4TCA9534Package_SO:TSSOP-16_4.4x5mm_P0.65mmU403, U404, U1003, U1603
4TLV3502Package_TO_SOT_SMD:SOT-23-8U504, U604, U704, U804
320kResistor_SMD:R_0402_1005MetricR1003, R1703, R1803
32N7002DWPackage_TO_SOT_SMD:SOT-363_SC-70-6Q1001, Q1703, Q1803
3FIDBusLabCustom:Fiducial_1mm_Mask2mm_Keepout3mmFID1401, FID1402, FID1403
3THVD2450BusLabCustom:VSON-8-1EP_3x3mm_P0.65mm_EP1.6x2.4mm_EP5U1104, U1204, U1304
20.15R 1%Resistor_SMD:R_0805_2012MetricR1706, R1806
21.0kResistor_SMD:R_0402_1005MetricR1709, R1809
210R 1%Resistor_SMD:R_0603_1608MetricR1705, R1805
215kResistor_SMD:R_0402_1005MetricR1701, R1801
215pCapacitor_SMD:C_0402_1005MetricC321, C322
21kResistor_SMD:R_0402_1005MetricR302, R305
2200mA holdFuse:Fuse_0805_2012MetricF201, F202
2220u 10V polymerCapacitor_SMD:CP_Elec_6.3x7.7C105, C1604
222RResistor_SMD:R_1206_3216MetricR1714, R1814
224kResistor_SMD:R_0402_1005MetricR106, R108
227RResistor_SMD:R_0402_1005MetricR201, R202
274HCT541Package_SO:TSSOP-20_4.4x6.5mm_P0.65mmU901, U902
2AO3400APackage_TO_SOT_SMD:SOT-23Q1702, Q1802
2AP7361C-3.3Package_TO_SOT_SMD:SOT-223-3_TabPin2U105, U106
2AP7361C-ADJBusLabCustom:Diodes_U-DFN3030-8_TypeE_ThermalViasU1701, U1801
2GNDTestPoint:TestPoint_Pad_D2.0mmTP107, TP108
2INA190A4Package_TO_SOT_SMD:SOT-363_SC-70-6U1704, U1804
2JST SH 12Connector_JST:JST_SH_SM12B-SRSS-TB_1x12-1MP_P1.00mm_HorizontalJ201, J202
2SMAJ5.0ADiode_SMD:D_SMAD101, D102
2TLV7011Package_TO_SOT_SMD:SOT-353_SC-70-5U1705, U1805
2TPD1E10B06Diode_SMD:D_SOD-882D1701, D1801
2TYPE-C-31-M-12Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J101, J102
2USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U101, U102
1+3V3_IOTestPoint:TestPoint_Pad_D2.0mmTP102
1+5VTestPoint:TestPoint_Pad_D2.0mmTP101
11.5kResistor_SMD:R_0402_1005MetricR218
112MHz ABM8-272-T3Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mmY301
118kResistor_SMD:R_0402_1005MetricR1005
11u SWPA4030Inductor_SMD:L_Sunlord_SWPA4030SL1601
12.2u SRN4018Inductor_SMD:L_Bourns-SRN4018L101
122kResistor_SMD:R_0402_1005MetricR111
127kResistor_SMD:R_0402_1005MetricR105
13.3u AOTABusLabCustom:L_Abracon_AOTA-B201610_PolarityDotL301
139kResistor_SMD:R_0402_1005MetricR1004
13V3_RPTestPoint:TestPoint_Pad_D2.0mmTP104
13V3_S3TestPoint:TestPoint_Pad_D2.0mmTP103
14x100RResistor_SMD:R_Array_Convex_4x0402RN205

The 399 most common of 429 parts.

More from tombueng/hilprobe

1
  • 4 layers100 × 100 mmDac16, the printed circuit board in 3D

    Dac16

    tombueng/hilprobe

    HILprobe: multi-function UUT probe for hardware-in-the-loop testing - RS-485, CAN FD, logic analyzer, 4-ch scope, two programmable UUT supplies. KiCad 10, 6 layers, RP2350B + ESP32-S3.

    200 parts

Similar boards

  • 4 layers100 × 80 mmBuilt, the printed circuit board in 3D

    Built

    devbisme/ai-circuit-design-tests

    Tests of KiCad-related AI tools.

    243 parts10
  • 2 layers95 × 140 mmRadio Kiosk v2c, the printed circuit board in 3D

    Radio Kiosk v2c

    Filip-Kin/frc-radio-kiosk

    Bench box that powers and configures FRC radios: dual-mode PoE (802.3at via LTC4279, passive 12 V via TPS26600), USB-C PD or DC in, 15.6 V out for the Toughbook, 4x CR123A backup, STM32F072 firmware.

    239 parts
  • 6 layers167.5 × 79 mmHandheld, the printed circuit board in 3D

    Handheld

    gamebub/gamebub-pcb

    PCB design files for the Game Bub project

    356 parts31CERN-OHL-S-2.0
  • 4 layers50 × 70 mmRp569, the printed circuit board in 3D

    Rp569

    kelu124/rp569

    RP569 - PIOs to usb3 ( rp2350 x ch569 )

    146 parts3
  • 4 layers21 × 38 mmSticks3-piezo hat placement, the printed circuit board in 3D

    Sticks3-piezo hat placement

    Bongorian/M5basspiezohat

    M5StickS3 Hat2 five-channel bass piezo ADC board: KiCad design, TDM audio acquisition and JLCPCB fabrication data

    111 parts
  • 4 layersBetz mini, the printed circuit board in 3D

    Betz mini

    codebot/betz_experimental

    experimental firmware for betz drive

    78 partsApache-2.0
  • 4 layers100 × 100 mmPhmod, the printed circuit board in 3D

    Phmod

    gallicchio/AMOD-and-RFMOD

    The tutorial's 2x12 adapter (/mudd/133electronics/icepi-zero-dac-adc/adapterboard/) with a 2 x 6 right-angle Pmod socket on a 15 mm extension of its right-hand end, so an Icepi Zero can drive AMOD-A's and RF-MOD's Pmod…

    234 parts

Questions

How big is the Buslab PCB?

It measures 160 × 100 mm and has 6 copper layers, 1.6 mm thick.

What parts does the Buslab use?

429 parts, built around the THVD2450D, 74HCT541D, OPA2365AID and TCA9534PW. 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 Buslab KiCad files?

From the tombueng/hilprobe repository on GitHub, at the commit this page was made from: the board is hw/buslab.kicad_pcb and its schematic addons/dac16/hw/dac.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Buslab design in my own project?

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