I2Cセンサがたまに応答しない——その犯人、プルアップ抵抗かも
ArduinoやラズパイにI2Cセンサをつないで、最初はうまく動いていたのに、配線を伸ばしたら突然データが化ける。ブレッドボードでは動くのに、ユニバーサル基板にハンダ付けしたらNACKが返ってくる。こういう経験、電子工作をやっていると一度はあるよね。
原因の多くは「プルアップ抵抗の値が合っていない」こと。このツールは、電源電圧・ICのしきい値・バス容量を入力するだけで、抵抗値の許容範囲とE24系列の推奨値を一発で算出する。I2C・SPI・GPIO汎用の3モードに対応しているから、プルアップが必要なあらゆる場面で使える。
なぜプルアップ抵抗計算ツールを作ったのか
開発のきっかけ
I2Cで温湿度センサ(SHT31)を5台バス接続するプロジェクトで、4.7kΩのプルアップ抵抗を付けたのに通信が不安定になった。原因を調べると、センサ5台分の入力容量とケーブル容量が合計300pFを超えており、立ち上がり時間がFastモードの規格ギリギリだった。
データシートのVIH/VOL表を見ても「結局何kΩにすればいいのか」がパッとわからない。NXPのI2C仕様書(UM10204)にはRmin/Rmaxの計算式が載っているが、毎回手計算するのは面倒だし、SPI/GPIOでは別の考え方が必要になる。
こだわった設計判断
E24系列の自動選定: 抵抗範囲を計算しても、実際に買える値(E24系列)を選ばないと意味がない。範囲内のE24値をすべてリストアップし、幾何平均に最も近い値を推奨する設計にした。
I2Cスピードモード対応: Standard/Fast/Fast+/High-speedの4モードで立ち上がり時間の規格値が異なる。モードを切り替えるだけでRmaxが自動更新されるので、「Fastモードに変えたら抵抗値も変えなきゃ」という見落としを防げる。
プリセット+カスタム入力: 3.3V CMOS/5V CMOS/5V TTL/1.8V CMOSの4プリセットをワンタップで切り替えられるが、ICのデータシートで正確な値がわかればカスタム入力も可能。
プルアップ抵抗とは何か——オープンドレインの仕組みから理解する
オープンドレイン出力とプルアップ抵抗の関係
プルアップ抵抗を理解するには、まず「オープンドレイン(オープンコレクタ)」という出力方式を知る必要がある。
通常のデジタル出力(プッシュプル)は、IC内部にHighを出すトランジスタとLowを出すトランジスタの両方がある。スイッチを上に倒せば電源につながり、下に倒せばGNDにつながるイメージだ。
一方、オープンドレイン出力にはLow側のトランジスタしかない。つまり「GNDに引っ張ることはできるが、電源に押し上げる力がない」。水道でたとえるなら、排水バルブはあるけど給水ポンプがない状態。水(電圧)を補うために、外部から蛇口(抵抗)を通じて水道管(電源)につなぐ——これがプルアップ抵抗の役割だ。
I2Cバスがオープンドレインを採用しているのは、複数のデバイスが同じ信号線を共有するため。どのデバイスもLowに引っ張ることができ、誰も引っ張らなければプルアップ抵抗がHighに戻す。この仕組みのおかげで、ワイヤードAND(論理積)が自然に実現される。
プルアップ抵抗 計算の基本式
プルアップ抵抗値Rpの許容範囲は、2つの条件から決まる:
Rmin = (VCC - VOL) / IOL
Rmax = tr_max / (0.8473 × Cb) ← I2Cの場合
- Rmin(最小値): Low出力時にVOL以下を保証するための下限。抵抗が小さすぎるとシンク電流が過大になり、ICが壊れる可能性がある
- Rmax(最大値): バス容量Cbを充電してHigh電圧まで立ち上がるのに十分な時間を確保するための上限。抵抗が大きすぎると信号の立ち上がりが遅くなり、通信エラーが発生する
定数0.8473はRC回路で電圧が0.3VCC(VILの目安)から0.7VCC(VIHの目安)まで変化する時間の係数で、-ln(0.3/0.7)から導出される。
プルダウン抵抗との違い
プルダウン抵抗は信号線をGNDに引っ張る抵抗。SPIのCS(チップセレクト)線やGPIO入力のデフォルト状態をLowにしたい場合に使う。計算の考え方はプルアップと対称的で、High/Lowの条件が入れ替わる。
なぜプルアップ抵抗値が重要なのか——小さすぎても大きすぎてもダメ
抵抗値が小さすぎる場合の問題
プルアップ抵抗が小さすぎると、ICがLowを出力しているときに流れるシンク電流が大きくなる。たとえば3.3V電源で470Ωのプルアップを付けると、Low出力時に約7mAの電流が流れる。一般的なCMOS ICのIOL定格は3mA程度なので、ICの絶対最大定格を超える危険性がある。
最悪の場合、ICの出力トランジスタが熱破壊を起こす。そこまでいかなくても、VOLが規定値(I2Cでは0.4V)を超えてしまい、受信側がLowと認識できなくなる。
抵抗値が大きすぎる場合の問題
抵抗が大きいと、信号線の寄生容量を充電するのに時間がかかり、立ち上がり波形が鈍る。I2C Fastモード(400kHz)では立ち上がり時間の規格上限が300ns。バス容量200pFで10kΩのプルアップだと、立ち上がり時間は約1694nsとなり、規格を大幅に超過する。
結果として、クロックやデータの波形がなまり、受信側のサンプリングタイミングでHigh/Lowが確定せず、通信エラーやデータ化けが発生する。
消費電流とのトレードオフ
バッテリー駆動の機器では、プルアップ抵抗を通じた静的消費電流も無視できない。3.3V/4.7kΩのプルアップは約0.7mAの定常電流を消費する。I2Cバスが2本(SDA/SCL)あれば合計1.4mA。コイン電池(CR2032、容量約220mAh)なら、プルアップだけで約6.5日で電池切れになる計算だ。
プルアップ抵抗計算が活躍する場面
Arduino/ラズパイのI2Cセンサ接続
BME280やMPU-6050などのI2Cセンサをブレッドボードに挿して「とりあえず4.7kΩ」——これはStandardモードなら大体うまくいく。だが、Fastモードに切り替えたり、センサを3台以上バス接続したりすると途端に不安定になる。バス容量を概算して適切な抵抗値を求めるのが安全だ。
SPI通信のCS線プルアップ
SPIのチップセレクト(CS)は通常Active Low。マイコンの起動直後、GPIOが初期化されるまでの間にCSがフローティングになると、意図しないデバイスが応答してバスが衝突する。CS線に10kΩ程度のプルアップを入れるのが定石だが、高速SPIでは立ち上がり時間も考慮が必要になる。
GPIO入力のチャタリング対策
タクトスイッチやロータリーエンコーダの入力にプルアップ/プルダウン抵抗を付けるのは基本中の基本。マイコン内蔵のプルアップ(20〜50kΩ程度)では弱すぎてノイズを拾う場合、外付けで1〜10kΩの抵抗を追加する。
基本の使い方
3ステップでプルアップ抵抗の推奨値が求まる。
Step 1: 回路モードを選ぶ
I2C・SPI・GPIO汎用から使用する回路を選択。I2Cを選ぶとバス容量やスピードモードの入力欄が追加表示される。
Step 2: 電圧・電流パラメータを入力する
プリセット(3.3V CMOS、5V TTLなど)を選べばVCC/VIH/VIL/IOLが自動入力される。ICのデータシートに正確な値が載っていれば、カスタムで個別に入力してみて。
Step 3: 結果を確認する
許容範囲(Rmin〜Rmax)、E24推奨値、立ち上がり時間、静的消費電流が一覧表示される。範囲内のE24候補が複数ある場合はすべてリストアップされるので、手持ちの抵抗から選ぶこともできる。
具体的な使用例(検証データ)
ケース1: 3.3V I2C Standardモード(基本的な構成)
Arduino UnoとBME280センサ1台をI2C接続する典型例。
入力値:
- 回路モード: I2C / プリセット: 3.3V CMOS
- VCC: 3.3V / VIH: 2.0V / VIL: 0.8V / IOL: 3mA
- I2Cスピード: Standard (100kHz) / バス容量: 50pF
計算結果:
- Rmin: 967 Ω / Rmax: 23.6 kΩ
- 推奨値 (E24): 4.7 kΩ
- 立ち上がり時間: 199 ns(規格上限1000ns)
→ 解釈: 定番の4.7kΩで問題ない。範囲が広いのでStandardモードは余裕がある。
ケース2: 5V TTL I2C Fastモード
5Vの旧世代ICでFastモード通信を行うケース。
入力値:
- 回路モード: I2C / プリセット: 5V TTL
- VCC: 5.0V / VIH: 2.0V / VIL: 0.8V / IOL: 8mA
- I2Cスピード: Fast (400kHz) / バス容量: 200pF
計算結果:
- Rmin: 575 Ω / Rmax: 1.77 kΩ
- 推奨値 (E24): 1.0 kΩ
- 立ち上がり時間: 169 ns(規格上限300ns)
→ 解釈: IOLが8mAと大きいのでRminが低い。Fastモード+大容量バスでRmaxが絞られる。1kΩが妥当。
ケース3: 1.8V低電圧I2C
最新の低電圧ICでの構成。
入力値:
- 回路モード: I2C / プリセット: 1.8V CMOS
- VCC: 1.8V / VIH: 1.17V / VIL: 0.63V / IOL: 2mA
- I2Cスピード: Standard (100kHz) / バス容量: 80pF
計算結果:
- Rmin: 700 Ω / Rmax: 14.8 kΩ
- 推奨値 (E24): 3.3 kΩ
- 立ち上がり時間: 224 ns(規格上限1000ns)
→ 解釈: 低電圧でもStandardモードなら選択肢は多い。ただし静的電流が0.55mAとバッテリー駆動では気になる値。
ケース4: I2C Fast+モード(大容量バス)
複数センサをバス接続する産業用途。
入力値:
- 回路モード: I2C / プリセット: 3.3V CMOS
- VCC: 3.3V / VIH: 2.0V / VIL: 0.8V / IOL: 3mA
- I2Cスピード: Fast+ (1MHz) / バス容量: 400pF
計算結果:
- Rmin: 967 Ω / Rmax: 354 Ω
- 推奨値 (E24): 該当なし(範囲外)
→ 解釈: Rmin > Rmaxで許容範囲が存在しない。バス容量400pFはFast+モードでは多すぎる。バッファICを入れるか、バスを分割する必要がある。
ケース5: SPI CS線プルアップ
SPIデバイスのCS線にプルアップを入れるケース。
入力値:
- 回路モード: SPI / プリセット: 3.3V CMOS
- VCC: 3.3V / VIH: 2.0V / VIL: 0.8V / IOL: 3mA
計算結果:
- Rmin: 833 Ω / Rmax: 8.33 kΩ
- 推奨値 (E24): 2.7 kΩ
→ 解釈: CS線は通信速度に直接影響しないので、範囲内の中間値で十分。消費電流を抑えたければ大きめの値を選ぶ。
ケース6: GPIO入力プルダウン
タクトスイッチの入力にプルダウン抵抗を接続するケース。
入力値:
- 回路モード: GPIO汎用 / プリセット: 5V CMOS
- VCC: 5.0V / VIH: 3.5V / VIL: 1.5V / IOL: 3mA
計算結果:
- Rmin: 1.17 kΩ / Rmax: 11.7 kΩ
- 推奨値 (E24): 3.3 kΩ
→ 解釈: スイッチ入力は速度が不要なので、範囲内の好きな値でよい。ノイズ環境が厳しければ小さめ(1.5kΩ〜2.2kΩ)を選ぶ。
仕組み・アルゴリズム
採用した計算方式: I2C仕様準拠 vs 簡易経験則
プルアップ抵抗の計算には大きく2つのアプローチがある:
方式1: I2C仕様書準拠(本ツールのI2Cモード) NXP UM10204に記載された電気特性から厳密にRmin/Rmaxを算出する。バス容量と立ち上がり時間の制約を正確に反映できるが、パラメータ(Cb, IOL, VOL等)を正しく入力する必要がある。
方式2: 経験則ベース(「とりあえず4.7kΩ」) 多くのアプリケーションノートや入門書で紹介される方法。3.3V/5VのI2C Standardモードなら4.7kΩ〜10kΩでたいてい動く。だが、Fastモード以上やバス容量が大きい場合には根拠のない値になる。
本ツールのSPI/GPIOモードでは方式1と方式2の中間——VIH/VIL保証からRminを求め、実用上限としてRmin×10をRmaxとする簡易方式を採用している。
計算フロー
1. 入力パラメータの検証
- VCC > 0, IOL > 0, VIL < VIH < VCC
2. Rmin算出
I2C: Rmin = (VCC - 0.4V) / IOL
GPIO: Rmin = (VCC - VIL) / IOL
3. Rmax算出
I2C: Rmax = tr_max / (0.8473 × Cb)
GPIO: Rmax = Rmin × 10
4. E24系列から推奨値を選定
- 範囲内のE24値をすべて列挙
- 幾何平均 √(Rmin × Rmax) に最も近い値を推奨
5. 付帯情報の算出
- 立ち上がり時間: tr = 0.8473 × Rp × Cb
- 静的消費電流: I = VCC / Rp
E24系列の丸めロジック
E24系列は1ディケード(10倍)あたり24個の値が等比級数的に配置されている。具体的には10^(n/24)の近似値で、1.0, 1.1, 1.2, ... 9.1の24値を10のべき乗倍して使う。
推奨値の選定では、単純な算術平均ではなく幾何平均(√(Rmin × Rmax))を中心に最も近いE24値を選ぶ。対数スケールで均等に分布する抵抗値に対して、対数スケールの中央を取るのが合理的だからだ。
参考: E系列 — Wikipedia
Excel計算やオンラインツールとの違い
入力の手軽さ
DigiKeyやTexas Instrumentsが提供するオンライン計算ツールは高機能だが、入力パラメータが多く、初心者には敷居が高い。本ツールはプリセット選択で主要パラメータが自動入力されるので、I2CやCMOSの基礎知識がなくてもすぐに使える。
結果の実用性
多くの計算ツールはRmin/Rmaxの数値を出すだけで、「で、何Ωの抵抗を買えばいいの?」に答えてくれない。本ツールはE24系列から即座に推奨値を選定し、範囲内の候補をすべてリストアップする。手持ちの抵抗から選ぶときにも便利。
マルチモード対応
I2C専用の計算ツールは多いが、SPI/GPIOのプルアップにも対応しているものは少ない。回路モードを切り替えるだけで計算式が自動的に切り替わるので、用途に応じた使い分けが簡単。
プルアップ抵抗にまつわる豆知識
E24系列の由来
抵抗値のE系列は国際電気標準会議(IEC)が定めた標準数列で、E24は許容差±5%の抵抗に対応する。隣り合う値の比率は約10^(1/24) ≈ 1.101で、±5%の誤差範囲で隣の値とちょうど重なるように設計されている。
E12(±10%)、E48(±2%)、E96(±1%)と精度が上がるほど値の数が増える。プルアップ抵抗は通常±5%で十分なので、E24で選ぶのが一般的。
なぜI2CのVOLは0.4V固定なのか
I2C仕様でVOL最大値が0.4Vに固定されているのは、TTLロジックとの互換性に由来する。1980年代にPhilips(現NXP)がI2Cを策定したとき、当時主流だったTTLのVIL(0.8V)に対して十分なノイズマージン(0.4V)を確保するために、VOL ≤ 0.4Vと規定した。この値は40年以上変わっていない。
プルアップ抵抗選定のTips
Tip 1: 迷ったら4.7kΩから始める
3.3V/5VのI2C Standardモードでバス容量が小さい(100pF以下)なら、4.7kΩはほぼ安全圏。まずこれで動作確認し、問題があれば計算で追い込む。
Tip 2: バス容量の見積もり方
ICの入力容量(データシートのCin、通常5〜15pF)× デバイス数 + 配線容量(1pF/cm目安)で概算できる。不明なら100pFで計算しておけば安全側。
Tip 3: I2Cの2本線は同じ抵抗値でよい
SDAとSCLは同じバス条件なので、通常は同じ抵抗値でOK。ただし、クロックストレッチを使うデバイスがある場合、SCLのプルアップをやや小さくすると安定することがある。
Tip 4: マイコン内蔵プルアップは補助的に使う
多くのマイコンにはGPIO内蔵のプルアップ(20〜50kΩ)があるが、I2C通信には弱すぎることが多い。外付け抵抗を基本とし、内蔵は使わないか補助程度に。
よくある質問
Q: プルアップ抵抗は1本でいい?SCLとSDAそれぞれに必要?
I2CではSCLとSDAの両方にプルアップ抵抗が必要。どちらもオープンドレインなので、それぞれに1本ずつ、合計2本を接続する。抵抗値は同じで問題ない。
Q: ブレークアウトボード(モジュール)に抵抗が載っている場合はどうする?
多くのI2Cブレークアウトボードには10kΩや4.7kΩのプルアップが実装済み。複数のモジュールを接続すると並列合成で抵抗値が下がりすぎることがある。モジュールが2枚なら4.7kΩ並列で2.35kΩ、3枚なら1.57kΩ。合成値がRmin以上であることを確認しよう。
Q: 3.3Vと5Vのデバイスを混在させる場合は?
電圧が異なるデバイスを直接I2C接続するのは危険。3.3Vデバイスの入力に5Vがかかると破損する。レベルシフター(BSS138ベースやPCA9306等)を使い、それぞれの電圧側に適切なプルアップを入れる。本ツールで各側の抵抗値を個別に計算するとよい。
Q: 計算結果はデータシートの値と一致する?
本ツールはI2C仕様書(NXP UM10204)の電気特性に基づく概算値を出力する。実際のICは仕様書の値と異なるIOLやVOLを持つことがあるため、精密な設計ではICのデータシートの値をカスタム入力して計算することを推奨する。
Q: プルアップ抵抗の消費電力は気にしなくてよい?
通常の信号線プルアップでは消費電力は微小(数mW以下)なので、1/8W〜1/4Wの一般的なチップ抵抗で十分。ただし、低抵抗(数百Ω)で高電圧の場合は P = V²/R で確認しておくと安心。
まとめ
プルアップ抵抗の値は「とりあえず4.7kΩ」で済むこともあるが、Fastモード以上やバス容量が大きい構成では計算による裏付けが不可欠。このツールなら、プリセット選択とパラメータ入力だけでRmin〜RmaxとE24推奨値が即座に求まる。
回路設計で抵抗値の選定に迷ったら、まずこのツールで安全な範囲を確認してみて。抵抗のカラーコードが読めない場合は抵抗カラーコード計算ツール、LED回路の抵抗計算にはLED回路設計ツールも試してみて。
不具合や要望があれば、X (@MahiroMemo)から気軽に教えて。