Skip to the content
4 layers130 × 64.3 mmTspico v3, the printed circuit board in 3D

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).

Size
130 × 64.3 mm
Copper layers
4
Thickness
1.6 mm
Parts
156
Nets
194
Pads
689
Tracks, vias
2,125, 373
Pours
9
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
17 Sep 2026
Updated
5 Nov 2026

Overview

Tspico v3 is an open-source printed circuit board by timex-sinclair-projects, from the timex-sinclair-projects/tspico-hardware repository on GitHub, published under the CERN-OHL-S-2.0 licence. It is a 4-layer board of 130 × 64.3 mm with 156 parts on 194 nets, routed with 2,125 tracks and 373 vias.

It is built around the RP2350B, 74LVC245APW and ESP32-C3-WROOM-02-N4, with the GD25Q128ESIGR, MCP6002-I/P and 74LVC06AD among its other parts. Its parts include 63 resistors, 52 capacitors, 15 ICs, 6 connectors and 4 switches. It belongs with the ESP32, RP2350 and RISC-V boards of this library.

Main components

11

README

hardware/README.md

TS-Pico v3 KiCad project

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). Both proto2 and proto3 were routed by scripts/flow.py with no hand edits, DRC clean at every severity. ERC: one warning, U4's unused input tied to GND.

To order: the JLCPCB upload files (Gerber zip, BOM, placement), ordering notes, schematic PDF and renders are on the v3.0-proto3.1 release: proto3 with the board labels, and L1 assembled by JLCPCB again. U22, J3 and J5 are fitted by hand. v3.0-proto3 is the same copper without the labels, with L1 fitted by hand. Proto2: v3.0-proto2.1 (L1 by hand) and v3.0-proto2 (L1 assembled by JLCPCB), same Gerbers. To regenerate them from this folder, run python3 scripts/gen_fab.py (output in fab/jlcpcb/).

Proto3 changes

ChangePartsWhy
Male DE-9J5 CONNFLY DS1037-09MNAKT74-0CC (C75750), footprint DSUB-9_Pins_Horizontal_…Atari sticks (CX-40) end in a female plug, like the 2068's own male ports expect. Proto1/2 had a female footprint; a male connector on it mirrors every pin, putting the stick's ground (pin 8) on pin 7 (JOY_5V, open) so nothing reads. Same body position and holes as proto2. On a proto1/2 board, mount a male connector on the back of the board: turning it over puts each pin on its own pad.
Buttons and LED movedSW3 under SW1, SW4 under SW2; D4/R5 left of the ESP32A 1.54 in module on J3 covered BOOTSEL and crowded RUN.
I2C OLED headerJ3 1x4 (1 GND, 2 +3V3, 3 SCL, 4 SDA), R44/R45 4k7 pull-upsFor a 1.54 in 128x64 SSD1309 I2C module, on I2C1 (GP43 SCL, GP42 SDA). Replaces the 7-pin header for the 1.27 in SSD1351 SPI module. GP34, GP41 and expander P0.2 (with its pull-down R11) are freed.

Proto2 changes (from proto1 bring-up and issue #21)

ChangePartsWhy
nBE pull-up to +5V_EDGER14 2k2The 74LVC06 only pulls /BE low; without a pull-up it rose too slowly and a RAM opcode fetch after a served byte read wrong bits. Proto1 boards carry a 2.2k bodge from A29 to +5V.
GP8-GP10 pull-upsR15-R17 10knAEN_LO, nAEN_HI, nDATA_OE: the RP2350 resets its pads with pull-downs, so in reset and BOOTSEL all three buffers were enabled and U1/U2 fought on MD.
SD socket power switchU32 SY6280AAC, R42 15k (0.45 A), R43 10k, C52 1uSocket VDD is now +3V3_SD, switched from XL9555 P0.6 (SD_PWR_EN, off at power-up). A latched card hits the current limit instead of resetting the RP2350B; the firmware can power-cycle a card. R34-R37 moved to +3V3_SD; R38 (detect) stays on +3V3.
U22 footprintSOIC-8 3.9 x 4.9 mmThe APS6404L-3SQR-SN is SOP-8 150 mil (AP Memory package code SN); proto1 had the 208 mil footprint. Still DNP; see docs/bom-cost-optimization.md for PSRAM options.
L1 fitted by handL1 DNP at JLCPCBThe RP2350 core-regulator inductor (Abracon AOTA-B201610S3R3-101-T) was out of stock at JLCPCB and LCSC on 2026-10-12. Raspberry Pi names no substitute: it is the only polarity-marked 0806 part. Fit it with the dot on pad 2 (DVDD, silkscreen dot), the end away from the top edge; the core has no supply until it is on. Gerbers unchanged. From proto3.1 (2026-10-22, 326 in stock) JLCPCB assembles it again.

Firmware for proto2: set SD_PWR_EN (expander port 0 bit 6) after the detect switch reads a card and before any SPI; return the SD pins to inputs before clearing it.

Sheets are generated by scripts/gen_<sheet>.py on top of scripts/schlib.py, netlist-style (labels on every pin, no wires). Regenerating a sheet overwrites hand edits, so once a sheet is being edited in KiCad, retire its generator. Spec: ../docs/v3-architecture.md.

Files

FilePurpose
tspico-v3.kicad_proProject. Design rules are JLCPCB 4-layer capable but conservative: 0.127 mm min clearance and track, 0.45/0.2 mm min via, 0.3 mm copper-to-edge. Net classes: Default 0.2 mm track / 0.6-0.3 via, Power 0.5 mm / 0.8-0.4.
tspico-v3.kicad_schRoot sheet with eight hierarchical sheets: interface, memory, mcu, power, storage_display, wifi, audio, joystick.
tspico-v3.kicad_pcb4-layer board (F.Cu, In1 GND, In2 PWR, B.Cu), 1.6 mm, ENIG. Outline and connector generated by scripts/gen_board.py.
lib/tspico.pretty/TS2068_EdgeConnector_2x32.kicad_modThe 2068 edge connector (generated).
lib/tspico.kicad_symProject symbols (empty so far; ESP32-C3 module and anything not in the stock library go here).
scripts/gen_board.pyRegenerates the edge-connector footprint and the bare board skeleton (outline, connector, holes, fiducials). Called by gen_layout.py.
scripts/gen_layout.pyBuilds the placed board: exports the netlist, loads every footprint from the KiCad or project library, assigns nets, places parts from its P table, adds the GND and +3V3 zones. Run with KiCad's bundled Python (/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/Current/bin/python3). It overwrites tspico-v3.kicad_pcb, so once routing starts in KiCad, stop running it and treat the placement table as history.
scripts/check.shkicad-cli ERC and DRC.
scripts/schlib.py, scripts/gen_edge_symbol.py, scripts/gen_interface.py, scripts/gen_memory.py, scripts/gen_mcu.py, scripts/gen_power.py, scripts/gen_storage_display.py, scripts/gen_wifi.py, scripts/gen_audio.py, scripts/gen_joystick.pySchematic generators (see above).
scripts/parts.pyOrderable part table: (Value, footprint) to MPN and LCSC number. schlib.place() stamps MPN and LCSC fields on every symbol from it.
bom/tspico-v3-jlcpcb-bom.csvJLCPCB-format BOM (Comment, Designator, Footprint, LCSC Part #), regenerated by the command below.
bom/tspico-v3-bom-full.csvSame grouping with MPN and quantities.
docs/tspico-v3-schematic.pdfSchematic, all nine sheets.
docs/tspico-v3-pcb.pdfPCB plot, one page per layer: F.Cu, In1.Cu, In2.Cu, B.Cu, F/B silkscreen, F/B fab (DNP parts crossed out). Bottom layers are not mirrored.
renders/3D renders (top, bottom, isometric).
fab/Plot output directory (ignored by git).

Edge connector geometry

Measured from the v2.2 fab Gerbers (../old/tsPico2_2Fab/Gerber/tsPico.GTL, .GBL, .Outline):

ItemValue
Board130.00 x 64.25 mm, 1.6 mm (v2.2 was 100 mm tall; v3 body is 56 mm plus the 8.25 mm tongue)
Body130.00 x 64.00 mm
Tongue83.66 mm wide, 8.25 mm deep, left edge 18.48 mm from the board's left edge, 1.0 mm corner chamfers
Positions32 at 2.54 mm pitch, 31 fingers per side
Keying slotposition 6, 2.03 mm wide, 8.26 mm deep
Fingers1.651 x 8.255 mm (65 x 325 mil), first finger centre 2.52 mm from the tongue's left edge, bottom edge 0.32 mm above the tongue edge

Pad names are A1..A32 on F.Cu and B1..B32 on B.Cu (no A6/B6), following the TS2068 Technical Manual table 2.4.1-1. Position 1 is at the left when the board is viewed from the top with the connector at the bottom.

Side A is the top (component) side, confirmed: side A (GND, EAR, D7, ..., SOUND) is on the top and side B (+15V, +5V, address bus, video) on the bottom. Proto1 proved it in a 2068 on 2026-10-07 (firmware/bringup/README.md). In shadow mode it logged every address the Z80 read through the side-B fingers, the boot log matching the ROM exactly. It then served the HOME ROM onto side A, with /MREQ and /RD timing each read, /BE on A29 and the data on D0-D7, and the 2068 booted to the card's "TS-Pico v3 ROM" banner. With the sides swapped, the address fingers would sit on data and control lines and none of that could work. This also matches how the v2.2 layout routes +5V (bottom trace from the fourth finger).

Fab notes for the fingers: hard gold over the fingers if the fab offers it (ENIG otherwise), 30 degree bevel on the tongue edge, no copper within 0.3 mm of the slot.

Stock library parts already identified

RP2350B symbol (MCU_RaspberryPi), Package_DFN_QFN:QFN-80-1EP_10x10mm_P0.4mm_EP3.4x3.4mm, TSPico:microSD_TF-01A (to be drawn from the HRO TF-01A drawing), Connector_Dsub:DSUB-9_*, Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12, SOIC/TSSOP logic packages, Button_Switch_SMD:SW_SPST_PTS645Sx43SMTR92, Connector_Audio:Jack_3.5mm_CUI_SJ-352x-SMT_Horizontal, Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm.

All parts used so far have stock symbols and footprints (the APS6404L PSRAM is in Memory_RAM, the ESP32-C3-WROOM-02 in RF_Module).

Regenerating the BOM

bash
cd hardware
KC=/Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli
$KC sch export bom --output bom/tspico-v3-jlcpcb-bom.csv --fields "Value,Reference,Footprint,LCSC" --labels "Comment,Designator,Footprint,LCSC Part #" --group-by "Value,Footprint" --exclude-dnp tspico-v3.kicad_sch

Part choices are priced against JLCPCB's catalog with python3 scripts/jlc_price.py --boards 10; the reasoning for each substitution is in docs/bom-cost-optimization.md (2026-09-17: parts + fees per board went from $32.95 to $14.93 on a 10-board run, to $14.48 after the DMA option was dropped; fitted logic packages from 16 to 7). The board was laid out again for these parts on 2026-09-17 (see the routing section).

Fab outputs

python3 scripts/gen_fab.py writes fab/jlcpcb/: tspico-v3-gerbers.zip (4-layer Gerbers + Excellon drill), tspico-v3-bom.csv and tspico-v3-cpl.csv (JLCPCB assembly format), and refreshes the two BOMs in bom/. fab/NOTES.md lists what to check on upload (L1 has no LCSC number yet; rotations of QFN/SOT/connector parts need checking in JLC's placement preview; J3 and J5 are through-hole).

Schematic and PCB PDFs, renders

Regenerate after a board or schematic change (from hardware/):

bash
KC=/Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli
$KC sch export pdf -o docs/tspico-v3-schematic.pdf tspico-v3.kicad_sch
$KC pcb export pdf --mode-multipage --ibt --scale 0 --cdnp -l F.Cu,In1.Cu,In2.Cu,B.Cu,F.Silkscreen,B.Silkscreen,F.Fab,B.Fab --cl Edge.Cuts -o docs/tspico-v3-pcb.pdf tspico-v3.kicad_pcb
$KC pcb render --side top --quality high -w 2384 -h 1376 --zoom 1.1 -o renders/tspico-v3-top.png tspico-v3.kicad_pcb
$KC pcb render --side bottom --quality high -w 2384 -h 1376 --zoom 1.1 -o renders/tspico-v3-bottom.png tspico-v3.kicad_pcb
$KC pcb render --side top --quality high -w 2384 -h 1568 --rotate '-45,0,45' --perspective -o renders/tspico-v3-iso.png tspico-v3.kicad_pcb

Parts without a 3D model in the KiCad library (the four buttons, USB-C, micro SD socket, audio jack) show as bare pads in the renders; U22 is DNP.

Layout notes

  • Body 130 x 56 mm (the register row of the first layout is gone). Left edge, top to bottom: ESP32-C3 antenna, USB-C, micro SD. The TF-01A socket's shell is flush with the board edge (its shield pads sit 3 mm back, so nothing needs edge clearance). Right edge: 3.5 mm jack in the corner, DE-9 below it.
  • Top edge: buttons in a 2x2 block on 0.5 in centres (top row TS Reset, NMI; below them RUN, BOOTSEL; proto1/2 had all four in a row), then the OLED header. The module on J3 covers everything right of the buttons, so nothing there may be taller than its standoff. The LED (D4, R5) sits left of the ESP32, between the mounting hole and the USB-C socket. A bottom-layer keepout (no tracks or vias) sits under the RP2350B.
  • Row above the fingers: data U3, high address byte U2 directly over fingers A15-A8, control U4 (U3 is turned 180 degrees from the others: its A side is the Z80 side so DIR can be /RD itself). Row above that: low address byte U1 over U2, fed from fingers A0-A3 on the left and A7-A4 on the right along the bottom layer, then strobe OR gates U6 and open-drain drivers U7. Both address buffers put plain bytes on MD0-MD7, so the firmware sees ordinary addresses. I2C expander U15 and the joystick conditioning network sit beside the DE-9; audio and the two LDOs above them.
  • RP2350B core regulator copied from "Hardware design with RP2350" figure 4: input cap C22 and output cap C20 (0402) straddle the VREG_LX pin, LX runs 3.7 mm under both to L1, VIN and PGND go straight into C22, feedback senses at C20, the AVDD filter R28/C39 sits above. L1 is the polarised Abracon part: pad 2 (dot) is the DVDD end, away from the top edge of the board.
  • Crystal 6.5 mm from its pins with R20 between chip and crystal; XOUT_R runs under the crystal to pad 3. XIN and XOUT drop one pad lane after leaving the chip so DVDD pin 32 has room for its via.
  • Before ordering: check the D-sub footprint against the CONNFLY DS1037 drawing, check lib/tspico.pretty/microSD_TF-01A and L_Abracon_AOTA-B201610 against the parts' drawings (both were generated from LCSC's land patterns). (TF-01A card detect: low = card in, confirmed on proto1.)

Routing flow and state

bash
cd hardware
PY=/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/Current/bin/python3
$PY scripts/gen_layout.py     # placement, keepouts, planes (discards all routing)
$PY scripts/preroute.py       # locked hand routes: regulator, crystal, DVDD spine, inner supply links, bottom-row fan
$PY scripts/autoroute.py --passes 100     # jar from $FREEROUTING_JAR (or --jar); about 25 minutes
$PY scripts/finish.py         # widen necked tracks, join orphan supply islands, retry open nets, drop unused vias and stubs
$PY scripts/silk.py           # place reference designators clear of pads, silk and the edge; trim outlines at the edge
$PY scripts/labels.py v3      # board name on top; name, URL, licence and OSHW logo on the bottom

Or all five in one command, which is the way to run it:

bash
$PY scripts/flow.py                       # jar from $FREEROUTING_JAR (or --jar); 10 to 15 minutes per attempt, up to 3 attempts

Freerouting does not give the same result twice from the same input. Before U1's address pins had their pre-routed via fan (below), about one run in three left one of them (A3, A5) sealed in behind its neighbours' vias; with the fan, three runs out of three closed on the first attempt. The safety net stays: if a signal net is left open, finish.py tries lifting the neighbours' copper around the pin, routing the open net and putting the neighbours back, but refuses a result that needs more than three vias per net (the only way out of such a pocket has been a 9-via, 70 mm detour). If the board still is not clean finish.py exits non-zero and flow.py routes again from the placement, keeping the failed board as fab/route/attempt-N.kicad_pcb.

Rules: 0.15 mm signal tracks (the router may neck down to 0.11 mm in a squeeze; board minimum 0.1 mm, JLCPCB's is 0.09), 0.4 mm on the 5 V rails and +3V3_WIFI, 0.127 mm clearance, every via 0.6/0.3 mm (JLCPCB's no-surcharge size; the ESP32 footprint's 0.2 mm thermal vias are opened to 0.3 mm by gen_layout.py). The pre-stitch step skips the RP2350B's pins: a via 0.9 mm out of a 0.4 mm pitch pin blocks both neighbours' escape lanes. Its exposed pad gets five ground vias.

What preroute.py fixes in place before the autorouter runs, because the router handles a fully used 0.4 mm pitch QFN badly (whichever pins it leaves for last end up sealed behind its own vias):

  • the regulator and crystal, as above;
  • the DVDD spine: 0.25 mm track under the package from the regulator's pin 65 to DVDD pins 51, 10 and 32 (10, 15 and 22 mm from the output capacitor; only the first 3 mm at the pins is 0.15 mm), and pin 51's 100 nF 2 mm from its pin;
  • the 3.3 V supply pins linked in groups under the package, each group with one via: 50 to corner pin 41, 68/69 to 76 to pin 5, 24 to 29;
  • the bottom pad row (pins 1-20, all used) as a deterministic fan: straight out to a staggered depth, a 45 degree turn, and a via on a common line at 0.75 mm spacing, which is the tightest legal pattern for 0.6 mm vias at 0.4 mm pitch.
  • U1's Z80-side pins (A0-A7): each runs straight in under U1's body to its own via, in two staggered rows 1.26 and 2.06 mm from the pads. U1's bottom pad row faces U2's top row across a 0.8 mm gap, so these pins can only leave under U1, and their fingers are on the bottom layer, so each needs a via anyway. Neighbouring vias are 1.03 mm apart, and a track on either layer still passes between two vias of the near row.

State on 2026-09-17 (DMA option dropped, address buffers delivering plain bytes, audio and joystick passives respaced for silkscreen, U1 address fan pre-routed): fully routed, DRC clean at every severity (no errors, no warnings, no unconnected items), no tracks on either plane layer. 2073 track segments, 378 vias, all 0.6/0.3 mm, no track under 0.13 mm. Produced by flow.py on its first attempt with no hand edits. (Run DRC on the board where it sits: a copy outside the project folder is checked against KiCad's default rules and reports hundreds of false clearance errors.)

Silkscreen: silk.py sets designators to 0.8 mm text and tries positions around each part until one clears pads, other silk, other parts and the board edge; rows of equal parts all get the label on the same side (above a flat part, to the right of an upright one), and a hidden designator gets a second chance by moving a neighbour's. The layout leaves room for this: passive rows are 3.2 mm apart in the audio block, 2.7 mm in the SD pull-ups, and the joystick RC columns are 2.6 mm apart. 139 of 140 designators are on silk; only C39 (the VREG_AVDD capacitor, boxed in by the design guide's regulator layout) is hidden, and it is on F.Fab with all the others. Outlines of edge connectors that overhang the board are trimmed where they cross the edge.

Board labels: labels.py (also run by flow.py) puts "TS-Pico v3" on the top silkscreen above the left end of the fingers. On the bottom it puts the name, the repository URL (the CERN-OHL-S Source Location), the licence and the OSHW logo. It only touches its own group of silkscreen items, so it can be rerun on a routed board, and it refuses to save if a label would land on a pad, a courtyard or other silk. labels.py v2.6 does the same for ../hardware-v2.6/.

Rerunning autoroute.py continues from the current routing (it exports existing tracks); --fresh starts over. Do not rerun gen_layout.py: it rebuilds the board from placement and discards routing.

Parts

156
QtyValueFootprintReferences
2610kR_0603_1608MetricR10, R12, R13, R15, R16, R17, R21, R22, R34, R35, R36, R37, R38, R40, R100, R101 +10
24100nC_0603_1608MetricC1, C2, C3, C10, C21, C23, C24, C25, C26, C27, C28, C29, C30, C31, C37, C38 +8
9100R_0603_1608MetricR5, R80, R81, R90, R91, R92, R93, R94, R95
810uC_0603_1608MetricC42, C43, C44, C45, C50, C60, C80, C81
71kR_0603_1608MetricR3, R20, R23, R71, R72, R75, R76
733R_0603_1608MetricR26, R27, R28, R30, R31, R32, R33
6100pC_0603_1608MetricC90, C91, C92, C93, C94, C95
64k7R_0603_1608MetricR1, R2, R6, R7, R44, R45
410nC_0603_1608MetricC71, C72, C75, C76
474LVC245APWTSSOP-20_4.4x6.5mm_P0.65mmU1, U2, U3, U4
4MountingHole_3.2mm_M3MountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
3220uCP_Elec_6.3x5.4C40, C41, C46
34.7uC_0402_1005MetricC20, C22, C39
3Fiducial_1mm_Mask2mmFiducial:Fiducial_1mm_Mask2mmFID1, FID2, FID3
215pC_0603_1608MetricC35, C36
21uC_0603_1608MetricC52, C70
222kR_0603_1608MetricR74, R78
25k1R_0603_1608MetricR24, R25
2SS34D_SMAD2, D3
2TLV1117LV33SOT-223-3_TabPin2U30, U31
10R_0603_1608MetricR39
1100kR_0603_1608MetricR70
112MHzCrystal_SMD_3225-4Pin_3.2x2.5mmY1
115kR_0603_1608MetricR42
12k2R_0603_1608MetricR14
13.3uHL_Abracon_AOTA-B201610L1
13.5mm stereoJack_3.5mm_PJ320D_HorizontalJ4
174LVC06ADSOIC-14_3.9x8.7mm_P1.27mmU7
174LVC32APWTSSOP-14_4.4x5mm_P0.65mmU6
1APS6404L-3SQR-SNSOIC-8_3.9x4.9mm_P1.27mmU22
1BOOTSELSW_Push_1P1T_XKB_TS-1187ASW4
1ESP32-C3-WROOM-02-N4ESP32-C3-WROOM-02U40
1GD25Q128ESIGRSOIC-8_5.3x5.3mm_P1.27mmU21
1GNDTestPoint_Pad_1.5x1.5mmTP3
1JOY +5VSolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmJP10
1JoystickDSUB-9_Pins_Horizontal_P2.77x2.84mm_EdgePinOffset7.70mm_Housed_MountingHolesOffset9.12mmJ5
1MCP6002SOIC-8_3.9x4.9mm_P1.27mmU50
1NMISW_Push_1P1T_XKB_TS-1187ASW2
1OLED 1.54in 128x64 I2CPinHeader_1x04_P2.54mm_VerticalJ3
1RP2350BQFN-80-1EP_10x10mm_P0.4mm_EP3.4x3.4mmU20
1RUNSW_Push_1P1T_XKB_TS-1187ASW3
1SWCLKTestPoint_Pad_1.5x1.5mmTP1
1SWDIOTestPoint_Pad_1.5x1.5mmTP2
1SY6280AACSOT-23-5U32
1TS ResetSW_Push_1P1T_XKB_TS-1187ASW1
1TS2068_Edgetspico:TS2068_EdgeConnector_2x32P1
1USB-CUSB_C_Receptacle_HRO_TYPE-C-31-M-12J1
1XL9555TSSOP-24_4.4x7.8mm_P0.65mmU15
1greenLED_0805_2012MetricD4
1microSDmicroSD_TF-01AJ2

More from timex-sinclair-projects/tspico-hardware

2
  • 4 layers130 × 64.3 mmTspico v2.6, the printed circuit board in 3D

    Tspico v2.6

    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).

    93 partsCERN-OHL-S-2.0
  • 4 layers130 × 64.3 mmTspico v2.5, the printed circuit board in 3D

    Tspico v2.5

    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).

    83 partsCERN-OHL-S-2.0

Similar boards

  • 4 layers130 × 64.3 mmMegabank, the printed circuit board in 3D

    Megabank

    timex-sinclair-projects/TS-2068-Megabank

    Battery-backed 4 MB expansion-bank RAM board for the Timex Sinclair 2068 (TS-Pico v3)

    97 partsMIT
  • 4 layers98.5 × 122.4 mmVbench pod, the printed circuit board in 3D

    Vbench pod

    embeddedci-com/benchpod

    An open hardware bench tool that plugs into your CI: sensor sim, CAN, analog I/O, power control, and a Python SDK with pytest integration

    335 parts2CERN-OHL-W-2.0
  • 2 layers100 × 89.5 mmLed processor board, the printed circuit board in 3D

    Led processor board

    eelstretching/led-processor-board

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

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

    Het68-core

    fedurca/het68_pcb

    pcb design description

    134 parts
  • 4 layers70.8 × 110 mmThors Arsenal, the printed circuit board in 3D

    Thors Arsenal

    shannon-greenlight/Thors-Arsenal

    Eurorack Module

    311 parts1GPL-3.0
  • 4 layers45 × 49 mmSwarm drone, the printed circuit board in 3D

    Swarm drone

    aniranaway/Drone_Swarm

    A fully custom, low-level embedded hardware and firmware platform designed for autonomous multi drone swarms. The system integrates custom STM32-based flight controller PCBs, coreless DC motor drive arrays for a micro…

    108 parts
  • 4 layers30.3 × 90.5 mmTinker base, the printed circuit board in 3D

    Tinker base

    Tinkerbug-Robotics/TinkerRocket

    Model rocket flight computer, ground station, iOS app, and simulation

    94 parts1GPL-3.0
  • 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

Questions

How big is the Tspico v3 PCB?

It measures 130 × 64.3 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Tspico v3 use?

156 parts, built around the RP2350B, 74LVC245APW, ESP32-C3-WROOM-02-N4 and GD25Q128ESIGR. 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 Tspico v3 KiCad files?

From the timex-sinclair-projects/tspico-hardware repository on GitHub, at the commit this page was made from: the board is hardware/tspico-v3.kicad_pcb and its schematic hardware-v2.5/benchprog.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Tspico v3 design in my own project?

Its repository publishes it under the CERN-OHL-S-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).