💡 PR:この記事の基板は JLCPCB の提供を受けています

この連載で作る基板の製造と部品実装は、JLCPCB 様の提供によるものです(製造費用に充てるクーポンの提供を受けました)。JLCPCB はこちら。

JLCPCB のロゴ

はじめに

このブログでは I2C や SPI の記事をいくつも書いてきましたが、載せられる波形はずっとオシロスコープの画面だけでした。オシロで見えるのは電圧の形までで、「このバイトは 0x76 番地への書き込み」というプロトコルとしての読みは画面に出せません。理由は単純で、ロジックアナライザを持っていないからです。

そこで、自分で作ることにしました。ゴールは次の1台です。

  • PulseView(sigrok)につないで、I2C・SPI・UART をデコードした画面を出せる
  • 16ch・入力は 1.8V〜5V のロジックをそのまま受ける
  • 中身は RP2040。PIO で GPIO をまとめて取り込み、USB で PC に流す
  • 0.4mm ピッチの QFN と 0402 のチップ部品を含むので、手はんだは諦めて JLCPCB の実装サービス(PCBA)に任せる
自作16chロジックアナライザ基板のKiCad 3Dレンダリング。上辺に2×16のピンヘッダ、その下にTXU0104が4個、中央にRP2040

設計が終わった基板(KiCad 10 の 3D ビュー)。上辺の 2×16 ヘッダが 16ch のプローブ入力、その下に並ぶ 4 個の IC がレベル変換、中央の QFN が RP2040。右端の USB-C は 3D モデルが無いので外形線だけ表示されている

第1回のこの記事では、何を載せてどう繋ぐかを決め、KiCad 10 で回路図と4層基板を仕上げ、JLCPCB に PCBA で発注するまでを扱います。回路図は手で描かず Python スクリプトから生成しました。自動配線ツール freerouting では、ビアを1個も打ってくれないという落とし穴にもはまりました。

🗓️ 連載「自作ロジアナ」(全3回予定)
  • 第1回 設計と発注(この記事) — 回路・KiCad 10・製造データ・JLCPCB PCBA の発注
  • 第2回 立ち上げ(基板到着後)— 開梱、電源と発振の確認、フロントエンドのしきい値をオシロで実測、PulseView とつなぐ
  • 第3回 実戦投入 — 手持ちの基板の I2C / SPI をデコードする。オシロとロジアナを同じ信号に当てて見比べる

📝 この記事でやること

  • ロジックアナライザと sigrok / PulseView の基礎、RP2040 で 16ch を取る仕組み
  • 入力回路の方式を、RP2040 の VIH は 2.0V という1つの数字で決めた話と、ファーム3種が同居するピン配置
  • 回路図をスクリプトで生成し、ERC・ネット照合・設計ルール検査の3段で確かめる方法
  • freerouting の落とし穴3つと、最後に人の手で仕上げた配線
  • JLCPCB 4層の設計値、BOM / CPL の作り方(Basic / Extended・回転補正)
  • PCBA の発注画面と費用
💡 対象読者

KiCad で2層基板を起こしたことがあって、次は QFN や 4 層、実装サービスまで踏み込みたい方を想定しています。ロジアナを買うか作るか迷っている方にも、中身の仕組みが分かるように書きます。


🧭 ロジックアナライザとは — オシロとの違いと、RP2040 で作れる理由

オシロは「形」、ロジアナは「中身」

ロジックアナライザ(ロジアナ)は、デジタル信号を 0 か 1 か だけで大量に記録する測定器です。オシロスコープが電圧の形を細かく見るのに対して、ロジアナは形を捨てる代わりに本数と長さを取ります。

オシロスコープ ロジックアナライザ
見るもの 電圧の波形(アナログ値) High / Low の並び(デジタル値)
ch 数 2〜4ch が普通(手持ちの OWON VDS3102L は 2ch) 8〜32ch 以上
得意なこと リンギング、立ち上がり、ノイズ、電源の揺れ 複数本の信号の時間関係、プロトコルのデコード
苦手なこと SPI の4本を同時に見る、長時間の記録 電圧レベルの異常(形はそもそも記録しない)

I2C なら SDA と SCL の2本で済むので、オシロでも波形は撮れます。ただ、「アドレス 0x76・書き込み・ACK」と読み下すのはロジアナとデコーダの仕事です。SPI は CS・SCK・MOSI・MISO の4本なので、2ch のオシロではそもそも同時に見られません。

sigrok と PulseView — デコーダは PC 側にある

sigrok はオープンソースの信号解析ソフト群で、PulseView はその GUI です。ロジアナ本体は「サンプリングして PC に送る」だけで、I2C や SPI の解読は PC 上の sigrok のプロトコルデコーダが受け持ちます。だから自作機でも、sigrok が話せるファームを載せれば、市販機と同じデコード画面が手に入ります。

💡 ワード解説:プロトコルデコーダ

取り込んだ 0/1 の列を、通信規格のルールに沿って「START・アドレス・R/W・ACK・データ」のような意味のある単位に読み下すソフトウェアです。sigrok では Python で書かれていて、I2C・SPI・UART をはじめ多数の規格が用意されています。

RP2040 で 16ch を取る仕組み

RP2040 には PIO(Programmable I/O)という、CPU とは別に動く小さな I/O 専用プロセッサが載っています。PIO は複数の GPIO をクロックごとにまとめて読み取れるので、GP0〜GP15 の16本を1命令で取り込み、DMA で RAM に流し込めます。CPU が1本ずつポーリングするのとは桁違いの速さで、これがロジアナ自作に RP2040 がよく使われる理由です。

flowchart TD T["測定対象
1.8V〜5V のロジック"] --> F["入力回路
100Ω + TXU0104
→ 3.3V に変換"] F --> P["RP2040 PIO
GP0〜15 を
まとめて取り込み"] P --> D["DMA
RAM のバッファへ"] D --> U["USB CDC
PC へ転送"] U --> S["PulseView
波形表示と
I2C/SPI/UART デコード"]

ファームウェアは自分では書きません。RP2040 用のオープンソース実装がいくつもあるので、基板をそれに合わせます。候補を4つ並べて比べました。

ファーム PulseView との接続 ch 使うピン 採否
sigrok-pico 専用ドライバ raspberrypi-pico。ただしリリース版 PulseView 0.4.2 には未収録で nightly 版が必要 最大 26(dig26) GP0〜22・GP26〜28 主力
μLA SUMP / OLS 互換(ols ドライバ)。リリース版で動く 16 GP0〜15 保険
dgatf/logic_analyzer_rp2040 SUMP 拡張(ols) 16 GP0〜15(GP18/19 は起動時設定) 動く
gusmanb/logicanalyzer PulseView にライブ接続できない(自前 GUI) 24 GP2 起点・GP0/1 はトリガ用 不採用

ハードウェアの完成度では gusmanb が最も高いものの、「PulseView で使う」という今回の要件に合いません。そこで sigrok-pico を主力にしつつ、GP0〜GP15 に CH0〜CH15 を素直に並べることにしました。こう並べると sigrok-pico(dig26)・μLA・dgatf の3つが無改造で動きます。nightly 版の PulseView でつまずいても、リリース版で動く μLA に書き替えればよい、という保険です。

⚠️ ch 数は 24 ではなく 16

「24ch」という区切りは gusmanb だけのものです。sigrok-pico なら 26ch、μLA / dgatf なら 16ch で、24 はどのファームの区切りとも合いません。26ch にすると μLA / dgatf が先頭 16ch しか使えないうえ、レベル変換 IC が7個に増えて基板も大きくなります。そこで 16ch にしました。


📐 回路 — 1つの数字で決まった入力回路

全体のブロック図

flowchart TD TGT["測定対象
1.8V〜5.5V"] --> J2["プローブ J2 +
直列 100Ω ×16"] J2 --> LS["TXU0104 ×4
A=VREF / B=3.3V"] USB["USB-C J1
+ ESD 保護"] -- "5V" --> LDO["LDO
AMS1117-3.3"] USB -- "5V" --> SW1["VREF 切替 SW1
3.3V / EXT / 5V"] LDO -- "3.3V" --> SW1 SW1 -- "VREF" --> LS LS -- "CH0〜15" --> MCU["RP2040
QFN-56"] LDO -- "3.3V" --> MCU USB -- "USB" --> MCU XT["水晶 12MHz"] --> MCU MCU -- "QSPI" --> FL["W25Q128JV
16MB"] MCU -- "OE" --> LS

構成は Raspberry Pi 公式の設計ガイド「Hardware design with RP2040」の最小構成(RP2040・W25Q128・12MHz 水晶・USB)に、16ch の入力回路と基準電圧の切り替えを足したものです。RP2040 のコア電源 1.1V はチップ内蔵の LDO が作るので、外付けの電源は 3.3V の LDO が1個だけです。

RP2040 16chロジックアナライザの回路図全体。左から電源とUSB、MCU、フロントエンド4ブロック、プローブヘッダ

回路図の全体(A3・1枚)。左から電源・USB、RP2040 とフラッシュ、入力回路 ×4、プローブヘッダ。生成スクリプトの出力なので部品の配置は機能優先

入力回路:直結では 1.8V が読めない

入力回路には候補が3つありました。決め手は、RP2040 の VIH=2.0V という1つの数字です。

方式 1.8V ロジック 5V ロジック 部品点数(16ch)
(a) 直列抵抗+クランプで RP2040 に直結 × 読めない △ 絶対最大定格ぎりぎり 48
(b) レベル変換 IC を挟む ○ ○ 28
(c) 高インピーダンスのバッファ+コンパレータ ○ ○ 100 超

RP2040 のデータシートによると、IOVDD = 3.3V のときの High 判定は 2.0V 以上です。1.8V ロジックの High は 1.8V 前後なので、直結ではどう頑張っても High と読めません。しかも RP2040 の GPIO は 5V トレラントではありません(絶対最大定格は IOVDD + 0.5V)。1.8V も 5V も受けるには、間にレベル変換を挟むしかありません。

💡 ワード解説:VIH(入力 High 電圧)

入力ピンが「High」と判定する電圧の下限です。ロジック IC は電源電圧で決まる境目を持っていて、相手の High がこの値に届かないと 1 と読めません。1.8V 系のセンサーを 3.3V マイコンに直結すると読めないことがあるのは、これが原因です。

挟む IC には TI の TXU0104PWR(4bit・一方向のレベル変換)を選び、4個で 16ch にしました。候補の SN74LVC8T245 なら2個で済んで IC 代も $1.4 安いのですが、TXU0104 には測定器として効く性質が3つあります。

TXU0104PWR(採用) SN74LVC8T245PWR
入力 シュミットトリガ シュミットなし(3.3V で遷移は 10ns/V より速くと規定)
未接続の入力 内蔵プルダウンで 0 に固定 外付けプルダウンが 16 本必要
電源範囲 1.08〜5.5V 1.65〜5.5V
最大データレート(この基板の向き) 5V→3.3V で 125Mbps、1.8V→3.3V で 100Mbps 規定なし

ロジアナは、長いジャンパ線でなまった波形を掴む道具です。なまった波形で多重エッジが出ると、測定器のほうが嘘をつきます。シュミットトリガ入力と、プローブを挿していない ch が 0 で落ち着く内蔵プルダウンは、その対策としてそのまま効きます。なお、GitHub の gusmanb/logicanalyzer も同じ TXU0104 を載せて 100Msps で出荷しています。部品選定の裏付けとして参考にしました(回路図とレイアウトは流用していません)。

TXU0104の1ブロック分の回路図。CH0〜CH3の入力が100Ωを通ってA1〜A4へ、B1Y〜B4YからD0〜D3へ出る。VCCAはVREF、VCCBは+3V3

入力回路 1 ブロック(4ch 分)。プローブ → 100Ω → TXU0104 の A 側(VCCA = VREF)→ B 側(VCCB = 3.3V)→ RP2040 の GPIO。OE は 4 個共通で GP23

1ch あたりの構成は プローブ → 100Ω → TXU0104 だけです。100Ω は事故のときの電流制限と反射の抑制が役目で、TXU0104 の入力容量 4pF との時定数は 0.4ns。帯域はほとんど削りません(1kΩ にすると 4ns になり、100MS/s に効いてくるので避けました)。

基準電圧 VREF:スイッチの並び順が回路の一部

TXU0104 の入力しきい値は、A 側の電源 VCCA に追従します。つまり VCCA を測定対象の電源電圧に合わせるのが正しい使い方です。そこで VCCA をまとめて VREF とし、スライドスイッチ SW1 で 3.3V(基板内)/ EXT(外部ヘッダ J3)/ 5V(USB) から選べるようにしました。

VREF切替スイッチSW1の回路図。コモンがピン1、ピン2が+3V3、ピン3がVREF_EXT、ピン4が+5V

SW1 の結線。コモン(ピン 1)が VREF、接点はピン 2 = 3.3V・ピン 3 = EXT・ピン 4 = 5V の順

SW1 では接点の並び順が効きます。採用したスライドスイッチ SK13D07VG5 は、データシートの図に SCHEMATIC (SHORTING) と書かれた shorting 型。切り替えの途中で、隣り合う2接点が一瞬つながるタイプです。

flowchart TD subgraph NG["✗ 3.3V と 5V を隣に置くと"] direction LR A1["3.3V(LDO 出力)"] --- A2["5V(USB)"] end subgraph OK["✓ 採用:間に EXT を挟む"] direction LR B1["3.3V"] --- B2["EXT(ふだんは未接続)"] --- B3["5V"] end NG ~~~ OK

3.3V と 5V を隣に置くと、スライドするたびに LDO の出力と USB の 5V が直結し、3.3V レールが RP2040 の上限 3.63V を超えて持ち上がります。間に EXT を挟めば、この2つは決して隣り合いません。部品代ゼロの対策です。

そのほかの決定事項

項目 決めたこと 理由
層数 4層 16本の高速入力の真下に、切れ目のない GND 層を置くため。公式ガイドも応用基板では 4層 1.6mm を選んでいる
水晶 ABM8-272-T3(12MHz) 公式推奨品。Basic の安い品は ESR / 負荷容量の確認が要る。発振しない基板ほど記事にしづらい失敗は無いので、Extended の手数料を払って既知良品に
水晶のダンピング抵抗 1kΩ を XOUT 側 公式ガイドの本文にはどちら側か書かれておらず、公式の KiCad 回路図を読んで確定
フラッシュ W25Q128JVSIQ(16MB) RP2040 が扱える最大容量で、公式と同じ型番。JLCPCB の Basic 部品なので追加の段取り費がかからない
USB 27Ω 直列 ×2、CC1 / CC2 に 5.1kΩ を各1本 CC 抵抗が無いと USB-C から 5V が来ない
枚数 5枚 壊す用・常用・テスト信号発生器用・予備2。段取り費は固定なので 2枚と 5枚の差は小さい
手はんだ 2.54mm ヘッダ 2点と SW1 だけ THT 部品は PCBA に出すと手はんだ工賃が乗るうえ、ケースに合わせて向きを変えたくなる

発注前の回路図レビューで見つかった4点

ERC がエラー 0 でも、回路として正しいとは限りません。発注前に回路図レビューをかけ、4点の指摘を受けました。回路は変えず、使い方と手順の側で潰しています。

# 指摘 対応
1 sigrok-pico の配布版 pico_baseline.uf2 は GP0 を UART TX として出力駆動する。GP0 には TXU0104 の出力が直結なので、出力どうしがぶつかる 書き込むのは pico_dig26.uf2 に統一(UART 無効・GP0〜15 は入力)。baseline は使用禁止
2 AMS1117 のデータシートが保証する出力コンデンサは 22µF タンタルだけ。今回の 10µF セラミックでの安定性は規定が無い そのまま発注し、到着後に 3.3V レールをオシロで観測して確かめる。発振したら 22µF タンタルへ載せ替え
3 外部 VREF(J3)をつないだまま SW1 を動かすと、切り替えの途中で外部電源と内蔵電源が一瞬つながる 運用で回避:J3 を外す → SW1 を選ぶ → つなぐ
4 dgatf ファームの GP18 / GP19 の説明が逆だった 文書を修正(GP18 = GND でデバッグ出力、GP19 = GND でレベルトリガ)

1番は、ネットリストの検査では原理的に見つからない種類の問題です。回路は仕様どおりに繋がっていて、ぶつかるのはファームが GPIO をどう設定するかのほう。上流のソース(sr_device.h の UART_EN 1)を読まないと分かりません。2番は第2回で実測し、結果をそのまま書きます。


🖥️ KiCad 10 を GUI なしで — 回路図は Python から生成した

なぜ手で描かなかったのか

回路図は KiCad の GUI で描き始めていました。ただ、部品を置いてラベルを貼っていく作業は時間がかかるうえ、描き終えても「仕様どおりに繋がっているか」を目で確かめるしかありません。そこで方針を変え、AI エージェント(Claude Code)と一緒に、回路図を丸ごと出力する Python スクリプトを書くことにしました。KiCad 10 のファイルは S 式のテキストなので、書式さえ合わせれば KiCad が読める回路図をプログラムで作れます。

流れはこうなりました。

flowchart TD SPEC["SPEC.md
ピン割り当て・部品表"] --> GS["gen_schematic.py
回路図を生成"] GS --> SCH[".kicad_sch"] SCH --> ERC["① kicad-cli ERC
エラー 0 / 警告 0"] SCH --> NET["② ネットリスト照合
期待 88 本と一致"] SCH --> K5["③ 設計ルール検査
17 項目 PASS"] ERC --> PCB["gen_pcb.py
配置・USB 手配線"] NET --> PCB K5 --> PCB PCB --> FR["freerouting
自動配線"] FR --> GUI["GUI で手直し
DRC 0・未配線 0"] GUI --> OUT["make_outputs.py
Gerber / BOM / CPL"]

スクリプトの中身は、要点だけ書くと次のとおりです。

  • KiCad 標準ライブラリと自作ライブラリからシンボルを読み、回路図ファイルに埋め込む(派生シンボルは KiCad と同じ規則で平坦化する)
  • 結線はピン端から短い線を出してネット名のラベルを付けるだけ。部品を GUI で動かしても、つながりはラベルで決まるので変わらない
  • UUID は固定の名前空間から作るので、何度実行しても同じファイルになる
  • --selftest で抵抗を 0°/90°/180°/270° に置き、ピンの位置を kicad-cli のネットリストで実測して回転の計算を確かめる

検証は3段:ERC だけでは足りない

生成した回路図は、次の3段で確かめています。

段 何を見るか 結果
① ERC(kicad-cli sch erc) 未接続ピン、出力どうしの衝突、ライブラリとの不一致 エラー 0 / 警告 0
② ネットリスト照合 kicad-cli が出したネットリストを、仕様書から作った期待表(どのピンがどのネットか)と突き合わせる 88 本すべて一致
③ 設計ルール検査 「RP2040 の電源ピンに 100nF が 10 個」「水晶の 1kΩ は XOUT 側」「SW1 の接点順」などを、ネットリストから機械的に判定 17 項目 PASS

ERC は「書かれた回路が電気的に矛盾していないか」しか見ません。仕様どおりかどうかは、仕様から作った期待表と比べて初めて分かります。とはいえ期待表も同じ仕様から作っているので、仕様そのものの誤りまでは拾えません。そのため、発注前に回路図レビューもかけました。

スイッチの罠を、シンボルの自作で先に潰した

生成の途中で、ERC では絶対に出ない罠を2つ見つけています。どちらもスイッチのピン番号です。

部品 KiCad 標準シンボルのまま使うと 対処
スライドスイッチ SW1(SK13D07VG5) 標準の SW_SP3T はピン 3 がコモン。実物はピン 1 がコモンなので、VREF の切り替えが成り立たない データシートどおりのピン番号でシンボルを自作
タクトスイッチ SW2 / SW3(TS-1187A) 2 ピンの SW_Push を 4 パッドのフットプリントに当てると、内部で常時つながっているパッド 1–2 をまたいで配線してしまい、ボタンが常時押された状態になる 4 パッド全部にネットを付けた自作シンボル

タクトスイッチのほうは、前に作った ESP32-S3 センサー基板で実際に踏んで、部品を 90 度回して載せ直した罠です。今回は発注前に潰せました。

基板の生成と freerouting

基板も同じように gen_pcb.py で生成しました。65 × 45mm・4層(L1 信号 / L2 GND / L3 電源 / L4 信号)に部品を並べ、USB の差動ペアだけはスクリプトで手配線し、locked で固定しておき、残りを自動配線ツールの freerouting に任せる、という段取りです。

ところが、1回目の freerouting は、未配線 221 ネットのうち 72 ネットを残して止まりました。結果を見ると、配線がほとんど表面にしかありません。

freeroutingの1回目の結果。表面にまばらな配線があるだけで、多くの接続が未配線のまま

freerouting の 1 回目。ビアが 1 個も打たれず、表面(F.Cu)だけで引こうとして 72 本が未配線のまま残った

原因を追うと、落とし穴が3つ見つかりました。

落とし穴①:ビアを1個も打たない — (wire_keepout) が宣言を巻き込む

内層を「配線禁止・ビアは可」にするため、KiCad のルールエリアを置いていました。KiCad はこれを freerouting 用の DSN ファイルに (wire_keepout ...) と書き出します。ところが freerouting はこのキーワードを知らず、中身を読み飛ばすときに、直後にある (via ...) の宣言まで一緒に失っていました。使えるビアが 0 種類になるので、全層でビアが打てず、表面1層だけで引こうとしていました。

DSN から (wire_keepout ...) を取り除くだけで、2パス目から 24 個のビアが打たれました。最初は電源プレーンがビアを塞いでいると疑ったのですが、freerouting のソースを読むとプレーンは他ネットのビアを通す扱いになっていて、こちらは無関係でした。

落とし穴②:固定した配線が「未接続」に見える — 座標の丸め

KiCad は DSN を書き出すとき、配線とビアの座標を 1µm に丸める一方、パッドの位置は 0.1µm で書きます。QFN のパッド中心は 0.4mm ピッチの半端な位置(例:3437.5µm)にあるので、パッドから出した固定配線が freerouting から見ると 0.5µm 離れていて、つながっていないように見えます。freerouting はそれを埋めようとして例外を出し続け、未配線が減りませんでした。DSN の配線部分を、基板の配線から 0.1µm 精度で書き直して解消しています。

落とし穴③:取り込むとビアの穴径が変わる

freerouting の結果(SES ファイル)を KiCad に取り込むと、既存ビアの穴径がネットクラスの値に書き換わります。外径 0.45mm のビアに 0.35mm の穴が開き、銅の輪(アニュラリング)が細すぎて DRC エラーになりました。取り込んだあとは DRC のアニュラリングを必ず見る、が教訓です。

QFN-56・0.4mm ピッチの出口と、16本の並び

自動配線では、RP2040 まわりが最後まで残りました。0.4mm ピッチの QFN はパッド幅 0.2mm・パッド間 0.2mm で、0.15mm の線をパッドの間に通す余地がありません。どの線もパッドから外向きに真っ直ぐ出るしかなく、ピン正面にビアを打つと両隣の出口を塞ぎます。0.5mm 幅の電源線はそもそもピッチに入らないので、最後の 1.5mm だけ 0.2〜0.25mm に絞って入れました。1.1V のコア電源(DVDD)は数十 mA なので、0.25mm のネットクラスを別に作っています。

もう1つは並び順の問題です。プローブヘッダは左から CH0→CH15、RP2040 を上向きに置くと GPIO0 は右端に来ます。つまり ヘッダと RP2040 で並びが逆向きで、間にストレートなレベル変換 IC を挟む以上、どこかで 16 本を交差させる必要があります。このため、後の配線図ではヘッダと TXU0104 のあいだの線が入り組んでいます。

最後は人の手で仕上げた

freerouting の最良の結果は、未配線 19 本・DRC エラー 0 まででした。残りの 19 本は、QFN からの出口の引き方を指定して GUI で引き、補助スクリプトで裏面の GND ベタと外周のビア打ち(22 個)を足して仕上げています。

完成した基板の配線図。赤が表面、青が裏面の配線。中央のRP2040から上の4個のTXU0104、右のフラッシュとUSB-Cへ配線が伸びる

配線の完成形(赤 = 表面 F.Cu、青 = 裏面 B.Cu。ベタとシルクは省略)。内層の L2 は全面 GND、L3 は電源

項目 値
配線 778 区間
ビア 181 個
DRC エラー 0
未配線 0
残した警告 シルク関係 47 件(基板端・パッド上・文字の重なり)

シルクの警告は機能に関係しないので残しました。パッドにかかったシルクは製造時に削られます。

発注直前の手直し:ビアの穴を 0.25mm → 0.3mm に

最後にもう1つ手を入れています。JLCPCB の注文画面では、最小ビアの選択肢が 「0.3mm/(0.4/0.45mm)」 になっていました。設計は穴 0.25mm・外径 0.45mm だったので、穴を 0.3mm に広げて注文条件に揃えました(外径 0.45mm は据え置き、148 個)。

ただ、穴だけを広げると、従来の「穴と銅の距離 0.25mm」のルールに 135 件引っかかります。JLCPCB の公表値ではビア穴と銅の最小距離は 0.20mm なので、ビアにだけ 0.225mm のカスタムルールを当て、DRC エラー 0・未配線 0 に戻しました。ルールを緩めて警告を消したのではなく、製造条件に合わせてルールを更新しました。


🏭 JLCPCB 4層の設計値と製造データ

KiCad に入れた設計値

JLCPCB の公式の製造能力表(4層・外層 1oz)をもとに、限界値ではなく余裕を取った値を Board Setup に入れています。

項目 JLCPCB の限界 この基板の値
スタックアップ — JLC04161H-7628(1.6mm。外層の下 0.2104mm に内層)
最小トラック幅 / クリアランス 0.09mm / 0.09mm 0.15mm / 0.15mm
ビア(外径 / 穴) 0.25mm / 0.15mm 0.45mm / 0.30mm(電源系は 0.65 / 0.35)
シルク線幅 0.15mm 0.15mm
基板端から銅まで 0.2mm 0.3mm
USB 差動ペア — 幅 0.30mm / 間隔 0.15mm(90Ω 狙い)

USB の線幅は、公式ガイドの「1mm 厚 2層なら 0.8mm 幅で約 90Ω」をそのまま使えません。4層ではすぐ下 0.21mm に GND 層が来るので、同じインピーダンスを出す線はずっと細くなります。7628 スタックアップの外層で、エッジ結合マイクロストリップの近似式(IPC-2141)から 0.30 / 0.15mm を出しました。

製造データは3ファイル

JLCPCB の PCBA に出すのは、次の3つです。すべて kicad-cli とスクリプトで出力しています。

ファイル 中身
Gerber の zip 銅4層・マスク・シルク・ペースト・外形の Gerber と、ドリル(Excellon、PTH / NPTH を分けて出力)
BOM(bom-jlcpcb.csv) 19 行。全行に JLCPCB(LCSC)の部品番号が入っている
CPL(cpl-jlcpcb.csv) 68 行。実装する部品の座標・回転・面

回路図の 82 部品は、次のように振り分けました。82 = 68 + 3 + 2 + 9 で、取りこぼしは 0 件です。

扱い 部品 点数
PCBA で実装 RP2040・フラッシュ・TXU0104 ×4・LDO・ESD・水晶・USB-C・タクト SW・LED・抵抗・コンデンサ 68
手はんだ(THT) プローブヘッダ J2・EXT ヘッダ J3・スライドスイッチ SW1 3
実装しない(DNP) アナログ用ヘッダ J4・QSPI_SS のプルアップ R23 2
部品なし テストパッド TP1〜TP9(GP16〜22・SWD) 9

Basic と Extended — 1種類ごとに段取り費がかかる

JLCPCB の部品には Basic(常時フィーダに載っている定番品)と Extended(使うたびにフィーダを掛け替える品)があります。Economic PCBA では、Extended 部品は1種類ごとにフィーダの段取り費 $3.07 がかかります(2026年9月時点の公開料金)。個数ではなく種類で数えるので、Basic で済むところは Basic を選ぶのが定石です。

区分 種類 この基板で使ったもの
Basic 12 W25Q128・AMS1117・タクト SW・LED・100nF・1µF・15pF・10µF・100Ω・5.1kΩ・1kΩ・10kΩ
Extended 6 RP2040・TXU0104・USB-C・USBLC6・水晶 ABM8-272-T3・27Ω

27Ω には Basic 品がありませんでした。JLCPCB の部品 API で 0402 の 27Ω を洗うと、400 件以上あって Basic が1件もありません。USB の直列終端なので外せず、ここで Extended が1種類増えました。

✅ 区分と在庫は API で引ける

JLCPCB の部品詳細は、ブラウザと同じ公開 API で取れます。componentLibraryType が base なら Basic、expand なら Extended です。「汎用品だから Basic だろう」という思い込みは、27Ω のように外れることがあります。発注前に BOM の全行を機械的に引いておくと安心です。

CPL の回転補正

KiCad のフットプリントと JLCPCB の部品データは、0° の向きの定義が部品ごとに違うことがあります。そのまま出すと、IC が 90° や 180° 回って載ってしまいます。そこで、KiCad 向けの定番プラグイン Fabrication Toolkit と同じ補正表(フットプリント名ごとの補正角)を当てました。

部品 フットプリント KiCad の回転 補正 CPL に書いた回転
RP2040(U1) QFN-56 −90 +90 0
フラッシュ(U2) SOIC-8 0 +270 270
TXU0104(U3〜U6) TSSOP-14 −90 +270 180
LDO(U7) SOT-223 0 +180 180
ESD(U8) SOT-23-6 0 +180 180
USB-C(J1) HRO TYPE-C-31-M-12 90 表に規則なし 90

補正表に載っていない USB-C と LED の極性は、注文画面の部品配置プレビューで目視するしかありません。KiCad が出す Y 座標は負になりますが、JLCPCB の公式手順も列名を変えるだけで座標は変換していないので、そのまま出しています。

⚠️ kicad-cli の `--exclude-fp-th` は USB-C まで落とす

位置ファイルから THT 部品を除く kicad-cli pcb export pos --exclude-fp-th は、固定用の THT ピンを持つ SMD コネクタ(今回の USB-C)まで一緒に除外します。CPL から USB-C が消えると、JLCPCB 側では実装されません。今回は THT 込みで出力し、基板ファイルの部品属性(smd / through_hole / dnp)を読んで SMD だけを残しました。


🛒 JLCPCB に PCBA で発注する

アップロードから部品確認まで

【人間記入:以下の手順に、スクリーンショットを差し込む。各画像の撮り方は handoff の一覧を参照】

  1. Gerber の zip をアップロード。4層・65 × 45mm が自動で認識されることを確かめる 【人間記入:スクショ①アップロード直後の画面(寸法・層数の自動認識が見える状態)】
  2. PCB の仕様を選ぶ:枚数 5・4層・厚さ 1.6mm・スタックアップ JLC04161H-7628・最小ビア 0.3mm/(0.4/0.45mm) 【人間記入:スクショ②PCB オプション(層数・スタックアップ・ビア)】
  3. PCB Assembly を ON:Economic・実装面 Top・枚数 5 【人間記入:スクショ③PCBA オプション】
  4. BOM と CPL をアップロードし、19 行すべてが JLCPCB の部品に当たっているか確認する。27Ω など Extended の行も含めて在庫切れが無いこと 【人間記入:スクショ④部品確認画面(Basic / Extended の表示が見える状態)】
  5. 部品配置のプレビューで向きを目視:RP2040 の1番ピン、TXU0104、SOT-223 のタブ、USB-C、LED の極性 【人間記入:スクショ⑤部品配置プレビュー(RP2040 と TXU0104 の付近を拡大)】
  6. 配送方法を選び、クーポンを適用して決済 【人間記入:スクショ⑥カートの内訳 ⑦クーポン適用後の決済画面(個人情報・注文番号・クーポンコードはマスク)】

【人間記入:プレビューで向きの修正が要った部品があれば、ここに1〜2文で】

費用

【人間記入:最終の決済画面の値で確定させる。下表は 2026-09-21 のカート(ビア 0.3mm 変更前の見積り)の値】

項目 金額
PCB(4層・5枚) $8.00
PCBA(Economic・5枚、部品代込み) $65.98
送料 $17.06
合計 $91.04
クーポン 【人間記入】
支払額 【人間記入】

PCBA の内訳のうち、手数料の部分は JLCPCB の公開料金(2026年9月時点)から計算できます。

手数料 公開料金 この基板
セットアップ費(Economic) $8.18 $8.18
ステンシル $1.53 $1.53
実装費 $0.0016 / はんだ点 約 280 点 × 5枚 ≒ $2.24
Extended の段取り費 $3.07 / 種類 6種類 = $18.42

残りのほとんどが部品代で、RP2040 とフラッシュ、TXU0104 ×4 が大半を占めます。手数料の中では、Extended の段取り費がセットアップ費の2倍以上あります。Basic で済む部品を1種類でも増やすと、そのまま効いてきます。


💭 所感:配線より「前」と「後」が面白かった

📌 技術者として思ったこと(ここは意見です)

配線そのものより、その前の設計と後の検証が結果を左右しました。

前は、数字で決まる設計です。入力回路は「VIH 2.0V」の一行で方式が決まり、SW1 の接点順は「shorting 型」の一語で決まりました。ピン配置も、ファーム4種のソースを重ねたら GP0〜15 しか答えがありませんでした。迷う余地が無いところまでデータシートとソースを読むと、設計はむしろ速く進みます。

後は、検証の層の厚さです。ERC 0、期待ネット 88 本一致、設計ルール 17 項目 PASS、DRC 0。これだけ揃えても、ファームが GP0 を出力にする問題は人のレビューでしか出てきませんでした。機械の検査は「書いたとおりか」を見るもので、「書いたことが正しいか」は別の目が要ります。前の基板でタクトスイッチを踏んだ経験が、今回は発注前のシンボル自作に変わりました。同じ罠を二度踏まずに済むのは、記録を残しておいた効用だと思います。

freerouting の3つの落とし穴は、どれもツールとツールの境目(KiCad → DSN → freerouting → SES → KiCad)で起きていました。どちらのツールも単体では正しく動いていて、受け渡しのときだけ情報が欠けます。自動化を組むときは、境目のファイルを開いて中身を読むのが早道です。


⚠️ この基板を使うときの注意

同じデータで作る方のために、壊さないための約束をまとめておきます。

# 約束 理由
1 ファームは pico_dig26.uf2 を書く。配布の pico_baseline.uf2 は書かない baseline は GP0 を UART TX として出力にし、CH0 の TXU0104 出力とぶつかる
2 J3(外部 VREF)を外してから SW1 を切り替える shorting 型なので、切り替えの途中で外部電源と内蔵電源が一瞬つながる
3 プローブ入力と EXT は 0〜5.5V まで 過電圧・負電圧の保護回路は無い(100Ω の直列抵抗だけ)
4 1.8V ロジックを読むときは VREF も 1.8V にする(EXT に供給) TXU0104 のしきい値は VREF に追従する
5 VREF を選ばずに(EXT・未接続で)使うと全 ch が反応しない VREF = 0V のとき TXU0104 の出力は Hi-Z。故障ではない

sigrok-pico は、リリース版の PulseView 0.4.2 では動きません(nightly 版が必要)。入れ方は第2回で扱います。


✅ まとめ

📌 この記事のポイント
  • ロジアナの自作は RP2040 の PIO+PC 側の sigrok デコーダという分業で成り立つ。基板はファームに合わせ、GP0〜15 に並べると3つのファームが無改造で動く
  • 入力回路は RP2040 の VIH 2.0V で決まる。直結では 1.8V が読めないので、シュミット入力・内蔵プルダウンの TXU0104 を挟む
  • shorting 型スイッチで電源を選ぶなら、接点の並び順が回路の一部。3.3V と 5V の間に EXT を置く
  • 回路図はスクリプトで生成し、ERC・期待ネット照合・設計ルール検査の3段で確かめた。それでもファームとの衝突はレビューでしか見つからなかった
  • freerouting の落とし穴は (wire_keepout) がビア宣言を巻き込む・座標の 1µm 丸め・SES 取り込みで穴径が変わるの3つ
  • JLCPCB の Economic PCBA は Extended 1種類ごとに段取り費。0402 の 27Ω には Basic が無い。CPL の回転は補正表を当て、残りはプレビューで目視

基板が届いたら、第2回は立ち上げです。電源を入れる前のショート確認から、3.3V レールの発振チェック(レビュー指摘2の答え合わせ)、水晶の発振、RPI-RP2 ドライブが見えるまで。そのあとオシロだけでフロントエンドのしきい値を実測し、PulseView で最初の波形を出します。第3回では、手持ちの基板の I2C と SPI をこの1台でデコードします。


よくある質問(FAQ)

Q: 市販の安いロジアナを買うのと比べて、作る意味はありますか?

A: 8ch・24MHz 級の安価な機種なら、買ったほうが安く早いです。自作の意味は、1.8V〜5V を VREF で受ける入力回路、16ch、PulseView のデコードを、中身が全部分かる形で手に入れられることです。設計データは公開予定なので、同じ基板を発注して追体験できます。

Q: なぜ Raspberry Pi Pico をそのまま使わないのですか?

A: Pico でも sigrok-pico は動きます。ただ Pico の GPIO は 3.3V 専用で、1.8V ロジックは High と読めず、5V は定格を超えます。16ch 分のレベル変換と VREF 切り替えを載せるなら、RP2040 ごと1枚の基板にしたほうが配線も GND も素直になります。

Q: 回路図をスクリプトで生成すると、あとから GUI で直せますか?

A: 直せます。出力は普通の .kicad_sch なので、KiCad でそのまま開けます。つながりはネットラベルで決まっているので、GUI で部品を動かしても結線は変わりません。ネットが変わる修正だけはスクリプト側に入れて再生成する運用にしています。

Q: freerouting がビアを打たないときは、まず何を見ればいいですか?

A: DSN ファイルを開いて、(wire_keepout が (via の宣言より前に無いかを見てください。KiCad のルールエリアを置いているとこの形で書き出されます。取り除いて freerouting を回し直すと、ビアが使えるようになります。

Q: JLCPCB の Economic PCBA と Standard PCBA は、どちらを選べばいいですか?

A: 試作の数枚なら Economic が安く済みます。セットアップ費が $8.18(Standard は片面 $25.56)で、段取り費は Extended 部品にだけかかります。発注枚数の上限は 50 枚です。


関連記事


参考