Skip to the content
2 layers134 × 80 mmProptroller, the printed circuit board in 3D

Open-source haunted-house prop controller: board, enclosure, firmware

Size
134 × 80 mm
Copper layers
2
Thickness
1.6 mm
Parts
145
Nets
121
Pads
467
Tracks, vias
1,119, 184
Pours
26
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
24 Oct 2026
Updated
4 Nov 2026

Overview

Proptroller is an open-source printed circuit board by speck0413, from the speck0413/specter-proptroller repository on GitHub, published under the MIT licence. It is a 2-layer board of 134 × 80 mm with 145 parts on 121 nets, routed with 1,119 tracks and 184 vias.

It is built around the TPS54360BDDAR, SS56 and PJ-320D, with the AO4485, B5819W and TS-1187A-B-A-B among its other parts.

Main components

12

README

README.md

Specter Proptroller

An all-in-one, open-source controller for props, animatronics and show effects. One 134 x 80 mm board takes a plug-in microcontroller (a 30-pin ESP32 DevKit or a Raspberry Pi Pico / Pico W / Pico 2 / Pico 2 W; a plain Pico 2 has no firmware build yet) and gives it the I/O a prop needs:

BlockWhat it does
4 power outputs (OUT1-4)high-side switched supply voltage, 5 A each continuous at 12-24 V (7.5 A for 5 s at low duty from idle, 10 A start-up surge under 1 s; 10 A board total); PWM dimming and soft start up to 2 A at 12 V (1 A at 24 V); LED per output
2 relays (RLY1-2)dry COM / NO / NC contacts. Rev B: 120 V AC 5 A (3 A inductive) or 28 V DC 10 A; rev A: ≤30 V DC only
Trigger inputs (TRIG1, TRIG2)3.5 mm TRS jacks: contact closure or a small powered sensor (3.3 V on the ring)
Contact outputs (CONTACT1-2; CC1-2 in scripts and code)isolated optocoupler closures on 3.5 mm jacks, to trigger other controllers or devices: signals only, ≤30 V DC, plan on about 2 mA, tip + / sleeve −
Pixels5 V level-shifted data for addressable LED strips
AudioDFPlayer Mini MP3 module (two-way UART), speaker terminal and stereo line out
Buttonsthree on-board user buttons
Expansion3 x 11 servo-style S/V/G header (I2C, analog, spare GPIOs), RAILS power terminal for accessories
Power9-24 V DC in (barrel ≤5 A or terminal ≤10 A), on-board 5 V / 2.5 A buck, TVS protection. Ratings are for a 12-24 V supply (12 V is the primary use case); below 12 V (down to the 9 V minimum), derate: the OUT FETs see less gate drive and run hotter

Controllers can be cascaded: a CONTACT output or a relay of one board triggers the TRIG1 / TRIG2 input of another, so one controller can drive up to four others; ESP-NOW / Wi-Fi is the option for richer coordination.

Getting started

New here? GETTING-STARTED.md goes from the parts on your table to a running prop with no programming: what to buy, flashing the stock firmware from the browser (ESP32) or by copying one file (Pico W), the sound card, wiring, and your first effect script typed on your phone. Then:

  • firmware/SHOW-SCRIPT.md: the effect script language (nine kinds of line), and firmware/show-script-examples/ with wiring notes;
  • the Arduino library: effects in code;
  • hardware/README.md: ratings, pinout and power.
  • firmware/BARE-DEVKIT.md: no board yet? Run the firmware on a bare ESP32 DevKit, ESP32-S3 DevKit or ESP32-C3 SuperMini (outputs through MOSFET or relay modules).
  • studio/: Specter Studio, the desktop app for these boards (Windows, macOS, Linux): find boards, write effects as text or blocks, try them on a practice board, update firmware, copy sounds to the SD card. Installers are on the releases page (studio-v… tags).
  • docs/DEV-SETUP.md: from nothing to a running board with Specter Studio built from source (macOS, with Windows and Linux notes): the setup script, the clone, a USB install and a script.
  • docs/FIRMWARE-BUILD.md: build the firmware for each board, flash it over USB, make a release folder, update over Wi-Fi, and what CI does on a release tag.

Status

This repository holds hardware rev B (relay insulation margin and air-gap slots for a 120 V AC relay rating, see hardware/README.md), not yet ordered. Rev A, the first ordered design (silk "RELAYS: <=30V DC ONLY"; not yet built or tested), differs as hardware/README.md describes (ratings, relay positions, errata). A 3D-printed enclosure is in enclosure/ (not printed yet). Firmware: C++ on the Arduino cores with PlatformIO (firmware/arduino), tested on the host and in a simulator; not yet run on a board. The desktop app, Specter Studio, is in studio/. Wiring guides and a build guide are in docs/ (below).

What is here

PathContents
hardware/board.tsthe board, written as design intent for the aieda toolchain (parts, nets, placement constraints, routing classes)
hardware/frozen.ts, hardware/routes.tsthe reviewed part placement and locked routing, so every build reproduces the same board
hardware/lib/parts.tsthe parts this board uses (KiCad footprints, LCSC numbers, pad maps checked against datasheets)
hardware/requirements.yamlrequirements with ids traced by the build
hardware/README.mdratings, GPIO map, power budget, copper sizing, test pads and first-board checks
enclosure/the 3D-printed enclosure: OpenSCAD model, design.toml with every size, Bambu Studio projects, build and check tools
GETTING-STARTED.mdfrom a new board to a running prop, no programming
firmware/the firmware (arduino/), the protocol (PROTOCOL.md), flash maps, the phone web UI (web/) and its browser tests (web-test/), golden sets and example show scripts
studio/Specter Studio, the desktop app (Tauri: Rust device layer in core/, React app in src/, Playwright tests in tests/e2e/); it builds its practice board from firmware/ and bundles the firmware library and the wiring guides. See studio/README.md and studio/docs/BUILDING.md
.github/workflows/firmware.yml: firmware host tests, board builds, examples, simulator and phone-page browser tests (on changes to firmware/); firmware-release.yml: on a tag v<firmware/VERSION>, builds the stock firmware (ESP32 DevKit, Pico W, Pico 2 W, and the bare devkits), drafts a GitHub Release with the update and first-flash images and proptroller-firmware.json, and publishes the browser flasher to GitHub Pages; studio.yml: Studio's tests and e2e (on changes to studio/ or firmware/), the installers (on changes to studio/), and on a tag studio-v<version> the installers on that tag's release
docs/wiring guides (interactive 3D pages, written pages, videos), the case build guide, switching AC loads, developer setup with Specter Studio (DEV-SETUP.md), building and flashing the firmware (FIRMWARE-BUILD.md)
tools/setup.sh (firmware setup; --dev for the developer checks; Studio has its own, studio/scripts/setup.sh), bootstrap, JLC order packages (with rotation corrections), routing helpers

The generated KiCad project (hardware/kicad/: board, schematic, rules, symbol library, build records) and the order files (hardware/fab/: gerbers zip, BOM, CPL, three JLC packages) are committed, so you can open or order the board without building it. Regenerating takes a few minutes and runs tools/portable_paths.py so the files carry no machine-specific paths.

Developer quick start (VS Code)

For changing the firmware itself. To use a board, GETTING-STARTED.md is enough; to write effects in code, start with the library's README.

  1. Clone and set up (Linux or macOS; Windows: see Windows below):
    sh
    git clone https://github.com/speck0413/specter-proptroller.git && cd specter-proptroller
    tools/setup.sh            # PlatformIO, a host compiler, the board packages; asks before sudo
    tools/setup.sh --dev      # optional: also clang-tidy, cppcheck, fuzzers, browser-test tools
    It offers (asking first) to put pio on your PATH and, on Linux, the serial-port access (the dialout group and PlatformIO's udev rules; log out and in afterwards).
  2. Open it: code spectre-proptroller.code-workspace, then click Install when VS Code offers the recommended extensions (PlatformIO IDE, C/C++, EditorConfig, Markdown lint, spell checker, WSL).
  3. Wait for PlatformIO to finish loading (status bar), then Terminal > Run Task:
    • Native unit tests: the host tests (no board needed).
    • Host simulator: a simulated board; open http://localhost:8080/ for its phone page.
    • Build all boards: ESP32 DevKit, Pico, Pico W, Pico 2 W, and the bare devkits (ESP32, ESP32-S3, ESP32-C3 SuperMini).
  4. Flash a board (USB):
    • ESP32 DevKit: cd firmware/arduino && pio run -e esp32dev -t upload
    • Pico (no Wi-Fi): cd firmware/arduino && pio run -e pico -t upload (the first time, hold BOOTSEL while plugging it in). It is updated over USB only.
    • Pico W / Pico 2 W (first time): run the task Pico W / Pico 2 W first-flash file, hold BOOTSEL, plug in, copy firmware/arduino/.pio/build/picoboot-pico-w/flash.uf2 (Pico 2 W: picoboot-pico2-w) to the drive. After that, update over Wi-Fi from the board's page.
  5. Change something: your own firmware starts from firmware/arduino/workspace-template/; effects without code are show scripts (firmware/show-script-examples/). Writing sketches: the library's README; how the firmware is built and tested: firmware/arduino/README.md.

Windows

Two ways, both with VS Code:

  • Native (simplest for building and flashing boards): install VS Code, then the PlatformIO IDE extension (it installs PlatformIO and its Python by itself), and open spectre-proptroller.code-workspace. The tasks Build all boards and Pico W / Pico 2 W first-flash file and PlatformIO's own Upload button work in it. Install the USB driver your ESP32 DevKit needs (Silicon Labs CP210x or WCH CH340). The host unit tests and the simulator also need a C++ compiler for Windows (for example MSYS2's MinGW-w64 g++ on PATH; the simulator is pio run -e sim_win, without MQTT); the tasks that are shell scripts (static check, fuzzers, browser tests, QEMU, golden files) need WSL 2.
  • WSL 2 (everything): install WSL 2 with Ubuntu (wsl --install in an administrator PowerShell), install the WSL extension in VS Code, open the folder with WSL: Open Folder in WSL, and run tools/setup.sh in its terminal. WSL does not see USB by itself: install usbipd-win in Windows, then usbipd list, usbipd bind --busid <id> (once, administrator) and usbipd attach --wsl --busid <id> each time the board is plugged in.

If something goes wrong

  • The page says rolled_back: the new firmware did not pass its self-check and the board went back to the one before. Your settings are as they were; try the update again or report it.
  • A Pico W that will not stay up (restarts every few seconds): flash it again over USB (hold BOOTSEL, copy the first-flash file). Re-flashing keeps the settings, shows and script; if it still restarts (a saved setting such as an unreachable Wi-Fi), erase everything as below and set it up again.
  • Start over, erasing everything (settings, Wi-Fi, shows, script): Settings, Factory reset on the page, or over USB: Pico picotool erase (then flash again), ESP32 pio run -e esp32dev -t erase (or esptool.py erase_flash) and flash again.

Specter Studio from source

sh
git clone https://github.com/speck0413/specter-proptroller.git && cd specter-proptroller/studio
scripts/setup.sh          # Node.js, Rust, PlatformIO, Tauri's system parts; npm ci and the practice board
npm run tauri dev         # the desktop app

Windows uses scripts\setup.ps1. The step-by-step version is docs/DEV-SETUP.md; tests, desktop builds and the layout are in studio/README.md. Studio needs no submodule (the aieda submodule is for the hardware build only).

Releases

One repository, two kinds of tag:

TagWorkflowRelease
v<firmware/VERSION>, e.g. v0.1.0-rc.3firmware-release.ymla draft "Firmware v…" release with the images and proptroller-firmware.json (published by hand), and the browser flasher
studio-v<version>, e.g. studio-v0.1.0-rc.3 (the version in studio/package.json, studio/src-tauri/tauri.conf.json and studio/Cargo.toml)studio.ymla "Specter Studio …" release with the installers and SHA256SUMS.txt

A version with a suffix (-rc.3) makes a pre-release. Studio's firmware updates look only at releases that carry proptroller-firmware.json, so Studio's own releases never count as firmware; GitHub's "Latest" label goes to whichever full release is newest, so link the firmware by its tag. Details: docs/FIRMWARE-BUILD.md (section 6) and studio/docs/BUILDING.md.

Build (hardware)

Requires KiCad 10 (with kicad-cli), Node.js, Python 3 and Java (for Freerouting).

sh
git clone --recursive https://github.com/speck0413/specter-proptroller.git && cd specter-proptroller
tools/bootstrap.sh        # aieda submodule, its Node deps, Freerouting
make typecheck
make build                # KiCad project in hardware/kicad/ (about 4 minutes)
make fab order            # gerbers in hardware/fab/, JLC BOM/CPL packages in hardware/fab/order/

Always check JLC's placement preview before ordering.

The committed hardware/kicad/proptroller.kicad_pcb is the reference board. Every signal and power net is locked (routes.ts) and the placement is pinned, so a rebuild reproduces the same tracks and vias with the toolchain it was made with: KiCad 10.0.6, Freerouting 2.5.0 (tools/freerouting.pin), aieda v0.2.0-1-gcd1f38a (submodule). Other tool versions may change the GND fanout or pour fill: compare before replacing it.

Wiring guides

New to wiring? docs/wiring-guides/ has a starter kit (a button, a motion sensor, a lamp, a fan, a pixel strip and a speaker on one desk) and short guides for the common hookups, each as an interactive 3D page with narration (docs/wiring-guides/html/index.html, works offline), a written page, and a renderable video. Assembling the board into its case: docs/build-guide/ (written for rev A: where it differs, hardware/README.md is right).

Safety

Read SAFETY.md first: the project is provided as-is, with no warranty and no certification, and you build and use it at your own risk.

The board is powered from low-voltage DC: use a listed power supply with its own over-current protection (≤10 A); the board has no fuses. The recommended way to switch AC loads is off the board, with a listed relay-controlled outlet box driven at low voltage (docs/ac-control.md). Only the rev B relays may switch AC directly, up to 120 V AC 5 A (3 A inductive) each, only from a GFCI-protected outlet, with a 5 A fuse in the line to the relay's COM and earth leads on both earth holes (H2, H3); in the case, one relay on mains, its cord through the case's mains grommet (left wall) straight to the relay terminals, never onto a pigtail or a 3.5 mm jack. That rating rests on the relay's own insulation and a design margin (≥3.0 mm copper clearance and air-gap slots around the relay contacts), not a certification; fog fluid residue, condensation and dust degrade it over time, so keep the board clean and dry (hardware/README.md). Rev A relays are rated ≤30 V DC only: AC on rev A relays is experimental, for prove-out only, not considered safe, and recommended against until rev B. Every other terminal, every 3.5 mm jack and every pigtail is low-voltage DC only. The board does not measure or limit current: keep each load within its terminal's rating (hardware/README.md).

License

MIT, see LICENSE. The licence covers everything in this repository: the software (firmware, Specter Studio, tools, web page), the hardware design files (hardware/, enclosure/) and the documentation. See also SAFETY.md.

Parts

145
QtyValueFootprintReferences
214.7kResistor_SMD:R_0805_2012MetricR_CP1, R_CP2, R_GD1, R_GD2, R_GD3, R_GD4, R_GS1, R_GS2, R_GS3, R_GS4, R_PD1, R_PD2, R_PD3, R_PD4, R_PXG, R_RP1 +5
181kResistor_SMD:R_0805_2012MetricR_DFT, R_LL, R_LR, R_RB1, R_RB2, R_RL1, R_RL2, R_X1, R_X2, R_X3, R_X4, R_X5, R_X6, R_X7, R_X10, R_X11 +2
65.08-2P (DNP)TerminalBlock_CUI:TerminalBlock_CUI_TB007-508-02_1x02_P5.08mm_HorizontalJ_IN, J_O1, J_O2, J_O3, J_O4, J_SPK
6SS56Diode_SMD:D_SMAD_CT1, D_CT2, D_F1, D_F2, D_F3, D_F4
6greenLED_SMD:LED_0805_2012MetricD_LO1, D_LO2, D_LO3, D_LO4, D_RL1, D_RL2
5100nCapacitor_SMD:C_0805_2012MetricC_BST, C_DFH, C_MCU, C_T1, C_T2
52N7002Package_TO_SOT_SMD:SOT-23Q_D1, Q_D2, Q_D3, Q_D4, Q_PX
5PJ-320DConnector_Audio:Jack_3.5mm_PJ320D_HorizontalJ_C1, J_C2, J_LO, J_T1, J_T2
410kResistor_SMD:R_0805_2012MetricR_LO1, R_LO2, R_LO3, R_LO4
4220Resistor_SMD:R_0805_2012MetricR_CA1, R_CA2, R_TR1, R_TR2
4AO4485Package_SO:SOIC-8_3.9x4.9mm_P1.27mmQ_O1, Q_O2, Q_O3, Q_O4
4B5819WDiode_SMD:D_SOD-123D_C1, D_C2, D_DF, D_MCU
3100u/50VCapacitor_SMD:CP_Elec_8x10C_BK1, C_BK2, C_DF
31x11 pin header (DNP)Connector_PinHeader_2.54mm:PinHeader_1x11_P2.54mm_VerticalJ_XG, J_XS, J_XV
35.08-3P (DNP)TerminalBlock_CUI:TerminalBlock_CUI_TB007-508-03_1x03_P5.08mm_HorizontalJ_PX, J_R1, J_R2
3TS-1187AButton_Switch_SMD:SW_Push_1P1T_XKB_TS-1187ASW_U1, SW_U2, SW_U3
210uCapacitor_SMD:C_0805_2012MetricC_LL, C_LR
210u/50VCapacitor_SMD:C_1206_3216MetricC_BI1, C_BI2
21N4148WDiode_SMD:D_SOD-123D_TC1, D_TC2
21x15 socket (DNP)Connector_PinSocket_2.54mm:PinSocket_1x15_P2.54mm_VerticalJ_DKN, J_DKS
21x20 socket (DNP)Connector_PinSocket_2.54mm:PinSocket_1x20_P2.54mm_VerticalJ_PIN, J_PIS
21x8 socket (DNP)Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_VerticalJ_DFA, J_DFB
2220R@100M 3AInductor_SMD:L_0805_2012MetricFB_BK, FB_DF
247u/10VCapacitor_SMD:C_1206_3216MetricC_BO1, C_BO2
2LTV-217-B-GPackage_SO:SOP-4_4.4x2.6mm_P1.27mmU_C1, U_C2
2M3MountingHole:MountingHole_3.2mm_M3_PadH2, H3
2M3MountingHole:MountingHole_3.2mm_M3H1, H4
2MMBT3904Package_TO_SOT_SMD:SOT-23Q_R1, Q_R2
2SRD-05VDC-SL-CRelay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_CK1, K2
1+3V3TestPoint:TestPoint_Pad_1.0x1.0mmTP3
1+5VTestPoint:TestPoint_Pad_1.0x1.0mmTP2
1+VINTestPoint:TestPoint_Pad_1.0x1.0mmTP1
110uH 8.8AInductor_SMD:L_Sunlord_MWSA1005SL_BK
113kResistor_SMD:R_0805_2012MetricR_CP
1150kResistor_SMD:R_0805_2012MetricR_RT
1330Resistor_SMD:R_0805_2012MetricR_PXS
143kResistor_SMD:R_0805_2012MetricR_FB1
1470Resistor_SMD:R_0805_2012MetricR_PXU
147p/50VCapacitor_SMD:C_0805_2012MetricC_CF
15.08-5P (DNP)TerminalBlock_CUI:TerminalBlock_CUI_TB007-508-05_1x05_P5.08mm_HorizontalJ_RAIL
16.8n/50VCapacitor_SMD:C_0805_2012MetricC_CP
18.2kResistor_SMD:R_0805_2012MetricR_FB2
1DC-005-5A-2.0Connector_BarrelJack:BarrelJack_HorizontalJ_PWR
1DF_BUSYTestPoint:TestPoint_Pad_1.0x1.0mmTP4
1GNDTestPoint:TestPoint_Pad_1.0x1.0mmTP5
1SJ3 1-2Jumper:SolderJumper-3_P1.3mm_Bridged12_RoundedPad1.0x1.5mm_NumberLabelsSJ_V
1SMAJ24ADiode_SMD:D_SMAD_TVS
1TPS54360BDDARPackage_SO:TI_SO-PowerPAD-8U_BK

Similar boards

  • 4 layers100 × 100 mmAmod m, the printed circuit board in 3D

    Amod m

    gallicchio/AMOD-and-RFMOD

    The tutorial's 2x12 adapter (/mudd/133electronics/icepi-zero-dac-adc/adapterboard/) with a 2 x 6 right-angle Pmod socket on a 15 mm extension of its right-hand end, so an Icepi Zero can drive AMOD-A's and RF-MOD's Pmod…

    207 parts
  • 2 layers99.5 × 83.1 mmFrank, the printed circuit board in 3D

    Frank

    rh1tech/frank

    RP2350 Based Hardware Emulation Platform

    166 parts66GPL-3.0
  • 2 layers99.5 × 83.1 mmFrank m1, the printed circuit board in 3D

    Frank m1

    rh1tech/frank-archive

    Archive of FRANK Boards

    158 parts3
  • 2 layers40 × 111 mmLED Wled, the printed circuit board in 3D

    LED Wled

    edvard5/wEasyLed_V2

    96 parts
  • 2 layers130 × 164 mmCct main, the printed circuit board in 3D

    Cct main

    syncmeta/PendingHome

    全屋双色温灯光控制方案 基于 HA 和 ESPHome

    217 partsMIT
  • 4 layers260 × 113 mmCellKeeper, the printed circuit board in 3D

    CellKeeper

    cellkeeper-bms/cellkeeper-hardware

    PCB for the CellKeeper BMS

    480 parts11GPL-3.0
  • 2 layers100 × 103.5 mmHstat, the printed circuit board in 3D

    Hstat

    mckay27/hstat

    108 parts
  • 4 layers63.6 × 86 mmBECom, the printed circuit board in 3D

    BECom

    rjsc/BECom

    BECom - Battery Emulator Companion - Open Source Hardware, designed to run dalathegreat/Battery-Emulator

    276 parts2GPL-3.0

Questions

How big is the Proptroller PCB?

It measures 134 × 80 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Proptroller use?

145 parts, built around the TPS54360BDDAR, SS56, PJ-320D and AO4485. 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 Proptroller KiCad files?

From the speck0413/specter-proptroller repository on GitHub, at the commit this page was made from: the board is hardware/kicad/proptroller.kicad_pcb and its schematic hardware/kicad/proptroller.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Proptroller design in my own project?

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