Designing a Prototyping Board in KiCad: From Breadboard to Perfboard and Fab

Solderless breadboards are indispensable for quick sanity checks. But as soon as a project grows beyond a few components, such as multiple sensors, high-speed I²C or SPI buses, microcontrollers, and button matrices, they quickly degrade into fragile rats-nests. One nudged wire during testing can cause intermittent signals that waste hours of debugging.

The standard jump is to immediately order a custom PCB from a fabrication house. But during active R&D or thesis prototyping, waiting two weeks for a revision cycle just to realize you swapped TX/RX or miscalculated a footprint pitch is agonizing.

There is a practical middle path: designing perfboards and prototyping boards directly in KiCad.

By treating the prototyping board as a first-class CAD citizen, you can use the same verified schematic to produce both a hand-wireable perfboard build and a compact production PCB.

Manufactured Board vs Perfboard Render

Here is the complete workflow, along with solutions to KiCad quirks, 3D wire visualization, and lessons from building the Haptic Console Control Unit.


1. The Strategy: One Schematic, Two Boards

When prototyping complex hardware (such as my Haptic Console Control Unit), maintaining multiple separate schematics for breadboard, perfboard, and custom PCB is an error-prone nightmare.

Instead, adopt the Single-Schematic / Dual-Board strategy:

Schematic

  1. One verified schematic: Capture all components, connectors, decoupling capacitors, and pull-ups. Run Electrical Rules Check (ERC) until you have 0 errors and 0 warnings.
  2. Board A (Hand-wireable Perfboard): A 2.54 mm grid-aligned physical layout designed with structured power buses and point-to-point jumper wires. Paired with an interactive HTML wiring guide and a 1:1 scale printable placement template.
  3. Board B (Compact Manufactured PCB): An SMD/through-hole layout with optimized copper traces, ground planes, and Gerber X2 exports ready for JLCPCB or PCBWay fabrication.

Manufactured Board 3D


2. Building the Perfboard Pad Grid in KiCad

Creating a standard 2.54 mm (0.1 in) perfboard matrix in KiCad’s PCB Editor only takes a few minutes:

  1. Place the anchor footprint: Open the PCB editor and add a single through-hole pad footprint (such as Connector:1X01_NO_SILK or TestPoint:TestPoint_Pad_D1.5mm). Place it at the top-left origin (0, 0).
  2. Hide silkscreen clutter: Right-click the footprint, open Properties, and untick “Show” for both Reference and Value. Having 1,600 visible REF** labels will grind rendering to a crawl and obscure your layout.
  3. Create the Array:
    • Right-click the footprint and select Create Array (Ctrl+N / Cmd+N).
    • Set Horizontal Count and Vertical Count (for a 90 × 150 mm board, a 32 × 50 matrix works well).
    • Set Horizontal Spacing and Vertical Spacing to 2.54 mm.
  4. Lock the Grid Pads (Critical Step):
    • When you subsequently trigger Update PCB from Schematic (F8), KiCad will consider all grid pads “extra” and try to delete them.
    • Select all grid pads, right-click, and select Locking → Lock. Locked footprints cannot be moved or deleted by automatic schematic syncs.
    • In the Update PCB from Schematic dialog, ensure “Delete extra footprints” is unticked.

Pro-Tip: If you need to remove a locked pad to make room for a mechanical mounting hole or a large module, hit Delete once, and then hit Delete again while the confirmation toast is visible.


3. Power Architecture and Bus Topologies

A reliable prototyping board needs clean power and ground distribution. Leaving power routing until the end results in erratic voltage drops and ground loops.

+-------------------------------------------------------------+
|  TERMINAL STRIP (Edge)                                      |
|  [ GND ] ==========> Continuous GND Rail across board       |
|  [ 5V  ] ==========> Continuous 5V Rail across board        |
|  [ 3V3 ] ==========> Continuous 3.3V Rail across board      |
|  ---------------------------------------------------------  |
|  SHARED BUSES (e.g., I2C SDA / SCL with 4.7k pull-ups)     |
|  =========================================================  |
|  COMPONENT ZONE (Teensy / Sockets / Drivers / Buttons)      |
+-------------------------------------------------------------+

Key Layout Principles


4. Visualizing Jumper Wires in 3D (jumper-wires-kicad)

One of the biggest frustrations when hand-wiring a perfboard from KiCad is visualization. KiCad’s raytraced 3D viewer renders all copper traces in a single uniform color per layer. If you use a physical 6-color jumper wire kit (red, yellow, white, orange, green, blue), standard traces cannot give you a true visual preview of your harness.

To solve this, I built jumper-wires-kicad, a standalone library of decorative, net-less footprints paired with color-coded 3D .wrl wire-tube models.

jumper-wires-kicad/
├── 3dmodels/              # 6 parametric .wrl wire-tube models (one per color)
├── JumperWires.pretty/    # 6 static footprints (Jumper_Wire_<Color>)
└── scripts/
    ├── gen_wire.py        # Generates .wrl tube geometry
    └── place_wire.py      # Batch-places wire footprints from a JSON segment list

The Scale and Rotation Bug

When building parametric 3D models for KiCad, non-uniform scaling (Scale X = length, Scale Y = 1, Scale Z = 1) combined with rotation exhibits a bug if the model geometry is defined from (0, 0, 0) to (length, 0, 0):

The Rotation Trap: Because KiCad evaluates scaling before rotation around the local origin, asymmetric geometry causes rotated segments (such as 90° vertical or 45° diagonal wires) to distort dramatically, often stretching across the entire canvas.

The solution in gen_wire.py is centering the tube geometry strictly at the local origin:

\[\text{Geometry X span: } \left[-\frac{\text{length}}{2}, +\frac{\text{length}}{2}\right]\]

Centered at $(0, 0, \text{radius})$ tangent to $Z=0$, non-uniform stretching and rotation remain consistent at any angle.

Automated Batch Placement

Instead of hand-placing dozens of wire footprints, place_wire.py reads a JSON segment list and places footprints automatically using KiCad’s Python API:

[
  [12.70, 25.40, 63.50, 25.40, "red", "5V_BUS"],
  [12.70, 27.94, 63.50, 27.94, "black", "GND_BUS"],
  [30.48, 40.64, 45.72, 40.64, "blue", "I2C_SDA"]
]

Run it directly inside KiCad’s bundled Python environment:

/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/Current/bin/python3 \
    scripts/place_wire.py /path/to/board.kicad_pcb segments.json

5. Case Study: The Haptic Console Control Unit

In the Control Unit (M6) project, this workflow powered the hardware bring-up:

Manufactured Board Gerber Layout


6. Practical Rules of Thumb for KiCad Prototyping

  1. Use Custom Path Variables: Point libraries to ${JUMPER_WIRES_LIB} configured in Preferences → Configure Paths. Never rely on ${KIPRJMOD} for shared global libraries, as project-less .kicad_pcb files will fail to resolve 3D model paths.
  2. Never regex .kicad_sch or .kicad_pcb by hand: KiCad S-expression syntax is complex. Always use the official pcbnew Python bindings, kicad-cli, or verified toolchains.
  3. Check DRC with Realistic Fab Constraints: Set your design rules (clearance 0.15 mm, track width 0.2 mm, via drill 0.3 mm) to match standard low-cost fab capabilities early so your board is ready for manufacturing on day one.

Conclusion and Resources

Designing prototyping boards in KiCad combines rapid benchtop assembly on hand-wireable perfboards, clear 3D color-coded wiring, and a seamless transition to professional fabricated PCBs.

Explore the repositories and guides: