Skip to content

필사 모드: プログラマーのためのオームの法則 — 電圧・電流・抵抗を数字で理解する

日本語
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.

はじめに — 抵抗ひとつを忘れてLEDを焼いた日

ブレッドボードにLEDを挿し、長い脚をArduinoのD9に、短い脚をGNDにつなぎます。コードは一行だけです。digitalWrite(9, HIGH)。LEDは一瞬まぶしいほど明るく光り、暗くなり、消えます。挿し直しても、もう点きません。

ソフトウェアではこんなことはほとんど起きません。間違ったコードは例外を投げるか誤った値を返しますが、関数が物理的に消えることはありません。ハードウェアでは部品が消えます。そして消える理由はほとんどの場合、ひとつの数字を正しく把握していなかったことにあります。

上の回路でその数字とは電流です。LEDにどれだけの電流を流すかを、誰も決めていませんでした。それを決める部品、つまり抵抗がなかったからです。この記事の目標は、その数字を自分で計算できるようになることです。

電圧・電流・抵抗 — 3つの数字が正確に意味するもの

まず用語を正確に押さえておきましょう。この3つがあいまいなままだと、この先のすべての計算があいまいになります。

電流(current)は流れです。単位はアンペアで、記号はIです。1アンペアとは、ある断面を1秒間に1クーロンの電荷が通過することです。マイコンの世界では主にミリアンペアを使います。LED1個で約15mA、Arduinoのピン1本が安全に出せる最大値はおよそ20mAです。

電圧(voltage)は流れではなく差です。単位はボルトで、記号はVです。ここで一番重要なのは、電圧は1点の性質ではなく2点間の関係だということです。「D9ピンの電圧は5Vだ」という文は、実は「D9ピンとGNDの間の電位差が5Vだ」の省略形です。基準点を示さない電圧には値がありません。

ここがプログラマーにとって一番なじみのないところです。変数はひとつの値を持ちますが、電圧は常に2点を要求します。マルチメーターのプローブが2本ある理由がこれです。プローブ1本の電圧計は作れません。

抵抗(resistance)は制約です。単位はオームで、記号はRです。同じ電圧をかけたときに、どれだけ電流を流しにくくするかを表します。

この3つを結びつけるのがオームの法則です。

V = I × R
I = V / R
R = V / I

3つの形は同じ式で、何が分かっていないかによって使う形が変わるだけです。実際に回路を組むときに一番よく使うのは3番目の形です。かかる電圧と流したい電流が決まっていて、それを実現する抵抗を求めることが、部品選定の大部分を占めます。

数字を入れてみましょう。5V電源とGNDの間に220オームの抵抗ひとつだけをつなぐと、

電流 = 5V / 220オーム = 0.0227A = 22.7mA

この22.7mAは計算で出た値というより、物理的に決まる値です。電源が5Vを保ち、抵抗が220オームである限り、他の値が流れる余地はありません。

ここでプログラマーが最もよく持つ誤解をひとつ整理しておきます。電源は電圧を決め、部品が電流を決めます。「5V 2Aアダプター」とは2Aを押し込むという意味ではなく、最大2Aまで供給できるという意味です。実際に流れる電流はつながっている回路の抵抗が決めます。何もつながなければ0Aが流れ、アダプターはそれに何の不満もありません。

水の比喩はどこまで正しく、どこで崩れるか

電気を学ぶとき、ほとんど必ず水の比喩が出てきます。電圧は水圧、電流は流量、抵抗は細い管。この比喩はかなりよく機能します。そして、正確にどこで崩れるかを知って使うと、もっとよく機能します。

まず合っている部分から見ましょう。水圧が高いほど水はたくさん流れ、管が細いほど少ししか流れません。これがオームの法則です。管を複数並列に置くと全体としてもっと水が流れます。これが並列抵抗が合成抵抗を下げる理由です。水が管の途中で消えないことも合っています。これがキルヒホッフの電流則です。

ここから崩れる部分です。

第一に、水は片方の端だけ開けても流れます。電流は閉じた経路がなければ流れません。電線1本を5Vにつなぎ、反対側を宙に浮かせておけば電流は0です。水槽からホースを抜けば水があふれ出ますが、回路から線を抜いても何も起きません。初心者がGND接続を忘れて「電源は入れたのになぜ動かないんだろう」と聞く理由はここにあります。

第二に、水は管の中にたまっていますが、電荷は回路の中で待機しているわけではありません。水の比喩は電流を「運ばれる物質」として想像させますが、実際にエネルギーを運んでいるのは導線の周りの電磁場であり、電子そのものは非常にゆっくり動きます。この違いが実務で表れるのが高速信号です。電線の長さや配置が信号の形を変える理由は、流量モデルでは説明できません。

第三に、そして最も重要なことですが、水の比喩では管の抵抗は固定です。しかし実際の回路部品の相当数は抵抗が固定ではありません。LEDはかかる電圧によって抵抗が急激に変わります。トランジスタは第三の信号によって抵抗が変わります。水の比喩でLEDを理解しようとした瞬間、完全に誤った結論にたどり着きます。この話はLED抵抗計算の記事で詳しく扱います。

まとめるとこうなります。抵抗と電源だけの回路では、水の比喩をいくら使っても構いません。能動素子が登場した瞬間、比喩は捨てて部品の実際の特性曲線を見る必要があります。

直列と並列を手で計算する

ブレッドボードで実際に出会う配置は2種類しかありません。部品が一列に並ぶ直列と、部品が同じ2点の間に並んで付く並列です。

直列 — 電流が同じで、電圧が分かれる

5V電源に220オームと330オームを順番につないだとします。

合成抵抗 = 220オーム + 330オーム = 550オーム
電流     = 5V / 550オーム = 0.00909A = 9.09mA

電流の行き先はひとつしかないので、両方の抵抗に等しく9.09mAが流れます。それぞれの抵抗にかかる電圧は、オームの法則をもう一度当てはめれば出てきます。

220オームにかかる電圧 = 0.00909A × 220オーム = 2.00V
330オームにかかる電圧 = 0.00909A × 330オーム = 3.00V
合計                  = 5.00V

合計はぴったり電源電圧と一致します。これは偶然ではなく法則で、少し後で名前を付けます。そしてこの構造にも名前があります。電圧分割器です。5Vを2Vと3Vに分けて使えるということで、センサー出力を下げたりアナログ入力の範囲に合わせたりするときにそのまま使われます。

並列 — 電圧が同じで、電流が分かれる

同じ220オームと330オームを、今度は5VとGNDの間に並べてつなぎます。両方の抵抗の両端が同じ2点なので、両方に5Vがかかります。

220オームに流れる電流 = 5V / 220オーム = 22.7mA
330オームに流れる電流 = 5V / 330オーム = 15.2mA
全体の電流            = 22.7 + 15.2 = 37.9mA

全体の抵抗を逆算するとこうなります。

合成抵抗 = 5V / 0.0379A = 132オーム

公式でも確認できます。

合成抵抗 = (220 × 330) / (220 + 330) = 72600 / 550 = 132オーム

並列合成抵抗は常に最小の抵抗値より小さくなります。道がもうひとつ増えたのだから全体の流れが増えるのは当然です。この事実は実務で安全確認によく使われます。計算結果が構成要素の最小値より大きく出たなら、どこかで計算を間違えています。

共通の値分かれる値合成抵抗実務での用途
直列電流電圧各抵抗の和電圧分割器、LED電流制限
並列電圧電流最小値より小さい電源レールにぶら下がるすべての負荷

最後の欄が重要です。ボードの5Vレールにセンサーを3つつなぐと、その3つは互いに並列になります。だからそれぞれが要求する電流が単純に足し合わされます。Arduino Unoの5Vレールが耐えられる上限はおよそ450mA、ラズベリーパイの3.3Vレールはおよそ50mAで、この限度を超えるかどうかの計算は並列電流の足し算ひとつで終わります。

キルヒホッフの2法則 — 測定に使う道具

先ほど、直列抵抗にかかる電圧の合計が電源電圧とぴったり一致しました。そして並列の枝の電流の合計が全体の電流と一致しました。この2つには名前があり、試験用の知識ではなく、回路が動かないときに原因を探る道具です。

電圧則 — 一周回ると0になる

閉じた経路を一周たどりながら電圧の上がり下がりをすべて足すと、ぴったり0になります。電源で5V上がったなら、部品を通り過ぎながら合計で5V下がって出発点に戻らなければなりません。出発点に戻ったのに電位が変わっていたら、それは同じ点ではなかったという意味なので矛盾です。

この法則が実戦で使われる形はこうです。5V電源に抵抗とLEDが直列につながった回路があり、LEDが点きません。マルチメーターで抵抗の両端を測ると5Vが出ます。この瞬間に答えが出ます。一周の合計は0でなければならないので、LEDにかかる電圧は0Vです。電圧が0なのに回路が閉じているなら、LEDの位置は事実上ただの導線だということで、LEDがショートしているか、ブレッドボードで両方の脚が同じ列に挿さっています。

逆の結果も同じくらい役立ちます。抵抗の両端が0VでLEDの両端が5Vなら、抵抗に電圧がかかっていないということは電流が流れていないという意味です。LEDが逆向きに挿さっているか、脚が切れています。

電圧を2回測るだけで2種類の故障を見分けられます。これがこの法則の実用的な価値です。

電流則 — 接点に入った分だけ出てくる

ひとつの接点に入る電流の総和と、その接点から出る電流の総和は等しくなります。電荷は接点にたまらないからです。

先ほどの並列計算がこの法則そのものです。電源から出た37.9mAが分岐点で22.7mAと15.2mAに分かれ、再び合わさって37.9mAとしてGNDに戻ります。

この法則が実務で使われる最も重要な形が電流予算です。ボードのGNDに戻る電流は、すべての負荷が消費した電流の合計です。だから部品ひとつひとつには余裕があっても、合計が上限を超えることがあります。ラズベリーパイはGPIOピン1本あたり16mAを許容しますが、全GPIOを合わせると上限は50mAです。ピン4本にそれぞれ15mAずつ流すと、個別にはすべて合格ですが、合計60mAで不合格になります。この計算はまるごと電流則の足し算です。

部品の数が増えると、この足し算を手でやるのは煩わしくなります。このブログの配線検証ツールにボードと部品を載せると、ピンごとの電流と3.3V・5Vレールごとの合計を計算して、どの上限に先に引っかかるかを示してくれます。手計算した値と突き合わせる用途に使うとよいでしょう。

電力 — 抵抗が熱くなる理由と定格の選び方

抵抗に電流を流すと抵抗は温かくなります。これは副作用ではなく、抵抗がする仕事そのものです。抵抗体の中で電子が原子とぶつかって運動エネルギーを失い、そのエネルギーが格子の振動、つまり熱になります。抵抗は電気エネルギーを熱に変える部品であり、電流を制限するということはその分のエネルギーを熱として捨てるということです。

捨てられる量が電力で、単位はワットです。

P = V × I

オームの法則を代入すると、便利な変形がさらに2つ出てきます。

P = I² × R
P = V² / R

先ほどの直列の例で計算してみます。330オームに9.09mAが流れ、3.00Vがかかっていました。

P = 3.00V × 0.00909A = 0.0273W = 27.3mW

一般的な炭素皮膜抵抗の定格は1/4W、つまり250mWです。27.3mWはその9分の1なので何の問題もありません。

今度は状況を変えてみます。12V電源に100オームの抵抗ひとつをつなぐと、

電流 = 12V / 100オーム = 0.12A = 120mA
電力 = 12V × 0.12A = 1.44W

1.44Wです。ここに1/4Wの抵抗を挿すとどうなるでしょうか。定格のほぼ6倍なので、抵抗体は数百度まで上がります。炭素皮膜が酸化して抵抗値がだんだん上がり、カラーコードが黒く焦げ、最後には皮膜が切れて開放になります。運が悪ければその前にブレッドボードのプラスチックが溶けます。この場合は3W以上のセメント抵抗を使う必要があります。

定格は余裕を持たせて選ぶのが原則です。実務でよく使われる基準は、計算した消費電力の2倍以上の定格を選ぶことです。理由は2つあります。抵抗の定格は通常、周囲温度25度で空気が自由に通う条件での値ですが、ケースの中や部品の間に挟まれるとその条件ではなくなります。そして定格の近くで長時間使うと、抵抗値自体がじわじわ変化します。

定格実際の部品の形状安全に使える実使用電力代表的な用途
1/8W(125mW)ごく小さな炭素皮膜60mW以下基板のスペースが狭い場所
1/4W(250mW)最も一般的な茶色い胴体125mW以下LED電流制限、プルアップ
1/2W(500mW)少し太めの胴体250mW以下12V系の回路
2W以上白い角ばったセメント抵抗1W以下電源部、ダミー負荷

LED電流制限抵抗はほとんどの場合50mW以下なので、1/4Wで十分に余裕があります。初心者向けキットに入っている抵抗がほぼ全部1/4Wなのはこのためです。ただしこれは「抵抗は全部1/4Wでいい」という意味ではない点だけは覚えておいてください。12V以上を扱い始めたら計算が必要になります。

マルチメーターで実際に測る(そしてヒューズを飛ばすミス)

計算と現実が食い違うとき、判断の根拠になるのは測定値です。マルチメーターはハードウェアにおけるデバッガーであり、使い方には必ず知っておくべき非対称性がひとつあります。

電圧は並列に、部品の両脇で測る

電圧は2点の差なので、知りたい2点にプローブを当てればよいだけです。回路に手を加える必要はまったくありません。抵抗の両端を測りたければ、抵抗の左と右にプローブを当てるだけで終わりです。

これでよい理由は、電圧計の内部抵抗が非常に大きいからです。通常10メガオームです。5Vの点を測るとき電圧計に漏れる電流は、

5V / 10000000オーム = 0.0000005A = 0.5マイクロアンペア

回路に流れる数十mAに比べれば、ないに等しい値です。だから測定という行為が回路を変えることはありません。

測定するときは基準点を見失わないことが大切です。黒いプローブをGNDに固定し、赤いプローブであちこち当てる方法が最もミスが少ないです。こうするとすべての測定値がGND基準の電位になり、互いに比較できます。

電流は直列に、回路を切ってそこに割り込ませる

電流はある地点を通過する量なので、その地点を実際に通過させなければ測れません。つまり回路をどこか1か所切って、切った両側にプローブをつなぎ、電流がマルチメーターを通過するようにする必要があります。

電流計の内部抵抗は非常に小さいです。mAレンジではおよそ10オーム前後、10Aレンジでは0.01オーム程度です。回路への影響をできるだけ小さくするために小さくしてあります。それでも完全にゼロではないので、測定という行為自体が回路を少し変えます。mAレンジで10オームのシャントに20mAを流すと、

0.02A × 10オーム = 0.2V

0.2Vがマルチメーターの中で消費されます。これが負担電圧です。5V回路では0.2Vは4パーセントなのでたいてい無視できますが、3.3Vでマージンがぎりぎりの回路を見るときは、この値のせいで回路が突然動作を止めることもあります。測定中だけ症状が消えるなら、この負担電圧を疑う価値があります。

誰もが一度はやるミス — 電流レンジで電圧を測る

電圧測定に慣れた後で電流を測ろうとすると、手が習慣どおりに動いてダイヤルだけAに回し、プローブはそのまま5VとGNDに当ててしまいます。つまり電流計を電源に並列につないでしまうのです。

その瞬間に何が起きるか計算してみましょう。電流計はほとんど抵抗のない導線です。mAレンジの10オームで計算すると、

電流 = 5V / 10オーム = 0.5A = 500mA

mAジャックに付いているヒューズは通常200mAか500mAの規格なので、即座に切れます。10Aジャックに挿さっていたら0.01オームなので理論上は数百アンペアになり、実際には電源が耐えられるだけ流れます。USB電源なら保護回路が遮断しますが、リチウム電池ならプローブが赤く焼けます。

そしてこの事故は静かに過ぎ去ります。ヒューズが切れたマルチメーターは電圧は問題なく測れて、電流だけ常に0を示します。だから翌日「なぜ電流が0なんだろう」と回路をばらすことになります。電流がずっと0のままなら、回路よりもマルチメーターのヒューズを先に疑うのが順番です。

これを防ぐ習慣は簡単です。電流測定が終わったらすぐにプローブを電圧ジャックに戻すことです。ダイヤルではなくプローブの位置を基本状態に保っておけば、手が習慣どおりに動いても事故にはなりません。

抵抗測定にはひとつ条件があります

抵抗測定は、マルチメーターが自分で小さな電圧をかけて流れる電流を測る方式です。だから2つの前提が必要です。

第一に、回路の電源が切れていなければなりません。電源が生きていると、マルチメーターがかけた電圧と回路の電圧が混ざって値がめちゃくちゃになり、ひどい場合はマルチメーターが壊れます。

第二に、測ろうとする抵抗が回路から切り離されていなければなりません。基板に挿さったまま測ると、その抵抗と並列につながっている他の経路まで一緒に測ってしまいます。先ほど見たように並列合成は常に最小値より小さくなるので、実際より小さい値が出ます。220オームと書かれた抵抗を測って132オームが出たなら、抵抗が不良なのではなく、隣に330オームが並列につながっています。

Arduinoで電圧を直接読んでみる

マルチメーターなしでもボードで電圧を測れます。アナログ入力がしていることはまさにそれです。Arduino UnoのADCは0Vから基準電圧までを0から1023の整数に変換します。

// A0にかかる電圧を読んでボルトに換算します。
// 注意: UnoのA0は5Vまでしか安全ではありません。それ以上は分圧器を通す必要があります。

const int SENSE_PIN = A0;
const float VREF = 5.0;      // 基準電圧。USB電源だと実際には4.7〜5.1Vの間で揺れます。
const float ADC_STEPS = 1024.0;

// 電圧分割器を使う場合の値です。使わないなら両方0のままにして、下の補正を省略します。
const float R_TOP = 10000.0;    // 測定対象側
const float R_BOTTOM = 20000.0; // GND側

void setup() {
  Serial.begin(115200);
}

void loop() {
  int raw = analogRead(SENSE_PIN);

  // 1ステップは5.0 / 1024 = 0.00488V、およそ4.9mVです。
  float pinVolts = (raw * VREF) / ADC_STEPS;

  // 分圧器を通した場合は、元の電圧に戻します。
  // 分圧比 = R_BOTTOM / (R_TOP + R_BOTTOM) = 20000 / 30000 = 0.667
  float sourceVolts = pinVolts * ((R_TOP + R_BOTTOM) / R_BOTTOM);

  Serial.print("raw=");
  Serial.print(raw);
  Serial.print("  pin=");
  Serial.print(pinVolts, 3);
  Serial.print("V  source=");
  Serial.print(sourceVolts, 3);
  Serial.println("V");

  delay(500);
}

このコードには2つの教訓が入っています。

ひとつは分解能です。5Vを1024段階に分けるので、1段階はおよそ4.9mVです。これより小さい変化は、コードをどれだけ精巧に書いても原理的に区別できません。この限界は超えられません。

もうひとつは基準電圧です。上のコードはVREFを5.0に固定していますが、USBで電源を取るArduinoの5Vレールは実際には4.7Vから5.1Vの間を行き来します。つまりすべての測定値にはすでに数パーセントの誤差が含まれています。正確な値が必要なら、マルチメーターで5Vピンの実際の電圧を測ってその値をVREFに入れるか、内蔵の基準電圧を使うほうがよいでしょう。計算ではなく測定が根拠だという原則がここでもそのまま当てはまります。

締めくくり — 部品を選ぶことは結局、電流を決めることです

ここまでの内容を一文にまとめるとこうなります。回路で部品を選ぶということは、ほとんどの場合、何ミリアンペアにするかを決めることです。

電圧はたいてい与えられています。ボードは5Vか3.3Vのどちらかで、それは選べません。部品が要求する電圧もデータシートに書かれています。残る自由度は電流であり、その電流を決める部品が抵抗です。だから抵抗値を選ぶ計算が回路設計のかなりの部分を占めます。

そしてこの記事の冒頭のLEDに戻ると、あの回路が失敗した理由がはっきりします。抵抗がなかったので、電流を決める部品がひとつもありませんでした。決める部品がなければ、電流は物理が許す最大値まで上がり、その最大値はほとんどの場合、部品が耐えられる値より大きいのです。

次回はこのLED回路をきちんと計算します。LEDがなぜ抵抗のように扱えない部品なのか、そして色ごとに異なる抵抗値が出てくる理由を、数字で確かめます。

현재 단락 (1/131)

ブレッドボードにLEDを挿し、長い脚をArduinoのD9に、短い脚をGNDにつなぎます。コードは一行だけです。`digitalWrite(9, HIGH)`。LEDは一瞬まぶしいほど明るく光り、暗く...

작성 글자: 0원문 글자: 9,180작성 단락: 0/131