Skip to the content
2 layers150 × 115 mmShop output board, the printed circuit board in 3D

Shop output board

Jay-Tech/GrblHAL-Sender8

8-channel opto-isolated high-side switch board, driven by a Raspberry Pi Pico over USB-C. Takes a 5–24 V field supply and sources it to screw terminals, so shop wiring carries a robust signal instead of 3.3 V logic.

Size
150 × 115 mm
Copper layers
2
Thickness
1.6 mm
Parts
84
Nets
78
Pads
237
Tracks, vias
348, 25
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
13 Apr 2024
Updated
22 Sep 2026

Overview

Shop output board is an open-source printed circuit board by Jay-Tech, from the Jay-Tech/GrblHAL-Sender repository on GitHub. It is a 2-layer board of 150 × 115 mm with 84 parts on 78 nets, routed with 348 tracks and 25 vias.

Its parts include 41 resistors, 17 diodes, 9 transistors, 8 ICs and 5 connectors.

README

hardware/shop-output-board/README.md

Shop Output Board

On the shelf as of 2026-08-06 — not cancelled, just unnecessary

Commercial Pico relay boards do this job for around £22, in an enclosure, on a DIN rail. This board switches a 5–24 V signal that still has to drive external relay modules, so the honest comparison was always "custom PCB + 8 relay modules + a field PSU + a case" against "one bought board". See commercial-alternatives.md for the comparison and what to verify on a bought board.

Nothing here is wrong or unfinished. The design is complete, DRC-clean and documented, and it stays the answer if a requirement appears that dry relay contacts cannot meet — a switched 5–24 V output, or genuine galvanic isolation with the field ground leaving the board. It has still never been on a bench.

8-channel opto-isolated high-side switch board, driven by a Raspberry Pi Pico over USB-C. Takes a 5–24 V field supply and sources it to screw terminals, so shop wiring carries a robust signal instead of 3.3 V logic. Built for the sender's shop outputs — dust collection, lighting — on hosts that have no GPIO header of their own.

Nothing here has been near a bench. Read design.md before ordering anything.

Where to start

If you want to…Read
Understand the circuit and why the values are what they aredesign.md
See how one channel becomes copperchannel-layout.svg
See how the input power section becomes copperpower-layout.svg
Route the boardlayout.md
Test it on a breadboard — do this firstbench-test.md
Order itfabrication.md
Check connectivity without any CAD toolnetlist.md
Write or flash device firmware../../docs/pico-gpio-protocol.md

State

Schematicgenerated, ERC clean (0 violations)
Netlist78 nets, 84 parts, all assertions pass
Footprintsassigned; pad-to-pin mapping checked
Board placementgenerated, DRC clean
Routingdone by hand in Pcbnew — 348 segments, 25 vias
DRC0 violations, 0 unconnected
Gerbersexported, validated, tracked in ShopOutput_Gerber/
BOM84 parts, every line with an MPN; F1 settled as an 1812 24V part
Assembly filesproduction/ — BOM grouped by value, positions exclude through-hole
Bench verificationnone — this is what is left

Part rotations in production/positions.csv are in KiCad's native convention and have not been translated for any assembler. Eighteen parts — C1, Q1–Q9, U1–U8, all of them polarized — sit at a different angle under JLCPCB's convention than under KiCad's. Settle this with whoever does the placement before an assembled run. It does not affect bare boards, which is the next order anyway.

Regenerating

Everything is generated, so a value change propagates rather than needing to be chased. Run from this directory, in this order:

text
python generate_schematic.py
kicad-cli sch erc --output erc.rpt --severity-error shop-output-board.kicad_sch
kicad-cli sch export netlist --output netlist.net shop-output-board.kicad_sch
python verify_netlist.py

python generate_pcb.py
kicad-cli pcb export ipcd356 --output pads.d356 shop-output-board.kicad_pcb
python verify_pcb.py
kicad-cli pcb drc --refill-zones --output drc.rpt --severity-error shop-output-board.kicad_pcb

Diagrams: python generate_channel_diagram.py, python generate_power_diagram.py. Assembly BOM: python generate_production_bom.py.

verify_pcb.py reports D9's pads swapped, and that is expected. D9 was rotated 180° by hand during routing. Rotation preserves pin-to-net mapping, so the circuit is unaffected — what it means is that the board is now hand-owned and generate_pcb.py's PADS no longer mirrors it. The barrier checks in the same script still hold, and DRC is the authority on connectivity.

PDF export is flaky when KiCad has the project open. kicad-cli sch export pdf will report Plotted to ... and Done., exit non-zero, and leave a 0-byte file. Close KiCad and Pcbnew first, or export somewhere else and move it in:

text
kicad-cli sch export pdf --output %TEMP%\sob.pdf shop-output-board.kicad_sch
move %TEMP%\sob.pdf shop-output-board.pdf

Always check the file size afterwards. SVG export does not have this problem.

generate_pcb.py writes placement only. --route also emits traces, but that routing is incomplete — down from 191 DRC violations to 113, still with shorts and crossings. A half-routed board is worse to inherit than an unrouted one, so it is not the default.

The two verifiers, and why they exist

verify_netlist.py asserts the connectivity in netlist.md — every channel individually, and that PICO_GND and ISO_GND share no node. ERC proves the schematic is well formed; it says nothing about whether it is the circuit anyone meant.

verify_pcb.py compares pad positions against KiCad's own IPC-D-356 export rather than against the generator's arithmetic. That distinction is not academic: the generator once used the textbook rotation matrix, KiCad's is mirrored, and every rotated part landed on the wrong side. It looked perfectly correct in the generator's own output. The optocouplers' isolated pins were sitting in the logic zone until someone opened Pcbnew and read the pad names.

Before this becomes copper

Breadboard one channel and confirm it switches cleanly at 5 V and 24 V. Everything verified so far is topology and geometry — nobody has yet watched the gate clamp work.

bench-test.md is the procedure, with the expected voltage at every node and what each failure mode looks like. The headline numbers: Vgs should be −4.8 V at 5 V and −8.2 V at 24 V, and if it ever goes past −12 V the clamp is not working and the MOSFET is being destroyed. One channel draws ~16 mA at 24 V; all eight draw ~126 mA.

Parts

84
QtyValueFootprintReferences
41Resistor_SMD:R_0805_2012MetricR101, R102, R103, R104, R105, R201, R202, R203, R204, R205, R301, R302, R303, R304, R305, R401 +25
9Package_TO_SOT_SMD:SOT-23Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9
9Diode_SMD:D_SOD-123D1, D2, D3, D4, D5, D6, D7, D8, D9
8Package_SO:SOP-4_7.5x4.1mm_P2.54mmU1, U2, U3, U4, U5, U6, U7, U8
8LED_SMD:LED_0805_2012MetricLED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8
2TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1-6-3.81_1x06_P3.81mm_HorizontalJ2, J3
2Connector_PinSocket_2.54mm:PinSocket_1x20_P2.54mm_VerticalJ4, J5
1Capacitor_SMD:CP_Elec_8x10.5C1
1TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2-5.08_1x02_P5.08mm_HorizontalJ1
1Capacitor_SMD:C_0805_2012MetricC2
1Diode_SMD:D_SMATVS1
1Fuse:Fuse_1812_4532MetricF1

More from Jay-Tech/GrblHAL-Sender

1
  • 2 layers70 × 92 mmShop output board v2, the printed circuit board in 3D

    Shop output board v2

    Jay-Tech/GrblHAL-Sender

    8-channel opto-isolated high-side switch board, driven by a Raspberry Pi Pico over USB-C. Takes a 5–24 V field supply and sources it to screw terminals, so shop wiring carries a robust signal instead of 3.3 V logic.

    47 parts8

Similar boards

  • 2 layers182.2 × 116.6 mmRight, the printed circuit board in 3D

    Right

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    84 parts915
  • 2 layers94.5 × 81.5 mmESP32-wroover adapter pan, the printed circuit board in 3D

    ESP32-wroover adapter pan

    pcbreflux/espressif

    all espressif stuff will committed here

    84 parts608GPL-3.0
  • 2 layers45.8 × 38.3 mmFramework input brkt, the printed circuit board in 3D

    Framework input brkt

    CRImier/MyKiCad

    My KiCad boards. Can't be bothered uploading individually anymore, so here you go.

    84 parts253GPL-3.0
  • 2 layers194.5 × 73.2 mmWizza xiao, the printed circuit board in 3D

    Wizza xiao

    AlaaSaadAbdo/battoota

    Keyboards

    84 parts188
  • 2 layers149.8 × 80 mmEDM Motherboard [23.04.20], the printed circuit board in 3D

    EDM Motherboard [23.04.20]

    Rack-Robotics/Powercore-V1.0-Hardware

    CAD & Electronics for Powercore V1

    84 parts168
  • 2 layers72.5 × 76.4 mmBox emu, the printed circuit board in 3D

    Box emu

    esp-cpp/esp-box-emu

    Star Wars: Dark Forces, Doom, NES, Gameboy/Color, Sega Master System / GameGear, Sega Genesis / MegaDrive, and MSX I/II Emulators running on ESP BOX and ESP BOX-3 with a custom gamepad

    84 parts148MIT
  • 2 layers100 × 100 mmVga, the printed circuit board in 3D

    Vga

    imihajlow/ccpu

    A 8-bit computer made of 74xx series logic gates and memory ICs.

    84 parts145
  • 2 layers106.1 × 155 mmMotherboard, the printed circuit board in 3D

    Motherboard

    Redherring32/OpenTendo-TopLoader

    An Open Source HardWare (OSHW) recreation of the 1993 toploading NES motherboard (Also known as NES-101)

    84 parts94

Questions

How big is the Shop output board PCB?

It measures 150 × 115 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Shop output board use?

84 parts. 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 Shop output board KiCad files?

From the Jay-Tech/GrblHAL-Sender repository on GitHub, at the commit this page was made from: the board is hardware/shop-output-board/shop-output-board.kicad_pcb and its schematic hardware/shop-output-board-v2/shop-output-board-v2.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Shop output board design in my own project?

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