
Hybrid Controller
DesignStraub/ringwheel-hybrid-drone
A 5-inch FPV drone whose prop ducts fold down and become wheels. Design study in Fusion 360 and KiCad, CC BY-NC-SA 4.0.

(最初计划走标准 BLE HID 键盘 + 无障碍服务捕获按键,实测目标车机没有暴露无障碍服务开关入口、这条路走不通,现已替换为上面这套自定义 GATT 方案,详见 docs/项目历程与架构.md。)
Knob v2 is an open-source printed circuit board by 1carusX, from the 1carusX/Knob repository on GitHub. It is a 2-layer board of 52 × 38.5 mm with 30 parts on 53 nets, routed with 403 tracks and 114 vias.
It is built around the ESP32-S3-MINI-1-N8, AP2112K-3.3 and USBLC6-2SC6, with the 0.5K-AS-12PWB and AO3400A among its other parts. Its parts include 12 resistors, 10 capacitors, 3 ICs, 2 connectors and 2 switches. It belongs with the ESP32 boards of this library.
目标车机的「蓝牙物理旋钮配件」DIY 项目。
硬件端:ESP32-S3 + 圆形屏 + 旋转编码器,通过自定义 BLE GATT 服务上报单击/双击/长按事件(转动只在旋钮本地生效),同时接收车况显示数据,并支持经蓝牙升级固件(OTA)。 车机端:Android App(壳 + DEX 热加载插件),解析旋钮事件并翻译成车控动作(空调 / 座椅通风加热),同时把车况回显给旋钮屏幕。
flowchart LR
HW["硬件配件<br/>ESP32-S3 + 编码器 + 圆形屏"]
subgraph CAR["车机"]
SHELL["壳 App<br/>车机厂商签名,只签一次"]
DEX["plugin.dex<br/>全部车控/业务逻辑,可热更新"]
SHELL -- DexClassLoader --> DEX
end
HW <-- "自定义 BLE GATT<br/>双向:事件 / 回显 / 固件 OTA" --> DEX(最初计划走标准 BLE HID 键盘 + 无障碍服务捕获按键,实测目标车机没有暴露无障碍服务开关入口、这条路走不通,现已替换为上面这套自定义 GATT 方案,详见 docs/项目历程与架构.md。)
├── app/ # 壳 App(Android 工程,cn.icarus.knob)
│ ├── 使用与验证指南.md # App 用法 / 实车验证步骤说明书
│ └── app/src/
│ ├── byd/ · generic/ # 按平台分的 flavor:权限声明 + PlatformConfig
│ └── main/java/cn/icarus/knob/
│ ├── api/ # 壳↔DEX 契约:KnobPlugin / KnobHost / Ui
│ ├── plugin/ # PluginLoader:导入并加载 plugin.dex
│ ├── host/ # KnobHostImpl:壳向插件提供的能力(只剩日志)
│ ├── util/ # 日志(LogSink)/ CrashHandler
│ └── KnobActivity / KnobApp / BootReceiver / RuntimePerm
├── plugin/ # 插件工程(编译产出 output/plugin.dex,可反复更新)
│ └── src/main/
│ ├── flags-real/ · flags-simulate/ # BuildFlags.kt:真实车控 / 模拟两个变体
│ └── kotlin/cn/icarus/knob/
│ ├── api/ # 与壳完全相同的契约副本(改动须两边同步)
│ └── plugin/
│ ├── MainPlugin.kt # KnobPlugin 接口实现(入口 + 停靠点状态机 + 页面路由)
│ ├── page/ # 触屏页面,一个页面一个文件
│ ├── CarCommands.kt # onCommand / onQuery 命令清单
│ ├── CarActions.kt # 停靠点的车控读写(空调、座椅)
│ ├── CarPermissions.kt # 车控运行时权限(只在用户点按钮时申请)
│ ├── StartupCheck.kt # 启动自检(通过才连旋钮)
│ ├── KnobOta.kt # 旋钮固件自动升级
│ ├── DriveFeed.kt # 旋钮驾驶页的数据源# 壳 App(比亚迪车机)→ app/app/build/outputs/apk/bydRelease/app-byd-release-unsigned.apk
cd app && ./gradlew assembleBydRelease
# 插件包(插件 + 旋钮固件)→ plugin/output/knob-plugin-<板子>-<固件版本>.zip
# 板子:Pcb(V1)/ PcbV2 / Devkit;需要 PlatformIO(pio)
cd plugin && ./gradlew pluginPackagePcb
# 只要插件、不带固件 → plugin/output/plugin.dex(SDK 版本见根目录 gradle/libs.versions.toml,SDK 路径自动探测)
cd plugin && ./gradlew pluginDex装车流程:U 盘安装壳 APK(需车机厂商签名版)→ 打开壳点「📥 选择插件」,用文件选择器选中插件包 zip 或 plugin.dex(自动拷进 App 私有目录,之后每次启动自动加载)→ 右半边出现插件页面即成功。导入的是插件包时,插件连上旋钮会自动给旋钮升级固件。更多构建变体(generic 壳、模拟版插件)见 AGENTS.md §4,装车细节见 app/使用与验证指南.md。
BYDAUTO_AC_GET/SET、BYDAUTO_SETTING_GET/SET 是 signature 级权限(protectionLevel=2),普通签名 App 车机不授予 → 直接 HAL 车控被挡死(实测,见 docs/验证结论.md)。docs/项目历程与架构.md)。所有知识文档的索引见 docs/INDEX.md;工具/代理请先读 AGENTS.md。
| Qty | Value | Footprint | References |
|---|---|---|---|
| 5 | 100nF | Capacitor_SMD:C_0402_1005Metric | C4, C6, C7, C8, C10 |
| 5 | 10k | Resistor_SMD:R_0402_1005Metric | R3, R4, R5, R7, R9 |
| 3 | 100 | Resistor_SMD:R_0402_1005Metric | R6, R8, R10 |
| 2 | 10uF | Capacitor_SMD:C_0603_1608Metric | C1, C2 |
| 2 | 1uF | Capacitor_SMD:C_0402_1005Metric | C5, C9 |
| 2 | 5.1k | Resistor_SMD:R_0402_1005Metric | R1, R2 |
| 1 | 0.5K-AS-12PWB | knob-v2:FPC_HDGC_0.5K-AS-12PWB_1x12-1MP_P0.50mm_Horizontal | J2 |
| 1 | 100k | Resistor_SMD:R_0402_1005Metric | R11 |
| 1 | 22uF | Capacitor_SMD:C_0805_2012Metric | C3 |
| 1 | 51 | Resistor_SMD:R_0805_2012Metric | R12 |
| 1 | AO3400A | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | AP2112K-3.3 | Package_TO_SOT_SMD:SOT-23-5 | U2 |
| 1 | BOOT | knob-v2:SW_Alps_SKRTLAE010_Keepout | SW2 |
| 1 | EC11E_Switch | knob-v2:RotaryEncoder_EC11C01V01-0027_Switch_Vertical | SW3 |
| 1 | ESP32-S3-MINI-1-N8 | RF_Module:ESP32-S2-MINI-1 | U1 |
| 1 | USBLC6-2SC6 | Package_TO_SOT_SMD:SOT-23-6 | U3 |
| 1 | USB_C_16P | Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12 | J1 |
It measures 52 × 38.5 mm and has 2 copper layers, 1.6 mm thick.
30 parts, built around the ESP32-S3-MINI-1-N8, AP2112K-3.3, USBLC6-2SC6 and 0.5K-AS-12PWB. 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 1carusX/Knob repository on GitHub, at the commit this page was made from: the board is hardware/V2/knob-v2.kicad_pcb and its schematic hardware/V2/knob-v2.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 1carusX before reusing the design.

DesignStraub/ringwheel-hybrid-drone
A 5-inch FPV drone whose prop ducts fold down and become wheels. Design study in Fusion 360 and KiCad, CC BY-NC-SA 4.0.


JamesTwallin/gas_sensor
A tiny plug-in board for the rev E phone-companion board. It stands upright in a notch in rev E's sensor end, between the two gas sensor cans, and pokes 4.5 mm out through a slot in the case face, so its tip sits in the…

jpt1729/Steer32
Steer32 is an ESP32 Devboard with support for a lipo battery and a 1.9" IPS Screen

nikolasbtks/BitSeries-PCB
An open-source hardware design series for embedded and IoT development applications, built using Altium Designer and KiCad and based on STM32 and ESP32 microcontrollers.

CivicTechTO/tRacket-sensor
Design files and source code for the tRacket noise sensor


anhldptit2610/dalws
This project is my attempt to learn about microcontroller and PCB design. Now I realize that making a full, complete electronic project is super hard.