Skip to the content
2 layers135 × 90 mmCable tester, the printed circuit board in 3D

design.py is the single source of truth: parts, footprints, pin-to-net map and positions. Everything else is generated from it.

Size
135 × 90 mm
Copper layers
2
Thickness
1.6 mm
Parts
66
Nets
193
Pads
494
Tracks, vias
1,476, 235
Pours
1
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
29 Sep 2026
Updated
29 Sep 2026

Overview

Cable tester is an open-source printed circuit board by Mykola2, from the Mykola2/uart-cable-tester repository on GitHub. It is a 2-layer board of 135 × 90 mm with 66 parts on 193 nets, routed with 1,476 tracks and 235 vias.

It is built around the 74AHCT1G125SE, MCP23017-E/SO and WS2812B, with the 1N4148W and MMBT3904 among its other parts. Its parts include 17 capacitors, 11 diodes, 5 resistors, 5 ICs and 5 connectors. It belongs with the RP2040 boards of this library.

Main components

5

README

hardware/README.md

Cable tester PCB (KiCad 9)

design.py is the single source of truth: parts, footprints, pin-to-net map and positions. Everything else is generated from it.

FileWhat it is
cable_tester.kicad_schSchematic. Every pin is connected by a net label; opens normally in KiCad.
cable_tester.kicad_pcbBoard, 135×90 mm, 2 layers. Routed with Freerouting, GND pours on both layers. DRC is clean apart from silkscreen warnings.
BOM.csvGrouped BOM with MPNs. fab/BOM_JLC.csv has the verified LCSC numbers.
fab/JLCPCB files (Gerber zip, BOM, CPL), regenerated by make_jlc.py.
move_decoupling.pyOne-off fix already applied to the routed board: moved C1–C4 next to the MCP23017 VDD pins.
cable_tester_schematic.pdf, render_top.png, render_bottom.pngPreviews of the schematic and the board.

Regenerate

bash
python gen_schematic.py
"C:/Program Files/KiCad/9.0/bin/kicad-cli.exe" sch erc cable_tester.kicad_sch
"C:/Program Files/KiCad/9.0/bin/kicad-cli.exe" sch export netlist --format kicadsexpr -o cable_tester.net cable_tester.kicad_sch
python check_design.py
"C:/Program Files/KiCad/9.0/bin/python.exe" gen_pcb.py

check_design.py checks the exported netlist against firmware/hwmap.py:

  • each of the 58 test lines runs connector pin → 220 Ω → the MCP23017 pin the firmware expects
  • the address straps are correct
  • no DUT pin touches a power net

The board is routed, so don't run gen_pcb.py again, because it overwrites the board. After that, make changes in the schematic (or design.py followed by gen_schematic.py), then use Tools → Update PCB from Schematic (F8).

Circuit summary

  • A1: Raspberry Pi Pico or a WeAct RP2040 (USB-C, same pinout).
    • USB supplies VBUS (+5 V), which powers the LEDs and buzzer.
    • The module's 3V3 output powers the MCP23017s.
    • Pins used: GP4 SDA, GP5 SCL, GP14 buzzer, GP15 button, GP16 LED data.
  • U1–U4: MCP23017 at I²C addresses 0x20–0x23. Every DUT contact goes to its own expander pin through one resistor in RN1–RN15 (4×220 Ω arrays).
    • U1: H1–16. U2: H17–32. U3: GPA = H33–40, GPB0–5 = TELEM1.
    • U4: GPA0–5 = TELEM2, GPB0–5 = TELEM3.
    • Spare lines: U3 GPB6–7, U4 GPA6–7, U4 GPB6–7.
  • J1: the 40-pin header. None of its pins touch GND, 3V3 or 5V. Each one is an isolated test line, which is why any future pinout can be tested with a config change only.
  • D1–D10: WS2812B, driven through U5 (74AHCT1G125) to shift the data line from 3.3 V to 5 V.
    • D1–D9 are the wire LEDs: TX / RX / GND for each TELEM connector.
    • D10 is the PASS/FAIL status LED.
  • BZ1: 5 V active buzzer, switched by Q1 with flyback diode D11.
  • SW1: START / LEARN button.
  • J5: optional SSD1306 OLED header. The firmware doesn't drive it yet.

Before ordering

  1. Route it. Freerouting works well:
    • export with File → Export → Specctra DSN, route in Freerouting, then import the .ses file
    • press B to fill the GND pours
    • run DRC
  2. Check JST orientation in the 3D viewer (Alt+3). The TELEM connectors must open toward the bottom board edge.
  3. Check the header orientation. It copies a Pi seen from above: pin 1 is bottom-left on the silkscreen, and the even-pin row is along the board edge. The cable must plug in exactly as it does on the Pi.
  4. Check the module footprint. If you use a Pico clone, confirm it matches RaspberryPi_Pico_SMD_HandSolder.
  5. JST-GH receptacles are consumables. They are rated for only ~50 mating cycles. Order spares and replace them with hot air when mating gets loose.

Parts

66
QtyValueFootprintReferences
15100nCapacitor_SMD:C_0603_1608MetricC1, C2, C3, C4, C5, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17
154x220Resistor_SMD:R_Array_Convex_4x0603RN1, RN2, RN3, RN4, RN5, RN6, RN7, RN8, RN9, RN10, RN11, RN12, RN13, RN14, RN15
10WS2812BLED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mmD1, D2, D3, D4, D5, D6, D7, D8, D9, D10
4M3MountingHole:MountingHole_3.2mm_M3MH1, MH2, MH3, MH4
4MCP23017-E/SOPackage_SO:SOIC-28W_7.5x17.9mm_P1.27mmU1, U2, U3, U4
210uCapacitor_SMD:C_0805_2012MetricC6, C7
24k7Resistor_SMD:R_0603_1608MetricR2, R3
110kResistor_SMD:R_0603_1608MetricR5
11N4148WDiode_SMD:D_SOD-123D11
11kResistor_SMD:R_0603_1608MetricR4
1330Resistor_SMD:R_0603_1608MetricR1
15V active buzzerBuzzer_Beeper:Buzzer_12x9.5RM7.6BZ1
174AHCT1G125Package_TO_SOT_SMD:SOT-23-5U5
1MMBT3904Package_TO_SOT_SMD:SOT-23Q1
1OLED (opt.)Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ5
1Pico / WeAct RP2040 (USB-C)Module:RaspberryPi_Pico_SMD_HandSolderA1
1RPi 40-pin (DUT)Connector_PinHeader_2.54mm:PinHeader_2x20_P2.54mm_VerticalJ1
1START / LEARNButton_Switch_THT:SW_PUSH_6mm_H5mmSW1
1TELEM1 (DUT)Connector_JST:JST_GH_SM06B-GHS-TB_1x06-1MP_P1.25mm_HorizontalJ2
1TELEM2 (DUT)Connector_JST:JST_GH_SM06B-GHS-TB_1x06-1MP_P1.25mm_HorizontalJ3
1TELEM3 (DUT)Connector_JST:JST_GH_SM06B-GHS-TB_1x06-1MP_P1.25mm_HorizontalJ4

Similar boards

  • 2 layers134.8 × 132 mm5x5 Matrix, the printed circuit board in 3D

    5x5 Matrix

    Charles-D-FPU/Lights-out-Matrix

    WIP

    110 parts
  • 2 layers250.2 × 84.2 mmGemini panel, the printed circuit board in 3D

    Gemini panel

    thanoslabs/keyboards

    Schematics, pcbs, layout files for all my keyboard projects

    151 parts
  • 2 layers99 × 65.5 mmVik playground, the printed circuit board in 3D

    Vik playground

    sadekbaroudi/vik

    This is a VIK module designed to mount a PER56 scroll ring, with a 35mm Cirque Trackpad and optional WS2812B LEDs.

    40 parts220CERN-OHL-P-2.0
  • 2 layers162 × 82 mmAhm panel placed, the printed circuit board in 3D

    Ahm panel placed

    kimaernoudt/custom-ahm-wallpanel

    One board that replaces the hand wiring: the 4 encoders, the 4 scene buttons, all 48 ring LEDs, 4 button LEDs and the MCP23017 sit on it. One 10-wire UEXT cable and one 2-wire 5 V cable go to the Olimex ESP32-POE.

    78 parts
  • 4 layers241.2 × 327.2 mmCyclic, the printed circuit board in 3D

    Cyclic

    tpcarlson/synth-diy

    Mostly Eurorack projects

    439 parts107
  • 2 layers100 × 102 mmMpair, the printed circuit board in 3D

    Mpair

    marpi82/mpair

    Advanced Air Quality Monitoring Station based on ESP32's

    198 parts2
  • 2 layers147.3 × 154.4 mmAA PwrSens Dist, the printed circuit board in 3D

    AA PwrSens Dist

    AESilky/ack-ack

    Ack-Ack Robot - Rover (Mars style)

    172 parts
  • 4 layers138 × 114 mmGlitchwave567, the printed circuit board in 3D

    Glitchwave567

    jdg511/567Terror

    Software simulation of the Glitchwave 567 (LM567 glitch pedal) — JUCE Standalone + VST3

    299 partsMIT

Questions

How big is the Cable tester PCB?

It measures 135 × 90 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Cable tester use?

66 parts, built around the 74AHCT1G125SE, MCP23017-E/SO, WS2812B and 1N4148W. 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 Cable tester KiCad files?

From the Mykola2/uart-cable-tester repository on GitHub, at the commit this page was made from: the board is hardware/cable_tester.kicad_pcb and its schematic hardware/cable_tester.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Cable tester design in my own project?

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