Skip to the content
PCBKitNew board
4 layers54 × 102 mmSWC, the printed circuit board in 3D

Steering-wheel-controls adapter module — ESP32-S3, KiCad schematic/PCB, JLCPCB assembly

Size
54 × 102 mm
Copper layers
4
Thickness
1.6 mm
Parts
110
Nets
80
Pads
330
Tracks, vias
841, 163
Pours
5
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
12 Sep 2026
Updated
28 Sep 2026

Overview

SWC is an open-source printed circuit board by OETSolutions, from the OETSolutions/swc-module repository on GitHub. It is a 4-layer board of 54 × 102 mm with 110 parts on 80 nets, routed with 841 tracks and 163 vias.

It is built around the ESPS3-32-N4, MCP4728-E/UN and TLV9004IPWR-MS, with the XL1509-5.0E1, AMS1117-3.3 and USBLC6-2SC6 among its other parts. Its parts include 41 resistors, 23 capacitors, 12 diodes, 6 ICs and 5 connectors. It belongs with the interfaces and adapters boards of this library.

Main components

12

README

README.md

SWC — Steering Wheel Controls Adapter

A programmable interface between a vehicle's factory steering-wheel buttons and an aftermarket Android head unit, so the buttons can be re-mapped, combined, or given press behaviours the factory wiring never had.

Status: design complete and routed; 0 DRC errors, 0 unconnected, 0 schematic/PCB parity errors. Not yet ordered.

SWC adapter, topSWC adapter, bottom
Top — ESP32-S3 module, four left-edge screw terminals, USB-CBottom — connector pinouts silkscreened on the back
ItemValue
Board54.0 × 102.0 mm, 4-layer, 1.6 mm, rounded corners r ≈ 2.83 mm
EDAKiCad 10 (SWC.kicad_pcb / .kicad_sch / .kicad_pro)
AssemblyJLCPCB, Economic PCBA, 5-off
Parts34 unique LCSC part types, JLCPCB-assembled
MCUDOIT ESPS3-32-N4 (ESP32-S3-WROOM-1 clone), native USB-CDC + USB-JTAG

Why this exists

A steering-wheel button is not a digital switch. It is a resistor dropped across a single analog KEY line; the head unit pulls that line up and identifies the pressed button from the voltage it reads. There are usually two such lines — this board calls them SWC1 and SWC2 — with the buttons split between them.

That arrangement is cheap and robust, and also completely fixed: the resistor values, and therefore the head unit's behaviour, live in the factory button pod. An aftermarket head unit wants a specific resistance it was taught, or one the user can program. This adapter supplies it by reading the ladder on one side and servoing the head unit's KEY line on the other, so the mapping becomes software. It can additionally send commands to the head unit over USB when a button is pressed, for actions the head unit's own steering-wheel input cannot express.

Architecture at a glance

Two identical channels. The factory ladder is read by the ESP32-S3's ADC; the head unit's KEY line is driven by a closed-loop servo, so the output tracks what the board actually senses rather than what it assumes.

text
  SWC1  J2.3 ─R1 10k─┬─ /SWC1_ADC ─────────► U3 ADC1
  SWC2  J2.2 ─R2 10k─┴─ /SWC2_ADC ─────────► U3 ADC1
        (R15/R16 10k pull-ups to +3V3 · D4/D5 BAT54S clamp · C3/C4 100nF)

  AUX1  J5.4 ─R23 1k─┬─ /AUX1_F ───────────► U3 ADC
  AUX2  J5.3 ─R24 1k─┤   /AUX2_F
  AUX3  J5.2 ─R25 1k─┴─ /AUX3_F
        (R17/R18/R19 10k pull-ups to +3V3 · D8/D9/D10 BAT54S · C15–C17 100nF)

  U3 ESP32-S3 ══ I2C, 3.3 V, R5/R6 10k pull-ups ══ U4 MCP4728  (VDD = +3V3,
       │                                              VREF = VDD, 0–3.3 V FS)
       │                                              ┌ A ─ signal, ch 1
       │                                              ├ B ─ gain mode, ch 1
       │                                              ├ C ─ signal, ch 2
       │                                              └ D ─ gain mode, ch 2
       │
       └─ per channel:  U4.VOUTx ─R46 100k─► U6x− ─(C24 100nF fb)─► U6x out
                                          U6x+ ◄─ R58 82k ─ V_buf
                                              ◄─ R61 100k ─ V_ADJ (VOUTB/D)
                        U6x out ─R52 1k─► Q4 gate ─► Q4 drain = KEY line
                        KEY ─R36 1M─► U6y buffer ─┬─► R54 10k / R50 10k ─► /SENSEx ─► U3 ADC
                                                   └─► R58 (feedback above)

  12 V ─ J1 ─ F1 PPTC ─► /+12V_SW ─► D1 SMBJ18A ─► U1 XL1509-5.0 ─► L1 47µH ─┐

The three ideas that make it work:

  • The ladder is read, not re-created. 10 kΩ series (1 kΩ on the AUX inputs), a BAT54S clamp to +3V3/GND, a filter, and a pull-up — so a bare switch-to-ground button works as well as a resistor ladder.
  • The output is a servo, not a buffer. V_KEY = (1 + R58/R61)·V_DAC − (R58/R61)·V_ADJ, so the gain is a resistor ratio and the offset is a second DAC channel. That gives runtime range switching between 3 V and 5 V head units, and it is why the ESP32 needs no DAC of its own (the S3 has none).
  • Idle is inherently high-impedance. The sink FET only pulls down; a command above the head unit's own idle voltage turns it off and the line floats back up through a 1 MΩ sense resistor.

Full description, including the analog detail, the power path, the USB front end, and the reasoning behind each component choice: DESIGN.md.

Repository guide

DocumentContents
MANUAL.mdHow to install and use the adapter — wiring, learning buttons, bindings, the app, firmware updates, troubleshooting
DESIGN.mdRequirements, block diagram, theory of operation, design rules, key design decisions
MANUFACTURING.mdBOM generation, part list, assembly-cost analysis, fabrication output, ordering decisions
CHANGELOG.mdRevision history, accepted limitations, open items
AGENTS.mdHow to work on the files — rules, MCP servers, skills, verify loop, gotchas. CLAUDE.md points here.
tools/README.mdThe sanctioned direct-write scripts, in detail

The live project is SWC.kicad_sch / SWC.kicad_pcb / SWC.kicad_pro / SWC.kicad_sym / the two library tables. 3dmodels/ and footprints/logo.pretty/ are required project-local assets; tools/ holds the sanctioned direct-write scripts; SWC-backups/ and SWC2-backups/ are the restore path; old/ is the 2022 RP2040 design, kept for reference only. The full annotated layout, including what is git-ignored, is in AGENTS.md.

Toolchain and credits

This board was developed with a small set of external tools, all worth citing:

  • KiCad 10 — the EDA suite. All file manipulation in this project goes through an MCP server rather than hand-editing.
  • mcp-server-kicad (uvx --from mcp-server-kicad mcp-server-kicad) — the MCP server providing byte-preserving schematic, PCB, ERC/DRC and manufacturing-export tools. It is the reason every change here is scriptable and repeatable.
  • pcbparts-mcp (https://pcbparts.dev/mcp) — component search, JLCPCB stock and cross-reference, reference-board lookup, and PCB design rules. Used for the part-selection and stock-availability pass.
  • KiStack by American Embedded — a human-written set of KiCad skills (schematic, PCB, BOM, export, gerbers, footprint, symbol, panelize, product render) that standardised the workflow. Installed with npx skills add American-Embedded/kistack.
  • JLCPCB component skills — jlcpcb-component-finder (part search by keyword, package, stock and price) and jlcpcb-bom-generate-from-kicad (KiCad BOM/position → JLCPCB PCBA order format), with its database refreshed from jlcparts.

The per-tool notes and the working rules for this repository live in AGENTS.md.

Parts

110
QtyValueFootprintReferences
1810kResistor_SMD:R_0805_2012MetricR1, R2, R5, R10, R13, R15, R16, R17, R18, R19, R29, R50, R51, R54, R55, R56 +2
13100nFCapacitor_SMD:C_0805_2012MetricC3, C4, C7, C15, C16, C17, C18, C19, C22, C23, C24, C25, C26
8TestPointTestPoint:TestPoint_THTPad_2.0x2.0mm_Drill1.0mmTP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8
7100kResistor_SMD:R_0805_2012MetricR28, R46, R47, R48, R49, R60, R61
71kResistor_SMD:R_0805_2012MetricR7, R23, R24, R25, R26, R52, R53
5BAT54SPackage_TO_SOT_SMD:SOT-23D4, D5, D8, D9, D10
41uFCapacitor_SMD:C_0805_2012MetricC8, C9, C10, C12
4MountingHole_5.3mm_M5MountingHole:MountingHole_5.3mm_M5H1, H2, H3, H4
4SS34Diode_SMD:D_SMAD2, D3, D7, D11
322uFCapacitor_SMD:C_0805_2012MetricC6, C11, C13
32N7002Package_TO_SOT_SMD:SOT-23Q3, Q4, Q6
2100uF/50VCapacitor_SMD:CP_Elec_6.3x7.7C1, C2
21MResistor_SMD:R_0805_2012MetricR36, R43
222RResistor_SMD:R_0805_2012MetricR11, R12
25.1kResistor_SMD:R_0805_2012MetricR8, R9
282kResistor_SMD:R_0805_2012MetricR58, R59
2GREENLED_SMD:LED_0805_2012MetricD6, D12
11.0AFuse:Fuse_0805_2012MetricF2
11.5AFuse:Fuse_1812_4532MetricF1
1100RResistor_SMD:R_0805_2012MetricR27
110k B3380Resistor_SMD:R_0603_1608MetricRT1
110uFCapacitor_SMD:C_0805_2012MetricC5
112V_DC_INTerminalBlock_CUI:TerminalBlock_CUI_TB007-508-02_1x02_P5.08mm_HorizontalJ1
147uHInductor_SMD:L_Sunlord_MWSA0605SL1
1AMS1117-3.3Package_TO_SOT_SMD:SOT-223-3_TabPin2U2
1AUX_INTerminalBlock_CUI:TerminalBlock_CUI_TB007-508-04_1x04_P5.08mm_HorizontalJ5
1BOOTButton_Switch_SMD:SW_SPST_TS-1088-xR020SW1
1ESPS3-32-N4RF_Module:ESP32-S3-WROOM-1U3
1LOGOlogo:LOGOG1
1MCP4728Package_SO:MSOP-10_3x3mm_P0.5mmU4
1RESETButton_Switch_SMD:SW_SPST_TS-1088-xR020SW2
1SMBJ18ADiode_SMD:D_SMBD1
1SWC_INTerminalBlock_CUI:TerminalBlock_CUI_TB007-508-03_1x03_P5.08mm_HorizontalJ2
1SWC_OUTTerminalBlock_CUI:TerminalBlock_CUI_TB007-508-03_1x03_P5.08mm_HorizontalJ3
1TLV9004IPWRPackage_SO:TSSOP-14_4.4x5mm_P0.65mmU6
1TMB12A05Buzzer_Beeper:MagneticBuzzer_StarMicronics_HMB-06_HMB-12BZ1
1USB-C 2.0 16PConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J4
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U8
1XL1509-5.0Package_SO:SOIC-8_3.9x4.9mm_P1.27mmU1

Questions

How big is the SWC PCB?

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

What parts does the SWC use?

110 parts, built around the ESPS3-32-N4, MCP4728-E/UN, TLV9004IPWR-MS and XL1509-5.0E1. 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 SWC KiCad files?

From the OETSolutions/swc-module repository on GitHub, at the commit this page was made from: the board is SWC.kicad_pcb and its schematic SWC.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the SWC design in my own project?

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

Similar boards

  • 2 layers48 × 55.9 mmBM3451XXDC T28A Board, the printed circuit board in 3D

    BM3451XXDC T28A Board

    YuaXan/BM3451XXDC-T28A-Board

    Rechargeable battery protection board based on BM3451 IC

    84 parts5
  • 4 layers50 × 69.5 mmRia, the printed circuit board in 3D

    Ria

    B44ken/ria

    ria is a small wheeled biped built for jumping and fast ground motion.

    107 parts
  • 2 layers160 × 110 mmAcquedotto test v4 finale, the printed circuit board in 3D

    Acquedotto test v4 finale

    igorilla666/water-controller

    Scheda di controllo basata sul modulo Waveshare ESP32-S3-ETH, con ingressi sensore, RS-485, pilotaggio rele, buzzer e alimentazione/protezioni dedicate.

    139 parts1CERN-OHL-S-2.0
  • 4 layers70 × 54 mmPicoLab, the printed circuit board in 3D

    PicoLab

    CoretechR/PicoLab

    Web-GUI Embedded Multitool

    285 parts327GPL-3.0
  • 4 layers96.9 × 88.1 mmDigichiver, the printed circuit board in 3D

    Digichiver

    frindaddy/digichiver

    Archival hardware/firmware for the MM54104 Digitalker chip

    121 partsMIT
  • 4 layers80 × 105.5 mmNetdaq, the printed circuit board in 3D

    Netdaq

    Gherkin/netdaq

    913 partsCERN-OHL-P-2.0
  • 4 layers83 × 67.5 mmMarineBoard, the printed circuit board in 3D

    MarineBoard

    Cadburies/SisuAssistant

    Sailing yacht Sisu: Home Assistant + ESPHome Marine Board (alternator regulation, tanks) + MQTT kernel, Signal K/Grafana/InfluxDB on a NAS, and Sisu Nav chart & weather-routing cockpit.

    162 parts1Apache-2.0
  • 2 layers40.1 × 54.3 mmBSPD 2027, the printed circuit board in 3D

    BSPD 2027

    SCFormulaElectric/USC-Electrical-Systems

    71 parts9