Skip to the content
4 layers55 × 55 mmDrone PCB FC, the printed circuit board in 3D

An 80×80 mm STM32F405 flight controller for a 4S freestyle quad, running Betaflight off a custom target I wrote.

Size
55 × 55 mm
Copper layers
4
Thickness
1.6 mm
Parts
90
Nets
90
Pads
333
Tracks, vias
553, 59
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
27 Jun 2026
Updated
23 Oct 2026

Overview

Drone PCB FC is an open-source printed circuit board by Ethansuttor, from the Ethansuttor/drone_PCB repository on GitHub. It is a 4-layer board of 55 × 55 mm with 90 parts on 90 nets, routed with 553 tracks and 59 vias.

It is built around the SPA06-003, TPS5450DDAR and W25Q128JVSIQ, with the AP2112K-3.3, BMI270 and USBLC6-2SC6 among its other parts. Its parts include 29 capacitors, 22 resistors, 8 connectors, 7 ICs and 6 diodes. It belongs with the robots and motor control boards and the STM32 boards of this library.

Main components

12

README

README.md

Custom Drone Flight Controller PCB

Flight controller PCB, top view

An 80×80 mm STM32F405 flight controller for a 4S freestyle quad, running Betaflight off a custom target I wrote. I built it to find out whether I could take an embedded system from a blank schematic all the way to something that actually flies.

The board is built, brought up, and running Betaflight in a printed 5-inch frame, and all four motors spin. It doesn't fly yet: it flips on every liftoff, and finding out why is the current job.

There's no VTX, camera, or OSD. Those are solved problems, and adding them would have cost layout time I wanted to spend on power architecture, IMU integration, and getting the pinout right.

Why it looks like this

The biggest constraint was self-imposed: the board has to mate with an ESC I already owned, a Flycolor Raptor BLS-04 4-in-1, using its existing 10-pin harness. That turned out to be the most useful decision I made, because the BLS-04 has no BEC. It hands you raw pack voltage and nothing else. So the board needs its own buck converter running off 16.8 V, which is a much more interesting problem than accepting a regulated 5 V from somewhere else.

The board is oversized on purpose. 80×80 mm with a standard 30.5 mm mounting pattern means it overhangs the stack, which would be silly on a real build. But everything is on the top layer in one hotplate reflow pass, and I hand-place all of it, so the extra room is worth more to me than the elegance.

The STM32F405 was the easy call — native Betaflight support, and writing the custom target is a big chunk of the point.

Hardware

  • MCU: STM32F405RGT6, 168 MHz Cortex-M4F, LQFP-64
  • IMU: Bosch BMI270 on SPI1
  • Blackbox: GigaDevice GD25Q16E, 2 MB SPI NOR on SPI2
  • Input: 4S LiPo, 14.8 V nominal / 16.8 V charged, through the ESC harness
  • Buck: TPS5450DDAR, VBAT to 5 V
  • Regulators: AP2112K-3.3 for MCU/flash/logic and the IMU's VDDIO; TLV733P-3.3 as a separate quiet rail feeding only the IMU's VDD
  • Receiver: FlySky FS-iA6B on i-BUS into UART1
  • USB-C for Configurator and DFU
  • 4-layer: signal / solid ground / power / signal, ENIG finish
  • Spare UART3, USART6 and I2C1 pads for GPS or a mag later

The parts that went wrong

This is the section I'd actually want to talk about in an interview.

The IMU disappeared mid-design. I'd settled on a TDK ICM-42605. Then the entire 426xx family went reel-only at LCSC — minimum orders of a thousand-plus — and out of stock at DigiKey and Mouser. In single quantities it simply stopped existing. The replacement was a Bosch BMI270, which shares the 2.5×3.0 mm LGA-14 outline and nothing else: completely different pinout, new footprint, every IMU net re-routed, different decoupling.

What saved it was a decision I'd made months earlier for unrelated reasons. Splitting the 3.3 V rail in two — a main AP2112K for logic and a dedicated TLV733P for the gyro — meant VDD was already isolated from switching noise. When the part changed, VDD still landed on the quiet rail and VDDIO still landed on the logic rail. A forced sourcing change cost me a footprint and a re-route instead of a power redesign. I'd like to claim I planned for that. I didn't.

The tradeoff is real, though: the BMI270 ships uncalibrated, which is why Betaflight discourages it for new designs, and it caps the PID loop at 3.2 kHz instead of 8 kHz. For Acro freestyle neither matters much. It's still a downgrade I took because the alternative was not building the board.

I ordered the wrong flash chip. The BOM called for a 128 Mbit part. A 16 Mbit part arrived — 2 MB instead of 16. I found it a week after the boards shipped, while cross-checking three different BOM files against the firmware, which is a sentence that should tell you something about how I was managing the BOM.

I'm keeping it. I assumed nothing would change in firmware, since Betaflight identifies SPI NOR by JEDEC ID at runtime. That turned out to be wrong, and it cost me the most time of anything on this board. The GD25Q16E's ID (0xC84015) isn't in Betaflight 4.5.5's device table, so the chip answered every read correctly and the driver threw the reply away. Along the way I blamed the chip, then the solder joints, then the STM32's SPI peripheral. The fix was one table entry in a patch the target build applies. The lesson I took from it: don't reason about what a bus returned until you're looking at the raw bytes.

What I lose is log duration: about 22 seconds at full rate, or roughly 90 seconds if I drop the blackbox sample rate to 1/4. Since 800 Hz still resolves everything below 400 Hz, where the noise peaks that matter for filter tuning live, and since tuning runs are a minute anyway, the practical cost is that I can't log a whole pack. Every candidate chip shares the same SOIC-8 208-mil footprint, so fixing it later is a hot-air swap.

A DMA collision moved a motor output. Motor 4 originally sat on PB7, which wanted DMA1 Stream 3 — the same stream SPI2_RX uses for the blackbox flash. DShot would have fought the logger for it. The final as-built mapping is M1 = PB0 and M2 = PB1 on TIM3, M3 = PA3 and M4 = PB10 on TIM2, checked against RM0090's DMA request mapping table. I'll confirm it with dma show all at bring-up rather than trusting the table twice.

Designed so I can actually bring it up

I assume I've made mistakes I haven't found yet, so the board is built to fail safely and be diagnosed.

Four normally-open solder jumpers split the power tree: buck output to the 5 V rail, 5 V to each LDO, and the quiet 3.3 V rail to the IMU. Each stage comes up on a current-limited bench supply before the next jumper is closed, so a short behind one jumper can't take the STM32 with it.

Test points sit on every rail plus multiple grounds, on the buck's switch and feedback nodes for scoping, and on both ADC sense lines for calibration. There are dedicated ground loops next to the buck and the IMU so a scope probe gets a short ground lead instead of the usual six inches of alligator clip.

Unused STM32 pins are broken out to a labelled header where the layout allowed — timer-capable pins for motor reassignment, a spare UART, spare ADC channels, and SWO. Cheap insurance against a pin-level mistake that would otherwise mean a respin.

One more thing that isn't a jumper: the schematic numbers the ESC connector in the reverse order to the manufacturer's diagram. It's only correct if the connector mates flipped. Before anything gets powered, I continuity-beep VBAT and both grounds from the mated cable to the ESC's XT60. Get that wrong and 16.8 V lands on a 3.3 V GPIO.

Where it's at

Boards came from JLCPCB (bare 4-layer, ENIG, frameless top-side stencil, quantity 5) and parts from LCSC. I pasted and populated one board on a hotplate and brought it up through the jumpers on 2026-08-19. Rails, USB, gyro, receiver, and both sense lines came up; the only failure was the blackbox flash, which was the firmware problem above. The two open BOM questions both closed the right way: the TPS5450 and the 15 µH inductor are what shipped.

The board is now mounted in a printed frame on the BLS-04 with EMAX 2205 motors and a 4S pack. It flips on liftoff every time.

Next

Verify motor mapping and spin direction, set up failsafe, then log a flight with blackbox at a 1/4 sample rate and diagnose the flip from data instead of guessing on the bench.

Then I find out what else I got wrong.

Parts

90
QtyValueFootprintReferences
13100nFCapacitor_SMD:C_0805_2012MetricC14, C15, C20, C24, C25, C26, C27, C29, C30, C31, C32, C33, C36
810kResistor_SMD:R_0805_2012MetricR3, R4, R9, R13, R15, R17, R18, R20
4MountingHole_3.2mm_M3MountingHole:MountingHole_3.2mm_M33.2mm M3, 3.2mm M3, 3.2mm M3, 3.2mm M3
31kResistor_SMD:R_0805_2012MetricR5, R24, R25
31uFCapacitor_SMD:C_0805_2012MetricC1, C2, C19
32.2uFCapacitor_SMD:C_0805_2012MetricC12, C13, C35
2.01uFCapacitor_SMD:C_0805_2012MetricC11, C17
2100kResistor_SMD:R_0805_2012MetricR6, R23
22.2kResistor_SMD:R_0805_2012MetricR12, R16
222pFCapacitor_SMD:C_0805_2012MetricC21, C22
24.7uFCapacitor_SMD:C_1210_3225MetricC6, C9
25.1kResistor_SMD:R_0805_2012MetricR1, R2
2SS54_C22452drone_lib:SMA_L4.4-W2.8-LS5.4-R-RDD2, D3
2SolderJumper_2_OpenJumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmJP3, JP4
10.01uFCapacitor_SMD:C_0805_2012MetricC10
110Resistor_SMD:R_0805_2012MetricR26
110kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR10
110nFCapacitor_SMD:C_0805_2012MetricC18
115uHdrone_lib:IND-SMD_L8.5-W8.0_PCC-M0854ML3
11N4148WDiode_SMD:D_SOD-123D8
13.24kResistor_SMD:R_0805_2012MetricR11
1330Resistor_SMD:R_0805_2012MetricR19
1330uFCapacitor_Tantalum_SMD:CP_EIA-7343-31_Kemet-DC16
14.7uFCapacitor_SMD:C_0805_2012MetricC28
1470Resistor_SMD:R_0805_2012MetricR14
1600ohms 100MHzInductor_SMD:L_0805_2012MetricFB1
18MHzCrystal:Crystal_SMD_3225-4Pin_3.2x2.5mmY1
1AIO_5VTestPoint:TestPoint_Pad_2.0x2.0mmTP3
1AIO_GNDTestPoint:TestPoint_Pad_2.0x2.0mmTP4
1AIO_VBATTestPoint:TestPoint_Pad_2.0x2.0mmTP2
1AO3400APackage_TO_SOT_SMD:SOT-23Q2
1AP2112K-3.3Package_TO_SOT_SMD:SOT-23-5U1
1BLM21PG221SN1DInductor_SMD:L_0805_2012MetricFB3
1BMI270drone_lib:LGA-14_L3.0-W2.5-P0.50-BRU7
1Conn_01x08Connector_JST:JST_SH_SM08B-SRSS-TB_1x08-1MP_P1.00mm_HorizontalJ1
1Current MJumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmCurrentM1
1D_ZenerDiode_SMD:D_SOD-123D1
1GPS-compassConnector_JST:JST_GH_SM06B-GHS-TB_1x06-1MP_P1.25mm_HorizontalJ4
1LEDLED_SMD:LED_0805_2012MetricD5
1LEDLED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolderD6
1MLT-8530drone_lib:BUZ-SMD_4P-L8.5-W8.5-P8.50-BRBZ1
1Optical_flowConnector_JST:JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_HorizontalJ5
1ReceiverConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ3
1SM10B-SRSS-TBdrone_lib:CONN-SMD_10P-P1.00_SM10B-SRSS-TB-LF-SNCN1
1SPA06-003drone_lib:LGA-8_2.0x2.5mm_P0.65mm_BaroU8
1STM32F405RGTxPackage_QFP:LQFP-64_10x10mm_P0.5mmU4
1SWDConnector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_VerticalJ7
1Spare_I2CConnector_JST:JST_GH_SM04B-GHS-TB_1x04-1MP_P1.25mm_HorizontalJ6
1TPS5450DDARdrone_lib:ESOP-8_L4.9-W3.9-P1.27-LS6.0-TL-EPU6
1TestPointConnector_Pin:Pin_D1.0mm_L10.0mmTP1
1USART1_TXTestPoint:TestPoint_Pad_1.5x1.5mmTP5
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U2
1USB_C_Receptacle_USB2.0_14PConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J2
1W25Q128JVSIQdrone_lib:SOIC-8_L5.3-W5.3-P1.27-LS8.0-BLU3

More from Ethansuttor/drone_PCB

2
  • 4 layers80 × 80 mmDrone PCB FC, the printed circuit board in 3D

    Drone PCB FC

    Ethansuttor/drone_PCB

    An 80×80 mm STM32F405 flight controller for a 4S freestyle quad, running Betaflight off a custom target I wrote.

    83 parts
  • 4 layersDrone PCB FC v1, the printed circuit board in 3D

    Drone PCB FC v1

    Ethansuttor/drone_PCB

    An 80×80 mm STM32F405 flight controller for a 4S freestyle quad, running Betaflight off a custom target I wrote.

    65 parts

Similar boards

  • 2 layers99 × 90 mmHomeyPCB, the printed circuit board in 3D

    HomeyPCB

    jadam3k/Homey

    Home Asistance/Industrial PLC

    99 parts
  • 4 layers117 × 107 mmHUB MPE, the printed circuit board in 3D

    HUB MPE

    felixmanfredi/MPE_HUB

    257 parts
  • 2 layers154.5 × 105.5 mmSeismos 5CoreStencil, the printed circuit board in 3D

    Seismos 5CoreStencil

    ReSummit/Seismos

    A split keyboard that evolves the concept of the Zebra keyboard, but fancier

    100 parts18GPL-3.0
  • 2 layers42 × 66 mmWafflehw rev0.1, the printed circuit board in 3D

    Wafflehw rev0.1

    Jankyneering/Waffle_hw

    Hardware designs for Waffle, a compact Pager and general RF multitool.

    42 parts2GPL-3.0
  • 6 layers100 × 67.8 mm12v-2x6, the printed circuit board in 3D

    12v-2x6

    eggsampler/12v-2x6-Current-Monitor

    For more information, see the schematic or the PCB layout (KiCanvas)

    152 parts1
  • 2 layersEphemerkey, the printed circuit board in 3D

    Ephemerkey

    ephemerkey/ephemerkey

    The consumer half of the ephemerkey system, and the second PCB in this repo (alongside hardware/ephemerkey/, sharing the same scripts/kschgen.py engine, Makefile, and lib tables — the multi-project layout used by…

    70 parts
  • 2 layers105 × 58 mmZAP-010A, the printed circuit board in 3D

    ZAP-010A

    lalithk06/Esp32_Smart_Plug

    Hardware reference design for an ESP32-S3 smart plug with mains power conversion, relay switching, RTC support, USB connectivity, and protection components.

    80 parts
  • 2 layers105 × 58 mmZAP-01A, the printed circuit board in 3D

    ZAP-01A

    ponrajleo/AI-Hardware-ESP32S3-

    This project is part of a complete open-source hardware design course on YouTube:

    103 parts

Questions

How big is the Drone PCB FC PCB?

It measures 55 × 55 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Drone PCB FC use?

90 parts, built around the SPA06-003, TPS5450DDAR, W25Q128JVSIQ and AP2112K-3.3. 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 Drone PCB FC KiCad files?

From the Ethansuttor/drone_PCB repository on GitHub, at the commit this page was made from: the board is Drone_PCB_FC_V2/Drone_PCB_FC.kicad_pcb and its schematic Drone_PCB_FC/Blackbox-flash.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Drone PCB FC design in my own project?

Its repository states no licence, so its author keeps all rights: ask Ethansuttor before reusing the design.