Skip to the content
PCBKitNew board
2 layers150 × 68 mmController, the printed circuit board in 3D

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

10

README

README.md

Firefly2

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)

bash
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:

bash
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 baud

Note: [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 the current device defined in Devices.hpp
  • READ_FROM_FLASH: read the device saved in flash, if present. If not present (determined by the validity of check_value), fall back to current.
  • WRITE_TO_FLASH: write current to 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):

bash
mkdir -p build && cd build
cmake .. -DBUILD_SIMULATOR=false   # true builds the SDL desktop simulator too
make && make test
./smalltests --gtest_filter=RadioStateMachineTest*
bash
./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 Firefox

CI (GitHub Actions): host tests, lint, node/fancy-node/controller firmware builds, the simulator suite, and CodeQL C/C++ security scanning.

Repo layout

PathContents
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 in specs/.

Parts

194
QtyValueFootprintReferences
51100nFCapacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolderC1, C3, C10, C15, C20, C23, C25, C26, C27, C29, C30, C31, C32, C33, C34, C35 +35
39WS2812C/WLED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mmD10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23, D24, D25 +23
131kResistor_SMD:R_0402_1005MetricR3, R4, R5, R11, R16, R17, R18, R19, R20, R31, R32, R36, R46
13D_TVSDiode_SMD:D_SOD-123FD1, D2, D4, D26, D30, D31, D50, D51, D53, D54, D55, D56, D57
9ILS_TA180_50Homebrew:SW_CK_TASW1, SW2, SW3, SW4, SW5, SW6, SW7, SW8, SW9
810uFCapacitor_SMD:C_0603_1608MetricC9, C11, C12, C13, C14, C16, C17, C18
4100Resistor_SMD:R_0402_1005MetricR6, R10, R13, R21
433Resistor_SMD:R_0603_1608MetricR1, R7, R25, R35
4MountingHoleMountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
3100uFCapacitor_SMD:CP_Elec_6.3x5.4C21, C22, C28
3220Resistor_SMD:R_0402_1005MetricR23, R38, R39
33k3Resistor_SMD:R_0603_1608MetricR33, R40, R41
3WS2811Package_SO:SOP-8_3.9x4.9mm_P1.27mmU1, U3, U4
2240kResistor_SMD:R_0603_1608MetricR8, R14
22k2Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR42, R44
24k7Resistor_SMD:R_0402_1005MetricR12, R15
2680kResistor_SMD:R_0603_1608MetricR9, R22
110nFCapacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolderC24
110nHInductor_SMD:L_0402_1005MetricL1
11pFCapacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolderC19
1470kResistor_SMD:R_0603_1608MetricR2
16k8Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR43
1AO3400APackage_TO_SOT_SMD:SOT-23Q2
1CH340XPackage_SO:MSOP-10_3x3mm_P0.5mmU10
1Conn_01x02Homebrew:JST_Micro_1x02_P1.25mm_HorizontalJ6
1Conn_01x03Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ5
1Conn_01x03Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_HorizontalJ2
1Conn_01x04Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ3
1Conn_01x05Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_VerticalJ1
1DDiode_SMD:D_SMAD52
1FM24CL16BPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU2
1HT75xx-1-SOT89Package_TO_SOT_SMD:SOT-89-3U5
1MMBT2222A 1PPackage_TO_SOT_SMD:SOT-23Q1
1MicrophoneHomebrew:MIC_CMA-4544PF-WMK1
1OS103011MS8QP1Homebrew:OS102011MS8QP1S1
1REDLED_SMD:LED_0603_1608MetricD39
1RFM69CW-915MHZHomebrew:RFM69CW-minimalpadsU6
1SRV05-4-P-T7Package_TO_SOT_SMD:SOT-23-6D46
1STM32G070CBTxPackage_QFP:LQFP-48_7x7mm_P0.5mmU8
1SW_PushHomebrew:SW_TACTILE_5.1MM_TS-1187A-C-D-BSW10
1SW_SPDTHomebrew:SW_SPDT_SK-12D02-G060SW11
1TP4056Homebrew:SOP127P600X175-9NU7
1Thermistor_PTCFuse:Fuse_0805_2012MetricTH1
1USB_B_MicroHomebrew:FRAMATOME_10118194-0001LF_fixed_bridgesJ4
1VEML6040Homebrew:VISHAY_VEML6040_1.25X2X1U9
1WHITELED_SMD:LED_0603_1608MetricD35

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 mmFancy node, the printed circuit board in 3D

    Fancy node

    candykingdom/firefly2

    Small blinkenlight boards that sync up using radios

    67 parts5
  • 4 layers21 × 63 mmRfboard, the printed circuit board in 3D

    Rfboard

    candykingdom/firefly2

    Small blinkenlight boards that sync up using radios

    67 parts5
  • 2 layers40.2 × 46.4 mmRing-40mm, the printed circuit board in 3D

    Ring-40mm

    candykingdom/firefly2

    Small blinkenlight boards that sync up using radios

    45 parts5
  • 2 layersMagnet connector, the printed circuit board in 3D

    Magnet connector

    candykingdom/firefly2

    Small blinkenlight boards that sync up using radios

    2 parts5

Similar boards

  • 4 layers84.9 × 74.8 mmGps tracker, the printed circuit board in 3D

    Gps tracker

    candykingdom/gps-tracker

    95 partsApache-2.0
  • 4 layersOpen motion light, the printed circuit board in 3D

    Open motion light

    ademuri/open-motion-light

    Open-source motion sensor light

    99 parts2Apache-2.0
  • 2 layers57 × 54 mmMb adv 1.0, the printed circuit board in 3D

    Mb adv 1.0

    aestellic/mb-adv

    GBA Multiboot Dongle

    10 partsMIT
  • 2 layers58.4 × 43.2 mmFlashprogrammer, the printed circuit board in 3D

    Flashprogrammer

    inaxeon/eightoduino

    11 parts21GPL-2.0
  • 2 layers100 × 100 mmVCOSeparate, the printed circuit board in 3D

    VCOSeparate

    wakimizufu/MC2

    81 parts1
  • 4 layers80 × 80 mmObc, the printed circuit board in 3D

    Obc

    OSUSat/cubesat

    Open Source Earth Imaging Satellite Hardware + Firmware

    151 parts8MIT
  • 4 layers115.5 × 96.2 mmClosed deck x4, the printed circuit board in 3D

    Closed deck x4

    OpenLogicEFI/Hardware

    Hardware is based off an open source project called Speeduino by Josh Stewart.

    245 parts19