Skip to the content
PCBKitNew board
2 layers90 × 60 mmFanCtrl3-Pro, the printed circuit board in 3D

FanCtrl3-Pro

mikagosz/FanCtrl3

USB-powered controller for three 4-pin PWM fans, driven by the CPU temperature of a Proxmox VE host - KiCad, MicroPython, OpenSCAD

Size
90 × 60 mm
Copper layers
2
Thickness
1.6 mm
Parts
39
Nets
46
Pads
179
Tracks, vias
993, 120
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
23 Sep 2026
Updated
5 Oct 2026

Overview

FanCtrl3-Pro is an open-source printed circuit board by mikagosz, from the mikagosz/FanCtrl3 repository on GitHub, published under the MIT licence. It is a 2-layer board of 90 × 60 mm with 39 parts on 46 nets, routed with 993 tracks and 120 vias.

It is built around the LM27313XMF, DS18B20 and TPS2553DBV, with the SS14 among its other parts. Its parts include 16 resistors, 7 capacitors, 4 connectors, 3 ICs and 3 transistors. It belongs with the RP2040 boards of this library.

Main components

4

README

README.md

FanCtrl3 Pro PCB, 3D render: Raspberry Pi Pico, three 4-pin fan headers, a temperature probe terminal and the on-board 12 V boost converter

FanCtrl3

A USB-powered controller for three 4-pin PWM fans, driven by the CPU temperature of a Proxmox VE host.

One USB cable to the host is all it needs — power, control and fan speed readings all go over it. The fan curve runs inside the controller, so a host reboot, a crashed service or a pulled cable never leaves the fans stopped.

License: MIT KiCad 10 MicroPython tests Status: not yet tested on hardware

Sponsor on GitHub Sponsors

Designed for small home servers and mini PCs running Proxmox: the machine sits in a closed cabinet, its own fan is not enough for the cabinet, and a set of quiet 120 mm fans should spin up only when the server actually works.

[!NOTE] FanCtrl3 is a hobby project, built in spare time. Updates may not come often — but ideas, questions and build reports are always welcome (see Contact and contributions).


Project status

[!WARNING] FanCtrl3 has not been tested on real hardware yet. Hardware testing is coming soon; this section will be updated with the results. Until the first boards have run for a while, treat this as a reviewed design, not a proven product.

Verified without hardware

AreaHowResult
SchematicsKiCad ERC, both variants0 errors, 0 warnings
Pro PCBKiCad DRC with schematic parity0 violations, 0 unconnected pads, 0 parity issues
Lite perfboardthe generator's own checkerevery net connected, no hole shared by two nets, no wire through a foreign pad, no overlapping parts
Enclosureintersection of the enclosure with the component bodies0 collisions, both variants
Control logic22 unit tests, run under CPython and MicroPythonall pass
Firmware main.pyruns under the MicroPython unix port on stubbed hardware: replies, 25 kHz inverted PWM, watchdog; SERVICE and service mode; SAVE success and failure (12 checks)all pass
Host daemon and CLI10 unit tests (Intel and AMD sensors, several CPU packages, CLI errors, a silent socket client) and 13 end-to-end tests against a simulated controller: sensor selection, curve, status, send, calibrate (incl. a dead fan and failsafe), clean stop, restart without a temperature, crash → failsafeall pass

Every push and pull request runs these tests on GitHub Actions.

Not tested yet

  • Anything on a real board: soldering, the 12 V rail, the current limiter and its FAULT signal, real fan speeds from the tachometers, the DS18B20 probe, the LED, the watchdog, USB behaviour with and without a host.
  • Power drawn from a real USB port with three fans at 100 %.
  • The udev rule on a real Pico (2e8a:0005 is MicroPython's default ID).
  • Printing and fitting the enclosure; the Lite mounting-hole positions.

Known issues

  • AMD support (k10temp, zenpower) is tested only against simulated sensors so far — a report from a real AMD host is welcome.
  • tests/test_main_smoke.sh depends on timing and can fail on a heavily loaded machine; run it again before looking for a bug.

Features

  • Three 4-pin PWM fans, 25 kHz PWM and tachometer reading on every channel.
  • Powered from USB only. An on-board step-up makes the 12 V for the fans; a TI TPS2553 current-limited switch limits the fan side to 465–570 mA — the budget of a USB 2.0 port — and reports an overload to the controller.
  • Curve in the controller, temperature from the host. A small daemon on the Proxmox host sends the CPU package temperature (Intel or AMD) every 5 seconds; the controller applies a curve with hysteresis and ramping.
  • Safe by default. No temperature for 30 s → fans at 100 %. A dead microcontroller → the output transistors switch off → fans at 100 %. A clean host shutdown → fans rest at 20 % instead of alarming.
  • Ambient probe. A DS18B20 on a cable measures the air in the cabinet and raises the fans on its own above 40 °C (60 %) and 45 °C (100 %).
  • Stall detection per fan, per-fan minimum duty and a calibrate command that measures it.
  • Two variants, one firmware — see below.
  • Host side needs nothing but Python 3's standard library, a udev rule and a systemd unit.

Two variants

FanCtrl3 LiteFanCtrl3 Pro
Buildmodules on a 72 × 47 mm perfboard (SCI PC-3)custom 2-layer PCB, 90 × 60 mm
Solderingthrough-hole only (plus one SOT-23-6 on an adapter)0805/1206 and SOT-23 by hand, no QFN
12 VPololu U3V16F12 moduleTI LM27313 boost on the board (12.4 V)
PWM outputBC547B, open collector2N7002, open drain
Current limitTPS2553 on a SparkFun SOT-23 → DIP adapterTPS2553 on the board
Picoin sockets, removablesoldered flat
Build guidedocs/build-lite.mddocs/build-pro.md

Both use the same pinout and run the same firmware.

Lite perfboard drawing: component side and mirrored solder side with every wire
Lite — perfboard wiring drawing
Pro PCB, 3D render from the top
Pro — PCB, top
Lite enclosure with the board inside, preview
Lite — enclosure
Pro enclosure with the board inside, preview
Pro — enclosure

How it works

text
 Proxmox host                                 FanCtrl3
┌────────────────────────┐   USB cable    ┌──────────────────────────────────────┐
│ CPU temp ─► fanctl     │  power + data  │ Pico: curve, hysteresis, failsafe    │
│             daemon ────┼───────────────►│  ├─ PWM ×3 ──► open collector/drain  │
│  TEMP 54.0 every 5 s   │◄───────────────│  ├─ tach ×3 ◄── fans                 │
│  STATUS, alarms        │                │  └─ DS18B20 ◄── ambient probe        │
└────────────────────────┘                │                                      │
                                          │ VBUS ─► TPS2553 ─► 12V boost ─► fans │
                                          │         (≈0.5 A)                     │
                                          └──────────────────────────────────────┘

The link is plain text over USB CDC — TEMP 54.0, STATUS, SET 1 40 — so it can be driven by hand from any terminal. Full protocol: docs/firmware.md.

Power budget

The whole controller lives on one USB 2.0 port, which is allowed to supply 500 mA. The design is sized for three low-power 120 mm PWM fans rated at up to 0.6 W each (for example Noctua NF-P12 redux-1300 PWM):

3 × 0.6 W = 1.8 W at 12 V → ÷ 0.85 converter efficiency + ≈ 0.15 W for the Pico ≈ 0.45 A from the port.

[!CAUTION] Fans rated above 0.6 W each will not fit this budget. The TPS2553 limits the fan side to 465–570 mA and reports FAULT, but the fans will not reach full speed. Check the rated input power of your fans before you build.

Getting started

  1. Pick a variant and order the parts — docs/bill-of-materials.md.
  2. Build the board — Lite or Pro.
  3. Print the enclosure — docs/enclosure.md.
  4. Flash the firmware — docs/firmware.md: MicroPython for RPI_PICO, then firmware/flash.sh.
  5. Install the host side on Proxmox — docs/host-proxmox.md:
    bash
    sh host/install.sh        # as root on the Proxmox host
    fanctl status
    fanctl calibrate          # finds the lowest duty each fan still spins at

Repository layout

PathWhat is inside
hardware/tools/generators — the design lives in code: design_pro.py and design_lite.py are the single source of truth
hardware/pro/KiCad project of the Pro PCB, schematic PDF, fabrication/ Gerbers + drill ZIP and BOM, preview/ 3D renders
hardware/lite/Lite schematic (KiCad + PDF), perfboard drawing (SVG) and wiring table
hardware/enclosure/parametric OpenSCAD enclosure and ready STL files for both variants
firmware/MicroPython for the Pico: logic.py (no hardware, testable) and main.py (pins)
host/fanctl daemon and CLI, udev rule, systemd unit, installer
sim/the controller on a pseudo-terminal, for testing the host side without hardware
tests/everything that runs without hardware: tests/run_all.sh
docs/documentation

Documentation

Contact and contributions

Ideas, improvements, a better circuit, a build report or a question — all welcome. Open an issue on this repository or write to support@fractal8.eu. See CONTRIBUTING.md.

Support the project

FanCtrl3 is built in spare time. If it is useful to you, you can support its development through GitHub Sponsors — it helps pay for parts and prototype boards.

Licence

MIT — see LICENSE. This covers the hardware design files, the firmware and the host software.

Parts

39
QtyValueFootprintReferences
510kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR2, R6, R13, R14, R15
4100kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR3, R7, R8, R9
44k7Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR10, R11, R12, R16
4M3MountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
310u 25VCapacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC2, C4, C5
32N7002Package_TO_SOT_SMD:SOT-23_HandsolderingQ1, Q2, Q3
2100nCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC1, C7
251kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR1, R4
1100u 25VCapacitor_THT:CP_Radial_D6.3mm_P2.50mmC6
110uInductor_SMD:L_Changjiang_FNR5040SL1
1220pCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC3
191kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR5
1DS18B20TerminalBlock:TerminalBlock_Xinya_XY308-2.54-3P_1x03_P2.54mm_HorizontalJ4
1FAN1Connector_Molex:Molex_KK-254_AE-6410-04A_1x04_P2.54mm_VerticalJ1
1FAN2Connector_Molex:Molex_KK-254_AE-6410-04A_1x04_P2.54mm_VerticalJ2
1FAN3Connector_Molex:Molex_KK-254_AE-6410-04A_1x04_P2.54mm_VerticalJ3
1LM27313XMFPackage_TO_SOT_SMD:SOT-23-5_HandSolderingU3
1Raspberry Pi PicoModule:RaspberryPi_Pico_SMD_HandSolderU1
1SS14Diode_SMD:D_SMA_HandsolderingD1
1TPS2553DBVPackage_TO_SOT_SMD:SOT-23-6_HandsolderingU2

Questions

How big is the FanCtrl3-Pro PCB?

It measures 90 × 60 mm and has 2 copper layers, 1.6 mm thick.

What parts does the FanCtrl3-Pro use?

39 parts, built around the LM27313XMF, DS18B20, TPS2553DBV and SS14. 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 FanCtrl3-Pro KiCad files?

From the mikagosz/FanCtrl3 repository on GitHub, at the commit this page was made from: the board is hardware/pro/FanCtrl3-Pro.kicad_pcb and its schematic hardware/lite/FanCtrl3-Lite.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the FanCtrl3-Pro 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).

Similar boards

  • 4 layers66 × 90 mmIctester, the printed circuit board in 3D

    Ictester

    jakubfi/ictester

    Logic IC tester

    104 parts79
  • 2 layers75 × 60 mmCircuit design, the printed circuit board in 3D

    Circuit design

    heresiarch/esp32-wifi-eth-gateway

    This is proof of concept of a Wifi to Ethernet Gateway with ESP32

    10 parts1Apache-2.0
  • 2 layers85 × 45 mmBench, the printed circuit board in 3D

    Bench

    Amir-Vered/Bench

    Wi-Fi upload dock for Arduino

    58 partsCERN-OHL-P-2.0
  • 6 layers140 × 100 mmSbc baseboard, the printed circuit board in 3D

    Sbc baseboard

    calicopizzadelivery/sbc-development-baseboard

    Baseboard for remote management of an attached SBC: K64 MCU as USB HID to the target and Ethernet to the workstation, six switched USB-A ports, isolated SPDT relays, level-shifted console, switched target power

    271 partsApache-2.0
  • 4 layers100 × 60 mmKigeyes power io board, the printed circuit board in 3D

    Kigeyes power io board

    jrymk/KigEyes

    Video passthrough and electronic eye for Kigurumi masks

    280 parts
  • 4 layers106 × 110 mmRearCircuitBoard 10, the printed circuit board in 3D

    RearCircuitBoard 10

    ssbingo/samba-solar-track

    Samba Solar Track – Solarnachführung mit Sturmschutz: Handbuch, Platine und Gehäuse für den Nachbau (10,1-Zoll-Version)

    329 parts
  • 4 layers42 × 100 mmPsu, the printed circuit board in 3D

    Psu

    xdylanm/modular-system-psu

    A PSU for a modular Eurorack system, featuring +/-12V and 5V rails, USB-C input, and a regulated USB-A output.

    68 partsMIT
  • 2 layers139 × 139 mmBreeze electronics design, the printed circuit board in 3D

    Breeze electronics design

    microdynamics-robot-quadcopter/breeze_electronics_design

    This project is created and managed by EDA softwares, which contains the breeze quadcopter's component library, footprint library, schematic, printed circuit boards, etc.

    107 parts13GPL-3.0