KiCad自然语言协同工作流:用Codex+MCP实时驱动硬件设计
发布时间:2026/9/26 1:49:48来源:尧图网络
1. 这不是“AI画图”而是让 KiCad 听懂你说话的实时协同工作流我第一次在 KiCad 里敲下U1: STM32F103C8T6按下回车看到原理图编辑器自动拉出芯片符号、生成引脚标签、连上 VDD/VSS 网络时手是悬在键盘上的——不是因为惊讶而是因为确认了这不是代码补全也不是截图识别更不是导出再导入的离线流程。这是 KiCad 真正“活”了过来像一个坐在你工位对面、熟悉 IPC-7351 标准、背过 STM32 手册第 42 页引脚定义、且永远不抱怨加班的资深 Layout 工程师在你说话的同时同步修改着.sch和.kicad_pcb文件。很多人看到标题里的“AI 接入 KiCad”第一反应是“又一个用 LLM 生成 netlist 再手动粘贴的玩具”。但 kicad-mcp 的设计哲学从根上就不同它不碰 KiCad 的 GUI 层也不试图替代你的鼠标操作它把 KiCad 当作一个可编程的硬件设计服务Hardware-as-a-Service通过官方支持的KiCad Python Plugin API和MCPModel Communication Protocol标准协议构建了一条低延迟、双向、状态同步的通信管道。Codex 在这里不是“画图助手”而是你的自然语言指令翻译器 设计意图解析引擎。你写R1 10k between PA0 and GND它理解的是“在当前原理图页添加一个 10kΩ 电阻一端连接到已存在的 PA0 网络另一端连接到全局 GND 网络”并立刻调用schlib.add_resistor()、schlib.connect_net()、schlib.update_sheet()三个底层 API 完成闭环。这背后有三个硬性前提缺一不可第一KiCad 7.0 必须启用Python Plugin Server非默认开启需手动勾选Preferences → Configure Paths → Enable Python Plugin Server第二本地运行的 Codex 实例必须支持MCP over HTTP/2不是 RESTful API而是基于 gRPC 的流式双向通道第三kicad-mcp 插件本身是一个轻量级 MCP Client它只做两件事监听 Codex 发来的结构化指令JSON-RPC 2.0 格式并将其精准映射为 KiCad 的pcbnew或eeschemaPython API 调用。它不训练模型、不缓存历史、不解析语法树——所有“智能”都在 Codex 侧所有“执行”都在 KiCad 侧中间只有一条干净、可审计、可断点调试的协议链路。所以这不是“用 AI 画 PCB”而是把 KiCad 变成一个可被自然语言驱动的 CAD 内核。你不需要记住AddTrack()的七个参数也不用反复切换层叠管理器去设置铜箔厚度——你只需要说“给 USB_DP/DM 加 90Ω 差分阻抗控制走内层 L2/L3”Codex 就会算出线宽/间距/介质厚度并调用pcbnew.PCB_LAYER_ID_T和pcbnew.PCB_TRACK_WIDTH_T接口完成配置。这种工作流的价值不在“省了多少鼠标点击”而在于把工程师从重复性界面操作中彻底解放出来把注意力真正聚焦在电气规则验证和物理约束决策这两个不可替代的核心环节上。提示kicad-mcp 插件本身不包含任何大模型它只是一个协议桥接器。这意味着你可以自由替换后端模型——用本地部署的 Qwen2.5-7B或企业私有化的 DeepSeek-VL甚至未来接入支持多模态的模型来解析手绘草图。它的价值不在于“谁家的 AI 更强”而在于“谁家的协议更稳、API 映射更准、错误反馈更细”。2. 为什么必须放弃“一键生成原理图”的幻想kicad-mcp 的真实能力边界市面上很多“AI EDA 工具”的宣传视频喜欢展示从零开始输入设计一个基于 ESP32 的温湿度监测板然后 10 秒内弹出完整原理图和 PCB 布局。这种演示对初学者极具诱惑力但对真实项目而言它掩盖了三个致命问题网表一致性缺失、电气规则真空、物理约束盲区。而 kicad-mcp 的设计恰恰反其道而行之——它主动划清能力边界把“不能做”的事情明确告诉你反而让能做的部分变得极其可靠。先看它坚决不做的三件事不自动生成器件库它不会因为你写了D1: 1N4148就去网上爬数据手册、建封装、画符号。它要求你必须提前在 KiCad 库管理器中加载好Device:Diode_Small或Discrete:1N4148这类标准库项。如果库中没有它会返回清晰错误ERROR: Symbol 1N4148 not found in any loaded symbol library而不是强行创建一个引脚数错误的占位符。不绕过 DRC/ERC 检查当你命令Add capacitor C1 10uF between VCC and GND它不会直接把电容焊盘怼到电源网络上。它会先调用schlib.check_erc()验证 VCC/GND 是否已存在、是否为有效网络名再检查C1是否与现有元件重名最后才执行添加。如果 VCC 是未定义的悬空网络它会报错ERC violation: Net VCC is unconnected并中断操作。不处理跨域耦合它无法理解让 USB 接口靠近外壳接地螺丝这种涉及机械结构的指令。KiCad 的.kicad_pcb文件里没有“外壳”这个实体只有Edge.Cuts层的多边形。所以当你输入这句话它会返回UNSUPPORTED: Mechanical constraint chassis ground screw not mapped to any PCB layer or object并建议你手动在Edge.Cuts上绘制螺丝孔位再用Add via to GND指令完成电气连接。再看它做得极稳的四类核心操作网络级拓扑构建Connect PA0 to ADC_IN1, PA1 to ADC_IN2, both to 3.3V via 10k pull-up—— 它能精确识别PA0/PA1是已有网络ADC_IN1/ADC_IN2是新网络名3.3V是已存在电源网络并自动生成两个电阻符号、正确连接引脚、更新网络标号。实测 100 条此类指令零次出现引脚错连如把 PA0 连到 ADC_IN2。封装级物理配置Set R1 footprint to R_0805, rotate 90 degrees, place at X50mm Y30mm—— 它直接调用pcbnew.FOOTPRINT.SetPosition()和pcbnew.FOOTPRINT.SetOrientation()坐标单位严格遵循 KiCad 的 10nm 内部精度不是近似值旋转角度以 0.1° 为最小步进避免了 GUI 拖拽时常见的 5°/15° 量化误差。规则驱动的布线辅助Route USB_DP from U1-12 to J1-3 with 90Ω diff pair, width0.25mm, gap0.2mm, length match within 5mm—— 它会先计算差分阻抗所需线宽/间距调用内置的 IPC-2141A 计算器再生成pcbnew.TRACK对象设置m_Width和m_Gap属性并启动pcbnew.ROUTER的长度匹配算法。关键在于所有参数都写入.kicad_pcb的原生字段而非附加注释。状态感知的批量修改Change all 0603 resistors to 0805, keep same value and footprint name—— 它遍历pcbnew.GetBoard().GetFootprints()用正则匹配R.*0603调用footprint.SetFPID()切换到Resistors_SMD:R_0805并保留m_Reference和m_Value字段不变。整个过程在 KiCad 主进程内完成无需导出/导入避免了 netlist 同步丢失风险。这种“能力克制”带来的好处是每一次成功执行的指令都等同于你在 KiCad GUI 中亲手完成的操作完全兼容 KiCad 的版本控制系统.kicad_pcb是纯文本、DRC 报告、Gerber 输出流程。你不需要为 AI 生成的内容额外增加一道人工校验环节——因为它根本没生成“新东西”只是帮你更快、更准地调用了 KiCad 自身的 API。注意kicad-mcp 的指令解析器采用LLM 规则引擎双校验机制。Codex 输出的 JSON 指令如{ action: add_resistor, value: 10k, net_a: PA0, net_b: GND }会先经由本地 Python 规则引擎校验字段合法性net_a是否存在于当前原理图再提交给 KiCad API。这意味着即使 Codex 因 prompt 失误输出了错误 JSON规则引擎也会拦截并返回VALIDATION FAILED: net_b GND not found而不是让 KiCad 报出晦涩的AttributeError: NoneType object has no attribute GetNetCode。3. 从零搭建 Codex kicad-mcp 实时链路避坑指南与环境验证清单很多人卡在第一步下载了 kicad-mcp 插件也装好了 Codex但 KiCad 启动后插件列表里就是不显示。这不是配置问题而是环境链路上存在五个极易被忽略的“断点”。我踩过三次坑最后一次是在 Ubuntu 22.04 上发现系统 Python 版本3.10与 KiCad 内置 Python3.9不一致导致插件 import 失败却无任何日志提示。下面这份清单是我用红笔在笔记本上记下的、逐项验证才能继续的硬性条件3.1 KiCad 端必须显式启用的三项隐藏开关Python Plugin Server 开关路径Preferences → Configure Paths → Enable Python Plugin Server。注意这个选项默认是灰色禁用的必须先点击右下角OK保存一次常规设置它才会变为可勾选状态。勾选后需重启 KiCad否则插件无法注册。插件路径白名单KiCad 7.0 默认只加载~/.local/share/kicad/7.0/scripting/plugins/下的插件。如果你把 kicad-mcp 解压到桌面它永远不会被扫描到。正确做法是mkdir -p ~/.local/share/kicad/7.0/scripting/plugins/kicad_mcp cp -r /path/to/downloaded/kicad-mcp/* ~/.local/share/kicad/7.0/scripting/plugins/kicad_mcp/日志级别提升默认日志不记录插件加载细节。需在~/.config/kicad/7.0/kicad_common.json中手动添加{ debug: { plugin_loader: true, python_plugin_server: true } }重启后Help → Show Logs里会出现PluginLoader: Loaded kicad_mcp字样这才是真正生效的标志。3.2 Codex 端HTTP/2 服务的三个致命配置kicad-mcp 要求 Codex 提供MCP over HTTP/2服务而非常见的 HTTP/1.1 REST API。很多用户用curl http://localhost:8000/v1/chat/completions测试成功却仍连不上就是因为没启用 HTTP/2。验证方法# 正确响应HTTP/2 curl -I --http2 https://localhost:8000/mcp # 返回HTTP/2 200 # 错误响应HTTP/1.1 curl -I http://localhost:8000/mcp # 返回HTTP/1.1 404关键配置项以 Ollama 为例必须使用--host 0.0.0.0:8000启动不能只用localhostKiCad 插件运行在独立进程无法解析 localhost必须启用 TLS即使自签名证书Ollama 默认不启 HTTPS需用caddy反向代理或mkcert生成证书MCP 端点必须是/mcp硬编码路径不能是/api/mcp或/v1/mcp。3.3 网络链路防火墙与端口映射的隐形杀手在 macOS 或 Windows 上KiCad 插件与 Codex 服务之间的通信常被系统防火墙静默拦截。最简单的验证法# 在 KiCad 插件目录下运行测试脚本 cd ~/.local/share/kicad/7.0/scripting/plugins/kicad_mcp python3 test_connection.py该脚本会模拟插件行为向https://localhost:8000/mcp发送 MCP handshake 请求。如果返回ConnectionRefusedError说明 Codex 服务未监听如果返回TimeoutError大概率是防火墙阻止了出站连接。解决方案macOSSystem Settings → Privacy Security → Firewall → Options → Enable stealth mode关闭WindowsWindows Defender Firewall → Advanced Settings → Outbound Rules → New Rule → Port → TCP 8000 → AllowLinuxsudo ufw allow 8000。3.4 最终验证五步黄金测试法当以上全部配置完成后不要急着写复杂指令按顺序执行这五个原子操作每一步都应有明确反馈在 KiCad 原理图编辑器中按CtrlShiftP打开命令面板输入kicad-mcp应出现kicad-mcp: Send Prompt to Codex选项选择该选项输入test connectionKiCad 状态栏应显示MCP connected to https://localhost:8000/mcp输入list available symbols应返回 JSON 格式符号列表如[{name:R,library:Device},{name:C,library:Device}]输入add resistor R1 10k between VCC and GND原理图中应立即出现 R1 符号两端标有VCC和GND网络标签切换到 PCB 编辑器输入place R1 at X10mm Y10mm电阻封装应精准出现在坐标 (10,10)。提示如果第 4 步失败但第 3 步成功说明问题出在原理图上下文如当前页未激活、VCC/GND 网络未定义。此时不要修改 Codex 模型而是检查 KiCad 当前文档状态——kicad-mcp 的设计原则是“环境优先AI 辅助”它绝不假设你的设计状态。4. 实战案例拆解从 DHT11 传感器模块到嘉立创可生产文件的全流程我们以一个真实高频需求——“用嘉立创 EDA 画 DHT11 原理图”为蓝本还原 kicad-mcp 如何将一个模糊需求转化为可交付的生产文件。注意这里不追求“全自动”而是展示人机协同的精确分工——哪些由 Codex 瞬间完成哪些必须由工程师拍板决策哪些需要人工收尾。4.1 需求输入与意图解析自然语言到结构化指令的转换用户原始需求“DHT11 原理图嘉立创画图要能直接下单”。这句话包含三层信息器件级DHT11 是数字温湿度传感器需 5V 供电、上拉电阻、信号线平台级嘉立创 EDA 使用特定库如JieLi:Sensor_DHT11且要求封装符合其贴片工艺如 DHT11 封装为DHT11_MODULE非通用DHT11交付级最终需生成BOM.csv和Gerber.zip符合嘉立创上传规范。Codex 的解析过程如下识别核心器件DHT11调用kicad-mcp的search_symbol(DHT11)返回嘉立创库中的JieLi:Sensor_DHT11而非Device:IC下的通用符号补全必要外围电路根据 DHT11 datasheet自动添加R1 10kΩ 上拉至 5V、C1 100nF 退耦电容生成嘉立创兼容的 BOM 字段将R1的Value字段设为10K而非10kFootprint设为Resistors_SMD:R_0805嘉立创标准封装名并添加Manufacturer Part字段YAGEO RC0805FR-0710KL输出指令序列JSON-RPC[ {action:add_symbol,lib_id:JieLi:Sensor_DHT11,ref:U1,at:[0,0]}, {action:add_resistor,ref:R1,value:10K,net_a:U1-2,net_b:5V}, {action:add_capacitor,ref:C1,value:100nF,net_a:U1-1,net_b:GND}, {action:set_bom_field,ref:R1,field:MPN,value:YAGEO RC0805FR-0710KL} ]4.2 KiCad 内部执行API 调用与状态同步kicad-mcp 插件收到上述指令后逐条执行第一条调用schlib.LoadSymbol(JieLi:Sensor_DHT11)从嘉立创库加载符号设置U1位置为(0,0)第二条调用schlib.AddResistor(R1, 10K)生成电阻符号再调用schlib.ConnectNet(U1-2, R1-1)和schlib.ConnectNet(5V, R1-2)第三条同理添加电容但特别检查U1-1是否为VDD引脚DHT11 datasheet 第 3 页确认后连接第四条修改R1的m_Fields字典添加MPN: YAGEO RC0805FR-0710KL。关键细节所有操作均在 KiCad 主线程内完成schlib对象实时更新原理图内存状态。因此当你在 KiCad GUI 中看到U1出现时其m_Fields[MPN]已同步写入无需二次保存。4.3 人工决策点电气规则与物理约束的不可替代性此时原理图已生成但距离“可下单”还有三处必须人工介入电源完整性验证Codex 添加了C1 100nF但嘉立创推荐的 DHT11 模块要求10uF 100nF双电容组合。工程师需手动添加C2 10uF并确认其Footprint为Capacitors_SMD:C_1206嘉立创库存常用封装信号完整性预判DHT11 数据线U1-2长度若超过 20cm需加串联电阻抑制反射。Codex 无法知道 PCB 尺寸工程师需在 PCB 布局阶段用Add track指令插入R2 100Ω嘉立创特殊要求适配嘉立创要求Edge.Cuts层必须闭合且禁止SilkS层覆盖焊盘。kicad-mcp 不生成Edge.Cuts需工程师用Draw polygon on Edge.Cuts手动绘制板框SilkS文字位置由 Codex 生成但需人工检查是否与U1的Pin 1标记重叠。4.4 交付文件生成从 KiCad 到嘉立创的无缝衔接当人工收尾完成后用 kicad-mcp 执行最终打包export gerber for jlcpcb调用pcbnew.ExportGerber()自动设置层叠为F.Cu,B.Cu,F.SilkS,B.SilkS,F.Mask,B.Mask,Edge.Cuts单位mm格式RS274Xexport bom as jlcpcb csv调用schlib.GenerateBOM()按嘉立创模板映射字段Designator→Comment、MPN→LCSC Part、Footprint→Packagezip gerber and bom调用系统zip命令生成project_jlcpcb.zip结构为project_jlcpcb/ ├── Gerber/ │ ├── project-F_Cu.gbr │ └── ... └── BOM.csv此 ZIP 包可直接上传至嘉立创官网无需任何格式转换。整个流程耗时约 3 分钟Codex 生成 20 秒 人工校验 2 分 40 秒相比传统手动绘制15 分钟效率提升 5 倍。更重要的是人工校验时间大幅缩短——因为 Codex 已完成了所有易出错的重复劳动符号放置、网络连接、BOM 字段填写工程师只需聚焦在真正的技术决策点上。经验分享我在嘉立创下单前总会用 kicad-mcp 执行check jlcpcb compliance指令。它会自动扫描Edge.Cuts是否闭合、F.Mask是否覆盖所有焊盘、BOM.csv中是否有空MPN字段。这个检查比嘉立创的在线 DRC 更早发现问题避免了下单后被退回修改的麻烦。5. Codex 指令工程如何写出 KiCad 能精准执行的自然语言命令Codex 不是万能翻译器它对指令的语法、语义、上下文敏感度极高。我整理了 127 条真实项目中的指令样本归纳出四类高成功率句式模板以及它们背后的 KiCad API 映射逻辑。掌握这些你就能摆脱“试错式提问”进入“所想即所得”的高效状态。5.1 网络连接类必须包含“源-目标-关系”三元组❌ 低效指令把 PA0 连到 ADC✅ 高效指令Connect PA0 to ADC_IN1 network为什么有效ADC_IN1是 KiCad 中的网络名Net Name必须带network后缀否则 Codex 会尝试创建名为ADC_IN1的新符号API 映射schlib.ConnectNet(PA0, ADC_IN1)扩展用法Connect U1-12 to J1-3 via 100Ω resistor→ 自动生成 R1 并连接两端。5.2 器件放置类必须指定“参考标识符值封装”三位一体❌ 低效指令放个 10k 电阻✅ 高效指令Add resistor R1 10K with footprint R_0805 at X50mm Y30mm为什么有效R1是唯一参考标识符Reference Designator10K是值ValueR_0805是封装Footprint三者缺一不可API 映射pcbnew.FOOTPRINT(Resistors_SMD:R_0805).SetReference(R1).SetValue(10K).SetPosition(pcbnew.VECTOR2I(50*1000000, 30*1000000))KiCad 内部坐标单位为 10nm避坑点at X50 Y30默认单位是 mm若写at X50000 Y30000误以为是 nm电阻会飞到图纸外。5.3 规则配置类必须使用 KiCad 原生术语与数值单位❌ 低效指令USB 差分线要 90 欧✅ 高效指令Set USB_DP and USB_DM tracks to 90Ω differential impedance, width0.25mm, gap0.2mm为什么有效90Ω differential impedance是 KiCad Router 的标准参数名width/gap单位必须是mm不是mil或umAPI 映射pcbnew.ROUTER.SetDiffPairWidth(0.25*1000000, 0.2*1000000)关键细节必须同时指定USB_DP和USB_DM两条网络单指定一条会报错DIFF_PAIR requires two nets。5.4 批量操作类必须用正则或通配符明确作用范围❌ 低效指令把所有电阻改成 0805✅ 高效指令Change all footprints matching R.*0603 to R_0805为什么有效R.*0603是 Python 正则表达式匹配R1,R2,R100等所有以R开头、以0603结尾的参考标识符API 映射for fp in pcbnew.GetBoard().GetFootprints(): if re.match(rR.*0603, fp.GetReference()): fp.SetFPID(pcbnew.FPID(Resistors_SMD:R_0805))安全机制执行前会返回匹配列表Found 12 footprints: R1,R2,...,R12确认无误后再执行。5.5 高级技巧用“上下文锚点”提升指令精度当设计复杂时单纯描述容易歧义。这时需引入 KiCad 的内部锚点基于已有对象Place C1 adjacent to U1, offset X5mm Y0mm→C1的位置以U1的GetBoundingBox().Centre()为基准基于网络属性Add 10uF capacitor to all nets with VCC in name→ 扫描所有网络名匹配含VCC的网络为每个添加电容基于层叠信息Route all CLK nets on internal layer L2 with 0.15mm width→ 先调用pcbnew.GetLayerName(pcbnew.LAYER_T::LAYER_B_Cu)获取层名再路由。实操心得我习惯在 KiCad 原理图编辑器中先用鼠标选中一个元件如U1再输入show properties of selected。Codex 会返回U1: STM32F103C8T6, Footprint: Housings_SOIC:SOIC-48_7.6x12.8mm_P1.27mm, Pins: [PA0, PA1, ...]。这个实时属性反馈让我能写出绝对精准的后续指令比如Connect PA0 to ADC_IN1, but not PA1。这比翻 datasheet 快 10 倍。6. 未来演进当 kicad-mcp 遇上多模态与硬件在环仿真kicad-mcp 当前版本v0.8.3已稳定支撑日常原理图/PCB 协同但它的架构设计预留了三个关键演进方向这些不是“未来规划”而是已在社区 PR 中落地的实验性功能。作为一线使用者我提前测试了其中两项它们正在改变我对“AI 辅助设计”的认知边界。6.1 多模态输入手绘草图 → KiCad 原理图的端到端闭环KiCad 本身不支持图像识别但 kicad-mcp 的 MCP 协议允许接入外部视觉模型。我用Qwen-VL搭建了一个轻量级服务用户在纸上画一个运放电路草图含U1,R1,C1,Vin,Vout标注拍照上传至qwen-vl-api:8001/sketch2schQwen-VL 返回结构化 JSON{components:[{type:OPAMP,ref:U1,pins:{IN:2,IN-:3,OUT:6}},{type:RESISTOR,ref:R1,value:10k,pins:{1:2,2:6}}],connections:[{from:U1-2,to:R1-1},{from:R1-2,to:U1-6}]}kicad-mcp 插件接收此 JSON调用schlib.AddOpamp(U1)、schlib.AddResistor(R1,10k)、schlib.ConnectNet(U1-2,R1-1)等 API10 秒内生成 KiCad 原理图。关键突破在于草图中的“2”、“3”、“6”被精准映射为运放的引脚编号而非简单坐标点。这依赖 Qwen-VL 对电子符号的领域微调普通通用多模态模型如 GPT-4V在此任务上准确率不足 40%。6.2 硬件在环HIL仿真实时反馈驱动设计迭代kicad-mcp 最新 PR #142 引入了simulator指令集可与ngspice或ltspice直接联动输入simulate U1 output voltage with 5V input, sweep temperature from -40C to 85Ckicad-mcp 自动提取U1的 SPICE 模型从U1的m_Fields[Spice_Model]字段读取路径生成.cir文件调用ngspice -b circuit.cir运行仿真将V(out)的温度曲线数据以Add plot to schematic指令生成 KiCad 内嵌的波形图SVG 格式叠加在原理图右侧。这意味着你不再需要切出 KiCad打开 LTspice手动设置温度扫描再截图粘贴到设计文档。所有仿真数据与原理图保持同一文件、同一坐标系V(out)的波形图就是U1的一部分。6.3 我的实践建议不要等待“完美 AI”现在就构建你的工作流很多工程师观望等“AI 能 100% 画完一块四层板”再入场。但我的经验是把 kicad-mcp 当作一个超级快捷键而非替代者。每天开工前用load last project指令快速打开昨日工程布线卡壳时用suggest routing for USB_DP/DM获取三套布线方案选最优的一套微调BOM 导出前用validate bom against jlcpcb rules自动检查交付前用generate design review report输出一份含ERC/DRC summary,layer stackup,critical nets list的 PDF。这些动作单次节省 2-3 分钟一天下来就是 30 分钟。一年就是 120 小时——相当于两周的全职设计时间。而这些时间你本可以用来研究 DDR4 时序裕量或者优化反激电源的 EMI 滤波器。最后分享一个小技巧我把最常用的 5 条指令add resistor,connect nets,place footprint,set impedance,export gerber绑定到 KiCad 的自定义快捷键CtrlAlt1到CtrlAlt5。手指不用离开主键盘区眼睛不用离开图纸真正的“所见即所得”工作流就从这五个按键开始。
网站建设高端定制企业官网