

Flight computer
Senior capstone project: demonstrate closed-loop lateral guidance of a high power rocket using forward canards, and handle the canard-wake-on-aft-fin interference problem correctly.
- Size
- 70 × 45 mm
- Copper layers
- 4
- Thickness
- 1.6 mm
- Parts
- 85
- Nets
- 100
- Pads
- 334
- Tracks, vias
- 767, 147
- Pours
- 2
- Routed
- Yes
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 28 Aug 2026
- Updated
- 27 Sep 2026
Overview
Flight computer is an open-source printed circuit board by Ben-Blair, from the Ben-Blair/Rocket-Build repository on GitHub. It is a 4-layer board of 70 × 45 mm with 85 parts on 100 nets, routed with 767 tracks and 147 vias.
It is built around the STM32F405RGT6, MMC5983MA and MS5611-01BA03, with the TPS62162DSGT, W25Q128JVSIQ and ICM-42688-P among its other parts. Its parts include 33 capacitors, 16 resistors, 9 ICs, 9 connectors and 3 diodes. It belongs with the STM32 boards of this library.
Main components
11STM32F405RGT6
LQFP-64(10x10)-40℃~+85℃ 1.8V~3.6V 12bit 12bit 168MHz 192KB 1MB 32 Bit 51 ARM Cortex-M4 Built-in FLASH LQFP-64(10x10) Microcontrollers (MCU/MPU/SOC) ROHSSTMicroelectronicsMicrocontrollers (MCU/MPU/SOC)MMC5983MA
LGA-16(3x3)-40℃~+105℃ 18bit 2.8V~3.6V 450uA I2C、SPI ±8Gs ±8Gs LGA-16(3x3) 3D Magnetic Sensors ROHSMEMSIC3D Magnetic SensorsMS5611-01BA03
QFN-8(3x5)QFN-8(3x5) Pressure Sensors ROHSMEASPressure SensorsTPS62162DSGT
WSON-8-EP(2x2)-40℃~+125℃@(TJ) 1 17uA 1A 2.25MHz 3.3V 3V~17V Buck Buck Built-in Fixed Yes WSON-8-EP(2x2) DC-DC Converters ROHSTexas InstrumentsDC-DC ConvertersW25Q128JVSIQ
SOIC-8-208mil-40℃~+85℃ 100,000 cycles 120ms@(32KB) 128Mbit 133MHz 1uA 2.7V~3.6V 20 Years 3ms Power-on reset、Hardware write protection、Software write protection、Write enable latch、Absolute write protection SPI SOIC-8-208mil NOR FLASH ROHSWinbondNOR FLASHICM-42688-P
LGA-14(2.5x3)-40℃~+85℃ 1.71V~3.6V 16bit 2KB 7.5uA IMU (accelerometer + gyroscope) SPI、I2C X,Y,Z X,Y,Z ±16g ±2000dps Motion Event Detection, Synchronization, Timestamp Support LGA-14(2.5x3) Accelerometers ROHSTDK InvenSenseAccelerometersLP2985-33DBVR
SOT-23-5-55℃~+150℃@(Tj) 1 10uA 150mA 18V 3.3V 70dB@(1kHz) 90mV@(100mA) Fixed Over Current Protection、Enable Positive SOT-23-5 Voltage Regulators - Linear, Low Drop Out (LDO) Regulators ROHSTECH PUBLICVoltage Regulators - Linear, Low Drop Out (LDO) RegulatorsMAX-M10S
LCC-18_10.1X9.7LCC-18_10.1X9.7 New Arrivals ROHSu-bloxUncategorisedUSBLC6-2SC6
SOT-23-60.35pF、0.8pF 100nA 150W@8/20us 15V 2 5V 6A@8/20us 6V ESD SOT-23-6 ESD and Surge Protection (TVS/ESD) ROHSUMWESD And Surge Protection (TVS/ESD)M2.5
-0.45mm 2.5mm 2mm 5mm DIN934 Hex M2.5X0.45 Nickel plated Silver white - Hexagonal nutsShuntianHex NutSS14
SMA(DO-214AC)-55℃~+150℃ 1A 25A 300uA@40V 40V 550mV@1A Independent SMA(DO-214AC) Schottky Diodes ROHSMDDSchottky Diodes
README
README.mdRocketSenior — canard-guided high power rocket
Senior capstone project: demonstrate closed-loop lateral guidance of a high power rocket using forward canards, and handle the canard-wake-on-aft-fin interference problem correctly.
This repository currently holds the preliminary sizing tool. It exists to answer the questions you have to answer before you can draw anything in OpenRocket: how big is the tube, how big are the fins, which motor, and can the canards actually do anything.
Why a sizing tool instead of just using OpenRocket
OpenRocket is a verification tool. It answers "is this specific rocket stable, and how high does it go." It cannot answer "what should my rocket be," because that depends on constraints it knows nothing about:
- the internal diameter needed to house four canard servos (this sets your airframe size),
- the lateral acceleration you need for a visible manoeuvre,
- the static margin you are willing to trade away to get control authority,
- whether the canard wake reverses the sign of your roll moment.
This tool computes those, converges on a baseline, and then prints the numbers to type into OpenRocket for an independent cross-check. Use both. Disagreement between them is information.
Quick start
pip install -r requirements.txt
python scripts/packaging_report.py # what diameter do the actuators force on you?
python scripts/fetch_motors.py --diameter 54 --classes J K # real thrust curves
python scripts/motor_trade.py # rank every real L2 motor against the airframe
python scripts/sweep.py # which (tube, motor, fin) combos meet requirements?
python scripts/baseline.py --plot # full analysis + OpenRocket entry valuesLayout
out/
RocketSenior.ork GENERATED by scripts/make_ork.py -- do not hand-edit, see belowThe .ork is a build artifact, not the design
out/RocketSenior.ork is written from the same DesignParams the Python tool uses, and
scripts/openrocket_check.py regenerates it on every run. That is the point: the two
models cannot drift apart.
It also means anything you change in the OpenRocket GUI and save back to that path is
destroyed the next time you run the check. Open it to look, simulate, and cross-check
freely. If you want to tinker, Save As somewhere outside out/ first. If a change is
worth keeping, it belongs in design/configure.py or scripts/make_ork.py, so that the
next regeneration carries it forward.
design/
atmosphere.py US Standard Atmosphere 1976, troposphere
aero.py Barrowman CNa & CP buildup, component drag buildup
avionics.py nav bay / nose packing, and the D7 flight computer trade
bay.py the printed canard bay: servo pockets, bearing seats, retainers
configure.py parameter set -> full vehicle -> requirement scoring, and the
frozen baseline airframe every script imports
control.py canard pitch authority, roll authority, wake interference, crossrange
estimation.py D8: observability per flight phase, attitude error budget, sensor specs
flight_computer.py the Stage 2 board: BOM, power budget, log budget, board envelope
flutter.py fin flutter margin
geometry.py nose / tube / fin set definitions, Barrowman CP geometry
hinge.py the hinge as a load path: shaft, bearing, coupling, root joint
joints.py all four tube joints -- a coupler costs bore, not length
mass.py geometric structural mass + editable subsystem budget, CG
materials.py material allowables, in one place
motors.py RASP .eng thrust curve parser + placeholder generic motors
onshape.py minimal Onshape REST API client
onshape_build.py emits Onshape Part Studio feature JSON
packaging.py actuator bay packaging + hinge moment + servo torque margin
recovery.py dual-deploy sizing, descent time, wind drift, soft-goods packing
seal.py the aft gas seal and the internal bulkhead, sized as pistons
horizontal.py horizontal-launch 3-DOF: fly the manoeuvre, then score the turn
trajectory.py 3-DOF RK4 ascent to apogeeHow this fits with OpenRocket and RocketPy
Three tools, each for what it is actually good at. Do not try to make one do everything.
| Tool | Use it for | Do not use it for |
|---|---|---|
| This repo | Actuator packaging, control derivatives (Cm_delta, Cl_delta, Cl_p), canard/aft-fin wake interference, hinge moments, requirement-driven sizing sweeps across 100+ motors | Final apogee or drag numbers |
| OpenRocket | Validated stability and trajectory, Mach-dependent drag, dual-deploy and recovery sizing, fin flutter, the airframe truth a reviewer will trust | Anything involving a deflected control surface. It has no concept of one |
| RocketPy | 6-DOF flight with wind, Monte Carlo dispersion, and closed-loop control. LinearGenericSurface takes coefficient derivatives as functions of Mach, alpha, beta and body rates; Controller runs your control law at a fixed sampling rate against simulated IMU and barometer sensors | Preliminary sizing; it needs a vehicle before it can fly one |
The intended pipeline: size here → validate the passive airframe in OpenRocket → export
the derivatives from here into a RocketPy LinearGenericSurface → close the loop in 6-DOF
→ fly, and replace the interference factors with measured values.
Model validity and what you must not trust
Read this before you quote any number from this tool in a report.
| Component | Status | Notes |
|---|---|---|
| Atmosphere | Solid | Standard model, valid to 11 km. |
| Barrowman CNa / CP | Good | Standard method. Valid subsonic, small alpha, attached flow. |
| Body lift (Galejs) | Approximate | Nonlinear term linearised about 4 deg alpha. |
| Drag buildup | ±20% at best | Component buildup with empirical form factors. Cross-check against OpenRocket, then against measured flight data. |
| Mass budget | Estimate | Every subsystem line is a guess until you weigh the part. Weigh things. |
| Trajectory | Good given the above | 3-DOF, no wind, perfect weathercocking. |
| Inertias | ±30% bulk, canard module measured | Crude analytical estimate for the airframe, with the canard module's CAD tensor superposed (control.MEASURED_COMPONENTS). Measure the rest before tuning gains. |
| Canard control derivatives | Approximate | Linear, quasi-steady, no wake effect on the canards themselves. |
| Canard/aft-fin interference | Weakest part | Empirical factors with no validation. Trends are believable, absolute values are not. Must be measured in flight. |
| Motor data | Real | 102 available 54 mm J/K certification curves from ThrustCurve.org in data/motors/. The GENERIC motors in motors.py are invented placeholders, kept only so the tool runs before a download. |
The interference model is the one to be honest about in your defense: it is a physically-motivated parameterisation, not a validated prediction. The project plan therefore makes measuring it a flight test objective rather than an assumption.
Baseline result
75 mm (3 in) fiberglass airframe, 79.4 mm OD, 1361 mm long, 4 canards interdigitated 45° from 4 aft fins, on a Cesaroni Pro54 J449 Blue Streak, actuated by four KST X08 Plus V6.0 servos on direct drive, with 100 g of nose ballast. 6.10 kg wet / 5.48 kg dry, apogee 1379 m (4525 ft), max Mach 0.531, static margin 2.03 cal at rail exit rising to 2.52 in coast, 1.96 g of lateral authority at 8° of canard deflection, giving 424 m of crossrange over an 11.4 second usable control window. Recovery is an 18 in drogue and 56 in main deployed at 200 m, landing at 5.0 m/s after a ~0.93 km walk in a 15 mph wind.
Both fin sets were sized together by a Monte Carlo on margin robustness rather than
independently by nominal stability — canard semispan 0.85 cal, aft semispan 1.55 cal. They
pull in opposite directions, and searching them jointly under a probabilistic margin
constraint beats trading one against the other. See docs/00-requirements.md §7.
The nose ballast is part of the design, not a contingency. Real 9 g servos in place of the 55 g budget placeholder removed ~180 g from ahead of the CG, which took P(SM < 1.0) to 1.8% against R1's 1% limit. 75 g of ballast is the minimum that satisfies R1; 100 g is the design point and brings it to 0.6%. It is deliberately the last free parameter — a washer stack you set after weighing the built vehicle, rather than fin area you commit to when you cut the tube. See §7.1.
Every number above is an output of scripts/baseline.py. Regenerate them rather than
editing them by hand; they will move as the mass budget is replaced with weighed parts.
Parts
85| Qty | Value | Footprint | References |
|---|---|---|---|
| 15 | 100nF | Capacitor_SMD:C_0402_1005Metric | C6, C9, C10, C11, C12, C13, C19, C20, C21, C24, C25, C26, C27, C28, C33 |
| 7 | 10k | Resistor_SMD:R_0402_1005Metric | R4, R8, R9, R10, R11, R12, R13 |
| 4 | M2.5 | MountingHole:MountingHole_2.7mm_M2.5 | MH1, MH2, MH3, MH4 |
| 3 | 100k | Resistor_SMD:R_0402_1005Metric | R1, R2, R34 |
| 2 | 10nF | Capacitor_SMD:C_0402_1005Metric | C18, C31 |
| 2 | 12pF | Capacitor_SMD:C_0402_1005Metric | C7, C8 |
| 2 | 1k | Resistor_SMD:R_0402_1005Metric | R3, R7 |
| 2 | 1uF | Capacitor_SMD:C_0603_1608Metric | C17, C30 |
| 2 | 2.2uF | Capacitor_SMD:C_0805_2012Metric | C15, C16 |
| 2 | 22uF/25V | Capacitor_SMD:C_1210_3225Metric | C1, C2 |
| 2 | 4.7uF | Capacitor_SMD:C_0805_2012Metric | C14, C32 |
| 2 | 5.1k | Resistor_SMD:R_0402_1005Metric | R5, R6 |
| 1 | +3V3 | TestPoint:TestPoint_Pad_D1.5mm | TP2 |
| 1 | 10 | Resistor_SMD:R_0402_1005Metric | R33 |
| 1 | 100nF/50V | Capacitor_SMD:C_0402_1005Metric | C4 |
| 1 | 10uF | Capacitor_SMD:C_0805_2012Metric | C29 |
| 1 | 10uF SET/RESET | Capacitor_SMD:C_0805_2012Metric | C23 |
| 1 | 10uF/25V | Capacitor_SMD:C_0805_2012Metric | C3 |
| 1 | 2.2uF | Capacitor_SMD:C_0603_1608Metric | C22 |
| 1 | 2.2uH | Inductor_SMD:L_1210_3225Metric | L1 |
| 1 | 22uF/16V | Capacitor_SMD:C_0805_2012Metric | C5 |
| 1 | 2S pack: XT30 pigtail, 18 AWG | Connector_Wire:SolderWire-0.75sqmm_1x02_P4.8mm_D1.25mm_OD2.3mm | J1 |
| 1 | 33k | Resistor_SMD:R_0402_1005Metric | R35 |
| 1 | 600R@100MHz | Inductor_SMD:L_0603_1608Metric | FB2 |
| 1 | 600R@100MHz 2A | Inductor_SMD:L_0805_2012Metric | FB1 |
| 1 | 8MHz | Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm | Y1 |
| 1 | BOOT0->3V3 (open) | Jumper:SolderJumper-2_P1.3mm_Open_Pad1.0x1.5mm | JP2 |
| 1 | GND | TestPoint:TestPoint_Pad_D1.5mm | TP3 |
| 1 | ICM-42688-P | Package_LGA:LGA-14_3x2.5mm_P0.5mm_LayoutBorder3x4y | U4 |
| 1 | LP2985-33DBVR | Package_TO_SOT_SMD:SOT-23-5 | U9 |
| 1 | MAX-M10S | RF_GPS:ublox_MAX | U8 |
| 1 | MMC5983MA | RocketSenior:MMC5983MA_LGA-16_3x3mm_P0.5mm | U5 |
| 1 | MS5611-01BA03 | Package_LGA:LGA-8_3x5mm_P1.25mm | U6 |
| 1 | SS14 | Diode_SMD:D_SOD-123 | D1 |
| 1 | STM32F405RGT6 | Package_QFP:LQFP-64_10x10mm_P0.5mm | U2 |
| 1 | SWD (ARM 10-pin 1.27mm) | Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMD | J3 |
| 1 | TPS62162DSGT | Package_SON:Texas_DSG0008A_WSON-8-1EP_2x2mm_P0.5mm_EP0.9x1.6mm | U1 |
| 1 | USB->VIN (open) | Jumper:SolderJumper-2_P1.3mm_Open_Pad1.0x1.5mm | JP1 |
| 1 | USB-C | Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12 | J4 |
| 1 | USBLC6-2SC6 | Package_TO_SOT_SMD:SOT-23-6 | U3 |
| 1 | VBATT | TestPoint:TestPoint_Pad_D1.5mm | TP1 |
| 1 | W25Q128JVSIQ | Package_SO:SOIC-8_5.3x5.3mm_P1.27mm | U7 |
| 1 | blue | LED_SMD:LED_0603_1608Metric | D3 |
| 1 | debug UART | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J10 |
| 1 | green | LED_SMD:LED_0603_1608Metric | D2 |
| 1 | reset | Button_Switch_SMD:SW_SPST_TL3342 | SW1 |
| 1 | servo 1 (raw 2S) | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J6 |
| 1 | servo 2 (raw 2S) | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J7 |
| 1 | servo 3 (raw 2S) | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J8 |
| 1 | servo 4 (raw 2S) | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J9 |
| 1 | star: SERVO_GND-GND | NetTie:NetTie-2_SMD_Pad0.5mm | NT1 |
| 1 | u.FL GNSS ant | Connector_Coaxial:U.FL_Hirose_U.FL-R-SMT-1_Vertical | J5 |
Similar boards
- 4 layers50.8 × 106.6 mm

- 4 layers74.5 × 69.2 mm

- 4 layers30 × 77 mm

- 4 layers50 × 100 mm

Flight computer one
liquid-rocketry-illinois/flight-computer-one-hw
SAME51-based flight computer with active control capabilities
105 partsCERN-OHL-S-2.0 - 4 layers103.4 × 93.6 mm

- 4 layers54 × 22 mm

- 4 layers60 × 84 mm

StratosCore Claude
pantojinho/StratosCore
StratosCore is an open-source portable field, aviation, meteorological, navigation and radio computer based on the ESP32-S3-WROOM-1-N16R8.
277 parts1 - 8 layers21.3 × 27 mm

FIRM v2.0
NCSU-High-Powered-Rocketry-Club/FIRM-KiCad
Full and open hardware design for FIRM
82 parts1MIT
Questions
How big is the Flight computer PCB?
It measures 70 × 45 mm and has 4 copper layers, 1.6 mm thick.
What parts does the Flight computer use?
85 parts, built around the STM32F405RGT6, MMC5983MA, MS5611-01BA03 and TPS62162DSGT. 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 Flight computer KiCad files?
From the Ben-Blair/Rocket-Build repository on GitHub, at the commit this page was made from: the board is pcb/flight_computer/flight_computer.kicad_pcb and its schematic pcb/flight_computer/flight_computer.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Flight computer design in my own project?
Its repository states no licence, so its author keeps all rights: ask Ben-Blair before reusing the design.