
Flight Controller
desanv01/Flight-Controller-V2
STM32H743 controller: regulated power, signal-only ESC, neutral ArduPilot firmware, manufacturing data and engineering history.

PCB Project
Can node is an open-source printed circuit board by twenty-seven27, from the twenty-seven27/CAN-NODE-BOARD repository on GitHub. It is a 4-layer board of 76 × 56 mm with 64 parts on 47 nets, routed with 336 tracks and 98 vias.
It is built around the STM32G431KBT6, TCAN1042VDRQ1 and AP63205WU, with the AP2112K-3.3, AO3407A and BZT52C12 among its other parts. Its parts include 20 capacitors, 15 resistors, 10 connectors, 4 ICs and 4 diodes. It belongs with the STM32 boards of this library.
One custom PCB that replaces the Arduino Mega + CAN Bus Shield stack on every node of a 4WD autonomous parking robot. The robot's three nodes (sensor, receive, motor) talk over CAN; each one now runs the same board and the same firmware image, and a single resistor tells the board which node it is.

| Input | 6–16 V (2S/3S LiPo, 6–8 AA, 12 V bench), reverse-polarity protected, TVS clamped |
| Rails | 5 V / 2 A synchronous buck (servo, ultrasonic sensor, CAN transceiver) · 3.3 V LDO (logic) |
| MCU | STM32G431KBT6 — Cortex-M4F 170 MHz, FDCAN, hardware quadrature-encoder timers |
| CAN | TCAN1042V transceiver, 5 V bus side / 3.3 V logic (VIO), 500 kbit/s classic CAN |
| Board | 76 × 56 mm, 4 layers (signal / GND / 3.3 V / signal), 4 × M3 holes |
| I/O | Servo, HC-SR04 ultrasonic, 2 × wheel encoder, motor driver (PWM + DIR × 2), UART, 2 spare GPIO, SWD |
PB0 (an ADC input) sits in the middle of a divider: a fixed 10 kΩ pull-up (R4) and a role resistor R5 to ground. At boot the firmware averages eight ADC samples, picks the nearest bin, and from that sets its CAN IDs, acceptance filters and which peripherals it starts.
| R5 fitted | V(ROLE) | Role |
|---|---|---|
| 0 Ω | 0.00 V | Sensor node (ultrasonic + servo) |
| 3.3 kΩ | 0.82 V | Receive node |
| 10 kΩ | 1.65 V | Motor node (encoders + motor driver) |
| 33 kΩ | 2.53 V | Spare |
| not fitted | 3.30 V | Safe mode: CAN listen-only, all outputs off |
The role table is printed on the back silkscreen, so the board documents itself.
flowchart LR
BUS["Bus connectors J1/J2<br/>VBAT · GND · CAN-H · CAN-L<br/>(daisy-chained)"] -->|VBAT| PG["Reverse-polarity P-FET Q1<br/>+ Zener D1, TVS D2"]
PG -->|VIN_PROT| BUCK["5 V buck U1<br/>AP63205, 2 A"]
BUCK -->|+5V| LDO["3.3 V LDO U2<br/>AP2112K-3.3"]
BUCK -->|+5V| IO
BUS <-->|CAN-H/L| XCVR["CAN transceiver U4<br/>TCAN1042V"]
XCVR --- TERM["Split termination<br/>JP1/JP2, end nodes only"]
XCVR <-->|TX/RX, STB| MCU["STM32G431KBT6 U3<br/>FDCAN · TIM encoders · ADC"]
LDO -->|+3V3| MCU
ROLE["Role select<br/>R4 + R5 → PB0"] --> MCU
MCU --> IO["Headers: servo, ultrasonic,<br/>encoders, motor, UART, AUX"]
SWD["SWD J10 (ST-Link)"] --- MCUMCU and pins. The STM32G431 has FDCAN built in (no separate CAN controller as on the MCP2515 shield) and timers with a hardware quadrature-encoder mode for the wheel encoders. On the 32-pin package, FDCAN TX only exists on PA12, which is also USB D+, so CAN and USB cannot both be used. The board drops USB and is programmed over SWD (ST-Link or a Nucleo's built-in one), with a 3-pin UART header for serial debug. PB8 doubles as BOOT0 and is pulled low, so the board always boots from flash.
| Pin | Function |
|---|---|
| PA11 / PA12 | FDCAN1 RX / TX |
| PA13 / PA14 | SWDIO / SWCLK |
| PA2 / PA3 | USART2 TX / RX (debug) |
| PB0 | ADC1_IN15, role select |
| PA0 | TIM2_CH1 input capture (ultrasonic echo, 32-bit timer) |
| PA1 | Ultrasonic trigger |
| PB4 | TIM16_CH1 servo PWM, 50 Hz |
| PA8 / PA9 | TIM1_CH1 / CH2 motor PWM, ~20 kHz |
| PA4 / PA5 | Motor direction |
| PB6 / PB7 | TIM4 encoder mode (left) |
| PA6 / PA7 | TIM3 encoder mode (right) |
| PF0 / PF1 | 8 MHz crystal (HSE) |
| PA10 | Status LED |
| PA15 | Transceiver STB |
| PB3 / PB5 | Spare GPIO on the AUX header |
The servo and the motors run on different timers because channels on one timer share a period: a servo needs 50 Hz, a motor driver about 20 kHz.
Clock. CAN bit timing needs a tighter clock than the internal RC oscillator gives, so an 8 MHz crystal drives the PLL. Load capacitors: C = 2 × (C_L − C_stray) = 2 × (10 − 3) pF ≈ 15 pF; match them to the crystal actually fitted.
Power. Q1 (AO3407A, −30 V, V_GS ±20 V) protects against a reversed battery with almost no voltage drop; the body diode conducts first, then the gate (pulled to ground through R1) turns the FET fully on. D1 clamps V_GS to 12 V and D2 (SMAJ18CA) clamps input transients from the motors. The buck uses the datasheet's typical-application values (10 µF in, 4.7 µH, 2 × 22 µF out, 100 nF bootstrap). C1 (47 µF) damps the input cable's inductance and C17 (220 µF) sits at the servo header to absorb stall-current spikes. VDDA is fed through a ferrite bead because the role pin is an analog measurement.
Interfaces. The HC-SR04 echo is a 5 V signal, divided to 3.33 V by R8/R9 (1 k / 2 k). Encoders are powered at 3.3 V with 10 kΩ pull-ups, which suits open-collector Hall encoders; if yours need 5 V, check that their outputs stay within the MCU's input limits. The motor header supplies 5 V for driver logic and takes 3.3 V PWM/DIR.
Layout. Four layers: In1 is an unbroken ground plane under everything, In2 is the 3.3 V plane, and the outer layers carry signals with ground pours. Every surface-mount ground and 3.3 V pad has its own via to its plane. The buck's input capacitor sits right next to its VIN and GND pins and the switch node is a short, wide copper run to the inductor. Power nets use 0.6–0.8 mm tracks, CAN-H/L 0.25 mm, signals 0.2 mm, with 0.2 mm clearance and 0.6/0.3 mm vias, all within standard 4-layer capabilities at JLCPCB and PCBWay.
| Path | Contents |
|---|---|
kicad/ | KiCad project: schematic, PCB, project symbol library (TCAN1042V) |
docs/schematic.pdf | Schematic, one A3 sheet |
docs/render-3d.png, render-top.png, render-bottom.png | Board renders |
docs/layout-top.png, layout-bottom.png | Copper and silkscreen plots (pours hidden) |
docs/can-node.step | 3D model of the assembled board |
fab/can-node-gerbers.zip | Gerbers (4 layers) + Excellon drill files, origin at the board's bottom-left corner |
fab/can-node-bom.csv | Bill of materials (part numbers are examples; R5 is fitted per role) |
fab/can-node-cpl.csv | Pick-and-place positions for assembly |
Ordering: 4 layers, 1.6 mm FR-4, 1 oz outer copper, any surface finish. Upload can-node-gerbers.zip as-is.
Designed in KiCad 7; the project opens in KiCad 8 and 9 (KiCad offers to upgrade the file format on first save).

| Qty | Value | Footprint | References |
|---|---|---|---|
| 8 | 100n | Capacitor_SMD:C_0603_1608Metric | C3, C8, C9, C12, C13, C16, C18, C19 |
| 8 | 10k | Resistor_SMD:R_0603_1608Metric | R1, R3, R4, R7, R10, R11, R12, R13 |
| 4 | M3 | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 3 | 1k | Resistor_SMD:R_0603_1608Metric | R2, R6, R8 |
| 3 | 1u | Capacitor_SMD:C_0603_1608Metric | C6, C7, C11 |
| 2 | 15p | Capacitor_SMD:C_0603_1608Metric | C14, C15 |
| 2 | 22u | Capacitor_SMD:C_1206_3216Metric | C4, C5 |
| 2 | 60.4 | Resistor_SMD:R_0603_1608Metric | R14, R15 |
| 2 | BUS | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | J1, J2 |
| 2 | TERM | Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm | JP1, JP2 |
| 1 | 10u | Capacitor_SMD:C_1206_3216Metric | C2 |
| 1 | 220u | Capacitor_SMD:CP_Elec_6.3x7.7 | C17 |
| 1 | 2k | Resistor_SMD:R_0603_1608Metric | R9 |
| 1 | 4.7n | Capacitor_SMD:C_0603_1608Metric | C20 |
| 1 | 4.7u | Inductor_SMD:L_Bourns_SRN6045TA | L1 |
| 1 | 4.7u | Capacitor_SMD:C_0603_1608Metric | C10 |
| 1 | 47u | Capacitor_SMD:CP_Elec_6.3x7.7 | C1 |
| 1 | 600R | Inductor_SMD:L_0603_1608Metric | FB1 |
| 1 | 8MHz | Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm | Y1 |
| 1 | AO3407A | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | AP2112K-3.3 | Package_TO_SOT_SMD:SOT-23-5 | U2 |
| 1 | AP63205WU | Package_TO_SOT_SMD:TSOT-23-6 | U1 |
| 1 | AUX | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J9 |
| 1 | BLUE | LED_SMD:LED_0603_1608Metric | D4 |
| 1 | BZT52C12 | Diode_SMD:D_SOD-123 | D1 |
| 1 | ENC_L | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J5 |
| 1 | ENC_R | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J6 |
| 1 | GREEN | LED_SMD:LED_0603_1608Metric | D3 |
| 1 | MOTOR | Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_Vertical | J7 |
| 1 | RESET | Button_Switch_SMD:SW_SPST_TL3342 | SW1 |
| 1 | R_ROLE | Resistor_SMD:R_0603_1608Metric | R5 |
| 1 | SERVO | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J3 |
| 1 | SMAJ18CA | Diode_SMD:D_SMA | D2 |
| 1 | STM32G431KBT6 | Package_QFP:LQFP-32_7x7mm_P0.8mm | U3 |
| 1 | SWD | Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMD | J10 |
| 1 | TCAN1042VDRQ1 | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U4 |
| 1 | UART | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J8 |
| 1 | ULTRASONIC | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J4 |
It measures 76 × 56 mm and has 4 copper layers, 1.6 mm thick.
64 parts, built around the STM32G431KBT6, TCAN1042VDRQ1, AP63205WU 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.
From the twenty-seven27/CAN-NODE-BOARD repository on GitHub, at the commit this page was made from: the board is can-node.kicad_pcb and its schematic can-node.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask twenty-seven27 before reusing the design.

desanv01/Flight-Controller-V2
STM32H743 controller: regulated power, signal-only ESC, neutral ArduPilot firmware, manufacturing data and engineering history.


andrew-c-tran/byteshift-fuel-center
Automotive-grade CAN module for fuel pressure, temperature and ethanol content. AEC-qualified parts, fail-safe protocol, JLCPCB-ready.



danbrunski/canary
Four 25 F cells in series for CANary-PWR's LTC3350 hold-up, on a lead (design record: docs/CANary-PWR-Spec.md §P4). The board has no active parts: four cells, an NTC, two Kelvin net ties and a Micro-Fit 2 × 5 header.

gschuurman/android_vendor_gschuurman_vehicle_interfaces
vehicle interfaces for android automotive for a custom headunit

Mowibox/chromapi_motherboard
Raspberry Pi control HAT dedicated to the quadruped robot Chromapi.