

Controller
Small blinkenlight boards that sync up using radios
- Size
- 150 × 68 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 194
- Nets
- 170
- Pads
- 631
- Tracks, vias
- 1,080, 248
- Pours
- 6
- Routed
- Yes
- KiCad
- KiCad 7 (file 20221018)
- Created
- 28 Feb 2018
- Updated
- 27 Jul 2026
Overview
Controller is an open-source printed circuit board by candykingdom, from the candykingdom/firefly2 repository on GitHub. It is a 2-layer board of 150 × 68 mm with 194 parts on 170 nets, routed with 1,080 tracks and 248 vias.
It is built around the WS2811, CH340X and FM24CL16B-G, with the TP4056, WS2812C/W and ILS TA180 50 among its other parts. Its parts include 64 capacitors, 56 diodes, 37 resistors, 12 switches and 10 ICs. It belongs with the radio and wireless boards and the STM32 boards of this library.
Main components
10WS2811
SOP-8-25℃~+85℃ 16.5mA 20V 3 5V~24V 800kHz Over Voltage Protection、Short-Circuit Protection PWM SOP-8 LED Drivers ROHSWorldsemiLED DriversCH340X
MSOP-10-20℃~+70℃ 2Mbps 3.3V、5V USB 2.0 USB to serial、USB to Parallel MSOP-10 USB Converters ROHSWCH (Nanjing Qinheng Microelectronics)USB ConvertersFM24CL16B-G
SOIC-8-40℃~+85℃ 100,000,000,000,000 Cycles 151 Years 16Kbit 1MHz 2.7V~3.65V 300uA 6uA I2C SOIC-8 FRAM ROHSInfineon TechnologiesFRAMTP4056
ESOP-8-40℃~+85℃ 1 1A 35uA 4.2V 4V~6.5V Charging IC Lithium Battery Support Support 恒流充电、恒压充电、涓流充电、自动再充电、充电终止、可编程充电电流、软启动、欠压锁定 ESOP-8 Battery Management ROHSUMWBattery ManagementWS2812C/W
SMD5050-4P-25℃~+85℃ 0.3mA 1.57mm 120us 245mcd 2kHz 300ns 4.5V~5.5V 465nm~475nm 5.4mm 515nm~525nm 5mm 60mcd 620nm~625nm 65mcd 800Kbit/s Built-in power-on reset circuit、Built-in power-on reset circuit、Built-in one-way transmission function Top-mount SMD5050-4P RGB LEDs(Built-in IC) ROHSWorldsemiRGB LEDs(Built-In IC)ILS TA180 50
插件-40℃~+85℃ 1.8N 100,000 cycles 100mA 30V 6.1mm 6.7mm 7.2mm PC Pin SPST-NO Through Hole White 插件 Tactile Switches ROHSC&KTactile SwitchesAO3400A
SOT-23-55℃~+150℃ 1 N-channel 1.45V 1.4W 30V 48mΩ@2.5V 5.7A 50pF 630pF 75pF 7nC@10V N-Channel SOT-23 MOSFETs ROHSAlpha & Omega SemiconductorMOSFETsCMA-4544PF-W
--44dB@±2dB 2.2kΩ 3V~10V 4.65mm 500uA 60dB 9.7mm Omnidirectional 插件,D=9.7mm Microphones ROHSCUIBuzzersOS103011MS8QP1
插件-30℃~+70℃ 10,000 cycles 100mA 12V 8mm PC Pin Rectangular Columnar SP3T Through Hole 插件 Slide Switches ROHSC&KSlide SwitchesSRV05-4-P-T7
SOT-23-612V 1A@8/20us 3.5pF 500W@8/20us 5V 5uA 6V ESD Four channels IEC 61000-4-2、IEC 61000-4-5、IEC 61000-4-4 SOT-23-6 ESD and Surge Protection (TVS/ESD) ROHSPROTEKESD And Surge Protection (TVS/ESD)
README
README.mdFirefly2
Wireless LED control for Burning Man art installations, bikes, and wearables. Devices driving WS2812 strips self-organize over 915 MHz RFM69 radios into a flood mesh with exactly one master, share a network clock via heartbeats, and render effects as pure functions of network time — so every device animates in sync without streaming frames.
New to the project? Start with GETTING_STARTED.md. Working in the code (human or agent)? The mental model lives in docs/index.md and the shared Claude Code/Codex ground rules in CLAUDE.md.
Web simulator (test without hardware)
python3 -m http.server 8642 -d sim
# open http://localhost:8642/A zero-dependency browser simulator of the whole system: every effect and palette on the real device catalog, synced to a scrubbable network clock, with master-mode autoplay and control overrides. Byte-exact against the firmware (enforced by tests: npm test). See docs/simulator.md.
Building firmware
Firmware builds with PlatformIO (pip install platformio). One env per device target:
pio run -e node # SAMD21 rfboard node (node-arm64 on Apple silicon)
pio run -e fancy-node # STM32G030 node
pio run -e controller # STM32G070 handheld controller
pio run -e dmx # ESP32 DMX bridge
pio run -e fancy-node -t upload # flash via ST-Link
pio device monitor # 115200 baudNote: [env:node]'s bossac platform_packages entry is OS-specific — uncomment the right line in platformio.ini for your OS. Full env/pin/flag details: docs/build-and-test.md.
Programming over USB
The fancy-node device can be programmed either using an STLink, or via USB port. To program via USB, you must first install stm32loader using pip (pip install stm32loader). You may also need to pass the port (typically /dev/ttyUSB0), e.g. pio run -e fancy-node-usb -t upload --upload-port /dev/ttyUSB0.
Saving device description in flash
Both node and fancy-node support reading the DeviceDescription from flash. The modes are defined by the DeviceMode enum within DeviceDescription.hpp. They work as follows:
CURRENT_FROM_HEADER: use thecurrentdevice defined inDevices.hppREAD_FROM_FLASH: read the device saved in flash, if present. If not present (determined by the validity ofcheck_value), fall back tocurrent.WRITE_TO_FLASH: writecurrentto flash, and then use it. This will only write the device to flash if it is different, to avoid causing flash wear.
Tests & linting
The platform-independent core (lib/, src/generic/) builds on the host against fakes, with ASan + UBSan on (and fatal). Requires cmake and a GCC/Clang toolchain (on Windows, use WSL or similar):
mkdir -p build && cd build
cmake .. -DBUILD_SIMULATOR=false # true builds the SDL desktop simulator too
make && make test
./smalltests --gtest_filter=RadioStateMachineTest*./lint.sh check # clang-format, Google style — CI enforces this
./lint.sh format # format in place
./ci.sh # exactly what CI runs: cmake + smalltests + largetests
node --test "sim/test/cases/*.test.mjs" # simulator suite, incl. firmware byte-exactness
npm run test:e2e # served UI/API/canvas journeys in Chromium and FirefoxCI (GitHub Actions): host tests, lint, node/fancy-node/controller firmware
builds, the simulator suite, and CodeQL C/C++ security scanning.
Repo layout
| Path | Contents |
|---|---|
lib/, src/generic/ | Platform-independent core: radio protocol, mesh, effects, LED management |
src/arduino/ | Hardware backends (FastLED, RadioHead RFM69) |
src/devices/ | One main per device target (node, fancy-node, controller, dmx) |
test/ | Host GoogleTest suites + FakeNetwork multi-node mesh simulation |
sim/ | Browser simulator (production C++ renderer via committed Wasm, usable without hardware) |
docs/ | Architecture and per-subsystem notes — start at docs/index.md |
hardware/, boards/, bootloader/ | PCB designs, PlatformIO board definitions, bootloaders |
specs/ | Spec-kit feature specs (spec → plan → tasks workflow, see CLAUDE.md) |
For agents & contributors
- CLAUDE.md — the canonical guidance for Claude Code and Codex, including build commands, architecture, and the invariants you must not break. Codex reaches the same file through
AGENTS.md; shared skills remain canonical under.claude/skills/and are exposed to Codex through.agents/skills/. - docs/ — per-subsystem research notes (radio/network, LED/effects, devices, build/test, hardware). Update them when you change documented behavior.
- Substantial features go through the spec-kit workflow (
speckit-specify→plan→tasks→implement; use/in Claude Code or$in Codex); specs live inspecs/.
Parts
194| Qty | Value | Footprint | References |
|---|---|---|---|
| 51 | 100nF | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C1, C3, C10, C15, C20, C23, C25, C26, C27, C29, C30, C31, C32, C33, C34, C35 +35 |
| 39 | WS2812C/W | LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm | D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23, D24, D25 +23 |
| 13 | 1k | Resistor_SMD:R_0402_1005Metric | R3, R4, R5, R11, R16, R17, R18, R19, R20, R31, R32, R36, R46 |
| 13 | D_TVS | Diode_SMD:D_SOD-123F | D1, D2, D4, D26, D30, D31, D50, D51, D53, D54, D55, D56, D57 |
| 9 | ILS_TA180_50 | Homebrew:SW_CK_TA | SW1, SW2, SW3, SW4, SW5, SW6, SW7, SW8, SW9 |
| 8 | 10uF | Capacitor_SMD:C_0603_1608Metric | C9, C11, C12, C13, C14, C16, C17, C18 |
| 4 | 100 | Resistor_SMD:R_0402_1005Metric | R6, R10, R13, R21 |
| 4 | 33 | Resistor_SMD:R_0603_1608Metric | R1, R7, R25, R35 |
| 4 | MountingHole | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 3 | 100uF | Capacitor_SMD:CP_Elec_6.3x5.4 | C21, C22, C28 |
| 3 | 220 | Resistor_SMD:R_0402_1005Metric | R23, R38, R39 |
| 3 | 3k3 | Resistor_SMD:R_0603_1608Metric | R33, R40, R41 |
| 3 | WS2811 | Package_SO:SOP-8_3.9x4.9mm_P1.27mm | U1, U3, U4 |
| 2 | 240k | Resistor_SMD:R_0603_1608Metric | R8, R14 |
| 2 | 2k2 | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R42, R44 |
| 2 | 4k7 | Resistor_SMD:R_0402_1005Metric | R12, R15 |
| 2 | 680k | Resistor_SMD:R_0603_1608Metric | R9, R22 |
| 1 | 10nF | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C24 |
| 1 | 10nH | Inductor_SMD:L_0402_1005Metric | L1 |
| 1 | 1pF | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C19 |
| 1 | 470k | Resistor_SMD:R_0603_1608Metric | R2 |
| 1 | 6k8 | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R43 |
| 1 | AO3400A | Package_TO_SOT_SMD:SOT-23 | Q2 |
| 1 | CH340X | Package_SO:MSOP-10_3x3mm_P0.5mm | U10 |
| 1 | Conn_01x02 | Homebrew:JST_Micro_1x02_P1.25mm_Horizontal | J6 |
| 1 | Conn_01x03 | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J5 |
| 1 | Conn_01x03 | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Horizontal | J2 |
| 1 | Conn_01x04 | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J3 |
| 1 | Conn_01x05 | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical | J1 |
| 1 | D | Diode_SMD:D_SMA | D52 |
| 1 | FM24CL16B | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U2 |
| 1 | HT75xx-1-SOT89 | Package_TO_SOT_SMD:SOT-89-3 | U5 |
| 1 | MMBT2222A 1P | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | Microphone | Homebrew:MIC_CMA-4544PF-W | MK1 |
| 1 | OS103011MS8QP1 | Homebrew:OS102011MS8QP1 | S1 |
| 1 | RED | LED_SMD:LED_0603_1608Metric | D39 |
| 1 | RFM69CW-915MHZ | Homebrew:RFM69CW-minimalpads | U6 |
| 1 | SRV05-4-P-T7 | Package_TO_SOT_SMD:SOT-23-6 | D46 |
| 1 | STM32G070CBTx | Package_QFP:LQFP-48_7x7mm_P0.5mm | U8 |
| 1 | SW_Push | Homebrew:SW_TACTILE_5.1MM_TS-1187A-C-D-B | SW10 |
| 1 | SW_SPDT | Homebrew:SW_SPDT_SK-12D02-G060 | SW11 |
| 1 | TP4056 | Homebrew:SOP127P600X175-9N | U7 |
| 1 | Thermistor_PTC | Fuse:Fuse_0805_2012Metric | TH1 |
| 1 | USB_B_Micro | Homebrew:FRAMATOME_10118194-0001LF_fixed_bridges | J4 |
| 1 | VEML6040 | Homebrew:VISHAY_VEML6040_1.25X2X1 | U9 |
| 1 | WHITE | LED_SMD:LED_0603_1608Metric | D35 |
Questions
How big is the Controller PCB?
It measures 150 × 68 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Controller use?
194 parts, built around the WS2811, CH340X, FM24CL16B-G and TP4056. 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 Controller KiCad files?
From the candykingdom/firefly2 repository on GitHub, at the commit this page was made from: the board is hardware/controller/controller.kicad_pcb and its schematic hardware/controller/controller.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Controller design in my own project?
Its repository states no licence, so its author keeps all rights: ask candykingdom before reusing the design.
More from candykingdom/firefly2
4- 4 layers47.1 × 30.7 mm

- 4 layers21 × 63 mm

- 2 layers40.2 × 46.4 mm

- 2 layers

Similar boards
- 4 layers84.9 × 74.8 mm

- 4 layers

- 2 layers57 × 54 mm

- 2 layers58.4 × 43.2 mm

- 2 layers100 × 100 mm

- 2 layers34.5 × 41 mm

- 4 layers80 × 80 mm

- 4 layers115.5 × 96.2 mm

Closed deck x4
OpenLogicEFI/Hardware
Hardware is based off an open source project called Speeduino by Josh Stewart.
245 parts19