Skip to the content
PCBKitNew board
2 layers100 × 89.5 mmLed processor board, the printed circuit board in 3D

A board with a processor and a couple of other things that can talk to an LED output board.

Size
100 × 89.5 mm
Copper layers
2
Thickness
1.6 mm
Parts
128
Nets
131
Pads
478
Tracks, vias
1,126, 212
Pours
24
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
19 Oct 2026
Updated
7 Nov 2026

Overview

Led processor board is an open-source printed circuit board by eelstretching, from the eelstretching/led-processor-board repository on GitHub. It is a 2-layer board of 100 × 89.5 mm with 128 parts on 131 nets, routed with 1,126 tracks and 212 vias.

It is built around the RP2350B, W25Q128JVSIQ and APS6404L-3SQR-SN, with the DS3231SN#T&R, TPS54202HDDC and B5819W among its other parts. Its parts include 54 resistors, 42 capacitors, 9 connectors, 7 ICs and 5 diodes. It belongs with the RP2350 boards of this library.

Main components

9

README

README.md

LED processor board

The brains for the LED output boards: an RP2350B with an RM2 radio, 8 MB PSRAM, a DS3231 RTC and four 16-pin ribbon shrouds. Each shroud drives one led-output-board, which does the level shifting, fusing and strand connectors, so this board carries no LED power.

The core (RP2350B, flash, PSRAM, RM2, crystal, BOOTSEL/RUN buttons, 3.3 V regulator) is the rp2350b-rm2-reference schematic unchanged, except that its micro-B USB is now USB-C. That board's single-row J2/J3 headers are gone; the rest is new.

Status: schematic and first layout done, not yet built. ERC is clean apart from the four items inherited from Pi's design, and DRC has no copper errors and nothing unconnected (see "Verification").

Root sheet

All three sheets: docs/schematic.pdf (Power, Outputs).

Pin map

GPIOUse
0-7OUT1 (J5) data 1-8
8-15OUT2 (J6) data 1-8
16-23OUT3 (J7) data 1-8
24-31OUT4 (J8) data 1-8
32RTC SDA (I2C0), 10k pull-up
33RTC SCL (I2C0), 10k pull-up
34RTC INT/SQW, 10k pull-up (open drain)
35-42J2 spare header (UART1 TX/RX on 36/37; 40-42 are ADC0-2)
43-46RM2 (WL_ON + BT_ON, CS, DATA, CLK), as on the reference board
47PSRAM chip select, as on the reference board

All 32 outputs sit in GPIO 0-31, so one PIO block (GPIO base 0) reaches every output. The radio's PIO uses the 16-47 window, so it has to be a different PIO block from the LED renderer's. The board header is firmware/boards/led_processor_board.h (the reference board's rp2350b_rm2.h plus the RTC pins); see firmware/README.md for the DS3231 driver and the rtc_set firmware.

Output shrouds (J5-J8)

The same pinout as the output boards' J2 (and MegaTree docs/power.md). Pin 1 is the triangle on the shroud.

PinSignalPinSignal
1GND2data 1
3GND4data 2
5GND6data 3
7GND8data 4
9GND10data 5
11GND12data 6
13+3V3 (shifter VCCA)14data 7
15+5V (shifter VCCB)16data 8

Data n of OUTk is GPIO 8(k-1) + (n-1). Each data line has a 33R series resistor at the RP2350 end to damp ringing on the ribbon. Each shroud has 100n on +3V3 and on +5V.

Power (Power sheet)

  • J4, 12 V in, from the LED supply (through a PTC on an output board, as planned for the Pico boards). D3 (SS34) blocks a reversed lead.
  • U7, TPS54202H buck, 12 V to 5 V. 4.5-28 V in, 2 A, SOT-23-6, with the values from TI's TPS54202HEVM-716 5 V design: 100k/13.3k divider (5.08 V), 75 pF feed-forward, 15 uH, 3 x 22 uF out, 510k EN pull-up from 12 V. The load is well under 0.5 A.
  • +5V goes straight to pin 15 of every shroud, and through D4 (B5819W) to VSYS, which feeds the existing NCP1117 3.3 V regulator. +3V3 goes to pin 13 of every shroud.
  • D5 (green) shows +5V is up.
  • USB still works for programming. On USB alone the board runs (VSYS through D2), but the ribbons get no +5V, so the output boards' shifters are off. D4 keeps USB from back-feeding the buck.

USB

J1 is a USB-C receptacle (Korean Hroparts TYPE-C-31-M-12, LCSC C165948, KiCad's stock USB_C_Receptacle_HRO_TYPE-C-31-M-12 footprint) in place of Pi's micro-B. USB 2.0 only: D+ and D- from both sides of the plug are joined, CC1 and CC2 each have a 5.1k pull-down (R56, R57) so a USB-C charger or host turns on 5 V, SBU1/SBU2 are unconnected and the shell goes to GND. The D+/D- nets (USB_D+/USB_D-, through Pi's 27R R7/R8) and VBUS into D2 are as before.

RTC

The DS3231 circuit from universal-strip-controller (its U9): DS3231SN, 1 uF on VCC, 10k pull-ups on SDA, SCL and INT/SQW, 32KHZ and RST unconnected. The coin cell is a CR1220 in a Keystone 3001 holder, so it can be replaced (universal-strip-controller used a tabbed cell).

Headers

  • J2, spare GPIO (1x10, 2.54 mm): 3V3, GPIO35-42, GND.
  • J3, SWD (1x3, 2.54 mm): SWCLK, GND, SWD, the same order as a Pico's debug header.
  • J9, RM2 spare GPIO (1x3, 2.54 mm, under the board name, left of J3): WL_GPIO1, WL_GPIO2, GND. These are the radio chip's own pins, not RP2350 pins: set or read them with cyw43_arch_gpio_put() / cyw43_arch_gpio_get(), which go over the radio's SPI link, so they're slow, plain digital in/out (no PWM, PIO or ADC). Fine for an LED, a button or a relay in a pinch. On a Pico 2 W these two are SMPS mode and VBUS sense; here nothing else uses them.

BOM / JLCPCB

production/ holds the BOMs and the JLCPCB upload set. bom-full.csv is the full BOM with LCSC numbers (edit this one); the rest is made from it and the board by python3 tools/jlc.py (rerun it after any board change):

  • led-processor-board-gerbers.zip: gerbers and drill files.
  • jlcpcb-bom.csv and jlcpcb-cpl.csv: BOM and placement for the 111 SMD parts JLC assembles (everything on the top side with an LCSC number). JLC's 3D models don't always share KiCad's zero angle: ROT_FIX in tools/jlc.py turns U2, U3, U4 and U6 a quarter turn to match (checked in JLC's placement preview for the first order). Still check the preview: legs on pads, pink pin-1 dot at the board's pin-1 mark.

tools/jlc.py needs KiCad's own Python (for pcbnew) and kicad-cli on the PATH. On a Mac with KiCad in /Applications/KiCad, save the board in KiCad, then from the repo root:

sh
K=/Applications/KiCad/KiCad.app/Contents
PATH=$K/MacOS:$PATH $K/Frameworks/Python.framework/Versions/Current/bin/python3 tools/jlc.py
git status production/   # see what changed, then commit and push

On Linux, with KiCad installed from its PPA, plain python3 tools/jlc.py works. The BOM and CPL only change when parts move or the BOM changes; the gerbers zip changes with any copper or silk edit.

Left off both files for hand-soldering:

  • U5 RM2: buy Raspberry Pi SC1169, as on the reference board.
  • L1 Abracon AOTA-B201610S3R3-101-T, 3.3 uH (Digi-Key or Mouser): the part Pi specifies for the RP2350 core regulator, out of stock at LCSC when ordering (2026-10). It is polarized: match its dot to the footprint mark.
  • BT1 Keystone 3001 holder (Digi-Key 36-3001-ND).
  • J2, J3, J9 pin headers and J5-J8 box headers (the shrouds already bought for the output boards).
  • J4 terminal block (C695629): JLC could fit it as through-hole assembly, but it's left to you.

SW1/SW2 are XKB TS-1088R-02526 (C455281, 4 x 3 mm) in place of Pi's Wurth 434133025816, which LCSC doesn't stock; same spots, same nets. R1 is DNP, as on the reference board. Pi's R9 (an unfitted 0R option from GPIO0 to the flash chip select) is removed, with its GPIO0 branch, so OUT1's first data line has no stub. The PSRAM chip select is GPIO47 (QMI CS1n, RP2350 datasheet section 9.4, which allows GPIO 0, 8, 19 or 47).

J4 (DORABO DB301V-3.5-2P, C695629) is in the same family as the output boards' strand terminals and uses KiCad's stock 3.5 mm Phoenix PT footprint; check the hole size against the DB301V drawing when laying out.

Layout

Top, zone fills hidden

100 x 89.5 mm, 2 layers, four 2.75 mm (M2.5) mounting holes. 3D views: top, bottom; bottom copper: docs/pcb-bottom-copper.png.

  • The core is Pi's layout: the RP2350B, flash, crystal, regulator, buttons and RM2 keep their placement and routing from the reference board (the buttons are a stock LCSC part in Pi's spots). The one move: U4 (PSRAM), C22, R11 and R13 moved from under the flash to the top side, just left of it, so every part is on the top and JLCPCB can assemble one side. The PSRAM's QSPI branches are about 12-15 mm long; Pi's were vias straight down to it. Pi's +3V3 top pour and full GND bottom plane stay; the board widens with a top GND pour on either side, stitched to the bottom plane.
  • Shrouds: OUT1/OUT2 (J5, J6) down the left edge, OUT3/OUT4 (J7, J8) along the bottom, either side of the RM2 antenna. The bottom two sit as low as the antenna strip allows (their bottom pins stop just above it, their bodies overhang it); J8 is 1.6 mm left of the resistor row to clear the corner hole, so its data lines jog. The 33R resistors sit in a row next to each shroud's data pins. On J7/J8 the 3V3 and 5V runs use the channel between the two pin rows, one net per layer.
  • Power in the top right: J4 (12 V) on the right edge, D3, the TPS54202 buck (U7, L2, output caps) and D5. The 12 V runs are 0.8 mm, +5V 0.5 mm.
  • USB-C at the top edge where Pi's micro-B was, with J2 (spare GPIO35-42, plus 3V3 and GND) along the top edge to its right, so wires leave from the board edge. Its lines leave the core on the top layer, drop through a row of vias left of the buck and fan out on the bottom; the ADC pins (GPIO40-42) are the lanes furthest from the buck's switch node. The RTC (U6, BT1) is on the right and J9 (RM2 spare GPIO) and J3 (SWD) sit side by side under the board name.
  • The antenna keepout runs the full width along the bottom edge past the RM2.

Regenerating it

The layout was built by scripts in tools/pcb/ (KiCad 10 Python API plus Freerouting 1.9.0). From here on it is a normal KiCad board, so edit it in KiCad; the scripts are a record of how it was made.

  1. build_pcb.py REF.kicad_pcb net.xml OUT.kicad_pcb . loads the reference layout, drops its micro-B and headers, clips the routes that went to them, places the new parts (placement.py) and hand-routes the power, USB-C, OUT4, RM2 and SWD runs (preroute.py). net.xml is kicad-cli sch export netlist --format kicadxml.
  2. route.sh in out 20 exports a Specctra DSN, freezes the existing copper and sets net classes (dsn_prep.py), runs Freerouting 1.9.0 (xvfb-run java -jar freerouting-1.9.0.jar; 2.x ignores the pass limit and never writes the session), and imports the result.
  3. post.py trims dangling tails and adds GND stitching vias; fix.py adds the two +3V3 jumpers under the +5V run to J7 and C40's link; rip.py plus a second route.sh rerouted the J2/RTC fan-out (GPIO32-42), which the first pass left one net short on; silk.py places the reference designators.
  4. Moving the PSRAM to the top: psram.py (flip and place U4/C22/R11/R13, rip their bottom-side routing), post.py --trim-only, psram2.py (Pi's QSPI escapes from under U3, the GPIO47 drop), route.sh, then the U4 supply hop at the end of fix.py, post.py and silk.py.
  5. Moving J2 to the top edge: j2top.py (place it and its pin labels, rip its old fan-out), post.py --trim-only, j2route.py (hand-routes the bus and moves the +3V3 hop from the core pour to the RTC, which also feeds the lower pour and the RM2, below the via row), post.py, silk.py.
  6. Bottom shrouds to the edge and J9: shrouds.py (move J7/J8 and their caps, re-run the data lines, rip their power), shrouds2.py (hand-routes their 3V3/5V), post.py, silk.py, then hdrs.py (adds J9 and moves J3 under the board name), route.sh (WL_GPIO1/2), post.py, silk.py, and swd.py (hand-routes SWCLK/SWD, which Freerouting couldn't get out of the core).
  7. LCSC buttons: buttons.py (TS-1088R footprints in SW1/SW2's spots, stubs re-joined) and tools/sch_buttons.py (swaps the schematic symbols to Switch:SW_Push).
  8. tools/rm_r9.py drops R9 and its GPIO0 branch from the schematic and board; tidy_gpio.py straightens GPIO0 and chamfers GPIO1 on their way to OUT1.
  9. render.sh / rendernz.sh make the PNGs (kicad-cli pcb export svg cropped with cairosvg; rendernz hides zone fills).

Files

PathWhat
led-processor-board.kicad_schroot sheet: the reference core, RTC, J2/J3/J9, sheet symbols
Power.kicad_sch12 V in, buck, +5V, VSYS
Outputs.kicad_schJ5-J8 shrouds, 33R series resistors, decoupling
rp2350b_rm2.kicad_sym, rp2350b_rm2.pretty/RM2 symbol and footprint (from the reference)
production/bom-full.csvfull BOM with LCSC numbers
production/ (rest)JLCPCB gerbers zip, assembly BOM and CPL (tools/jlc.py)
docs/schematic.pdf, docs/sheet-*.pngall three sheets
led-processor-board.kicad_pcbthe layout
docs/pcb-*.pnglayout previews
tools/build_schematic.pythe one-off script that built these sheets from the reference (kept for reference; edit the schematic in KiCad from here on)
tools/pcb/the scripts that built the layout (see "Regenerating it")

Verification

kicad-cli sch erc (KiCad 10.0.7, stock libraries) reports the same four items as the reference board, all in Pi's part of the design: U2's two OUT pins tied together, U1 VREG_AVDD and #PWR16 "not driven" (power-flag nits), and one off-grid wire end. The rest are notes that Pi's embedded libraries (RPI_DB, RPI - Power, RPI_COMPILED) aren't in the library table, as on the reference board. A netlist check confirms each shroud's GND, +3V3, +5V and data pins, the RTC nets and the 12 V to VSYS chain.

kicad-cli pcb drc --severity-all --schematic-parity reports no clearance, short, hole or unconnected items, and the board matches the schematic (apart from footprints not carrying the symbols' manufacturer fields). What's left: 41 warnings that Pi's RPI_COMPILED footprint library isn't in the library table (as on the reference board), and 4 silkscreen-past-the-edge warnings from J1 and J4, whose bodies overhang the board edge (the USB-C opening and the terminal block). C7 and C27 have their reference designators hidden for lack of room.

License

Raspberry Pi's design is MIT (see LICENSE-RaspberryPi.txt); the additions here are MIT too.

Parts

128
QtyValueFootprintReferences
3233Resistor_SMD:R_0402_1005MetricR24, R25, R26, R27, R28, R29, R30, R31, R32, R33, R34, R35, R36, R37, R38, R39 +16
14100nRPI_COMPILED:generic_capc1005x50C2, C8, C10, C11, C12, C13, C14, C15, C16, C17, C18, C20, C21, C22
10100nCapacitor_SMD:C_0402_1005MetricC24, C25, C36, C37, C38, C39, C40, C41, C42, C43
410kResistor_SMD:R_0402_1005MetricR15, R17, R18, R19
4NPTH FD2.75mm SM3.15mm KO6mmRPI_COMPILED:none_mh_npth_fd2p75mm_sm3p15mm_ko6mmMH1, MH2, MH3, MH4
310uCapacitor_SMD:C_0805_2012MetricC23, C27, C28
310uRPI_COMPILED:generic_capc2012x125C1, C5, C19
31kRPI_COMPILED:generic_resc1005x35R2, R4, R6
322uCapacitor_SMD:C_0805_2012MetricC32, C33, C34
20RPI_COMPILED:generic_resc1005x35R10, R11
2100nCapacitor_SMD:C_0603_1608MetricC29, C30
210kRPI_COMPILED:generic_resc1005x35R1, R13
215pRPI_COMPILED:generic_capc1005x50C3, C4
21kResistor_SMD:R_0402_1005MetricR16, R23
227RPI_COMPILED:generic_resc1005x35R7, R8
24.7uRPI_COMPILED:generic_capc1005x50_wideC6, C7
25.1kResistor_SMD:R_0402_1005MetricR56, R57
2B5819WDiode_SMD:D_SOD-123D2, D4
2GreenLED_SMD:LED_0603_1608MetricD1, D5
2TS-1088R-02526Button_Switch_SMD:SW_SPST_TS-1088-xR025SW1, SW2
1100kResistor_SMD:R_0402_1005MetricR21
112MHzRPI_COMPILED:generic_xtalcc320x250x80-4X1
112V INTerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_HorizontalJ4
113.3kResistor_SMD:R_0402_1005MetricR22
115uInductor_SMD:L_Sunlord_SWPA8040SL2
11uCapacitor_SMD:C_0402_1005MetricC26
13.3uRPI_COMPILED:abracon_aota-b201610s3r3-101-tL1
133RPI_COMPILED:generic_resc1005x35R3
14.7uRPI_COMPILED:generic_capc1005x50C9
1470Resistor_SMD:R_0402_1005MetricR14
1510kResistor_SMD:R_0402_1005MetricR20
175pCapacitor_SMD:C_0402_1005MetricC31
1APS6404L-3SQR-SNPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU4
1CR1220Battery:BatteryHolder_Keystone_3001_1x12mmBT1
1DS3231SNPackage_SO:SOIC-16W_7.5x10.3mm_P1.27mmU6
1NCP1117ST33T3GRPI_COMPILED:onsemi_ncp1117st33t3gU2
1OUT1Connector_IDC:IDC-Header_2x08_P2.54mm_VerticalJ5
1OUT2Connector_IDC:IDC-Header_2x08_P2.54mm_VerticalJ6
1OUT3Connector_IDC:IDC-Header_2x08_P2.54mm_VerticalJ7
1OUT4Connector_IDC:IDC-Header_2x08_P2.54mm_VerticalJ8
1RM2rp2350b_rm2:RPi_RM2U5
1RP2350BRPI_COMPILED:rpi_rp2350b_viasU1
1SJG_BigBrotherlogos:SJG_BigBrotherG1
1SPAREConnector_PinHeader_2.54mm:PinHeader_1x10_P2.54mm_VerticalJ2
1SS34Diode_SMD:D_SMAD3
1SWDConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ3
1TPS54202HPackage_TO_SOT_SMD:SOT-23-6U7
1USB-CConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J1
1W25Q128JVSIQRPI_COMPILED:generic_soic127p790x195-8U3
1WL_GPIOConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ9

Questions

How big is the Led processor board PCB?

It measures 100 × 89.5 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Led processor board use?

128 parts, built around the RP2350B, W25Q128JVSIQ, APS6404L-3SQR-SN and DS3231SN#T&R. 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 Led processor board KiCad files?

From the eelstretching/led-processor-board repository on GitHub, at the commit this page was made from: the board is led-processor-board.kicad_pcb and its schematic Outputs.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Led processor board design in my own project?

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

Similar boards

  • 2 layers52 × 89.5 mmRP2350B RM2, the printed circuit board in 3D

    RP2350B RM2

    eelstretching/rp2350b-rm2-reference

    Raspberry Pi's RP2350B minimal design (RPI-RP2350B-MINIMAL R4-S1, KiCad 10) with these additions:

    57 parts
  • 6 layers160 × 100 mmHet68-core, the printed circuit board in 3D

    Het68-core

    fedurca/het68_pcb

    pcb design description

    134 parts
  • 2 layers208 × 110 mmButton grid, the printed circuit board in 3D

    Button grid

    paulsonnentag/button-grid

    An ESP32-S3 controller board for an 8×8 button matrix with 64 individually switched 12 V LEDs. It's designed in KiCad 9 and made to be ordered from JLCPCB.

    108 parts
  • 2 layers50 × 62 mmIotDisplay, the printed circuit board in 3D

    IotDisplay

    BerkeleyHCI/PolymorphicBlocks

    A Python-based hardware description language for PCBs for higher-level (block-diagram / system-architecture level) PCB design through libraries of directly reusable subcircuit generators.

    78 parts94BSD-3-Clause
  • 4 layers130 × 64.3 mmTspico v3, the printed circuit board in 3D

    Tspico v3

    timex-sinclair-projects/tspico-hardware

    Status 2026-10-19: prototype 3 (v3.0-proto3, changes below). Proto1 (v3.0-proto1) was built and brought up; proto2 added its fixes (below).

    156 partsCERN-OHL-S-2.0
  • 4 layers30 × 30 mmPCIe Pie, the printed circuit board in 3D

    PCIe Pie

    vk-sahni/M.2_IMU_sensor_module

    KiCad design for an M.2 Key A RP2350B sensor module featuring an MPU-9250 IMU and BME280, intended for UAV and ArduPilot integration experiments.

    85 parts
  • 2 layers76.2 × 50.8 mmMcustm32f402, the printed circuit board in 3D

    Mcustm32f402

    STM32World/hardware

    STM32World Development Modules

    37 parts6