- Authors

- Name
- Youngju Kim
- @fjvbn20031
- はじめに — LEDを5Vに直接挿すと正確に何が起きるか
- LEDは抵抗ではなくダイオードです
- 順方向電圧は色ごとに異なります
- 抵抗値の計算 — 5Vと3.3Vそれぞれで
- なぜ切り上げなのか — E24系列と標準抵抗値
- 抵抗で消費される電力と定格
- LED複数個 — 並列に抵抗ひとつが良くない理由
- ピンが耐えられないとき — トランジスタとドライバIC
- 締めくくり — 計算の出発点は余裕電圧です
はじめに — LEDを5Vに直接挿すと正確に何が起きるか
「LEDには抵抗を付けなければならない」という文はどこにでもあります。ですが、なぜ付けるのか、なぜ220オームなのか、青いLEDにも220オームでよいのかについての説明はあまり見当たりません。ただ220オームと書かれた回路図をそのまま真似することになります。
ここで問題が起きます。5VのArduinoで220オームでうまくいっていた回路を3.3Vのラズベリーパイに移すと、LEDが暗くなります。赤いLEDの代わりに青いLEDを挿すと、まったく点きません。真似しただけなので、何を変えればよいのか分かりません。
この記事の目標は、220オームという数字がどこから出てきたのかを計算できるようになることです。そうすれば電源が変わっても色が変わっても、自分で値を求められます。
まず抵抗なしで挿すとどうなるかを正確に見てみます。赤いLEDひとつを5VとGNDの間に直接つなぐと、LEDの両端に5Vがかかります。このLEDが正常に動作するときにかかる電圧はおよそ2.0Vです。3.0Vが残ります。この3.0VはLED内部のごく小さな抵抗成分にかかり、その値はおよそ10オームです。
電流 = 3.0V / 10オーム = 0.3A = 300mA
300mAです。このLEDが耐えるように作られている値は20mAです。15倍です。LEDチップの大きさは一辺およそ0.3mmで、その中で消費される電力は、
P = 5V × 0.3A = 1.5W
1.5Wです。マッチの頭より小さな半導体片に1.5Wが入ります。接合部の温度は一瞬で数百度まで上がり、チップとリードをつなぐ金線が溶けるか、接合そのものが損傷します。これが「一瞬明るく光って消える」の物理的な正体です。ソフトウェアのように元に戻せません。
LEDは抵抗ではなくダイオードです
なぜこんなことが起きるのかを理解するには、LEDが抵抗とは根本的に異なる部品だということを知る必要があります。
抵抗は電圧と電流が比例します。5Vをかければ1Vのときの5倍流れます。グラフを描けば直線です。
LEDはダイオードで、ダイオードの電流は電圧に対して指数関数的に増加します。この関係はショックレーダイオード方程式と呼ばれますが、実務で知っておくべきなのは式そのものよりそれが生む結果です。
典型的な5mmの赤色LEDを実際に測定すると、おおよそこのような値が出ます。
| かけた電圧 | 流れる電流 | 前段階比 |
|---|---|---|
| 1.7V | 約0.5mA | 基準 |
| 1.8V | 約2mA | 4倍 |
| 1.9V | 約6mA | 3倍 |
| 2.0V | 約20mA | 3.3倍 |
| 2.1V | 約60mA | 3倍 |
| 2.2V | 約150mA | 2.5倍 |
電圧を0.1V、つまり5パーセント上げただけなのに、電流は3倍になります。これが指数関数の性質です。
この表から2つの結論が出ます。
第一に、LEDに電圧を直接指定するのはほぼ不可能です。目標電流20mAを合わせるには電圧を2.00Vぴったりに合わせる必要がありますが、2.05Vになっただけで電流はほぼ2倍になります。電源の誤差、温度変化、個体差はすべてこの程度の水準です。電圧でLEDを制御しようという発想は最初から成り立ちません。
第二に、そしてもっと危険なことですが、LEDは自分自身を保護できません。温度が上がると順方向電圧は摂氏1度あたり約2mVずつ下がります。つまり熱くなるほど、同じ電圧でより多くの電流が流れます。より多く流れればより熱くなります。この帰還にブレーキをかけるものが何もありません。
だから解決策は方向を変えることです。電圧を指定しようとせず、電流を指定します。電流を決める最も単純で確実な部品が直列抵抗です。抵抗は電圧と電流が比例する線形部品なので、電流が増えようとすると抵抗の両端の電圧が大きくなり、その分LEDにかかる電圧が減って電流が再び抑えられます。抵抗は電流制限装置であると同時に負の帰還装置です。
順方向電圧は色ごとに異なります
LEDが光を出すには半導体のバンドギャップエネルギーを超える電圧が必要で、そのエネルギーがそのまま出てくる光の色を決めます。波長が短い光、つまり青色はより大きなエネルギーを要求するので、順方向電圧が高くなります。色と電圧は別々に動いているのではなく、同じ物理量のふたつの顔です。
実務で使う代表値は次のとおりです。個体ごとにばらつきがあるので、データシートがあればそちらを優先し、なければこの値で計算してもおおむね安全です。
| 色 | 代表的な順方向電圧 | 実際の分布範囲 | 半導体材料 |
|---|---|---|---|
| 赤色 | 2.0V | 1.8〜2.2V | AlGaAs、GaAsP |
| 黄色 | 2.1V | 2.0〜2.4V | AlGaInP |
| 黄緑色(旧型) | 2.2V | 2.0〜2.4V | GaP |
| 純緑色(高輝度) | 3.2V | 2.9〜3.6V | InGaN |
| 青色 | 3.2V | 2.9〜3.6V | InGaN |
| 白色 | 3.2V | 2.9〜3.6V | InGaN + 蛍光体 |
| 赤外線(IR) | 1.3V | 1.2〜1.5V | GaAs |
ここに実務上もっとも重要な境界がひとつあります。緑色LEDには2種類あります。昔からある黄緑色系は2.2Vで、最近の明るい純緑色は青色と同じInGaNなので3.2Vです。見た目が似ているので同じ値で計算すると結果が大きくずれます。迷ったらマルチメーターのダイオードテスト機能で直接測るのが一番早いです。表示される値がそのLEDの順方向電圧です。
そして3.2Vという数字を3.3Vのボードと並べて見ると、すぐに問題が見えます。この話は次の節で計算して確認します。
抵抗値の計算 — 5Vと3.3Vそれぞれで
公式は前回の記事のオームの法則そのままです。抵抗にかかる電圧を目標電流で割ればよいだけです。
抵抗 = (電源電圧 - LED順方向電圧) / 目標電流
分子を余裕電圧と呼ぶことにします。LEDが自分の取り分である順方向電圧を持っていき、残ったものが抵抗の取り分です。
目標電流はいくらに設定すればよいでしょうか。一般的な5mm LEDの最大定格は20mAです。最大定格に合わせて設計すると余裕が0になるので、実務では15mA程度を目標にするのが安全です。明るさの違いは人の目でほとんど区別できません。このブログの配線検証ツールも15mAを基準に抵抗を提案します。
5V電源に赤色LED
余裕電圧 = 5V - 2.0V = 3.0V
抵抗 = 3.0V / 0.015A = 200オーム
ちょうど200オームが出ました。この値は後で見る標準値リストにそのまま存在します。
20mAで計算するとこうなります。
抵抗 = 3.0V / 0.02A = 150オーム
150オームも標準値です。そしてよく使われる220オームは、この間のどこかにある余裕のある選択です。220オームを使うと実際の電流は、
電流 = 3.0V / 220オーム = 0.0136A = 13.6mA
13.6mAです。十分明るく、とても安全です。初心者向けキットに220オームがたくさん入っている理由がこれです。間違った値ではなく、安全側に振った値です。
3.3V電源に赤色LED
余裕電圧 = 3.3V - 2.0V = 1.3V
抵抗 = 1.3V / 0.015A = 86.7オーム
86.7オームです。5Vのときの200オームとはまったく違う値です。余裕電圧が3.0Vから1.3Vに減ったからです。電源電圧は34パーセント減っただけなのに、抵抗値は57パーセント減りました。この非線形性が「同じ回路をラズベリーパイに移したら暗くなった」の原因です。5V用に計算した200オームをそのまま使うと、
電流 = 1.3V / 200オーム = 0.0065A = 6.5mA
目標の半分にも満たない6.5mAしか流れません。抵抗が間違っているのではなく、電源が変わったので計算し直す必要があるということです。
3.3V電源に青色LED — 計算が成り立たない場合
余裕電圧 = 3.3V - 3.2V = 0.1V
抵抗 = 0.1V / 0.015A = 6.67オーム
数字は出ますが、この回路は使ってはいけません。理由は余裕電圧がわずか0.1Vしかないからです。
順方向電圧の個体差は2.9Vから3.6Vだと述べました。このLEDが3.4Vのものだったら余裕電圧はマイナスになり、まったく点きません。3.0Vのものだったら余裕電圧は0.3Vになり、電流は3倍に跳ね上がります。3.3Vのレールが3.25Vに少し落ち込むだけでも明るさが半分になります。つまりこの回路は部品の個体差と電源の揺れに完全に振り回されます。
解決策は3つのうちのどれかです。5Vレールから電源を取ってLEDを駆動し信号だけ3.3Vで制御するか、順方向電圧が低い別の色を使うか、電流を能動的に一定に保つ定電流ドライバを使うかです。余裕電圧が電源の20パーセントを下回ったら、抵抗ひとつで処理する方式を見直すのが原則です。
計算結果のまとめ
| 電源 | 色 | 順方向電圧 | 余裕電圧 | 15mA用計算値 | 選ぶべき標準値 | 実際の電流 |
|---|---|---|---|---|---|---|
| 5V | 赤色 | 2.0V | 3.0V | 200オーム | 200オーム | 15.0mA |
| 5V | 黄色 | 2.1V | 2.9V | 193.3オーム | 200オーム | 14.5mA |
| 5V | 黄緑色 | 2.2V | 2.8V | 186.7オーム | 200オーム | 14.0mA |
| 5V | 青色/白色 | 3.2V | 1.8V | 120オーム | 120オーム | 15.0mA |
| 3.3V | 赤色 | 2.0V | 1.3V | 86.7オーム | 91オーム | 14.3mA |
| 3.3V | 黄色 | 2.1V | 1.2V | 80.0オーム | 82オーム | 14.6mA |
| 3.3V | 黄緑色 | 2.2V | 1.1V | 73.3オーム | 75オーム | 14.7mA |
| 3.3V | 青色/白色 | 3.2V | 0.1V | 6.67オーム | 使用不適 | 不安定 |
表の最後の2列がこの記事のもう半分です。計算値と実際に買える抵抗値がなぜ違うのか、そしてなぜ常に大きいほうに合わせるのかを見る必要があります。
なぜ切り上げなのか — E24系列と標準抵抗値
86.7オームの抵抗は売っていません。抵抗は任意の値で作られるのではなく、決められたリストの値でしか生産されません。このリストをE系列と呼びます。
E24系列は1桁の区間を24段階に分けたもので、次の値とその10倍、100倍、1000倍で構成されます。
1.0 1.1 1.2 1.3 1.5 1.6 1.8 2.0 2.2 2.4 2.7 3.0
3.3 3.6 3.9 4.3 4.7 5.1 5.6 6.2 6.8 7.5 8.2 9.1
だから実際に存在する値は82オーム、91オーム、100オーム、110オームといった具合で、86.7オームはその間にありません。
この間隔がこう決まっている理由が興味深いです。隣り合う値の比はおよそ1.1倍、つまり10パーセントずつ広がっています。そしてE24抵抗の標準誤差は5パーセントです。つまり各値の誤差範囲が互いに重ならず、かつ隙間も残さないように設計された等比数列です。より細かいE96系列は1パーセント誤差の部品に対応します。対数スケールで均等に分割するという発想は、オーディオの音量や画像リサイズの段階を決めるときと同じ原理です。
ここが核心です。計算値がリストにないとき、上に丸めるか下に丸めるか。
必ず上に丸めなければなりません。 理由は抵抗が大きいほど電流が小さくなるからです。86.7オームを82オームに下げると、
電流 = 1.3V / 82オーム = 0.0159A = 15.9mA
目標より多い15.9mAが流れます。91オームに上げると、
電流 = 1.3V / 91オーム = 0.0143A = 14.3mA
目標より少ない14.3mAです。明るさの違いは目立たず、電流は安全な側に寄ります。
この原則が決定的に重要になるのがピンの電流上限です。ラズベリーパイのGPIOピンひとつが許容する値は16mAです。82オームを使うと15.9mAで、上限まで0.1mAしか残りません。ここにLEDの個体差で順方向電圧が1.9Vだったとすると、余裕電圧は1.4Vになり、
電流 = 1.4V / 82オーム = 0.0171A = 17.1mA
上限を超えます。一方91オームなら同じ条件で15.4mAとなり、まだ範囲内です。切り上げ一段階がマージンを生みます。
配線を組んでからこの計算が合っているかすぐ確認したければ、このサイトの配線検証ツールにボードと部品、抵抗値を入れてみてください。このツールも同じ規則でE24系列から上の値を選んで提案し、選んだ抵抗で実際に流れる電流がピンの上限を超えるかどうかも教えてくれます。
抵抗で消費される電力と定格
抵抗は余裕電圧の分だけ熱として捨てます。どれだけ捨てるかを計算しておけば、どの抵抗を買うべきかが決まります。
5Vに赤色LED、200オームの場合です。
抵抗にかかる電圧 = 3.0V
流れる電流 = 15mA
消費電力 = 3.0V × 0.015A = 0.045W = 45mW
45mWです。もっとも一般的な1/4W(250mW)の抵抗なら定格の18パーセントしか使わないので、とても余裕があります。
3.3Vに赤色LED、91オームの場合です。
消費電力 = 1.3V × 0.0143A = 0.0186W = 18.6mW
さらに少なくなります。3.3V回路が熱の面で有利な理由です。
ではLED抵抗は常に1/4Wでよいかというと、電源電圧が上がると話が変わってきます。12Vの照明に赤色LEDひとつを20mAで点けるとすると、
余裕電圧 = 12V - 2.0V = 10.0V
抵抗 = 10.0V / 0.02A = 500オーム → E24標準値510オーム
消費電力 = 10.0V × 0.02A = 0.2W = 200mW
200mWです。1/4W抵抗の定格250mWの80パーセントまで達します。前回の記事で定格の半分以下で使うべきだと述べた基準を超えるので、1/2Wを使うのが正しい選択です。
そしてこの計算は12V回路の設計方法そのものを変えます。10Vを抵抗で熱として捨てるのは、供給電力の83パーセントを無駄にすることです。だから12VではLEDを複数直列につないで余裕電圧を減らします。赤色LED5個を直列に置くと、
LED電圧の合計 = 2.0V × 5 = 10.0V
余裕電圧 = 12V - 10.0V = 2.0V
抵抗 = 2.0V / 0.02A = 100オーム
消費電力 = 2.0V × 0.02A = 0.04W = 40mW
同じ20mAでLED5個を点けながら、抵抗の損失は5分の1です。直列接続では電流が共通なので、5個がまったく同じ明るさで点きます。LEDを複数扱うとき直列をまず検討する理由がこれです。
LED複数個 — 並列に抵抗ひとつが良くない理由
直列が良いなら並列はどうでしょうか。LED3個を並べて抵抗ひとつでまとめる配線を回路図でよく見かけます。部品が少なく済むので魅力的に見えます。しかしこの配線はやってはいけません。
理由は先ほど見た指数曲線です。並列につないだ3つのLEDは両端の電圧が強制的に同じになります。ところが3つのLEDの順方向電圧が完全に同じになることは絶対にありません。同じ袋から出た部品でも0.05V程度は差が出ます。
数字で確認してみます。5Vに150オームひとつ、LED3個が並列で順方向電圧がそれぞれ1.95V、2.00V、2.05Vだとします。
3つのLEDの両端電圧は等しくなければならず、その値はおおよそ最も低い1.95V付近で決まります。抵抗にかかる電圧は、
5V - 1.95V = 3.05V
全体の電流 = 3.05V / 150オーム = 0.0203A = 20.3mA
全体の20.3mAを3つで分け合いますが、先ほどの指数表をもう一度見ると、1.95Vで流れる電流は2.00Vのときよりおよそ3倍少ないです。逆に言えば、順方向電圧が最も低いLEDが電流を独り占めします。実際に測ると、おおよそこのような配分になります。
| LED | 順方向電圧 | 実際に流れる電流 | 割合 |
|---|---|---|---|
| A | 1.95V | 約15mA | 74パーセント |
| B | 2.00V | 約4mA | 20パーセント |
| C | 2.05V | 約1mA | 5パーセント |
3つが目に見えて違う明るさで点きます。これだけでも失敗ですが、もっと悪いことが残っています。
電流を独り占めしたAが最も熱くなります。温度が上がると順方向電圧は1度あたり2mVずつ下がります。Aの温度が25度上がると順方向電圧はさらに0.05V低くなり、するとAはさらに多くの電流を取ります。より熱くなり、電圧はさらに下がり、電流をさらに多く取ります。これが熱暴走です。結局Aが先に死に、Aが死ぬと残った電流すべてがBに集中し、Bも危険になります。
正しい配線はLEDごとに抵抗をひとつずつ付けることです。抵抗3個がそれぞれの枝の電流を独立して決めるので、個体差があっても電流が大きく開くことはありません。抵抗があれば、Aがより多くの電流を取ろうとした瞬間、A側の抵抗にかかる電圧が大きくなって自然にブレーキがかかります。抵抗ひとつを節約しようとしてLEDを失う取引は、どう見ても損です。
ピンが耐えられないとき — トランジスタとドライバIC
LEDの個数が増えると、抵抗計算とは別の壁にぶつかります。ピンが出せる電流の上限です。
この上限は2層になっています。ピンひとつあたりの上限と、すべてのピンを合わせた合計の上限です。両方守る必要があります。
| ボード | ロジック電圧 | ピンひとつあたりの上限 | GPIO合計の上限 | 15mA LEDを何個まで |
|---|---|---|---|---|
| Arduino Uno R3 | 5V | 20mA(絶対最大40mA) | 200mA | 13個 |
| ラズベリーパイ40ピン | 3.3V | 16mA | 50mA | 3個 |
| ESP32 DevKit v1 | 3.3V | 12mA | 120mA | 10個(ピンあたり12mAに下げて) |
最後の列は合計上限だけで計算した個数です。ESP32はピンあたりの上限が12mAなので、LEDひとつあたりの目標電流を12mAに下げる必要があり、そうすると合計120mAを10個で分け合うことになります。ピンあたりの上限と合計の上限のうち、先に引っかかるほうが実際の上限です。
ラズベリーパイの数字をもう一度見てください。ピンあたり16mAはLEDひとつには十分ですが、全体の合計は50mAです。15mAのLEDを4個点けると60mAですでに超過です。ピンは40本あるのに、LEDは3個までです。
合計上限が存在する理由は物理的なものです。各ピンの出力トランジスタはチップ内部の共通電源配線につながっていて、その配線とチップのボンディングワイヤ、パッケージのリードが全体の電流を一緒に受け持たなければなりません。個々のピンが規格内でも、合計が超えるとその共通経路が過熱します。そしてチップ内部の電源配線の抵抗によって電圧降下が起き、同じチップ内の他の回路が不安定になります。
上限を超えたら、ピンでLEDを直接駆動する方式をあきらめる必要があります。選択肢は3つです。
トランジスタでスイッチングする
ピンは信号だけを送り、電流は電源レールから直接取るようにします。ロジックレベルMOSFETか小信号トランジスタをスイッチとして使います。
BJTを使うなら、ベース抵抗の計算が必要です。LED8個を15mAずつ、合計120mAをスイッチングするとします。2N3904のような小信号トランジスタを飽和領域で使うには、電流増幅率を余裕を持って10程度に見積もります。
必要なベース電流 = 120mA / 10 = 12mA
ベース抵抗 = (5V - 0.7V) / 0.012A = 358オーム
E24から下側の値である330オームを選ぶと、
実際のベース電流 = (5V - 0.7V) / 330オーム = 0.013A = 13mA
13mAで、ピンの上限20mA以内です。ここでベース抵抗はLED抵抗とは逆に下側へ丸める点に注意が必要です。ベース電流が足りないとトランジスタが完全にオンにならず、自分自身で電力を消費して熱くなります。目的が違うので丸める方向も違います。
0.7Vはベースとエミッタの間の電圧降下です。シリコン接合の特性値で、計算から差し引くと実際に抵抗にかかる電圧が出ます。
ドライバICを使う
ULN2803のようなドライバアレイは、8チャンネルのダーリントントランジスタをひとつのチップに収めた部品です。チャンネルあたり500mAまで扱え、入力はマイコンのピンから1mA程度しか取りません。74HC595シフトレジスタと組み合わせると、ピン3本で8個、16個を制御できます。
ここで注意すべきは方向です。ULN2803はシンク専用です。つまり出力ピンは電流をGNDへ吸い込むだけで、押し出しません。だからLEDのアノードを電源レールにつなぎ、カソードをドライバの出力につなぐ必要があります。ソース方式で配線すると、コードをどれだけ直しても点きません。
専用LEDドライバへ移行する
LEDが数十個以上になるか、明るさを個別に制御する必要があるなら、定電流ドライバが答えです。WS2812Bのように、LEDごとに制御器が内蔵された部品が代表的で、この場合は電流計算の性格が変わります。WS2812B1個が3色すべてを最大で点けると60mAを使います。30個のストリップなら、
60mA × 30 = 1800mA = 1.8A
1.8Aです。Arduinoの5Vレールの上限が450mAなので、ボードから電源を取ること自体が不可能です。別電源が必要で、この話はモーターと誘導性負荷を扱う記事につながります。
PWMは電流を減らす方法ではありません
明るさ調整が目的なら、抵抗を大きくする代わりにPWMを使います。ただしPWMはオンになっている瞬間の電流を減らしません。オンとオフの比率を変えて平均の明るさを調整するだけです。
// LEDの明るさをなめらかに上げ下げします。
// 抵抗は変わらず200オームで、オンになっている瞬間の電流も変わらず15mAです。
// PWMはオンになっている時間の割合だけを変えます。
const int LED_PIN = 9; // Unoでpwmが使えるピン
const int STEP_DELAY_MS = 8;
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// デューティ0から255まで。255がずっとオンの状態です。
for (int duty = 0; duty <= 255; duty++) {
analogWrite(LED_PIN, duty);
delay(STEP_DELAY_MS);
}
for (int duty = 255; duty >= 0; duty--) {
analogWrite(LED_PIN, duty);
delay(STEP_DELAY_MS);
}
}
ピンの電流予算を計算するときはPWMのデューティではなく、最大瞬間電流で見積もらなければなりません。デューティ50パーセントだからといって7.5mAで計算してはいけません。オンになっている瞬間には15mAがそのまま流れ、ピンの出力トランジスタが耐えなければならないのはその瞬間値です。
締めくくり — 計算の出発点は余裕電圧です
LED抵抗計算で覚えておくべきことは実質一行です。電源電圧からLEDの順方向電圧を引き、その残りを目標電流で割ります。
この一行は電源電圧が変わっても色が変わってもそのまま通用します。220オームを覚える代わりに、この引き算と割り算を覚えればよいのです。
そして引き算の結果、つまり余裕電圧を見るたびに、ひとつのことを一緒に確認する習慣をつけるとよいです。この値が電源電圧に対して小さすぎないかどうかです。3.3Vに青いLEDを付ける場合のように余裕が0.1Vしか残らないと、抵抗値をどれだけ正確に計算しても、回路は部品の個体差と電源の揺れにそのままさらされます。余裕電圧は計算の材料であると同時に、この設計が頑丈かどうかを教えてくれる指標です。
次回は入力側に話を移します。ボタンをピンにつないだのに値が勝手に変わる現象、つまりフローティング入力とプルアップ抵抗の話です。