Skip to the content
4 layers70 × 45 mmFlight computer, the printed circuit board in 3D

Flight computer

Ben-Blair/Rocket-Build

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

11

README

README.md

RocketSenior — 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

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

Layout

text
out/
  RocketSenior.ork   GENERATED by scripts/make_ork.py -- do not hand-edit, see below

The .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.

text
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 apogee

How this fits with OpenRocket and RocketPy

Three tools, each for what it is actually good at. Do not try to make one do everything.

ToolUse it forDo not use it for
This repoActuator packaging, control derivatives (Cm_delta, Cl_delta, Cl_p), canard/aft-fin wake interference, hinge moments, requirement-driven sizing sweeps across 100+ motorsFinal apogee or drag numbers
OpenRocketValidated stability and trajectory, Mach-dependent drag, dual-deploy and recovery sizing, fin flutter, the airframe truth a reviewer will trustAnything involving a deflected control surface. It has no concept of one
RocketPy6-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 sensorsPreliminary 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.

ComponentStatusNotes
AtmosphereSolidStandard model, valid to 11 km.
Barrowman CNa / CPGoodStandard method. Valid subsonic, small alpha, attached flow.
Body lift (Galejs)ApproximateNonlinear term linearised about 4 deg alpha.
Drag buildup±20% at bestComponent buildup with empirical form factors. Cross-check against OpenRocket, then against measured flight data.
Mass budgetEstimateEvery subsystem line is a guess until you weigh the part. Weigh things.
TrajectoryGood given the above3-DOF, no wind, perfect weathercocking.
Inertias±30% bulk, canard module measuredCrude analytical estimate for the airframe, with the canard module's CAD tensor superposed (control.MEASURED_COMPONENTS). Measure the rest before tuning gains.
Canard control derivativesApproximateLinear, quasi-steady, no wake effect on the canards themselves.
Canard/aft-fin interferenceWeakest partEmpirical factors with no validation. Trends are believable, absolute values are not. Must be measured in flight.
Motor dataReal102 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
QtyValueFootprintReferences
15100nFCapacitor_SMD:C_0402_1005MetricC6, C9, C10, C11, C12, C13, C19, C20, C21, C24, C25, C26, C27, C28, C33
710kResistor_SMD:R_0402_1005MetricR4, R8, R9, R10, R11, R12, R13
4M2.5MountingHole:MountingHole_2.7mm_M2.5MH1, MH2, MH3, MH4
3100kResistor_SMD:R_0402_1005MetricR1, R2, R34
210nFCapacitor_SMD:C_0402_1005MetricC18, C31
212pFCapacitor_SMD:C_0402_1005MetricC7, C8
21kResistor_SMD:R_0402_1005MetricR3, R7
21uFCapacitor_SMD:C_0603_1608MetricC17, C30
22.2uFCapacitor_SMD:C_0805_2012MetricC15, C16
222uF/25VCapacitor_SMD:C_1210_3225MetricC1, C2
24.7uFCapacitor_SMD:C_0805_2012MetricC14, C32
25.1kResistor_SMD:R_0402_1005MetricR5, R6
1+3V3TestPoint:TestPoint_Pad_D1.5mmTP2
110Resistor_SMD:R_0402_1005MetricR33
1100nF/50VCapacitor_SMD:C_0402_1005MetricC4
110uFCapacitor_SMD:C_0805_2012MetricC29
110uF SET/RESETCapacitor_SMD:C_0805_2012MetricC23
110uF/25VCapacitor_SMD:C_0805_2012MetricC3
12.2uFCapacitor_SMD:C_0603_1608MetricC22
12.2uHInductor_SMD:L_1210_3225MetricL1
122uF/16VCapacitor_SMD:C_0805_2012MetricC5
12S pack: XT30 pigtail, 18 AWGConnector_Wire:SolderWire-0.75sqmm_1x02_P4.8mm_D1.25mm_OD2.3mmJ1
133kResistor_SMD:R_0402_1005MetricR35
1600R@100MHzInductor_SMD:L_0603_1608MetricFB2
1600R@100MHz 2AInductor_SMD:L_0805_2012MetricFB1
18MHzCrystal:Crystal_SMD_3225-4Pin_3.2x2.5mmY1
1BOOT0->3V3 (open)Jumper:SolderJumper-2_P1.3mm_Open_Pad1.0x1.5mmJP2
1GNDTestPoint:TestPoint_Pad_D1.5mmTP3
1ICM-42688-PPackage_LGA:LGA-14_3x2.5mm_P0.5mm_LayoutBorder3x4yU4
1LP2985-33DBVRPackage_TO_SOT_SMD:SOT-23-5U9
1MAX-M10SRF_GPS:ublox_MAXU8
1MMC5983MARocketSenior:MMC5983MA_LGA-16_3x3mm_P0.5mmU5
1MS5611-01BA03Package_LGA:LGA-8_3x5mm_P1.25mmU6
1SS14Diode_SMD:D_SOD-123D1
1STM32F405RGT6Package_QFP:LQFP-64_10x10mm_P0.5mmU2
1SWD (ARM 10-pin 1.27mm)Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMDJ3
1TPS62162DSGTPackage_SON:Texas_DSG0008A_WSON-8-1EP_2x2mm_P0.5mm_EP0.9x1.6mmU1
1USB->VIN (open)Jumper:SolderJumper-2_P1.3mm_Open_Pad1.0x1.5mmJP1
1USB-CConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J4
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U3
1VBATTTestPoint:TestPoint_Pad_D1.5mmTP1
1W25Q128JVSIQPackage_SO:SOIC-8_5.3x5.3mm_P1.27mmU7
1blueLED_SMD:LED_0603_1608MetricD3
1debug UARTConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ10
1greenLED_SMD:LED_0603_1608MetricD2
1resetButton_Switch_SMD:SW_SPST_TL3342SW1
1servo 1 (raw 2S)Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ6
1servo 2 (raw 2S)Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ7
1servo 3 (raw 2S)Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ8
1servo 4 (raw 2S)Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ9
1star: SERVO_GND-GNDNetTie:NetTie-2_SMD_Pad0.5mmNT1
1u.FL GNSS antConnector_Coaxial:U.FL_Hirose_U.FL-R-SMT-1_VerticalJ5

Similar boards

  • 4 layers50.8 × 106.6 mmM.I.A., the printed circuit board in 3D

    M.I.A.

    landodoughty/Mission-Independent-Avionics-M.I.A.-

    My Custom Rocket Avionics System

    186 parts
  • 4 layers74.5 × 69.2 mmBrian Dai, the printed circuit board in 3D

    Brian Dai

    rice-eclipse/AFSElec

    ECLIPSE: AFS

    104 parts
  • 4 layers50 × 100 mmFlight computer one, the printed circuit board in 3D

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

    Layout c

    NoidWorks/CDIO_PCBlib

    KiCad PCB schematic library for CDIO project.

    85 parts
  • 4 layers54 × 22 mmSerialTap, the printed circuit board in 3D

    SerialTap

    tfindlay-au/SerialTap

    PCB Design for a drop in UART serial tap

    46 partsCERN-OHL-P-2.0
  • 4 layers60 × 84 mmStratosCore Claude, the printed circuit board in 3D

    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 mmFIRM v2.0, the printed circuit board in 3D

    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.