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

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

JLCPCB のロゴ

はじめに

第2回で立ち上げた RP2040 の 16ch ロジックアナライザを、今回から手持ちの基板のデバッグに使います。ゴールは、このロジアナが「どこまで信じられるか」を数字で持っておくことです。1.8V のロジックは読めるのか。何 MS/s までなら、画面に出た波形をそのまま信じてよいのか。16ch を全部使ったとき、一度に何 ms 取れるのか。この 3 つが分かっていれば、見慣れない波形が出たときに「ロジアナの限界か、相手の回路の問題か」を迷わずに切り分けられます。

そこで今回は、しきい値を雑音の少ない入力で測り直し、UNO R4 WiFi で作った 12MHz と 24MHz の矩形波をサンプリングレートを変えながら取り込みました。そのうえで、74HC595 の LED 基板に送る SPI、UART の文字列、サーボの PWM を、PulseView のデコーダで読みます。

確かめること 何を見れば言えるか 結果
1.8V ロジックを読めるか EXT 1.8V でのしきい値(VT+ / VT−) 読める。VT+ 1.399V・VT− 0.732V
第2回のしきい値は正しかったか 雑音の少ない入力で、3.3V・5V 位置を測り直す 第2回の「帯」は入力の雑音。3.3V 位置は VT+ 2.401V
何 MS/s まで信じられるか 12MHz・24MHz の矩形波を、レートを変えて取ったときの見え方 最高 120MS/s。信号がレートの半分を超えると化ける
何チャネルで何 ms 取れるか 16ch・120MS/s で、サンプル数を増やしたときに取れた長さ 10 万サンプル(約 0.84ms)まで
実際の通信を読めるか SPI・UART・サーボ PWM が値/文字/パルス幅に読み下されるか 読める。設定が違うと別の値に化ける
📌 この記事の結論(先に4行で)
  • 1.8V ロジックは、SW1 を EXT にして J3 に 1.8V を入れれば読める。VT+ 1.399V・VT− 0.732V で、0.05V 刻みの掃引ではトグルする帯が出なかった
  • 周波数を正しく読めるのは、信号がサンプリングレートの半分より低いとき。12MHz は 120・60MS/s で正しく、20MS/s では 8MHz に化けた。24MHz を 8MS/s で取ると、ほぼ何も無いように見えた。選べる最高は 120MS/s
  • 16ch・120MS/s なら 10 万サンプル(約 0.84ms)まで一度に取れた。それ以上を指定すると、エラーは出ずに約 0.45ms で打ち切られる
  • SPI・UART・サーボ PWM は、デコーダの設定が送る側と合っていれば値として読めた。74HC595 に送った 0x0F、UART の文字列、サーボのパルス幅 約 2.40ms/0.50ms。Bit order やボーレートが違うと、同じ波形が F0 や「00 と Break の列」に化ける
🗓️ 連載「自作ロジアナ」(全3回)
  • 第1回 設計と発注 — 回路・4層基板・製造データ・JLCPCB PCBA の発注
  • 第2回 立ち上げ — 開梱と手はんだ、スイッチの改修、電源と発振の確認、入力しきい値の実測、PulseView で最初の I2C
  • 第3回 実戦投入(この記事) — 1.8V のしきい値、サンプリング上限と時間窓、SPI・UART・サーボ PWM のデコード

🧭 ロジアナで「読む」とは — サンプリング定理と折り返し

ロジアナは、決まった間隔で 0 か 1 かを拾うだけ

ロジアナは、入力がしきい値より上か下かを、決まった間隔(サンプリングレート fs)ごとに 0 か 1 で記録する測定器です(オシロとの違いは第1回の「ロジックアナライザとは」で書きました)。画面の波形は、その 0 と 1 を横に並べて線でつないだものです。サンプルとサンプルの間に何が起きていたかは、記録されていません。

このため、ロジアナが描いた波形を信じてよいかどうかは、次の 2 つで決まります。

  1. 0 と 1 の境目(しきい値)が、相手の信号の電圧に合っているか
  2. 信号の速さに対して、サンプルの間隔が十分に細かいか

1 つ目は第2回で測ったシュミットトリガのしきい値の話、2 つ目がサンプリング定理の話です。

💡 ワード解説:シュミットトリガのしきい値(第2回のおさらい)

この基板の入力に使っている TXU0104 はシュミットトリガ入力です。Low から High に変わる電圧 VT+ と、High から Low に戻る電圧 VT− が別にあり、その差 ΔVT(ヒステリシス) の間では前の状態を保ちます。しきい値は入力側の電源 VCCA(この基板では VREF)に応じて上下するので、VREF を相手の電源電圧に合わせるのが使い方の基本です。

サンプリング定理とナイキスト周波数

一定の間隔で拾った点から元の信号の周波数を正しく読めるのは、信号の周波数 f がサンプリングレート fs の半分より低いときです。この半分の値をナイキスト周波数と呼びます。

f_N = \frac{f_s}{2}
💡 ワード解説:サンプリング定理・ナイキスト周波数・エイリアス

サンプリング定理は、「信号に含まれる周波数がナイキスト周波数(fs の半分)より低ければ、サンプル列から元の信号を取り戻せる」という定理です。逆に、ナイキスト周波数より高い成分は、サンプル列の上ではもっと低い別の周波数と区別がつかなくなります。この化けた周波数をエイリアス(折り返し)と呼びます。ロジアナはエイリアスでも、きれいな矩形波として描きます。画面だけを見ていると、間違っていることに気づけません。

化けた先の周波数は「折り返し」で計算できる

ナイキスト周波数より高い信号が何 Hz に見えるかは、次の式で計算できます。k は、結果が fs/2 以下になるように選ぶ整数です。

f_{\mathrm{alias}} = \left| f - k \cdot f_s \right|

判断の流れを図にすると、次のようになります。

flowchart TD A["信号 f を
レート fs で取る"] --> B{"f は fs/2
より低い?"} B -- "はい" --> C["周波数は正しく読める
デューティは ±1 サンプル"] B -- "いいえ" --> D{"f が fs の
整数倍?"} D -- "いいえ" --> E["別の周波数に化ける
(エイリアス)"] D -- "はい" --> F["ほぼ一定値に見える
(DC かうなり)"]

今回の実験で使った組み合わせを、この式で計算しておきます。

信号 f レート fs ナイキスト fs/2 計算 見かけの周波数
12MHz 120MS/s 60MHz ナイキストより低い 12MHz(正しい)
12MHz 20MS/s 10MHz 12 − 1×20 = −8 → 絶対値で 8 8MHz に化ける
12MHz 8MS/s 4MHz 12 − 1×8 = 4 4MHz(ナイキストちょうど)
24MHz 8MS/s 4MHz 24 − 3×8 = 0 0Hz(整数比)

最後の行のように、信号がレートのちょうど整数倍だと、毎回同じ位相を拾うので、見かけはずっと High かずっと Low になります。実際には信号源とロジアナのクロックがわずかにずれているので、拾う位相がゆっくり流れ、ときどきエッジをまたいで短いトグルが出ます。これが「うなり」です。

1 サンプルごとに位相がどれだけ進むかを追うと、化ける理由が見えます。12MHz を 20MS/s で取ると、1 サンプル(50ns)の間に信号は 0.6 周期進みます。前半(位相 0〜0.5)を High として並べると、次のとおりです。

サンプル 時刻 位相(周期の何割か) 値
0 0ns 0.05 1
1 50ns 0.65 0
2 100ns 0.25 1
3 150ns 0.85 0
4 200ns 0.45 1
5 250ns 0.05 1
6 300ns 0.65 0
7 350ns 0.25 1
8 400ns 0.85 0
9 450ns 0.45 1

250ns(5 サンプル)で同じ並びに戻り、その間に 0 → 1 の変化が 2 回あります。250ns に 2 周期なので、見かけは 8MHzです。本物の 12MHz は、同じ 250ns に 3 周期あります。

実用の目安:信号の 4〜10 倍のレート

ナイキストより低ければ周波数は正しく読めますが、エッジの位置は1 サンプル単位でしか分からないので、デューティ(High の割合)は ±1 サンプルぶん揺れます。1 周期に 2 サンプルしかなければ、デューティはほとんど読めません。このため実用上は、信号の 4〜10 倍のレートを選ぶのが目安です。

深さ × レート = 時間窓

ロジアナが一度に取れる長さ(時間窓)は、サンプル数 N とレート fs で決まります。

T = \frac{N}{f_s}
サンプル数 N レート fs 時間窓 T(計算)
5 万 120MS/s 約 0.42ms
10 万 120MS/s 約 0.83ms
5 万 60MS/s 約 0.83ms
10 万 2MS/s 50ms

レートを上げるほど細かく見えますが、同じサンプル数なら取れる時間は短くなります。何 MS/s で、何サンプルまで取れるのかは、ロジアナごとの実力です。後半で実測します。


🔋 1.8V も読める — EXT 1.8V のしきい値

第2回では、VREF 3.3V での VT+ を約 2.0V と推定し、「1.8V ロジックを読むには SW1 を EXT にして 1.8V を VREF に与える必要がある」と書きました(第2回のしきい値の節)。今回は、実際に EXT 1.8V でしきい値を測りました。

構成:雑音の少ない入力を作る

第2回のしきい値は、安定化電源の出力に乗っていた 0.5〜0.9Vpp の雑音のせいで、1 点に決まらず「帯」になっていました。そこで今回は、入力の電圧を UNO R4 WiFi の 3.3V ピン → 10kΩ のポテンショメータ → RC フィルタで作りました。安定化電源は、VREF の 1.8V だけに使います。

flowchart TD A["UNO R4 WiFi
3.3V ピン"] --> B["10kΩ ポテンショ
(ワイパで電圧を選ぶ)"] B --> C["2kΩ + 100µF∥0.1µF
RC フィルタ"] C --> D["ロジアナ CH0
(PulseView の D2)"] E["安定化電源 1.8V
電流制限 10mA"] --> F["J3 中央ピン
(VREF_EXT)"] F --> D
項目 内容
SW1 EXT(J3 を外した状態で切り替えてから J3 をつなぐ)
VREF 安定化電源 1.8V → J3 の中央ピン。テスターで 1.806V
入力 ポテンショのワイパ → 直列 2kΩ → 100µF 電解と 0.1µF を GND へ → CH0
RC のカットオフ 約 0.80Hz(τ = 0.2 秒。下の式)
GND UNO R4 WiFi・安定化電源・ロジアナ・オシロを共通に
読み方 入力電圧はオシロで CH0 のピンを直接読む(DC 結合の Vrms)
PulseView D2 のみ・50kHz・5 万サンプル(1 回 1 秒)
f_c = \frac{1}{2\pi \times 2\,\mathrm{k\Omega} \times 100\,\mathrm{\mu F}} \approx 0.80\,\mathrm{Hz}

先に入力の雑音を測る

しきい値を測る前に、入力の雑音をオシロで見ました(AC 結合・20mV/div・50ns/div・帯域制限 ON)。

OWONオシロの画面。AC結合20mV/divで、RCフィルタを通ったCH0入力を拡大した波形。Vpp 31.2mVの細かい揺れ

CH0 に入る点の雑音(20mV/div)。揺れは 1 目盛り半ほどで、画面下の Vpp は 31.2mV

測った点 Vpp
ワイパ(2kΩ の手前) 12.8mV
CH0 に入る点(RC の後) 31.2mV
参考:第2回の入力(安定化電源の出力) 520〜920mV

どちらも 30mV 前後で、第2回の雑音と比べて 1 桁以上小さくなりました。第2回で見えていた ±0.3V 級のスパイクは、この入力には見えません。ただし、この 2 枚は 50ns/div の窓なので、数十 kHz 以下のゆっくりした揺れまでは判定できていません。

結果:VT+ 1.399V・VT− 0.732V

入力を 0.05V 刻みで上げ下げし、D2 が 1 秒間ずっと High(または Low)になった最初の電圧を、そのときのオシロの Vrms で読みました。

OWONオシロの画面。DC結合500mV/divで、1.4V付近の細い直流の線。Vrms 1.399V、Vpp 60mV

VT+ を読んだ画面。線の太さ(Vpp 60mV)が雑音の小ささ、画面下の Vrms 1.399V が D2 がずっと High になった最初の電圧

項目 値 種別
VREF 1.806V 実測(テスター)
VT+ 1.399V 実測(オシロの Vrms)
VT− 0.732V 実測(オシロの Vrms)
ΔVT = VT+ − VT− 0.667V 計算
0 と 1 が混ざる電圧帯 なし 0.05V 刻みの掃引で出なかった

電圧は 0.05V 刻みで動かしたので、VT+・VT− はそれぞれ 0.05V 程度の幅を含みます。第2回でしきい値付近に出ていた細かいトグルは、今回は 1 度も出ませんでした。

データシートの規格と比べる

TXU0104 のデータシート(SCES937B)には、VCCA = 1.8V ちょうどの行がありません。1.8V を挟む 2 行は次のとおりです。

VCCA VT+ VT− ΔVT
1.65V(規格値) 0.76〜1.13V 0.35〜0.69V 0.30〜0.55V
2.3V(規格値) 1.08〜1.56V 0.56〜0.97V 0.38〜0.65V
1.806V(今回の実測) 1.399V 0.732V 0.667V

実測は、2 行を合わせた範囲(VT+ 0.76〜1.56V・VT− 0.35〜0.97V)には入っています。1.65V の行だけと比べると、VT+ と VT− は上限を超え、ΔVT は 2 行どちらの上限も超えています。1.8V の規格値は無いので、2 行のあいだを比例で割り振った値は推定にしかなりません。ここで言えるのは「挟む 2 行の合算範囲に入る」までです。VT+ が規格より高めに出る傾向は、次の 3.3V・5V でも見えました。

1.8V ロジックは EXT で読める

1.8V 系のロジックが High を出すと、入力はおよそ 1.8V、Low なら 0V 付近です。EXT 1.8V での VT+ 1.399V・VT− 0.732V は、その間にあります。

入力 しきい値との関係 読める値
1.8V(High) VT+ 1.399V より約 0.4V 高い 1
0V 付近(Low) VT− 0.732V より約 0.7V 低い 0

SW1 を EXT にして J3 に 1.8V を入れれば、1.8V ロジックは読めます。逆に、3.3V 位置の VT+ は次の節で測った 2.401V なので、3.3V のまま 1.8V の High を読むことはできません。


🧹 きれいな入力で 3.3V・5V を測り直す

同じ入力(ポテンショ+RC)のまま、SW1 を 3.3V と 5V に切り替えて、しきい値を測り直しました。J3 を外してから SW1 を動かし、5V 位置ではポテンショの電源を UNO R4 WiFi の 5V ピンに替えています。

読み方は EXT 1.8V と同じで、オシロの画面はどれも上の 1 枚と同じ「細い直流の線」です。入力の Vpp は 20〜60mV でした。値は表にまとめます。

3 つの VREF のしきい値を並べる

SW1 VREF VT+ VT− ΔVT VT+ ÷ VREF VT− ÷ VREF
EXT 1.806V 1.399V 0.732V 0.667V 0.775 0.405
3.3V 3.303V 2.401V 1.395V 1.006V 0.727 0.422
5V 5.0V 3.290V 2.138V 1.152V 0.658 0.428

VT+・VT− は実測、ΔVT と比率は計算です。3.3V・5V 位置の VREF は今回は測っていないので、3.3V 位置は第2回の実測(3.303V)を、5V 位置は 5.0V を仮に使いました(第2回の実測 4.895V で割ると、VT+ 0.672・VT− 0.437)。3 つの VREF とも、0.05V 刻みの掃引で VT+・VT− はそれぞれ 1 つの値に決まり、0 と 1 が混ざってトグルする段はありませんでした。

3 つの VREF で並べると、VT− は VREF の約 0.4 倍、VT+ は 0.66〜0.78 倍に出ました。しきい値が VREF とともに動くことは、第2回より細かい刻みで確かめられました。

第2回の「帯」は入力の雑音だった

第2回の値(雑音 0.5〜0.9Vpp の入力で推定した目安)と並べます。

SW1 第2回の VT+(推定) 今回の VT+ 第2回の VT−(推定) 今回の VT−
3.3V 約 2.0V 2.401V 1.5〜1.8V 程度 1.395V
5V 約 3.0V 3.290V 2.6V 以下程度 2.138V

雑音の入った入力では、VT+ は低めに、VT− は高めに見えていました。雑音の山が VT+ に届いた時点で High になり、谷が VT− に届いた時点で Low に戻るので、見かけのしきい値は、雑音の片側の振れ幅ぶんだけ内側に寄ります。VT+ のずれは約 0.3〜0.4V で、第2回の雑音(0.5〜0.9Vpp)の片側の振れ幅と同じ程度です。入力の雑音を 30mV 前後まで下げると、0 と 1 が混ざる帯は消え、しきい値は 0.05V 刻みで 1 点に決まりました。第2回で見えていた帯は、ロジアナ側ではなく入力側の雑音によるものだった、というのが今回の測り直しの答えです。

VT+ が規格の上限より高めに出た

規格と比べると、気になる点も出ました。

SW1 実測 VT+ 近い規格の行(VT+) 実測 VT− 近い規格の行(VT−)
3.3V 2.401V VCCA 3V:1.48〜1.92V 1.395V VCCA 3V:0.89〜1.5V
5V 3.290V VCCA 4.5V:2.19〜2.74V / 5.5V:2.65〜3.33V 2.138V VCCA 5.5V:1.88〜2.4V

VT− はどちらも近い行の範囲に入っています。一方で VT+ は、3 つの VREF すべてで近い規格行の上限より高めに出ました。3.3V 位置の 2.401V は、VCCA 3V の行の上限 1.92V を超えます(電圧比で 1.1 倍しても 2.11V)。5V 位置の 3.290V は、5.5V の行には入りますが、4.5V の行の上限 2.74V を超えます。ΔVT(1.006V・1.152V)も、各行の上限(0.72V・1.06V)より大きい値です。

原因はまだ特定できていません。今回の測定では、次のことをまだ確かめていません。

  • 3.3V・5V 位置の VREF そのもの(今回はテスターで読んでいない)
  • CH0(D2)以外のチャンネルで同じ掃引をしたときの値
  • 2 枚目以降の基板で同じ傾向が出るか

使う側として大事なのは、High を確実に読ませるには、入力が VT+ を上回っている必要があることです。3.3V 位置で 3.3V 系の信号を読む場合、High(3.3V 付近)と VT+ 2.401V の差は約 0.9V あります。プルアップで立ち上がりが鈍い信号や、電圧が下がり気味の High を測るときは、この実測値を基準に余裕を見てください。


📈 何 MS/s まで信じられるか — 12MHz と 24MHz をレートを変えて取る

信号源:UNO R4 WiFi のタイマで 12MHz と 24MHz を作る

速い矩形波の信号源には、Arduino UNO R4 WiFi の GPT(汎用 PWM タイマ)を使いました。GPT のカウントクロックは 48MHz なので、「周期 4 カウント・High 2 カウント」で 12MHz、「周期 2 カウント・High 1 カウント」で 24MHz が出せます。出力は D6 です。スケッチはロジアナのリポジトリ ramtuc/rp2040-logic-analyzer に同梱しています。

周波数 周期(カウント) High(カウント) デューティ マニュアルの設定範囲
12MHz 4 2 50% 範囲内
24MHz 2 1 50% 範囲外

24MHz の設定は、RA4M1 のユーザーズマニュアル(22.9.2 (5))が鋸波 PWM に求める「0 < GTCCRA < GTPR」を満たしません。周期 2 カウントでは、この範囲に入る整数がありません。そこで、ロジアナにつなぐ前にオシロで波形を確かめました。

項目 12MHz 24MHz
オシロの Frequency(実測) 11.979MHz 23.957MHz
設定値からのずれ(計算) −0.18% −0.18%
Vmax/Vmin(実測) 4.960V/−1.120V 5.040V/−1.360V
OWONオシロの画面2枚を左右に並べた図。左は12MHz(11.979MHz)の矩形波でエッジの直後にリンギング。右は24MHz(23.957MHz)で、台形から三角に近い形

同じ 50ns/div で並べた信号源の出力。左の 12MHz は平らな High が残る矩形波、右の 24MHz は平らな部分がほとんど無く三角に近い

24MHz は設定範囲の外ですが、見た目のデューティは 50% 付近で、High や Low に張り付くこともありませんでした。周波数のずれ −0.18% は、UNO R4 WiFi のクロック源が水晶ではなく内蔵の HOCO(マニュアルの規格で ±1%)だからです。このずれは、後で「うなり」の速さとして画面に出てきます。エッジ直後のリンギングには、プローブの GND リードの長さの影響が含まれている可能性があり、切り分けはしていません。

配線は D6 → CH0(D2)、GND は J2 の外側の列に共通です。UNO R4 WiFi は 5V ロジックなので、SW1 は 5V(J3 を外してから切り替え)にしました。

選べるレートと、120MS/s の上限

PulseView(raspberrypi-pico ドライバ)でこの基板を選ぶと、サンプリングレートの一覧には 5kHz から 240MHz までが並びます。

範囲 一覧に出る値
1MHz 未満 5k・6k・8k・10k・20k・30k・40k・50k・60k・80k・100k・125k・150k・160k・200k・250k・300k・400k・500k・600k・800k
1〜10MHz 1M・1.2M・1.5M・2M・2.4M・3M・4M・5M・6M・8M・10M
10MHz 以上 15M・20M・30M・40M・60M・80M・100M・120M・150M・200M・240M

ただし、150M 以上を選ぶと取り込みに失敗しました。

PulseViewのエラーダイアログ。Capture failed、generic/unspecified error と表示されている

150MHz 以上を選んで Run したときのダイアログ。取り込みは始まらない

実際に使える最高は、sigrok-pico の USER_GUIDE にある上限どおり 120MS/s です。また、一覧には 24M と 12M がありません。今回は近い 20M と 8M で代わりに試しました。

予想と実測を並べる

12MHz と 24MHz を、120・60・20・8MS/s で取りました。左が折り返しの式による予想、右が PulseView の画面の読みです。

信号 レート 1 周期のサンプル数 予想(計算) 実測(画面の読み)
12MHz 120MS/s 10 12MHz・High 5 前後 12MHz と読める。等間隔
12MHz 60MS/s 5 12MHz・High 2 か 3 12MHz と読める。High 幅がわずかに交互
12MHz 20MS/s 1.67 8MHz に化ける 周期約 125ns=見かけ 8MHz
12MHz 8MS/s 0.67 4MHz(ナイキストちょうど) 見かけ 4MHz+ときどき幅の広いパルス
24MHz 120MS/s 5 24MHz・High 2 か 3 24MHz と読める。High 幅が 2 と 3 で交互
24MHz 60MS/s 2.5 24MHz・High 1 か 2 24MHz と読める。High 幅が広い/狭いの交互
24MHz 20MS/s 0.83 約 4MHz に化ける(未取得) —
24MHz 8MS/s 0.33 0Hz(整数比)+うなり ほぼ一定値+約 13µs ごとの短いバースト

8 つの組のうち、取り込んだ 7 つはすべて予想どおりでした。12MHz の 4 枚を縦に並べると、レートを下げたときの崩れ方が一度に見えます。

PulseViewの画面4段。上から120MS/s、60MS/s、20MS/s、8MS/sで同じ12MHzを取り込んだD2の波形

同じ 12MHz を 4 つのレートで取った画面(各段の目盛りは ns か µs)。上 2 段は周期 約 83ns の 12MHz、3 段目は周期 約 125ns の 8MHz、4 段目は 1 サンプルごとの交互に、右寄りで幅の広いパルスが混ざる

120・60MS/s:周波数は正しく、デューティは 1 サンプル単位で揺れる

上の図の上 2 段と、24MHz の 120・60MS/s(表)のように、ナイキスト周波数より低い組では、周波数はどれも正しく読めました。崩れるのは High の幅だけで、1 周期のサンプル数が少ないほど、1 サンプルの量子化が目立ちます。24MHz を 60MS/s で取ると 1 周期 2.5 サンプルで、High 幅は広い/狭いの交互になります。周波数は正しいものの、1 周期ごとのデューティはもう読めません。周波数を見るならナイキストより下、デューティやタイミングまで見るなら信号の 4〜10 倍、という目安がそのまま画面に出ています。

20MS/s:12MHz が 8MHz に化ける

上の図の 3 段目です。ナイキスト周波数(10MHz)より高い 12MHz は、計算どおり 8MHz の矩形波として描かれました。上の位相の表のとおり、High が 1 サンプルのところと 2 サンプルのところが混ざるので、パルス幅は少し不揃いです。それでも、この画面だけを見て「8MHz のクロックが出ている」と読んでしまうのは自然です。オシロの 11.979MHz と並べて初めて、間違いに気づけます。

8MS/s:ナイキストちょうどの 4MHz と、うなり

上の図の 4 段目です。12MHz を 8MS/s で取ると、1 サンプルごとに信号は 1.5 周期進みます。半周期ずつずれるので、High と Low が交互に並ぶ 4MHz(ナイキストちょうど)に見えます。

ところが、本物の信号は 11.979MHz です。1 サンプルあたりの進みは 1.5 周期より少しだけ短く、拾う位置はゆっくり後ろへずれていきます。拾う位置がエッジをまたぐと、同じ値が 2 回続き、幅の広いパルスになります。ずれの速さは 12.000MHz との差の 21kHz で決まり、計算では約 24µs ごとにエッジをまたぎます。約 13µs 分を切り出した 4 段目の右寄りに、乱れの区間が 1 か所あるのは、この計算と矛盾しません。

8MS/s:24MHz が「ほぼ無信号」に化ける

PulseViewの画面2段。上は120MS/sで取った24MHzの矩形波が密に並ぶ。下は8MS/sで、ほとんど一定値の中に約13µsごとに短いトグルのかたまりが出る

同じ 24MHz を 120MS/s(上・約 1.8µs 分)と 8MS/s(下・約 140µs 分)で取った画面。下段は目盛り 10µs ごとに 1 か所ほど、短いトグルのかたまりが出るだけ

24MHz は 8MS/s のちょうど 3 倍なので、1 サンプルの間に信号はぴったり 3 周期進み、毎回ほぼ同じ位相を拾います。画面のほとんどは一定の値で、オシロでは 5V 振幅の 24MHz が出ているのに、ロジアナの上では「信号が無い」ように見えます。

ここでも、本物の 23.957MHz とのずれが「うなり」として出ます。計算するとうなりは |23.957 − 3 × 8.000| = 0.043MHz、つまり 43kHz(周期 約 23µs)です。拾う位置は 1 周期のうちに立ち上がりと立ち下がりの 2 回エッジをまたぐので、トグルのかたまりは約 11.6µs ごとに出る計算です。画面の目盛りから読んだ約 13µs と、読み取りの精度の範囲で一致しました。うなりの間隔から、信号源のクロックのずれを逆算できることになります(ロジアナ側の RP2040 は水晶なので、ずれはほぼ信号源側です)。

おまけ:レートを間違えるとこう見える

PulseViewの画面。50kHzサンプリングのD2。20µs単位のHighとLowが不規則に並ぶ

12MHz を 50kS/s のまま取った画面。目盛りは 50µs ごと。High と Low が 20µs 単位で不規則に並び、20kHz 台の信号に見える

しきい値の測定に使った 50kHz の設定のまま 12MHz を取り込んだ画面です。12MHz は 50kHz のちょうど 240 倍なので、計算上は 0Hz の整数比で、見えているのは 11.979MHz と 12.000MHz の差、約 21kHz のうなりです。画面では約 650µs に 15 周期ほどのパルス列で、20kHz 台の矩形波に見えます。12MHz の信号が、20kHz 台の信号として描かれる例です。レートの設定を変え忘れると、こういう画面が何事もなかったように出てきます。


⏱️ 何チャネルで何 ms 取れるか — 16ch・120MS/s の時間窓

16ch・120MS/s でサンプル数を増やす

D2〜D17 の 16ch を全部有効にし、120MS/s のままサンプル数を 5 万 → 10 万 → 20 万 → 50 万と増やしました。信号は CH0 に 24MHz(ほかのチャンネルは未接続)です。取れた長さは、PulseView の画面の目盛りから読んだ概算です。

サンプル数の設定 取れた長さ(目盛りから概算) サンプル数に換算(計算) 結果
5 万 約 413µs 約 5 万 設定どおり
10 万 約 842µs 約 10 万 設定どおり
20 万 約 456µs 約 5.5 万 打ち切り
50 万 約 452µs 約 5.4 万 打ち切り
PulseViewの画面2段。上は10万サンプルで0から約842µsまで、下は20万サンプルで0から約456µsまで取り込まれている。下段は上段と同じ時間軸に縮めてある

16ch・120MS/s で、10 万サンプル(上)と 20 万サンプル(下)を指定したときに取れた長さ。下段は上段の目盛りにそろえて横に縮めてある。多く指定した下段のほうが短い

16ch・120MS/s では、10 万サンプル(約 0.84ms)まで一度に取れました。20 万以上を指定すると、エラーは出ずに約 0.45ms で打ち切られます。10 万のときより短くなる点に注意が必要です。

24ch では約 0.23ms で打ち切り

D2〜D25 の 24ch を有効にした場合も試しました。5 万サンプルでは約 415µs(設定どおり)取れましたが、20 万・50 万を指定すると、どちらも約 227〜229µs(約 2.7 万サンプル)で打ち切られました。

打ち切られたときの長さを並べると、16ch で約 5.5 万サンプル、24ch で約 2.7 万サンプルでした。1 サンプルを 16ch なら 2 バイト、24ch なら 4 バイトで持つと仮定すると、どちらも約 110KB 前後になります。打ち切りの長さは、サンプル数ではなくデータ量(バイト数)で決まっているとみられます。ファームの中身までは確かめていないので、ここは推定です。

公式ガイドとの比較と、使い方の目安

sigrok-pico の USER_GUIDE は、15〜21ch では「5 万サンプル以下なら 120MS/s」としています。この基板の 16ch では、その倍の 10 万サンプルまで取れました。

やりたいこと 設定の目安
16ch で速い信号を見る 120MS/s・10 万サンプル以下(約 0.84ms)
長い時間を見たい レートを下げる。時間窓は「サンプル数 ÷ レート」
指定より短く終わった サンプル数の設定がバッファを超えている。10 万以下に戻す
使うチャンネルが少ない 不要なチャンネルを無効にする(データ量が減る)

60MS/s など低いレートで同じ 10 万サンプルが取れるか(取れれば約 1.7ms)は、今回は確かめていません。長い時間を取るときは、まず欲しい長さとレートから必要なサンプル数を計算し、取れた長さが設定どおりかを画面の目盛りで確かめるのが確実です。


🧮 SPI — 74HC595 に送る 1 バイトを読む

ここからは、マイコンが実際に出している通信を、PulseView のデコーダで値に読み下します。I2C のデコードは、第2回で ESP32-S3 センサー基板の SEN63C(アドレス 0x6B)を読み、CRC の一致まで確かめました。今回は残りの SPI と UART、それにサーボの PWM を読みます。

配線:UNO R4 WiFi → 74HC595 とロジアナ

相手は 74HC595 の LED 基板です。UNO R4 WiFi から 100ms ごとに 1 バイト(0x0F)を送り、同時に D1(TX)から文字列 electwork 74HC595 0x0F を UART で出すスケッチを書きました(ロジアナのリポジトリ ramtuc/rp2040-logic-analyzer に同梱)。4 本の線を、ロジアナの CH0〜CH3 に当てています。

信号 UNO R4 WiFi ロジアナ(PulseView) デコーダでの割り当て
RCLK(ラッチ) D10 CH0(D2) SPI の CS#(active-low)
SER(データ) D11(COPI) CH1(D3) SPI の MOSI
SRCLK(クロック) D13(SCK) CH2(D4) SPI の CLK
TX(Serial1) D1 CH3(D5) UART の TX

SW1 は 5V(J3 を外してから切り替え)、PulseView は 10MS/s・100 万サンプル(100ms 分)です。デコーダは SPI(Mode 0・MSB first・8bit)と UART(8N1)を重ねました。

74HC595 の RCLK は本来ラッチの信号で、SPI の CS ではありません。ただ、スケッチは転送の前に RCLK を Low、転送の後に High にしているので、SPI デコーダの CS# に割り当てると、1 バイトずつ枠で区切って読めます。

SPI と UART を同時に読む

PulseViewの画面。D2からD5の4本の波形と、SPIのデコード行(MOSI bits 00001111、MOSI data 0F)、UARTのデコード行(Start、65、Stop、Start、6C、Stop)

shiftOut で 0x0F を送った直後の 4ch(目盛りは 20µs ごと)。左の SPI の行に 0F、右の UART の行に 65・6C(文字の e・l)と読み下されている

SPI の行は MOSI bits が 0 0 0 0 1 1 1 1、MOSI data が 0F で、送った値と一致しました。SER(D3)は前半 4 ビットが Low、後半 4 ビットが High です。右側の UART の行は 65・6C・65 と続き、ASCII で「ele」、送った文字列の先頭です(115200bps)。2 種類の通信を、同じ時間軸の上で同時に読めています。

LED でも確かめる — プローブは相手の入力ピンで取る

机の上の写真。左にArduino UNO R4 WiFi、中央にミニブレッドボードに挿した74HC595のLED基板で1から4のLEDが緑に点灯、右に自作のRP2040ロジアナ基板

0x0F を送ったときの机。中央の LED 基板で、1〜4 の LED だけが点いている(右が自作ロジアナ)

0x0F を MSB first で送ると、最後に入った 4 ビットの 1 が QA〜QD に並び、LED 1〜4 が点きます。写真のとおりです。

実は最初に点灯を確かめたときは、LED が 8 個全部点いていました。ロジアナの画面は上と同じ 0F で、波形には何の問題もありません。原因は、LED 基板側で SER の線を 1 列ずらして挿していたことでした。ロジアナは UNO R4 WiFi 側の D11 を見ていたので、マイコンが正しく出している波形が正しく見えるのは当然です。ロジアナの波形が正しくても、相手の入力ピンに届いているとは限りません。送る側は正しいのに相手が動かないときは、プローブを相手の IC の入力ピンに移して取り直すと、途中の配線の問題を切り分けられます。

shiftOut とハードウェア SPI を比べる

同じ 0x0F を、shiftOut() とハードウェア SPI(1MHz・Mode 0・MSB first)で送り比べました。

送り方 1 クロック(目盛りから概算) 8 クロック RCLK が Low の時間 デコード(MSB first)
shiftOut 約 2.1µs 約 17µs 約 20µs 0F
ハードウェア SPI(設定 1MHz) 約 1µs 約 8µs 約 15µs 0F
PulseViewの波形2段。上はshiftOut、下はハードウェアSPI 1MHz。どちらもD2(RCLK)が下がってからD4(SRCLK)に8本のパルスが出るが、下段のほうがパルスの間隔が約半分

同じ時間軸(約 28µs 分)で並べた RCLK・SER・SRCLK。D4(SRCLK)の 8 本のパルスが、下段では約半分の幅に詰まっている

クロックの速さは約 2 倍違いますが、デコード結果はどちらも 0F です。shiftOut はソフトウェアでピンを 1 本ずつ上げ下げするので、クロックの速さは決まった値ではなく、マイコンの処理の速さで決まります。1MHz のクロックを 10MS/s で取ると 1 周期 10 サンプルで、前半で書いた「信号の 4〜10 倍」の範囲に入っています。

同じ波形を MSB first と LSB first で読む

最後に、shiftOut の取り込みデータはそのままで、SPI デコーダの Bit order だけを LSB first に変えました。

PulseViewの画面2段。上はBit order MSB firstでMOSI dataが0F、下は同じ波形をLSB firstで読んでMOSI dataがF0。MOSI bitsはどちらも00001111

同じ取り込みデータを、Bit order だけ変えて読んだ画面(上下で時間軸の拡大率が違う)。MOSI bits は 0 0 0 0 1 1 1 1 のまま、MOSI data が 0F から F0 に変わる

Bit order 並び 0 0 0 0 1 1 1 1 の読み方 MOSI data
MSB first 先頭のビットが最上位 0F
LSB first 先頭のビットが最下位 F0

ビットの並びは同じでも、どちらの端を最上位と見るかで値は 0x0F にも 0xF0 にもなります。ロジアナは波形を記録するだけで、どちらで読むのが正しいかは知りません。正しい設定は、送る側の約束(ここではスケッチの MSBFIRST)で決まります。設定を間違えても、エラーは出ずに別の値が表示されます。


📟 UART — ボーレートが合えば文字、違えば 00 と Break

115200bps と 9600bps で読む

UART は、上の SPI と同じスケッチの D1(TX)を CH3(D5)で取っています。115200bps は上の図で読めたので、次に送信側を 9600bps に書き換えて取り込みました。1 ビットの幅は、ボーレートの逆数です。

T_{\mathrm{bit}} = \frac{1}{9600} \approx 104\,\mu\mathrm{s}, \qquad \frac{1}{115200} \approx 8.68\,\mu\mathrm{s}
送信のボーレート 1 ビット(計算) 1 文字=10 ビット(計算) デコーダの設定 読めた値
115200bps 8.68µs 約 87µs 115200 65 6C 65 …(「ele…」)
9600bps 104µs 約 1.04ms 9600 e l e c t w o r k ␣ 7 4 …
9600bps 104µs 約 1.04ms 115200(設定違い) 00 と Break の列

9600bps では、画面の +84〜+96ms の約 12ms に 12 文字が並び、1 文字約 1ms という計算と合っています(スタート 1・データ 8・ストップ 1 の 10 ビット)。

9600bps の信号を 115200bps で読むと

同じ 9600bps の取り込みデータのまま、UART デコーダのボーレートだけを 115200 に戻すと、文字は 1 つも読めなくなりました。

PulseViewの画面2段。上はデコーダ9600で、UART TX dataにe、l、e、c、t、wと文字が並ぶ。下は同じ波形をデコーダ115200で読み、短い00と、B、Brk、Breakの印が並ぶ

同じ 9600bps の取り込みデータを、デコーダのボーレートだけ変えて読んだ画面。上は 1 文字ずつ e・l・e…、下は短い 00 と B/Brk/Break の印が並ぶ

9600bps の 1 ビット(104µs)は、115200bps の約 12 ビット分の長さです。115200 のデコーダは、立ち下がりをスタートビットと見て 8.68µs ごとにデータを読みますが、9600 のスタートビット 1 つの Low の中に、スタートビット・データ 8 ビット・ストップビットの全部が収まってしまいます。データは 00、ストップビットの位置でも Low のままなので、デコーダはこれをブレーク(回線が 1 フレーム以上 Low のまま)と判定します。Low が長く続く場所ほど、Break の印も長くなっています。

ボーレートの設定違いは、エラーではなく「00 と Break の列」として画面に出ます。00 と Break が並んだら、まずボーレートを疑う。相手のボーレートが分からないときは、いちばん短いパルスの幅を測れば、それが 1 ビットの幅(=1 ÷ ボーレート)です。104µs なら 9600bps です。


🎛️ サーボ PWM — デューティからパルス幅を出す

最後は SG90 サーボの PWM です。UNO R4 WiFi の D9 から Servo ライブラリで PWM を出し、CH0(D2)で取りました。スケッチは attach(9, 500, 2400)(0° = 500µs・180° = 2400µs)で、0° → 90° → 180° を 2 秒ごとに繰り返します。PulseView は 10MS/s・1,000 万サンプルの設定で、PWM デコーダ(active-high)を使いました。

PWM デコーダが出すのは、デューティ(High の割合)・周期・周波数です。サーボの角度を決めるパルス幅は、デューティと周期の積で出せます。

t_{\mathrm{high}} = D \times T
角度の指定 設定のパルス幅 デューティ(デコーダ) 周期・周波数(デコーダ) パルス幅(計算)
write(180) 2400µs 12.027〜12.028% 20.0ms・50.04Hz 約 2.40ms
write(0) 500µs 2.503〜2.504% 20.0ms・50.04Hz 約 0.50ms
write(90) 1450µs — — 今回は未取得
PulseViewの画面2段。上はwrite(180)でDuty cyclesが約12.03%、下はwrite(0)で約2.50%。どちらもPeriodsは20.0ms、Frequenciesは約50.04Hz

write(180) と write(0) の PWM デコード(上下で目盛りが違う)。Duty cycles の行が 12.03% と 2.50%、Periods はどちらも 20.0ms

パルス幅は、設定値の 2400µs・500µs とほぼ一致しました(差は 1% 未満)。周期 20.0ms(50Hz)は Servo ライブラリの既定どおりです。10MS/s で取っているので、時間の刻みは 0.1µs、パルス幅 2400µs に対して約 0.004% です。デューティが小数第 3 位まで揃って表示されるのは、この細かさのおかげです。90°(1450µs、デューティにして約 7.25%)は、今回は取り込んでいません。


💭 所感:ロジアナは間違っていても自信満々に描く

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

ロジアナの画面には「自信がない」という表示が無い。 12MHz を 20MS/s で取った画面は、きれいな 8MHz の矩形波でした。24MHz を 8MS/s で取れば、信号そのものが消えます。どちらも、エラーも警告も出ません。速い信号を初めて見るときは、オシロで周波数を一度確かめてから、その 4〜10 倍のレートを選ぶ。この順番を守るだけで、エイリアスにだまされることはほぼ無くなります。

しきい値は、入力をきれいにして初めて 1 点に決まる。 第2回の「帯」は、測定器の性能ではなく、入力に乗った雑音の大きさでした。雑音を 30mV 前後に抑えると、0.05V 刻みでもトグルは出ませんでした。測定器の特性を測るときは、まず入力側の雑音を測って、測りたいものより小さいことを確かめておく。それができていれば、規格より高めに出た VT+ のように、次に調べるべきことがはっきり残ります。

「取れる長さ」は、設定ではなく画面で確かめる。 20 万サンプルを指定しても、エラーなしで 10 万サンプルより短い時間しか取れませんでした。設定値を信じるのではなく、取れた長さを目盛りで確かめる。小さなことですが、長いトランザクションを追うときに効いてきます。

デコーダの設定は、送る側との約束を書き写すもの。 同じ SPI の波形は、Bit order を変えるだけで 0F にも F0 にもなりました。9600bps の UART を 115200 で読めば、文字は消えて 00 と Break が並びます。どれもエラーではなく、もっともらしい別の値として出てきます。デコード結果が期待と違うときは、相手の回路を疑う前に、まずデコーダの設定が送る側のスケッチやデータシートと合っているかを見直す。そして値が正しいのに相手が動かないときは、プローブを相手の入力ピンに移す。LED が 8 個全部点いた件は、この順番で見ればすぐに配線へたどり着けます。


⚠️ この基板を使うときの注意(第3回で追加した分)

第1回と第2回の注意に、今回分かったことを足します。

# 約束 理由
1 1.8V ロジックは SW1 = EXT・J3 中央ピンに 1.8V で読む EXT 1.8V の VT+ は 1.399V。3.3V 位置の VT+ は 2.401V で、1.8V の High に届かない
2 SW1 は J3 を外してから切り替える shorting 型なので、切り替えの途中で外部電源と内蔵の 3.3V/5V が一瞬つながる
3 サンプリングレートは信号の 4〜10 倍を選ぶ 半分を超えるとエイリアスに化け、整数比だと信号が消えて見える
4 150MS/s 以上は選ばない 一覧には出るが、取り込みに失敗する。上限は 120MS/s
5 16ch・120MS/s は 10 万サンプル以下にする それ以上を指定すると、エラーなしで約 0.45ms に打ち切られる
6 VT+ は規格の上限より高めに出ている 3.3V 位置で 2.401V。High が下がり気味の信号は余裕を確かめる

🛒 この基板を自分で発注するには — GitHub の製造データから JLCPCB の PCBA 発注まで

この基板は、公開している製造データで誰でも発注できます。発注の流れそのものは第1回の「JLCPCB に PCBA で発注する」に書いたので、ここではこの基板のファイルを使って、実際にどこで何を選ぶかをまとめます。

💡 公開している製造データは A1 だけ

公開している製造データは A1(SW1 の配線を直した版・2026-10-10)だけです。筆者が注文して検証したのは、SW1 の配線を第2回で改修した A0 の基板で、ここまでの実測もその基板で取っています。A1 はまだ製造していません(DRC と、基板と回路図のネット照合は通っています)。

発注先は、この連載の基板を製造・実装した JLCPCB です。

JLCPCB のロゴ

製造データの場所

製造データは、リポジトリ ramtuc/rp2040-logic-analyzer(GitHub)の hardware/jlcpcb/ に置いています。A0 との違いは SW1 まわりだけで、BOM と CPL は A0 の注文に使ったものと同じ内容です。基板の表シルクは「RP2040 LA A1」、裏シルクに「CERN-OHL-P v2」が入ります。

パス 中身
hardware/jlcpcb/gerbers/ A1 の Gerber・ドリル・ジョブファイルの 16 ファイル。1 つの zip にまとめてアップロードする
hardware/jlcpcb/bom-jlcpcb.csv BOM。19 行で、全行に JLCPCB(LCSC)の部品番号が入っている
hardware/jlcpcb/cpl-jlcpcb.csv CPL。実装する 68 部品の座標・回転・面
hardware/jlcpcb/README.md 各ファイルの出どころ

設計データのライセンスは CERN-OHL-P-2.0(改変・製造・販売を認める寛容型のオープンハードウェアライセンス)です。

JLCPCB の注文画面で選ぶもの

以下の画面は、A1 のデータで見積りを進めてカートに保存するところまで撮ったものです(2026-10-10)。

  1. Gerber の zip をアップロード:JLCPCB の注文画面で、gerbers/ の 16 ファイルを 1 つの zip にして渡します。層数 4・外形 65 × 45mm と読み取られれば、外形とドリルまで入っています

    JLCPCB のオンライン PCB 見積り画面。基板の表と裏のプレビューの下に「4 層が検出されました 45x65mm のボード」と出ており、FR-4・4 層・65×45mm・5 枚・1.6mm・緑・HASL が選ばれている

    Gerber を読み込んだ直後。プレビューの下の「4 層が検出されました 45x65mm」で層数と外形を確かめ、その下で板厚・色を選ぶ

  2. 基板の仕様:次の表の値を選びます。表に無い項目(表面処理など)は、この設計の前提には関わりません

    項目 選ぶ値 理由
    層数 4(自動認識) 4 層基板
    枚数 5 A0 と同じ
    板厚 1.6mm スタックアップの前提
    スタックアップの指定 いいえ(既定)/はい → JLC04161H-7628 設計は JLC04161H-7628 を前提にしていて、USB の線幅(0.30 / 0.15mm)もこの層構成で計算している。今回の見積りは下の画面のとおり「いいえ」(既定)のまま進めた。USB の差動インピーダンスまで設計どおりにしたい場合は「はい」にして JLC04161H-7628 を選ぶ
    最小ビア(穴径・外径の項目) 0.3mm/(0.4/0.45mm) 設計のビアは穴 0.30mm・外径 0.45mm
    色 緑 A0 と同じ(機能には関わらない)
    JLCPCB の高度なオプション。外層銅箔 1oz、内層 0.5oz、ビア処理はビアプラグ、最小ビア内径/外径は 0.3mm/(0.4/0.45mm)、PCB 上のマークはマーク除去が選ばれている

    「高度なオプション」を開いたところ。見るのは中ほどの「最小ビア内径/外径」で、0.3mm/(0.4/0.45mm) を選ぶ

  3. PCB Assembly を ON:Economic・実装面 Top・枚数 5 を選びます。SMD 部品はすべて表面にあるので、片面実装で足ります

    JLCPCB の PCB 組み立て設定。右上のスイッチが ON で、トップ面を組み立てる・エコノミック・トップ面・PCBA 数量 5・部品の選択は顧客による(セルフサービス)が選ばれている

    右上のスイッチで PCB 組み立てを ON にした画面。トップ面・エコノミック・5 枚を選び、部品の選択は「顧客による(セルフサービス)」のまま進める

  4. BOM と CPL をアップロード:bom-jlcpcb.csv と cpl-jlcpcb.csv を渡し、「BOM と CPL を処理する」を押します

    JLCPCB の部品表タブ。左に bom-jlcpcb.csv、右に cpl-jlcpcb.csv がアップロード済みで、右下に「BOM と CPL を処理する」ボタンがある

    部品表タブ。左に BOM、右に CPL を入れ、両方にチェックが付いたら右下の「BOM と CPL を処理する」を押す

  5. SW1 のダイアログは「次へ」:処理を始めると、「SW1 designator don’t exist in the CPL file」というエラーが出ます。SW1(C393948)は BOM にありますが、THT 部品なので CPL に入れていません。「次へ」で進んで問題ありません。SW1 は実装の対象から外れ、部品代にも入りません。届いてから自分ではんだ付けします(A0 も同じです)

    JLCPCB のエラーダイアログ。The below parts won't be assembled due to data missing. SW1 designator don't exist in the CPL file. と表示され、「ファイルを再アップロードする」と「次へ」のボタンがある

    SW1 が CPL に無いことを知らせるダイアログ。SW1 は手はんだなので、右下の「次へ」を押す

  6. 部品の照合:19 行がすべて JLCPCB の部品に当たり、在庫があるかを見ます。区分は Basic 12 種類・Extended 6 種類(RP2040・TXU0104・USB-C・USBLC6・水晶・27Ω)で、Extended は 1 種類ごとに段取り費がかかります。在庫切れの行があれば、ここで判断します。A0 の注文では USB-C(C165948)が入手できず、その行を実装から外して手はんだにしました(第2回)。在庫があれば、そのまま実装に含めて構いません。2026-10-10 に A1 で見積もったときは、USB-C を含む 18 種類を実装に含められました

  7. 配置プレビューで向きと位置を直す:次の「コンポーネントの配置」で、CPL の座標と回転どおりに部品が載っているかを 3D プレビューで確かめます

    JLCPCB の 3D 配置プレビューの右下を拡大し、左右に並べた図。左の修正前は J1 の USB-C がパッドからずれて基板の外へ出ており、U8 は 90 度回った向き。右の修正後は J1 がパッドに載って基板端に収まり、U8 の向きがパッドに合っている

    配置プレビューの右下(J1 と U8 のまわり)を拡大して並べた。左の修正前は赤枠の J1 がパッドからずれ、U8 が 90 度回っている。右の修正後は J1 がパッドに載り、U8 の足がパッドに重なる

⚠️ 配置プレビューは必ず見る。向きや位置が違っていることがある

JLCPCB の配置プレビューでは、CPL どおりに書き出したデータでも、部品の向きや位置がずれて表示されることがあります。A1 の見積りでは、J1(USB-C)の位置と U8(USBLC6)の向きが違っていました。プレビューで部品を選び、上のツールバーの回転・移動で直してから「次へ」に進みます。

ほかに見ておくところは、RP2040 の 1 番ピン、TXU0104 ×4、SOT-223 の LDO のタブ、LED の極性です。

  1. 見積りを確かめてカートへ:料金の内訳を確かめ、配送方法を選んでカートに入れ、決済します。A0 は DHL Express で、注文確定から 5 日で届きました

    JLCPCB の見積り&発注画面。PCB 価格 $8.00、エコノミック PCBA の価格 $68.01(設定料金 $8.24・ステンシル $1.55・構成部品 18 アイテム $36.41・拡張コンポーネント料 $18.54・SMT アセンブリ $2.36・Nitrogen reflow soldering $0.91)、合計価格 $76.01

    A1 の見積り(2026-10-10・送料別)。PCBA の内訳では、構成部品と拡張コンポーネント料(Extended 部品の段取り費)が大半を占める

届いたら手はんだする部品

PCBA に含まれないのは、次の部品です。SW1 とピンヘッダは別に用意し、USB-C も在庫切れで外した場合は自分で用意します。SW1 と USB-C は、Amazon で買うなら表のリンク先(筆者が使ったものと同等品)を選べます。届いた品が基板に合うかは、備考の条件(ピッチ・ピン数・切り替えの型)で確かめてください。J2・J3 は一般的な 2.54mm ピッチのピンヘッダで構いません。

部品 種類 基板側の要件・備考 入手先
J1 USB-C SMD(0.5mm ピッチ) USB-C レセプタクル(16 ピン・C165948 相当)。PCBA で在庫が無く外した場合だけ。付け方は第2回 Amazon で USB-C レセプタクルを見る →
SW1 スライドスイッチ(SK13D07VG5・C393948) THT SK13D07VG5 互換のスライドスイッチ(SP3T・2.54mm ピッチ・shorting 型)。A1 は改修不要 Amazon でスライドスイッチを見る →
J2 2×16 ピンヘッダ THT プローブ入力 —
J3 1×3 ピンヘッダ THT 外部 VREF(EXT) —

ファームは pico_dig26.uf2 を書き、PulseView は nightly 版を使います(第2回)。

費用の目安

A0(5 枚)の実際の注文額は、第1回に書いたとおりです。

項目 A0 の注文(2026年9月)
製品代(PCB+Economic PCBA・5 枚) $73.10(1 枚 $14.62)
送料(DHL Express) $17.04
合計 $90.14

これは USB-C を実装から外した構成の金額です。A1 の見積り(2026-10-10 時点・カートに保存するところまで)は、PCB $8.00+PCBA $68.01=$76.01 で、送料は別です(DHL の見積り表示は $17.44)。USB-C を実装に含めた構成で、A0 の実績($73.10+送料 $17.04)とほぼ同じでした。部品の価格と在庫、Extended 部品の数、配送方法で変わるので、目安として見てください。製品代の大半は部品代(RP2040・フラッシュ・TXU0104 ×4)です。手はんだの SW1 とピンヘッダは別にかかります。


✅ まとめ

📌 この記事のポイント
  • EXT 1.8V(VREF 1.806V)のしきい値は VT+ 1.399V・VT− 0.732V。1.8V ロジックは EXT で読める
  • 雑音を 30mV 前後に抑えた入力で測り直すと、3.3V 位置は VT+ 2.401V・VT− 1.395V、5V 位置は VT+ 3.290V・VT− 2.138V。第2回の「帯」は入力の雑音によるものだった
  • VT+ は 3 つの VREF すべてで、近い規格行の上限より高めに出た。原因は未特定
  • 選べる最高レートは 120MS/s(150M 以上は取り込み失敗)。12MHz は 120・60MS/s で正しく読め、20MS/s で 8MHz に化け、8MS/s で 4MHz+うなり。24MHz を 8MS/s で取るとほぼ無信号に見えた
  • 16ch・120MS/s で 10 万サンプル(約 0.84ms)まで一度に取れた。それ以上はエラーなしで約 0.45ms に打ち切り
  • 74HC595 に送った 0x0F は、shiftOut(1 クロック 約 2.1µs)でもハードウェア SPI 1MHz でも 0F と読めた。同じ波形を LSB first で読むと F0 になる
  • UART は 115200bps・9600bps とも文字として読めた。9600bps の信号を 115200 で読むと、00 と Break の列に化ける
  • サーボの PWM は、デューティ 12.03%/2.50%・周期 20.0ms から、パルス幅 約 2.40ms/0.50ms(設定 2400µs/500µs)と読めた
  • ロジアナの波形が正しくても、相手の入力ピンに届いているとは限らない。プローブは相手の入力ピンで取る
  • この基板は、リポジトリの製造データ(A1 の Gerber・BOM・CPL)で JLCPCB の PCBA にそのまま発注できる。A1 は SW1 の配線を直した版で改修不要(未製造)。SW1 は手はんだで、USB-C も在庫切れなら手はんだ

JLCPCB の PCBA で組み上がった 1 枚目は、ここまでで「どこまで信じてよいか」の数字がそろい、SPI・UART・サーボ PWM を読めることも確かめられました。次の一手は 3 つです。SW1 のピン割り当てを直した A1 の基板を製造して VREF まわりを確かめること、25MHz の発振器を用意して水晶精度の信号源で上限を追試すること、そして 2 枚目以降の基板で、今回の VT+ の傾向が再現するかを確かめることです。


よくある質問(FAQ)

Q: この自作ロジアナで 1.8V のロジックは読めますか?

A: 読めます。SW1 を EXT にして J3 の中央ピンに 1.8V を入れると、しきい値は VT+ 1.399V・VT− 0.732V でした(VREF 1.806V での実測)。1.8V の High と 0V の Low を、どちらも余裕を持って判定できます。SW1 が 3.3V のままだと VT+ が 2.401V なので、1.8V の High は読めません。

Q: 何 MS/s までサンプリングできますか?

A: PulseView の一覧には 240MHz まで並びますが、150MHz 以上を選ぶと取り込みに失敗します。使える最高は 120MS/s です。12MHz や 24MHz の矩形波は、120MS/s と 60MS/s で周波数を正しく読めました。デューティやタイミングまで見るなら、信号の 4〜10 倍のレートが目安です。24MHz は 120MS/s でも 1 周期 5 サンプルで High 幅が 2 と 3 サンプルの交互になるので、デューティまで読むのは 12MHz 程度までと考えてください。

Q: 16ch で長い時間を取るにはどうすればよいですか?

A: 16ch・120MS/s では 10 万サンプル(約 0.84ms)まで一度に取れました。それ以上を指定するとエラーは出ずに約 0.45ms で打ち切られるので、サンプル数は 10 万以下にします。長く取りたいときはレートを下げます。取れる時間はサンプル数 ÷ レートで、使わないチャンネルを無効にしてデータ量を減らすのも有効とみられます。

Q: エイリアス(折り返し)かどうかは、どうやって見分けますか?

A: ロジアナの画面だけでは見分けられません。エイリアスも、きれいな矩形波として描かれるからです。オシロで一度信号の周波数を確かめるか、レートを 2 倍に上げて同じ周波数に見えるかを確かめます。本物の信号なら周波数は変わらず、エイリアスなら見かけの周波数が変わります。化けた先の周波数は |f − k × fs| で計算できます。

Q: 第2回のしきい値と値が違うのはなぜですか?

A: 第2回は、入力に 0.5〜0.9Vpp の雑音が乗った状態で推定した目安でした。雑音があると、見かけの VT+ は低く、VT− は高く出ます。今回は雑音を 30mV 前後に抑えた入力で測り直し、3.3V 位置で VT+ 2.401V・VT− 1.395V になりました。

Q: SPI や UART のデコード結果が、送った値と違うときはどうすればよいですか?

A: まずデコーダの設定を、送る側の設定と合わせます。SPI の Bit order が逆だと 0x0F は F0 と表示され、UART のボーレートが違うと 00 と Break の列になります。どちらもエラーは出ません。UART のボーレートが分からないときは、いちばん短いパルスの幅が 1 ビットの幅(1 ÷ ボーレート)なので、104µs なら 9600bps と分かります。値は正しいのに相手が動かないときは、プローブを相手の IC の入力ピンに移して、配線の途中を確かめます。

Q: この基板は自分でも作れますか?

A: 作れます。リポジトリ ramtuc/rp2040-logic-analyzer の hardware/jlcpcb/ にある A1 の Gerber 16 ファイルを zip にしてアップロードし、BOM と CPL を渡せば、JLCPCB の Economic PCBA で発注できます。A1 は SW1 の配線を直した版で、スイッチの改修は要りません。ただし A1 はまだ製造しておらず、筆者が検証したのは A0 を改修した基板です。費用の目安は、A0 の 5 枚が送料込みで $90.14 でした。A1 の 5 枚の見積りは $76.01(2026-10-10 時点・送料別)です。発注の途中で SW1 が CPL に無いというダイアログが出ますが「次へ」で進めます。配置プレビューでは部品の向きや位置が違うことがあるので(A1 では J1 と U8)、必ず確かめて直してください。届いたら SW1・J2・J3(在庫次第で USB-C も)を手はんだします。SW1 と USB-C の入手先は本文の表に載せています。


関連記事


参考


基板提供:JLCPCB(PCB 製造・部品実装)

JLCPCB のロゴ