Skip to the content
8 layers45.2 × 29.7 mmOrbitESC, the printed circuit board in 3D

An attempt at creating my own ESC module

Size
45.2 × 29.7 mm
Copper layers
8
Thickness
2.04 mm
Parts
161
Nets
124
Pads
522
Tracks, vias
1,028, 178
Pours
28
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
15 Apr 2021
Updated
27 Oct 2026

Overview

OrbitESC is an open-source printed circuit board by brandonbraun653, from the brandonbraun653/OrbitESC repository on GitHub, published under the MIT licence. It is an 8-layer board of 45.2 × 29.7 mm with 161 parts on 124 nets, routed with 1,028 tracks and 178 vias.

It is built around the TLE9250XLE, AT25SF128A-SHB-T and DRV8300DRGER-MS, with the AP2171WG, MCAC100N08YA-TP and B5819W among its other parts. Its parts include 61 resistors, 45 capacitors, 13 connectors, 11 ICs and 9 diodes. It belongs with the robots and motor control boards and the STM32 boards of this library.

Main components

6

README

README.md

OrbitESC

Brushless motor controller development environment for STM32-based ESC firmware, a host-side simulator, and a Python GUI/tooling suite.

Features

  • Field-oriented control (FOC)-centric ESC stack with FreeRTOS integration
  • STM32F446RE target (embedded) and host simulator build (ChimeraSim)
  • Protobuf/Nanopb command and telemetry schema for C/C++ and Python
  • Python tools and PyQt5 GUI for monitoring, configuration, and testing
  • CMake presets for embedded and simulator builds

Project Structure

PathDescription
src/C++ sources for firmware, simulator integration, startup, tasks, and libraries.
lib/Third-party and in-tree libraries: Aurora, Chimera, ChimeraSim, CMSIS, FreeRTOS, Thor, tinyusb, db.
pyorbit/Python package for host tools, GUI (pyorbit/app), serial/CAN clients, protobuf stubs.
scripts/Helper scripts: build embedded, generate protobufs, CAN interface setup.
model/MATLAB/Simulink models and notebooks related to control algorithms.
CMakePresets.jsonConfigure/build presets for embedded and simulator targets.

Quickstart (Python tooling & GUI)

This repo uses uv for Python dependency management. Python 3.11 is required and auto-detected from pyproject.toml.

  1. Create and sync the environment
bash
uv venv
uv sync
  1. Option A: Activate the environment
bash
source .venv/bin/activate
  1. Option B: Run one-off commands without activation
bash
uv run <command>
  1. Launch the GUI
bash
uv run python -m pyorbit.app.main

Common tasks

bash
# Run unit tests
uv run pytest

# Type check
uv run mypy

# Lint / Format
uv run flake8
uv run black .

Development workflow

  • Add dependencies: uv add <package>
  • Sync/update: uv sync
  • Update lockfile: uv lock

Protobuf/Nanopb workflow

Protobuf definitions live under src/core/com/proto. C bindings are generated with Nanopb for the firmware, and Python stubs for pyorbit.

Prerequisites

  • protoc available in PATH
  • The repo includes the Nanopb generator under lib/Aurora/lib/nanopb/...

Generate all bindings

bash
cd scripts
./build_proto.sh

What it does

  • Runs Nanopb to generate C/C++ descriptors into src/core/com/proto
  • Runs protoc to generate Python modules and .pyi into pyorbit/nanopb

Embedded firmware build (STM32F446RE)

The firmware uses CMake presets and GCC ARM toolchain.

Prerequisites

  • CMake ≥ 3.16, build-essential toolchain
  • Arm GNU Toolchain arm-none-eabi-* (see scripts/install_arm_gcc.sh or install from Arm)

Configure & build (Debug)

bash
cmake --preset "OrbitESC_V3 Debug"
cmake --build --preset "OrbitESC_V3 Debug"

Configure & build (Release)

bash
cmake --preset "OrbitESC_V3 Release"
cmake --build --preset "OrbitESC_V3 Release"

Artifacts

  • Build directories under build/debug and build/release
  • The OrbitESC image and map file are produced; a copy of the image is placed under a sys_image folder in the preset's runtime output directory

Flashing

  • Flashing is board/debugger dependent (ST-Link, J-Link, OpenOCD). Provide your preferred tool or script; a generic OpenOCD flow is recommended.

Simulator build (host)

Build a host-executable with simulated hardware using ChimeraSim.

Host prerequisites (Ubuntu/Debian)

bash
sudo apt-get update
sudo apt-get install -y build-essential cmake pkg-config libzmq3-dev

Configure & build

bash
cmake --preset "OrbitESC Simulator"
cmake --build --preset "OrbitESC Simulator"

Run

bash
# Example path; adjust if your CMake generator places binaries differently
./build/sim/OrbitESC

CAN bus setup (Linux)

Scripts are provided to bring up a can0 interface at 1 Mbit/s. Root privileges are required.

Open the CAN port

bash
sudo ./scripts/open_can_port.sh

Close the CAN port

bash
sudo ./scripts/close_can_port.sh

Note: Ensure a compatible CAN adapter/driver is present. The Python side uses python-can.


Testing & quality checks

All commands can be run with uv run ... without activating the venv.

bash
# Python tests
uv run pytest -q

# Type checks
uv run mypy

# Linting / formatting
uv run flake8
uv run black --check .

Pytest is configured to discover tests under pyorbit/tests.


Troubleshooting

  • CMake cannot find arm-none-eabi-gcc: install the Arm GNU Toolchain and ensure it is in PATH.
  • Simulator link fails on zmq: install libzmq3-dev (or the platform equivalent) and reconfigure.
  • protoc: command not found: install protobuf compiler (sudo apt-get install -y protobuf-compiler).
  • GUI fails to start: ensure PyQt5 is installed (it is declared in pyproject.toml), then uv sync again.

License

MIT. See LICENSE.

Parts

161
QtyValueFootprintReferences
2210kResistor_SMD:R_0402_1005MetricR1, R19, R20, R23, R29, R30, R31, R34, R37, R38, R41, R42, R43, R44, R47, R53 +6
21100nFCapacitor_SMD:C_0402_1005MetricC1, C11, C12, C16, C17, C24, C28, C34, C35, C36, C37, C39, C40, C41, C42, C43 +5
91kResistor_SMD:R_0402_1005MetricR17, R32, R33, R35, R36, R39, R60, R61, R65
61Resistor_SMD:R_0402_1005MetricR2, R4, R8, R10, R14, R16
6MCAC100N08YA-TPProject Mosfets:TRANS_BSC076N06NS3-GQ1, Q2, Q3, Q4, Q5, Q6
55.1kResistor_SMD:R_0402_1005MetricR9, R13, R46, R48, R50
42.2uFCapacitor_SMD:C_0402_1005MetricC3, C15, C27, C29
4TLV9051IDBVRPackage_TO_SOT_SMD:SOT-23-5U4, U6, U13, U14
30.01Resistor_SMD:R_2512_6332MetricR6, R12, R63
31.5kResistor_SMD:R_0402_1005MetricR24, R52, R66
3100kResistor_SMD:R_0402_1005MetricR21, R22, R57
31nFCapacitor_SMD:C_0402_1005MetricC2, C5, C45
32.2uFCapacitor_SMD:C_0805_2012MetricC19, C20, C21
339kResistor_SMD:R_0402_1005MetricR45, R49, R51
34.7nFCapacitor_SMD:C_0402_1005MetricC9, C13, C22
347uFCapacitor_SMD:C_0805_2012MetricC10, C25, C26
3CHTestPoint:TestPoint_Pad_D1.0mmTP1, TP2, TP18
21uFCapacitor_SMD:C_0402_1005MetricC30, C44
24.7uFCapacitor_SMD:C_0402_1005MetricC8, C46
2470Resistor_SMD:R_0402_1005MetricR7, R58
247uFCapacitor_SMD:C_1206_3216MetricC31, C33
256kResistor_SMD:R_0402_1005MetricR40, R56
2B5819WDiode_SMD:D_SOD-123D3, D8
2Green LEDDiode_SMD:D_0603_1608MetricD5, D6
2Yellow LEDDiode_SMD:D_0603_1608MetricD4, D9
1100uHInductor_SMD:L_0805_2012MetricL3
110uFCapacitor_SMD:C_0805_2012MetricC18
1120Resistor_SMD:R_0402_1005MetricR15
118vDiode_SMD:D_SMAD2
12.0kResistor_SMD:R_0402_1005MetricR5
1220uHInductor_SMD:L_1812_4532Metric_Pad1.30x3.40mm_HandSolderL2
12N7002Package_TO_SOT_SMD:SOT-23Q7
133Resistor_SMD:R_0402_1005MetricR11
133nFCapacitor_SMD:C_0402_1005MetricC14
14.7uHInductor_SMD:L_Bourns-SRN6028L1
1AHTestPoint:TestPoint_Pad_D1.0mmTP14
1ALTestPoint:TestPoint_Pad_D1.0mmTP15
1AP2120Package_TO_SOT_SMD:SOT-23U9
1AP2171WPackage_TO_SOT_SMD:SOT-23-5U8
1AP62200Z6-7Package_TO_SOT_SMD:SOT-563U7
1ASE-24MHzOscillator:Oscillator_SMD_Abracon_ASE-4Pin_3.2x2.5mmX1
1AT25SF128A-SHB-TPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU2
1BHTestPoint:TestPoint_Pad_D1.0mmTP16
1BLTestPoint:TestPoint_Pad_D1.0mmTP17
1Blue LEDDiode_SMD:D_0603_1608MetricD1
1CANHTestPoint:TestPoint_Pad_1.5x1.5mmJ2
1CANLTestPoint:TestPoint_Pad_1.5x1.5mmJ7
1CLTestPoint:TestPoint_Pad_D1.0mmTP19
1DFUButton_Switch_SMD:SW_SPST_EVQP2SW2
1DRV8300DRGERPackage_DFN_QFN:VQFN-24-1EP_4x4mm_P0.5mm_EP2.45x2.45mmU5
1FerriteBead_SmallResistor_SMD:R_0603_1608MetricFB1
1GNDTestPoint:TestPoint_Pad_2.5x2.5mmJ12
1GNDTestPoint:TestPoint_Pad_1.5x1.5mmJ6
1Micro_SD_Card_Det2Connector_Card:microSD_HC_Hirose_DM3D-SFJ8
1RXTestPoint:TestPoint_Pad_1.5x1.5mmJ13
1Red LEDDiode_SMD:D_0603_1608MetricD7
1ResetButton_Switch_SMD:SW_SPST_EVQP2SW1
1STM32F446RETxPackage_QFP:LQFP-64_10x10mm_P0.5mmU3
1TLE9250XPackage_SON:HVSON-8-1EP_3x3mm_P0.65mm_EP1.6x2.4mmU1
1TXTestPoint:TestPoint_Pad_1.5x1.5mmJ9
1TermATestPoint:TestPoint_Pad_2.5x2.5mmJ3
1TermBTestPoint:TestPoint_Pad_2.5x2.5mmJ4
1TermCTestPoint:TestPoint_Pad_2.5x2.5mmJ5
1USB_C_Receptacle_USB2.0Connector_USB:USB_C_Receptacle_GCT_USB4085J1
1VDCTestPoint:TestPoint_Pad_2.5x2.5mmJ11
1~Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_VerticalJ10

More from brandonbraun653/OrbitESC

1
  • 4 layers38.9 × 30 mmOrbitESC, the printed circuit board in 3D

    OrbitESC

    brandonbraun653/OrbitESC

    An attempt at creating my own ESC module

    160 parts2MIT

Similar boards

  • 4 layers92 × 88.9 mmCubesat obc, the printed circuit board in 3D

    Cubesat obc

    ephemeridis/cubesat_obc

    A small CubeSat On-Board Computer with lots of processing headroom, utilizing a low power ARM Cortex M33 processor at its core.

    311 parts2MIT
  • 2 layersBadge, the printed circuit board in 3D

    Badge

    hex-inverter/badge_display

    18 parts
  • 4 layers63.5 × 165.4 mmPCB 2, the printed circuit board in 3D

    PCB 2

    nathaniel-krueger/Capstone_PCB_2

    115 parts
  • 4 layers310 × 125 mmDev board, the printed circuit board in 3D

    Dev board

    sammaclennan/dev-board

    An 84-key mechanical keyboard

    208 parts
  • 4 layers97.3 × 90.3 mmDashboard, the printed circuit board in 3D

    Dashboard

    patwitt/PGRacingElectronics

    https://www.pgracingteam.pl/

    102 parts4
  • 4 layers50.8 × 50.8 mmController, the printed circuit board in 3D

    Controller

    oats-center/avena-rs

    Avena On The Road: Bringing pavement health data to your fingertips

    63 parts3
  • 2 layersPDM, the printed circuit board in 3D

    PDM

    PGRacing/PDM

    Rev 4.3 | ID | NAME | CAUSE |DIFFICULTY | PRIORITY | STATUS | | --- | --- | --- | --- | --- | --- | | 1. | Create test board for BTS50025-1TAE | Switch with higher Rds(on) should perform better in terms of diagnostics…

    294 parts1
  • 4 layers48.8 × 53.1 mmESC Board, the printed circuit board in 3D

    ESC Board

    FPV-Drone-STM32F411/DroneController

    All-in-one FPV drone PCB with integrated flight controller, PDB, and ESCs built around STM32F411.

    73 parts60

Questions

How big is the OrbitESC PCB?

It measures 45.2 × 29.7 mm and has 8 copper layers, 2.04 mm thick.

What parts does the OrbitESC use?

161 parts, built around the TLE9250XLE, AT25SF128A-SHB-T, DRV8300DRGER-MS and AP2171WG. 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 OrbitESC KiCad files?

From the brandonbraun653/OrbitESC repository on GitHub, at the commit this page was made from: the board is hw/pcb/OrbitESC_V3/OrbitESC.kicad_pcb and its schematic hw/pcb/OrbitESC/OrbitESC.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

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