This website requires JavaScript.
優惠券
寄往
部落格

讓 AI Agent 參與 PCB 設計:MAX-M10S GNSS 四層板從 KiCad 到 JLCPCB SMT 的實作紀錄

最初發布於 Nov 03, 2026, 更新於 Nov 03, 2026

4 分鐘

目錄
  • 一、為什麼要做這塊板
  • 二、工作流程:兩個 Agent、一個寫入者
  • 三、原理圖:每一個腳位都要對回原廠資料
  • 四、佈局:四層板上的 50 Ω RF 走線
  • 五、驗證:ERC/DRC 之外還檢查了什麼
  • 六、為了 SMT 組裝而改版:Rev A → Rev B → Rev C
  • 七、JLCPCB 製造:從 DFM 到生產稿確認
  • 八、到貨實測:先收不到衛星,再一步步找原因
  • 九、經驗與限制
  • 結語

專案資訊

作者:John

專案:MAX-M10S GNSS 驗證板

工作流程與範例檔:GitHub 公開專案

本次 PCB 製造與 SMT 組裝由 JLCPCB 合作支持;文中的 JLCPCB 連結為作者的合作推廣連結。

MAX-M10S GNSS Rev C 四層 PCB 與 SMT 組裝成品

圖 1:MAX-M10S GNSS 驗證板 Rev C 成品。頂面 17 顆元件由 JLCPCB SMT 貼裝;兩側的 2.54 mm 排針孔留給使用者自行焊接。

這篇文章記錄一塊小板子的完整過程:用 Claude Code 和 Codex 兩個 AI Agent 協助 KiCad 設計,經過 ERC/DRC 與交叉審查,送到 JLCPCB 做四層板和 SMT 組裝,到貨後實際上電、收衛星、定位。

做完的感想是:Agent 幫得上的地方比我預期多,查原廠資料、寫驗證腳本、輸出製造檔都省了不少時間;但它也算錯過阻抗、寫錯過設計規則,還對證據不足的問題下過結論。後來的做法是每一步都要留下能重跑的證據,付款、送單和功能取捨則一律由我決定。

一、為什麼要做這塊板

我之後的幾個專案都會用到 GNSS 定位。與其直接把 GNSS 塞進一塊功能更多的板子,我想先用一塊獨立的小板確認幾件事:

  • u-blox MAX-M10S 的周邊電路與腳位接法是否正確;
  • 被動天線的 RF 走線在四層板上的做法;
  • PCBA 的料號、封裝、貼裝方向能不能一次過;
  • 韌體端的 UART、PPS 與 A-GNSS 輔助資料能不能跑起來。

所以這塊板的定位很單純:只有 GNSS,能插麵包板,方便接任何 MCU 測試。

項目規格
GNSS 模組u-blox MAX-M10S-00B(LCC-18,9.7 × 10.1 mm)
板子尺寸25.0 × 36.5 mm
層數/板厚4 層,1.6 mm,疊構 JLC04161H-7628
銅厚外層 1 oz,內層 0.5 oz;In1、In2 皆為完整 GND
表面處理OSP
天線被動天線,I-PEX MHF I 天線座,不提供天線供電
電源外部 3.3 V(板上無 LDO,不可接 5 V)
對外介面J2:3V3/GND/TX/RX/PPS/EXTINT;J3:GND/SCL/SDA/RESET_N/SAFEBOOT_N/GND
通訊UART 9600 8N1;I²C 位址 0x42
指示燈電源 LED、PPS LED(經 BSS138 緩衝,不直接吃 PPS 腳電流)
組裝頂面 11 種料、17 顆元件由 JLCPCB 貼裝;排針自焊

供電與天線注意事項

電源:本板只接受外部穩壓 3.3 V,板上無 LDO,不可接 5 V。

天線:本版僅支援被動 GNSS 天線,不提供主動天線所需的電源。

二、工作流程:兩個 Agent、一個寫入者

這個專案同時用了 Claude Code(以下簡稱 CC)和 Codex。兩者都能讀寫檔案、執行命令,所以一開始就得講好誰能改檔案,不然兩個 Agent 加上我,很容易互相覆蓋。最後定下來的規則是:

  1. 同一時間只有一個寫入者。 同一個工作目錄、同一個 KiCad 視窗,同時只能有一位 owner 修改。換手前在 WORKLOG.md 記下 owner、改了什麼、驗證結果和停止點。
  2. 重要修改交給另一個 Agent 審查。 審查者只開讀檔與搜尋工具,不能寫檔、不能執行 shell。審查最多兩輪:審查者提出證據,owner 判斷並修改。如果審查因額度或權限中斷,就標示「未完成審查」,不當成通過。
  3. 改設計前先保存可還原的版本。 改完後比對 netlist、重跑 ERC/DRC,確認差異只出現在預期的地方。
  4. 付款、送單、寄信、確認生產稿都由我本人決定。 Agent 可以準備文件、起草信件、比對資料,但按下確認的一定是人。

實際分工上,這塊板的原理圖與佈局修改主要由 Codex 負責,它用 Python 腳本呼叫 KiCad 的 pcbnew API 建立板框、擺放零件和設定規則,再用自動佈線腳本走訊號線(一般訊號 0.20 mm、3V3 0.30 mm)。CC 負責工具驗收、RF 部分的獨立複查、投產後對製造檔的獨立複核,以及到貨後的上電測試。JLC 回傳生產稿後的逐層比對,則由 Codex 主導,另由唯讀 Agent 做機械與鑽孔審查。驗證一律使用 KiCad 10.0.6 原生的 kicad-cli 跑 ERC、DRC 與 Gerber 匯出,不只依賴 Agent 自己的判斷。

後來我把這套流程、範本和相關 Agent Skills 整理到 pcb-agent-workflow,下面各節提到的做法在裡面都有對應文件。

三、原理圖:每一個腳位都要對回原廠資料

MAX-M10S GNSS 驗證板 Rev C 電路原理圖

圖 2:Rev C 原理圖。左上為電源與去耦,中間是 MAX-M10S,右側是天線、ESD 與兩排排針,下方是 LED 與測點。圖上 D1 為原設計料號 PESD3V3C1BSF,實際生產時因缺貨換成同封裝的 PESD3V3Z1BSFYL。

原理圖本身不複雜,難的是每個決定都要有依據。我要求 Agent 在決定任何腳位接法之前,先對照 u-blox 的 MAX-M10S Data Sheet(UBX-20035208)與 Integration Manual(UBX-20053088),並把引用的表格與章節記下來。幾個實際的設計決定:

  • 只支援被動天線。 VCC_RF 與 LNA_EN 不接,沒有 bias tee。設計時參考了 SparkFun 的 MAX-M10S 板,但把 SMA 換成更小的 MHF I 天線座,並刪掉主動天線供電電路。
  • 板上不放 LDO。 MAX-M10S 的供電範圍是 3.135~3.465 V,這塊板只接受外部穩壓的 3.3 V,絲印直接印「3V3 ONLY」。
  • UART 與 PPS 保留 33 Ω 串聯電阻。 沿用 SparkFun 參考設計的做法,模組 TX/RX 方向直接標在絲印上,避免接反。
  • PPS LED 經 BSS138 緩衝。 由 MOSFET 驅動 LED,減少模組 TIMEPULSE 腳的負載,接到 MCU 的 PPS 訊號不受 LED 影響。
  • 天線端加低電容 ESD。 D1 原本選用 Nexperia PESD3V3C1BSF(典型電容 0.2 pF),送廠時因缺貨改用同封裝的 PESD3V3Z1BSFYL(典型 0.28 pF),兩者對 1.575 GHz 訊號的負載都很小。

早期版本(Rev A、Rev B)還有 RTC 備援電路,讓模組斷電後保留星曆、縮短下一次定位時間。這個電路後來因為 SMT 組裝的限制被拿掉,第六節會說明。

四、佈局:四層板上的 50 Ω RF 走線

KiCad Rev C PCB 頂層佈局與 RF 天線走線

圖 3:Rev C 頂層。右上 J1 天線座經 D1 直接連到 U1 的 RF_IN,全程沒有過孔;左下與右側為麵包板排針。

板子只有 25 × 36.5 mm,但 RF 路徑是整塊板最需要小心的地方。這裡的做法:

  • 疊構: F.Cu/7628 預浸片 0.2104 mm/In1 GND/芯板/In2 GND/7628 0.2104 mm/B.Cu。兩個內層都是完整的地,內層不走訊號。
  • RF 線寬: 以 In1 為參考面的微帶線,介電常數取 4.4,用 Qucs 文件中的 Hammerstad–Jensen 公式計算,50 Ω 對應線寬 0.372 mm。
  • 敏感度: 線寬 ±0.025 mm 時阻抗約 48.2~51.9 Ω;介電常數 4.2~4.6 加上介質厚度 ±10% 時約 46.0~53.9 Ω。對一條總長只有 5.5 mm 的走線來說可以接受。
  • 退讓與回流: RF 線兩側與地銅保持 1 mm 間距,在 J1、D1、U1 旁放接地過孔,讓回流路徑盡量短。D1 的焊盤間距較窄,有兩段 0.15 × 0.5 mm 的細頸,長度遠小於波長。

四層 PCB In1 內層完整 GND 接地平面

圖 4:In1 內層是完整的 GND 平面,RF 線正下方沒有任何切割。

RF 這段也是 Agent 出錯最多的地方,前後遇到三次:

  1. 公式用錯分支。 第一次的阻抗計算對有效介電常數用了簡化式,條件超出適用範圍,結果作廢。後來改成寫一支腳本,完整實作 Hammerstad–Jensen 公式並加上銅厚修正,數字才穩定下來。
  2. 回代錯誤。 另一個 Agent 在交叉驗算時,把只該用在傳播計算的厚度修正介電常數又代回阻抗式,算出 51.12 Ω。owner 用公式與 scikit-rf 重新實作反證後,這個結果被撤回。分析工具給的 43.2 Ω 則是用純微帶線模型套在有側邊地銅的結構上,也不能拿來佐證。
  3. 規則寫錯,DRC 卻照樣通過。 設計規則檔(DRU)中有一條例外,原意是讓 D1 附近的 RF 細頸可以用 0.15 mm 間距,但條件寫成「所有 RF 網路物件」,結果也套用到 GND 鋪銅上。文件寫的 1 mm 退讓,實際只剩約 0.151 mm,而 DRC 完全不會報錯,因為規則本身允許。

第三個問題讓我學到:DRC 通過只代表「符合你寫的規則」,不代表規則是對的。 修正後,CC 在複查時做了一個反向測試:把板子副本的鋪銅間距刻意改小,確認 DRC 仍守住 1 mm;再把規則檔拿掉,DRC 立刻報出 4 個違規。用「讓它故意失敗」的方式證明規則確實在發揮作用,比單看「0 錯誤」可靠得多。

阻抗設計說明

另外要說明,0.372 mm 是設計階段的計算目標,不是板廠的阻抗控制保證。這塊板沒有下阻抗控制的訂單;如果之後量產對 RF 餘裕要求較高,應該改用板廠的阻抗計算結果,並加購阻抗控制。

五、驗證:ERC/DRC 之外還檢查了什麼

Rev C 送廠前的驗證結果:

檢查項目結果
KiCad 原生 ERC(全部嚴重度)0
單板 DRC:違規/未連線/原理圖一致性0/0/0
拼板 DRC0
原理圖與 PCB 的 pin-net 對應68 筆完全一致
Gerber 焊盤與元件核對138 個焊盤
重新匯出 Gerber 與發行包比較0 差異
獨立 Agent 唯讀審查無 P1/P2 問題

除了數字,審查真正有價值的地方,是抓出「看起來合理但其實不對」的東西。例如有一份審查報告把天線座 J1 列為「確定無法配料」的阻擋問題,Codex 稽核時找不到足夠證據支持,這一項被駁回,後來 J1 也順利貼裝。反過來,CC 在驗收 KiCad 工具時建了一個拋棄式的 LED 測試專案,裡面把 LED 的陽極和陰極接反,也是在 Codex 的交叉審查中被指出。

這裡的原則是:Agent 的結論必須附上證據,而且要讓另一方能重現。 只說「我檢查過了,沒問題」的報告一律不算數。

六、為了 SMT 組裝而改版:Rev A → Rev B → Rev C

這塊板總共改了三版,其中兩次改版都是因為製造端的限制,不是電路錯誤:

版本尺寸主要內容改版原因
Rev A20.32 × 50.8 mm含 0.1 F THT 超級電容作 RTC 備援原定的超級電容從組裝料庫中下架
Rev B同 Rev A改成 9 顆 CPH3225A 並聯(約 0.099 F),加分壓保護確認超級電容與電池類元件不接受 PCBA 組裝
Rev C25 × 36.5 mm移除備援、縮板,保留兩顆 LED;V_BCKP 依手冊懸空最終製造版

Rev B 卡關時,我請 Agent 整理問題並透過 JLCPCB 線上客服詢問,客服明確回覆超級電容與電池類元件目前不提供組裝。我一開始選擇讓 JLCPCB 貼其餘元件、儲能電容自己補焊。後來重新評估:這是驗證板,MAX-M10S 的 Integration Manual 也允許 V_BCKP 不接,補焊 9 顆 3225 電容不划算,於是決定整個拿掉備援,順便把板子縮小。這種「功能取捨」是我認為應該由人做的決定,Agent 負責列出影響與手冊依據。

Rev C 的 RF 走線、U1、J1、D1 位置與 Rev B 完全相同,只動電源備援區和板框,所以前面 RF 的驗證可以沿用。

最後送廠的版本又做了三個製造調整,PCB 幾何沒變:

  • 表面處理從 ENIG 改成 OSP。
  • 只貼頂面: 兩排排針不交工廠,到貨後自己從底面插入焊接。
  • D1 換替代料: 原料號缺貨,改用同封裝的 PESD3V3Z1BSFYL,並對照 Nexperia 原廠資料確認封裝、電容與工作電壓。

七、JLCPCB 製造:從 DFM 到生產稿確認

下單在 JLCPCB 網站完成:PCB 5 片,其中 2 片做 Standard PCBA。

拼板與工藝邊交給工廠。 原本 Codex 做了一版 70 × 70 mm 自拼工藝板,後來改成只上傳單板,由 JLCPCB 加工藝邊與定位點,並選擇交貨前拆邊。網站顯示的加工尺寸是 71 × 70.5 mm,收到的是拆好的 25 × 36.5 mm 成品。這樣能省去自己畫工藝邊和 V-cut 的麻煩。

DFM 與工程問答。 我在下單時選了生產稿確認(production file confirmation),付款後工程師會把 CAM 處理後的生產稿和貼裝位置傳回來,請客戶確認後才投產。這一步我請 Agent 協助逐項比對,並對工程師提出四個問題:

項目我的問題工程師回覆
R7這顆 0603 距成品板邊只有 0.775 mm,拆邊時會不會受力?拆邊在 SMT 之後進行,上下為預銑槽、左右沿 V-cut 拆;生產指示單已加註保護 R7
RESET_N 過孔生產稿中一個過孔移動約 0.061 mm,為什麼?原位置與焊盤阻焊開窗重疊,無法做塞孔處理,因此微移,不影響性能
Q1網頁標示 Q1 被工程修正依板上 pin 1 絲印修正方向
J1網頁讀到的座標與機械中心不同確認該讀數是游標位置,不是貼裝中心

原始 Gerber 與 JLCPCB CAM 生產稿頂層銅箔比較

圖 5:頂層銅箔比對,左為原始 Rev C,右為 JLCPCB CAM 生產稿。Agent 把每一層都對齊後逐像素比較,再分類差異。

生產稿比對是我覺得 Agent 最好用的一個環節。它把工廠回傳的 14 個 Gerber 和原始發行包對齊,逐層算差異:外層除了上面提到的一個過孔微移與少數局部銅邊擴張,沒有其他差異;內層只是工廠移除了沒有連到 GND 的孤立焊盤,沒有發現斷路。這是影像比對,不等於完整的網表證明,所以我們仍逐項向工程師確認。這些工作如果用人工對著兩張圖找,很容易漏看。

JLCPCB PCBA 貼裝確認頁面與靠近板邊的 R7 元件

圖 6:JLCPCB 的貼裝確認頁面,可以逐顆檢查元件位置、極性與料號。圖中為靠近板邊的 R7 與兩顆 LED。

PCBA 的貼裝確認頁可以切換 2D/3D,逐顆檢查位置和方向。我們檢查了 U1 的 pin 1、兩顆 LED 的極性、Q1 的方向和 J1 的位置,確認後才送出。要注意的是貼裝確認有時限,逾時未回覆會直接投產,所以收到通知後最好盡快處理。

訂單在 9 月 30 日投產,中間遇到工廠連假停工,10 月中收到板子並開始測試。

MAX-M10S GNSS PCB 裸板與 JLCPCB SMT PCBA 成品對照

圖 7:左為裸板,右為 JLCPCB SMT 組裝完成的 PCBA。MAX-M10S、天線座、ESD 與 0603 被動元件都已貼好。

排針是收到板子後自己焊的。這裡有一個小教訓:OSP 焊盤對 SMT 沒影響,但手焊排針時比較不容易上錫。所以之後需要手焊零件的板子,我改選無鉛噴錫(HASL)。

八、到貨實測:先收不到衛星,再一步步找原因

測試用 Raspberry Pi Pico 2 W 當主控,UART1 以 9600 baud 接模組,PPS 接 GPIO 中斷,Pico 的 USB 序列埠輸出狀態。韌體會轉發 NMEA,並用 UBX 指令讀取模組資訊(MON-VER、MON-RF、NAV-STATUS 等),這部分程式也是 CC 寫的。

  1. 通訊正常

    NMEA 句子持續輸入,沒有校驗錯誤,UBX 查詢也能正確讀到模組型號與韌體版本。

  2. 收不到衛星

    一開始可見衛星一直是 0。CC 加了 UBX-MON-RF 查詢,觀察天線接上與拔掉時 AGC 的變化:拔掉天線 AGC 會改變,插回又恢復。這代表 J1 到 RF_IN 的路徑是通的,不是開路或短路。CC 同時重新審查了 layout,RF 走線、D1 方向與接地都沒有問題。

    最後原因很單純:我手邊那支天線上標示需要 2.7–5 V 供電,是主動天線。這塊板依設計不提供天線電源,天線內的 LNA 沒有上電,當然收不到。中途我還誤拿了一支電視天線來測,那段數據也只能作廢。

  3. 換真正的被動 GNSS 天線

    上電後很快就追到第一顆 GPS 衛星。測試地點在窗邊,可見天空有限,等了一段時間後取得 3D 定位,PPS 也穩定以 1 Hz 輸出,PPS LED 跟著閃爍。

項目實測結果(窗邊、被動天線)
UART/NMEA正常,沒有校驗錯誤
3D 定位成功
PPS穩定 1 Hz
A-GNSS 回灌輔助資料全部被模組接受,定位時間縮短約 8 倍

MAX-M10S GNSS 取得 3D 定位時的 NMEA 輸出

圖 8:換上被動天線後,第一次取得 3D 定位時由 Pico 2 W 讀到的 NMEA 原始輸出(節錄 RMC、GGA、GSA 三句,未經改寫)。RMC 狀態為 A(定位有效),GGA 定位品質為 1、使用 4 顆衛星,GSA 模式為 3(3D 定位)。時間、日期、座標、高度、精度因子與校驗碼已遮蔽。

定位時間的部分,我們在韌體中加入了 A-GNSS 輔助:定位後把模組的星曆資料庫(UBX-MGA-DBD)與最後位置存進 Pico 的快閃記憶體,模組重新上電時再回灌。和沒有回灌的冷啟動相比,首次定位時間大約快了 8 倍。這只是在窗邊弱訊號環境下的少量樣本,當作方向性的參考,不是規格值。

九、經驗與限制

AI Agent 做得好的事

  • 查資料與對照: 腳位、電壓範圍、Integration Manual 的建議,Agent 能快速找到並標出出處,前提是你要求它附上頁碼或表號。
  • 寫腳本做驗證: 阻抗計算、pin-net 比對、Gerber 逐層比對、BOM/CPL 一致性檢查,寫成腳本後可以重跑,比一次性的「我看過了」可靠。
  • 處理繁瑣的製造資料: 匯出 Gerber、BOM、CPL、裝配圖,整理給工程師的問題清單。
  • 實測除錯: 從 AGC 的變化推論 RF 路徑是否接通,讓「收不到衛星」很快縮小到天線本身。

需要人把關的地方

  • 數值與公式: 本文提到的三次 RF 錯誤,都是 Agent 在「看起來很專業」的情況下犯的。重要數字一定要有可重跑的計算過程。
  • 規則本身: ERC/DRC 只能證明設計符合規則,規則寫錯時它不會告訴你。
  • 審查也會出錯: 審查報告會誤判阻擋問題,也會漏掉問題。所以審查結論同樣要附證據,由 owner 判斷。
  • 實體世界: 天線是主動還是被動、焊盤好不好上錫,這些都要拿到實物才知道。
  • 取捨與授權: 要不要拿掉 RTC 備援、要不要付款送單、要不要確認生產稿,都應該由人決定。

這塊板下一版會改的地方

  • 有兩條 I²C/SAFEBOOT_N 走線和兩個過孔位在模組正下方的頂層,Integration Manual 建議模組下方淨空,下一版會移開。
  • MHF I 天線座封裝的接地焊盤比原廠圖面偏了約 0.1 mm,雖然這次貼裝與實測都沒有影響,下一版仍會修正。
  • 若需要更快的冷啟動,可以考慮加回備援電源,改用可組裝的方案或接受手焊。

結語

這塊 25 × 36.5 mm 的小板,從 9 月初的 Rev A、三個版本、送廠到 10 月中實測定位,前後大約五週。這次的 Agent 並不是按一個鍵就畫出整塊板子。它比較像一個手很快、會寫腳本,但做完的東西需要被檢查的工程助手。我花最多心思的地方,反而是讓它的每一步都留下證據、讓另一個 Agent 和我能檢查。

JLCPCB 在這次專案中負責四層板製造與 SMT 組裝。對我來說最有幫助的是生產稿確認與貼裝確認這兩個環節,能在投產前看到工廠實際要做的東西,並和工程師直接溝通細節。

JLCPCB 包裝盒與 MAX-M10S GNSS PCB 及 PCBA 成品

圖 9:JLCPCB 外箱前的 MAX-M10S 驗證板,左為裸板,右為 PCBA。

這塊板的 KiCad 原始檔、製造檔、Agent 協作規範與相關 Skills 都整理在 pcb-agent-workflow,有興趣用 AI Agent 輔助 PCB 設計的讀者可以參考。如果想把自己的設計做出來,也可以透過 JLCPCB 下單打樣。

使用 JLCPCB 製作你的 PCB 與 PCBA

需要製作 PCB 或 SMT 組裝,可以透過作者的合作連結查看服務與報價。

查看服務與報價

持續學習