
Dimmer4
Meo98/picostack
Stackable, contract-driven module system for the Raspberry Pi Pico — open hardware, built by code

Stackable, contract-driven module system for the Raspberry Pi Pico — open hardware, built by code
Motormodul is an open-source printed circuit board by Meo98, from the Meo98/picostack repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 75 × 65 mm with 63 parts on 72 nets, routed with 686 tracks and 144 vias.
It is built around the STM32C011F6P6, SN74LVC1G07DBV and K7805-1000R3, with the SN74LVC1G08DBV, SN74LVC1G175DCK and IRFR5305 among its other parts. Its parts include 20 resistors, 14 capacitors, 11 ICs, 11 connectors and 2 diodes. It belongs with the robots and motor control boards and the RP2040 and STM32 boards of this library.
A stackable, contract-driven module system for the Raspberry Pi Pico.
Open hardware, generated by code, verified by tests that are proven to fail.
One board plus a Pico is a working device. PicoStack v2 abolishes the separate base board that v1 needed: every 75 × 65 mm module now carries its own 6–30 V supply (reverse-polarity protection, TVS, a K7805-1000R3 regulator, Schottky-OR into VSYS) and a pair of Pico-native 1×20 socket rows (17.78 mm apart, the Pico's own pinout) — the Pico plugs straight into the top of the stack and all 40 pins run down through it. Stack several fed boards and they coexist; one is enough to power the whole chain. Every module also breaks out its 18 spare Pico GPIOs plus 3V3/GND as labelled solder pads on the board edge.
Power, I²C, emergency-stop and flashing signals run through the stack on the same contract pinout v1 defined — v2 changed the connector geometry, not a single pin's role — and any module can be flashed through the stack, selected by a hardware token chain, without touching a cable.
The unusual part: these boards are not drawn, they are built. Schematics, placement, routing, ground stitching and the manufacturing checks all come from Python that runs headless against KiCad. The stack's mechanical and electrical rules live in a single machine-readable file — the contract (see the design spec for the full v2 rationale) — and every board is measured against it before it may exist.
| Piece | What it is | State |
|---|---|---|
Contract (tools/stack_spec.py) | Connector positions, pin roles, per-module supply rules, edge-pad positions, landing-point copper rules, mating rules — the single source of truth for anyone building a module | stable, v2 |
Motor module (hardware/kicad/motor/) | DRV8876 H-bridge, STM32C011 co-processor, opto-isolated dual-channel e-stop loop, own 6–30 V supply cell | 75 × 65 mm, routed, DRC-clean |
Dimmer family (hardware/kicad/dimmer{1,3,4}/) | 1/3/4-channel low-side LED dimmers from one parametric description, own supply cell each | 75 × 65 mm, routed, DRC-clean |
Base board (hardware/kicad/sockel/) | v1's Pico socket + 24 V input + 5 V rail board | v1-only, archived — see release v0.1.0; not part of v2, not updated to the v2 contract |
Toolchain (tools/) | Schematic generators, board builder, autorouter driver, ground healer, contract probes | working, evolving |
tools/sch/<board>.py → KiCad schematic (generated, ERC-clean)
tools/pcb/spec_<board>.py → placement + pre-routes + stitching, no KiCad needed
tools/pcb/build.py → fresh .kicad_pcb from netlist + spec
tools/pcb/autoroute.py → freerouting 2.3 headless, DSN repaired on the fly
tools/pcb/masseheiler.py → finds isolated copper islands, heals them with vias
tools/pcb/steckerprobe.py → measures the finished board against the contractEvery stage is a plain Python file you can read, run and extend. The website walks through the architecture in detail.
The contract is deliberately small. A module must:
stack_spec.py,tests/ and the contract probes against the built board.Start by copying tools/pcb/spec_motor.py and
tools/sch/motormodul.py, then read
CONTRIBUTING.md — it describes the workflow, the
red-proof testing rule, and how to propose a new module.
Module ideas we would love to see: sensor hats, LED drivers, stepper drivers, CAN/RS-485 bridges, audio, battery management — anything that speaks the contract. Firmware in any language that runs on a Pico or the module MCUs (C, MicroPython, Rust, …) is equally welcome.
hardware/kicad/ KiCad projects (generated .kicad_sch + built .kicad_pcb)
tools/stack_spec.py the contract
tools/sch/ schematic generators
tools/pcb/ board builder, router driver, probes, healer
tests/ plain-python test suites (no pytest needed)
docs/ project website (GitHub Pages)You need KiCad 10, Python 3, and Java ≥ 25 for the bundled freerouting 2.3 flow. Then:
python3 tests/run_all.py # every suite, no board tools needed
python3 tools/sch/motormodul.py # regenerate a schematic
tools/pcb/kipy tools/pcb/build.py spec_motor \
hardware/kicad/motor/Motormodul.kicad_pcb \
hardware/kicad/motor/Motormodul.kicad_sch # rebuild a board(kipy is a small launcher that runs a script inside KiCad's Python.
See CONTRIBUTING for the full toolchain walkthrough.)
Gerbers, JLC-format BOM/CPL and pick-and-place files for all four v2 boards
live under hardware/fertigung/{motor,dimmer1,dimmer3,dimmer4}/, and ship as
ZIPs with every release.
hardware/fertigung/ORDERING.md walks
through ordering an assembled board at JLCPCB, including the traps that
already cost real money in v1 (a diode package mix-up, a rotation-preview
miss, a type-code encoding gotcha).
hardware/): CERN-OHL-S-2.0 —
strongly reciprocal: if you ship a derived board, you publish your changes.The public face of this project is English. The code comments are currently German — they carry the full engineering rationale of every decision and are being translated over time. New contributions should be in English.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 6 | 0.1u | C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C9, C11, C13, C14, C15, C16 |
| 4 | 100n | C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C17, C18, C19, C100 |
| 4 | 10k | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R13, R15, R90, R91 |
| 4 | 3.3k | R_1206_3216Metric | R16, R17, R18, R19 |
| 4 | M3 | H1, H2, H3, H4 | |
| 3 | 0.1k | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R7, R8, R9 |
| 3 | 4.7k | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R10, R20, R21 |
| 2 | 10000 (ID_OBEN) | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R104, R105 |
| 2 | Kennwiderstand (Modultyp) | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R100, R101 |
| 2 | PC817 | PC817_SMT_Gullwing | U4, U5 |
| 2 | SN74LVC1G07 | SOT-353_SC-70-5 | U6, U7 |
| 2 | SN74LVC1G08 | SOT-353_SC-70-5 | U3, U103 |
| 1 | 0.022u | C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C10 |
| 1 | 1.3k | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R5 |
| 1 | 1000n | C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C101 |
| 1 | 100k | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R102 |
| 1 | 220u | CP_Radial_D8.0mm_P3.50mm | C90 |
| 1 | 22u | C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C91 |
| 1 | DRV8876PWPR | IC_DRV8876PWPR | U1 |
| 1 | IRFR5305 | TO-252-3_TabPin2 | Q90 |
| 1 | K7805-1000R3 | Converter_DCDC_RECOM_R-78B-2.0_THT | U90 |
| 1 | Kettenstecker, Buchse oben (SMD) | PinSocket_1x02_P2.54mm_Vertical_SMD_Pin1Left | J101 |
| 1 | Kettenstecker, Stift unten (SMD) | PinHeader_1x02_P2.54mm_Vertical_SMD_Pin1Left | J102 |
| 1 | Leistungsstecker, Buchse oben (SMD) | PinSocket_2x02_P2.54mm_Vertical_SMD | J103 |
| 1 | Leistungsstecker, Stift unten (SMD) | PinHeader_2x02_P2.54mm_Vertical_SMD | J104 |
| 1 | Motor-Klemme | TerminalBlock_Phoenix_MKDS-3-2-5.08_1x02_P5.08mm_Horizontal | J5 |
| 1 | Notaus-Ruhestrom | PinHeader_1x04_P2.54mm_Vertical | J3 |
| 1 | Randpads GPIO, unbestueckt (SMD-Loetpad, Rueckseite) | Randpad_Reihe_1x18 | J95 |
| 1 | Randpads Versorgung: 2x 3V3 + 2x GND, unbestueckt (SMD-Loetpad, Rueckseite) | Randpad_Reihe_1x04 | J96 |
| 1 | SMCJ30A | D_SMC | D90 |
| 1 | SN74LVC1G175 | SOT-363_SC-70-6 | U101 |
| 1 | SN74LVC2G00DCUR | VSSOP-8_2.3x2mm_P0.5mm | U102 |
| 1 | SS36C | D_SMC | D91 |
| 1 | STM32C011F6P6 | TSSOP-20_4.4x6.5mm_P0.65mm | U100 |
| 1 | Stapelstecker links, Pico-Pins 1..20 (Buchse) | PinSocket_1x20_P2.54mm_Vertical | J100 |
| 1 | Stapelstecker rechts, Pico-Pins 21..40 (Buchse) | PinSocket_1x20_P2.54mm_Vertical | J105 |
| 1 | Versorgung Eingang | TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal | J90 |

Meo98/picostack
Stackable, contract-driven module system for the Raspberry Pi Pico — open hardware, built by code

Meo98/picostack
Stackable, contract-driven module system for the Raspberry Pi Pico — open hardware, built by code

LeanderM99/esp32-warmduscher-autoterm
ESP32 controller board for a tigerexped Warmduscher Kit 2.0: 16 A relay for the 24 V/300 W boiler element plus AUTOTERM Air 4D 5 V UART control, driven from Home Assistant. KiCad PCB generated from Python.

scrambletools/AVB-Eurorack
Eurorack interposer for the Scramble Hat-trik: bus power, 180° hat stacking, panel jacks


jdeguire/pjcontroller
Hardware and software for controlling your homebuilt video-beaming creation.



xtech/hw-openmower-sabo
OpenMower is an open-source project that upgrades off-the-shelf robotic mowers into modern, smart lawn mowing robots with RTK GPS technology. For more details, check out the OpenMower project.

sparkfun/SparkFun_Soft_Power_Switch_Mk2
Documentation, example code, and hardware for the SparkFun Soft Power Switch - JST 2mm.
It measures 75 × 65 mm and has 2 copper layers, 1.6 mm thick.
63 parts, built around the STM32C011F6P6, SN74LVC1G07DBV, K7805-1000R3 and SN74LVC1G08DBV. 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.
From the Meo98/picostack repository on GitHub, at the commit this page was made from: the board is hardware/kicad/motor/Motormodul.kicad_pcb and its schematic hardware/kicad/_vorschau/Modulsockel.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
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).