Skip to the content
2 layers101.6 × 48.3 mmLimn, the printed circuit board in 3D

Pen Plotter with toolchanger

Size
101.6 × 48.3 mm
Copper layers
2
Thickness
1.6 mm
Parts
53
Nets
51
Pads
150
Tracks, vias
149, 8
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
1 Apr 2026
Updated
5 Nov 2026

Overview

Limn is an open-source printed circuit board by prashnts, from the prashnts/limn repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 101.6 × 48.3 mm with 53 parts on 51 nets, routed with 149 tracks and 8 vias.

It is built around the SMAJ3.3A and AO3400. Its parts include 19 connectors, 18 resistors, 5 capacitors, 4 ICs and 3 diodes. It belongs with the RP2040 boards of this library.

Main components

2

README

docs/kicad/README.md

Limn: the electronics in KiCad

A KiCad 9 project, limn.kicad_pro. The root sheet is the overview, with one sheet per role or board:

SheetFileWhat's on it
Powerpower.kicad_schThe USB-C PD charger, the 12 V (motion, switched) and 9 V triggers. The bucks sit on their boards: LM_Buck0 by the Melzi, MP_Buck0 on the Aux PCB, MP_Buck1 on the hub board
Host (Pi 4)host.kicad_schThe Pi 4, its USB ports (the hub board on USB-A 3), a camera, I2C1
Tool docktool_dock.kicad_schThe MCP23017 and the 5 holder switches, the PN532 tag reader, the indockator strip
Melzi (motion)melzi.kicad_schThe Melzi, motors A/B, the X endstop, the EXT header, the OR gate (going), the plot bed's pull-up, LM_Buck0 (LM2596: +7V5_ZK, the motors only)
Toolheadtoolhead.kicad_schA2. The toolchanger as a PCB of its own (refs 50x, toolhead_board.kicad_pcb): the coupling (3 screws 5 V/GND/ID, 4 pogo pins D+/D-/GND/ID), the K lock's motor on 4 pogo pins, its key switch, the cell's pads (J501), 10 uF + 100 nF + an LED on +5V_TOOL, the FFC on an FPC-20P breakout (U506). The FFC (20P 0.5 mm, <= 15 cm) to a second breakout on the axis (U507, wired, no PCB): the USB-C cable to the hub board (W501, 5k1 on CC), CAT6 to LIT, the K ribbon to the Melzi. The axis: Z, the Y/Z endstops, the MPU9250, the endoscope, the BLTouch (gone). The FFC pinout and the tool classes in its notes
Aux MCU (rpi)aux.kicad_schThe Aux PCB, next version: a Waveshare RP2040-Zero (Klipper rpi) on the hub's DN4 (data only), MP_Buck0 (9 V to +5V_LED: the Zero, the LEDs, the buzzer), the buzzer, the MPU9250's I2C; the LEDs off the board
Calibration bedcal_bed.kicad_schThe bed's ID resistor, the FSR node (GP0 BED_DATA, GP2 BED_PROBE) and its 4 x 8 sheet with the row loads
Plot bed boardplot_bed_board.kicad_schThe board of limn.kicad_pcb and what hangs off it (refs 95x, A2). Above: the two-strip cell (4 BF350s, one full bridge; its nets CELL_* on the head side), W951 = CAT6's bridge pairs to the board's rails (so E+/E- stay their own nets on the toolhead PCB), CAT6 through the chain (orange = E, blue = S, white-green = the tool's ID, green = its GND return on J952.6; the browns spare) to the board at the back: one ADS1220, the touch line (Q951, Q952 in series for BED_PROBE), the tool's ID line, LEDs, J957 to the hub board (the hub's DN3: 5 V on RAW, D+/D- on the Pro Micro's pads underneath; GP9 = TOOL_5V_EN back; +5V_TOOL_IN for the bed). Below: the bed dock's work, DETECT (GP29), BED_DATA (GP0, half-duplex), BED_PROBE (GP1), two Pololu Mini MOSFET Slide Switches on MP_Buck1 (+5V_TOOL_IN): U956 on GP4 = the bed (BED_PWR, F952), U957 on GP5 = +5V_SW on J959 (the LEDs, spare), J958, and the dock's pogo J701. Its board headers are 1x1s (J952.1, J957.4, ...), one per pin, to place each where its wiring wants
Hub board (USB + tool 5 V)hub.kicad_schThe FE1.1s hub on its own cable from the Pi (Adafruit USB-C breakout; the Pi powers the hub): DN1 the Melzi, DN2 the tool, DN4 the Aux MCU: data only; DN3 the plot bed board, with the hub's 5 V. The tool's 5 V: 9 V in, MP_Buck1, the Pololu switch, a polyfuse, the tool's USB-C cable on a second Adafruit breakout (U1007: +5V_TOOL, DN2)
Beam bed (XY)beam_bed.kicad_schA detachable bed (refs 85x), its own PCB (beam_bed_board.kicad_pcb): a Waveshare RP2040-Tiny, two 940 nm IR LEDs (AO3400, 100R, pulsed from BED_PWR) and two PT1206BS (10k emitter loads into GP26/27) in an L of 15 mm slots; GP0 = BED_DATA (half-duplex UART, one wire), GP1 = BED_PROBE (the trigger, high = OK), DETECT = the ID resistor only. 0805 resistors. Z from the head's load cell

How to read it:

  • Sheets meet through global labels (USB_*, I2C1_*, MOT_*, ENDSTOP_*, PROBE_*, BED_*, ...) and named power rails (+12V, +7V5_ZK, +9V, +5V_LED, +5V_TOOL, +5V_TOOL_IN, +5V_HUB, +5V_MELZI, +3V3_PI, +3V3_AUX, +3V3_PB, +3V3_PH). All GND is one net.
  • Solid boxes: one board or assembly. Dashed boxes: planned, or going; their parts are DNP.
  • Boards are blocks with the pins Limn uses, named as the code names them. The Pro Micro is drawn with its full header in physical order. A USB link is one pin (the cable).
  • References per sheet: power 1xx, host 2xx, tool dock 3xx, Melzi 4xx, toolhead 5xx, Aux 6xx, the dock's pogo 7xx (J701), calibration bed 8xx (the beam bed 85x), plot bed board 95x, hub board 10xx.
  • Set aside (2026-10-23, not drawn): the bed on three load-cell feet (the old Plot bed sheet, refs 90x), the RTP node, a toolhead MCU, the QRE1113 on the toolhead (U954, R961, C957, GP28). Their drawing code is in kicad_gen/aside.py, to bring one back as it was.
  • Wires turn at 45°.

Gathered from the code and the docs on 2026-10-16: notebooks/pinout.md, micropython/nodes/*.json, klipper/*.cfg, projects/limn/content/electronics.md, docs/block-diagrams.md, docs/load-cell.md, TODO.md.

Regenerating

text
python3 docs/kicad/gen.py --force --check

kicad_gen/ holds the drawing code: core.py (the writer, wires, labels, enclosures), boards.py (the blocks), sheets_a.py / sheets_b.py (one function per sheet), aside.py (what is set aside). gen.py keeps KiCad's settings in limn.kicad_pro and only rewrites its sheet list. --check runs ERC, audit.py (a net joining two signal pins of one part: the shorts ERC can't see between passive pins) and writes one SVG per sheet into svg/. Today (2026-10-23): ERC 0 errors 0 warnings, audit ok. R958 fitted (as traced on the PCB), TOUCH_GP on GP2 only.

Footprints: Plot bed board has them (perfboard: R and C in 0805 since 2026-10-23, the fuse in 1812; the modules in limn.pretty, written by kicad_gen/footprints.py, listed in fp-lib-table), and so do the three boards of their own below. The other sheets don't yet.

One PCB per board. limn.kicad_pcb is the plot bed board's (Update PCB from Schematic, F8). Its perfboard's copper is drawn on Dwgs.User between the hole dots (perfboard.strips, 2026-10-23): the top and bottom rows one strip each, the 15 rows between joined down each column in 5 groups of 3. The hub board, the Aux PCB and the beam bed are boards of their own; their parts are "not on board" in the schematic (sheets_b.own_board), so F8 never puts them on limn.kicad_pcb. Their boards are made from the netlist by tools/mkboard.py hub|aux|beam|head: the sheet's parts with a footprint, their nets, a first placement (not routed). It never writes over an existing board (--force does); open them in the PCB editor on their own (no project of their own, so no F8: a schematic change goes in by hand or a sync like tools/sync.py).

BoardFileWhat
Hub boardhub_board.kicad_pcbPerfboard 38 x 17 holes (as the plot bed board's; its strips not drawn yet). The FE1.1s and the USB-C breakout's pad maps are placeholders: map the real boards before soldering
Aux PCBaux_board.kicad_pcbPerfboard 38 x 17. MP_Buck0 drawn as the same mini buck as MP_Buck1; the LEDs (U602/U603) off the board
Toolhead PCBtoolhead_board.kicad_pcbIts own project (toolhead_board.kicad_pro): the Toolhead sheet drawn again as toolhead_board.kicad_sch (gen.py STANDALONE), so the board and the schematic link (F8, cross-probing); its global labels dangle there (their other ends are in limn.kicad_pro). Edit the generator, not one copy. A PCB, 61 x 50.8 mm for now (a first outline: shape it to the head). The FPC-20P breakout (limn:FPC20_breakout, from its photo; its STEP to come), SMD pogo pins D 2.0 x 5 (limn:Pogo_pin_D2.0_L5.0), the K motor with its flex on 4 pogos (limn:Stepper_slider_5mm_flex4), the key switch (limn:Micro_limit_sw_inline), M3 pad holes for the screws, the cell's wires (SolderWire 1x04), 0805. STEPs from the user's models in limn.3dshapes/
Beam bedbeam_bed_board.kicad_pcbA PCB, 43.2 x 33.0 mm, 1.6 mm (thinner for the bed: set it in Board Setup). 0805, the LEDs/PTs in 1206 (where they go depends on the slots), the pogo as a 1x05 2.54 mm row

The RP2040-Zero and RP2040-Tiny (same 23 castellated holes, rows 15.24 mm apart) use Waveshare's pin numbers (GP0-15 = 1-16, GP26-29 = 17-20, 3V3 21, GND 22, 5V 23; 24 = the USB), with Waveshare's STEP models in limn.3dshapes/ (gzipped, .stpZ). The library footprints point at KiCad's 3D models (${KICAD9_3DMODEL_DIR}): install kicad-packages3d to see them.

Once the schematic is edited in KiCad, regenerating overwrites the edits: don't, or move the change into the generator first.

To fill in

  • The FE1.1s breakout (which board) and its pad map: limn:FE1.1s_USB_hub_breakout is a placeholder (U1002).
  • The Adafruit USB-C breakout's pin order (U1001: VBUS, D+, D-, GND in a row for now).
  • The beam bed's pogo: its pitch and pin order (J851: a 1x05 2.54 mm row for now); where the LEDs/PTs sit against the slots; the board's thickness.
  • The toolhead PCB: the K flex pads' pitch and place (3.0 mm past the motor's end, a placeholder), the key switch's tabs (from the model), the screws' size and places, the outline; the breakout's STEP (the user, 2026-10-30).
  • The FFC: 1 -> 1 (the cell reads right through pins 2-5, 2026-11-01; reversed they'd land on 16-19). Meter 13-15 before power anyway.
  • The bed pogo connector's pin order (power, GND, DETECT, TX, RX).
  • The cameras on the Pi: which is on which port, and which devices are on the hub vs straight on the Pi today.
  • The buzzer circuit: gate resistor, supply, flyback diode.
  • The Pico's VSYS (USB only, or the Aux PCB's LM2596 through a diode?), and where the MPU9250 gets its VCC.
  • The MCP23017 breakout's RST pin.
  • The ADS1220 module's header order: from the photo (2026-10-18), DIP numbering, top view; footprint limn:ADS1220_module.
  • The Pololu Mini MOSFET Slide Switch's pad map (U1006 on the hub board).
  • Where the Pro Micro's D+/D- pads are underneath (footprint pads 30/31 are placeholders by the USB-C).
  • klipper/leds.cfg for the RP2040-Zero (lamp gpio16 → 14, indockator gpio17 → 13) and the merged Dock/plot bed firmware (dock pins GP29, GP0/1, GP4 = BED_EN, GP5 = SW_5V_EN, high = on; CS2 on GP21, LED_R/LED_G gone).
  • The FSR board's series resistors on the rows (values).
  • The Melzi's endstop headers (2 or 3 pins), and whether the BLTouch and the OR gate are already out.

Parts

53
QtyValueFootprintReferences
61kResistor_SMD:R_0805_2012MetricR951, R952, R958, R959, R971, R973
4100RResistor_SMD:R_0805_2012MetricR956, R965, R967, R969
3100kResistor_SMD:R_0805_2012MetricR955, R972, R974
310kResistor_SMD:R_0805_2012MetricR957, R966, R970
3SMAJ3.3ADiode_SMD:D_SMAD951, D952, D957
24k7Resistor_SMD:R_0805_2012MetricR954, R968
24n7 C0GCapacitor_SMD:C_0805_2012MetricC951, C952
2PPTC 1812 1A 6VFuse:Fuse_1812_4532MetricF952, F953
2Pololu mini slide sw. #2810limn:Pololu_Mini_MOSFET_Slide_SwitchU956, U957
1+5V Toolchanger USB 1Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ959.1
1+5V Toolchanger USB 2Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ959.2
1100nCapacitor_SMD:C_0805_2012MetricC956
147nCapacitor_SMD:C_0805_2012MetricC953
147uCapacitor_THT:CP_Radial_D5.0mm_P2.50mmC955
1ADS1220 module (the sum chip)limn:ADS1220_moduleU951
1AO3400Package_TO_SOT_SMD:SOT-23Q952
1CAT6 1Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ952.1
1CAT6 3Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ952.3
1CAT6 4Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ952.4
1CAT6 5Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ952.5
1CAT6 8Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ952.8
1MMBT3904 / BC847 (SOT-23)Package_TO_SOT_SMD:SOT-23Q951
1SparkFun Pro Micro RP2040 (top view, USB-C up)limn:SparkFun_Pro_Micro_RP2040U952
1to the Melzi (EXT A4) 1Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ953.1
1to the Melzi (EXT A4) 2Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ953.2
1to the bed dock (pogo) 1Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ958.1
1to the bed dock (pogo) 2Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ958.2
1to the bed dock (pogo) 3Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ958.3
1to the bed dock (pogo) 4Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ958.4
1to the bed dock (pogo) 5Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ958.5
1to the hub board (J1002) 1Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ957.1
1to the hub board (J1002) 2Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ957.2
1to the hub board (J1002) 3Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ957.3
1to the hub board (J1002) 5Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ957.5
1to the hub board (J1002) 6Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalJ957.6

More from prashnts/limn

6
  • 2 layers101.6 × 48.3 mmLimn, the printed circuit board in 3D

    Limn

    prashnts/limn

    Pen Plotter with toolchanger

    35 parts14GPL-3.0
  • 2 layers101.6 × 48.3 mmLimn, the printed circuit board in 3D

    Limn

    prashnts/limn

    Pen Plotter with toolchanger

    25 parts14GPL-3.0
  • 2 layers20.3 × 48.3 mmBeam bed board, the printed circuit board in 3D

    Beam bed board

    prashnts/limn

    Pen Plotter with toolchanger

    19 parts14GPL-3.0
  • 2 layers63.5 × 53.3 mmToolhead board, the printed circuit board in 3D

    Toolhead board

    prashnts/limn

    Pen Plotter with toolchanger

    18 parts14GPL-3.0
  • 2 layers101.6 × 48.3 mmHub board, the printed circuit board in 3D

    Hub board

    prashnts/limn

    Pen Plotter with toolchanger

    12 parts14GPL-3.0
  • 2 layers101.6 × 48.3 mmAux board, the printed circuit board in 3D

    Aux board

    prashnts/limn

    Pen Plotter with toolchanger

    5 parts14GPL-3.0

Similar boards

  • 4 layers67.5 × 96.5 mmNew Flight Controller, the printed circuit board in 3D

    New Flight Controller

    chanmeletio/Astro_Avionics

    Astro at Baylor HPR Avionics Software

    139 partsMIT
  • 2 layersOpenPowerDistribution, the printed circuit board in 3D

    OpenPowerDistribution

    ulikoehler/OpenPowerDistributor

    Open-hardware PCB to distribute DC 12V power to 12V / 5V / 9V & 24V consumers

    537 partsCC0-1.0
  • 2 layers109 × 67.2 mmDaughter Board, the printed circuit board in 3D

    Daughter Board

    hancho6319/My_PCB_Designs_repo

    48 parts
  • 2 layers55 × 80 mmBoard esp32 v2, the printed circuit board in 3D

    Board esp32 v2

    sudomesh/disaster-radio

    A (paused) work-in-progress long-range, low-bandwidth wireless disaster recovery mesh network powered by the sun.

    101 parts1.1k
  • 2 layers59.2 × 52.9 mmMagic epaper, the printed circuit board in 3D

    Magic epaper

    fossasia/magic-epaper-hardware

    Magic ePaper Hardware

    57 parts1kApache-2.0
  • 2 layers155.5 × 130 mmEinkpicframe, the printed circuit board in 3D

    Einkpicframe

    Spritetm/picframe_colepd

    A WiFi picture frame allowing for remote photo uploads, using an ESP32-C3 and a 5.6" color E-ink display

    60 parts97
  • 2 layers100 × 93 mmSpeeduino base, the printed circuit board in 3D

    Speeduino base

    Tjeerdie/SPECTRE

    Speeduino compatible engine control unit (ECU) based around black STM32F407VET6 board.

    213 parts59GPL-3.0
  • 2 layers128 × 77 mmScale, the printed circuit board in 3D

    Scale

    Jana-Marie/lab-balance

    https://twitter.com/_Jana_Marie/status/1270040286710968321

    59 parts34

Questions

How big is the Limn PCB?

It measures 101.6 × 48.3 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Limn use?

53 parts, built around the SMAJ3.3A and AO3400. 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 Limn KiCad files?

From the prashnts/limn repository on GitHub, at the commit this page was made from: the board is docs/kicad/limn.kicad_pcb and its schematic docs/kicad/aux.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Limn design in my own project?

Its repository publishes it under the GPL-3.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).