基礎 · 読了まで20分

7805電圧レギュレーター:ピン配置、コンデンサ、発熱の計算

7805電圧レギュレーターのつなぎ方を解説します。ピン配置、0.33 µFと0.1 µFのコンデンサ、ドロップアウト電圧、損失とヒートシンクの計算、78xxシリーズ、AMS1117-3.3、降圧型とリニア型の違いまでまとめました。

7805電圧レギュレーターは、7〜35 Vの範囲の高い電圧や不安定な電圧を受け取り、安定した5 Vに変える、安価な3本足のICです(三端子レギュレーターとも呼ばれます)。12 VのACアダプター、車のバッテリー、電池パックから、Arduinoやセンサー、リレーボード用のきれいな5 Vを得るいちばん簡単な方法で、追加するのは小さなコンデンサ2個だけです。ただし7805は余分な電圧を熱に変えて動作するため、正しい配線、入力電圧の限界、どれくらい熱くなるかを知っておくことが、安全に動く回路の鍵になります。

このガイドでは、電圧レギュレーターとは何か、7805のピン配置と0.33 µF・0.1 µFのコンデンサを使った配線、ドロップアウト電圧の意味、P = (Vin − Vout) · Iによる発熱の計算、ヒートシンクの選び方をステップごとに学びます。続いて78xxファミリー、3.3 Vモジュール用のAMS1117-3.3(LDO)、リニアレギュレーターとスイッチング(降圧)レギュレーターの違い、Arduino自身のレギュレーターとVinの限界を見ていき、最後にArduino、ESP32、Raspberry Pi Picoでレギュレーターを測定するコードを紹介します。

LM7805電圧レギュレーターモジュール
LM7805レギュレーターモジュール:ヒートシンクにネジ止めした7805、入力と出力のネジ端子、平滑用コンデンサ、保護用ダイオード、5 V出力ピンが1枚の基板にまとまっています。

電圧レギュレーターとは? どのように動作する?

電圧レギュレーターは、入力電圧や負荷電流が変わっても出力の電圧を一定に保つ回路です。7805はリニアレギュレーターで、内部には入力と出力の間に直列に入ったパワートランジスタ、温度で変動しない内部の基準電圧、そして出力をその基準と常に比較する誤差増幅器があります。出力が5 Vを下回るとトランジスタは少し多く電流を流し、上回ると絞ります。つまりトランジスタは自動で値が変わる抵抗のようにふるまい、入力と出力の間の余分な電圧を自分自身で受け持ちます。この余分な電圧に電流を掛けた分が熱になります。これが7805がとてもシンプルな理由であり、熱くなる理由でもあります。

78ファミリーの下2桁は出力電圧を表します。7805は5 V、7812は12 Vを出力します。先頭の文字はメーカーを示すだけなので、LM7805、L7805CV、MC7805、KA7805はどれも同じ働きをします。ICには電流制限、過熱時に停止するサーマルシャットダウン、安全動作領域(SOA)保護が内蔵されています。そのため出力がショートしてもめったに壊れず、電流を制限するか、冷えるまで出力を止めるだけです。

項目値
出力電圧5 V(±4%:4.8〜5.2 V)
入力電圧推奨7〜25 V、絶対最大定格35 V
ドロップアウト電圧(最小の電位差)標準2 V(1 A時)
出力電流1 A、十分に冷却すれば最大1.5 A
短絡電流約2 A(内部制限)
自己消費電流(静止電流、Iq)標準3〜5 mA、最大8 mA
熱抵抗(TO-220)ジャンクション〜ケース間4〜5 °C/W、ヒートシンクなしのジャンクション〜周囲空気間50〜65 °C/W
過熱保護ジャンクション温度が約150 °Cになると停止
パッケージTO-220(1 A)、D2PAK、DPAK。小型の78L05はTO-92(100 mA)

7805のピン配置と配線図

7805を印字面が手前、足が下になるように持つと、ピンは左から1:入力(IN)、2:GND、3:出力(OUT)です。穴のあいた金属タブもGNDにつながっているので、回路のグラウンドにつながったヒートシンクや金属ケースに、絶縁材なしで7805をネジ止めできます。入力側のGNDと出力側のGNDは同じ点です。電源、レギュレーター、給電するボードは共通グラウンドで結ばれていなければなりません。下の表は、各ボードで7805の出力をどこにつなぐかを示しています。

7805のピン接続先Arduino UnoESP32 DevKitRaspberry Pi Pico
1 – 入力(IN)7〜25 V電源のプラス + 0.33 µF接続しない接続しない接続しない
2 – GND電源のマイナスとコンデンサの共通側GNDGNDGND(例:38番ピン)
3 – 出力(OUT)5 Vライン + 0.1 µF5Vピン5V(VIN)ピンVSYS(39番ピン)、ショットキーダイオード経由
7805の出力をArduinoのVinピンやDCジャックにつないではいけません。ボード上のレギュレーターも最低7 Vを必要とするため、5 Vを入れるとボードの5Vラインは3.5〜4 Vまで下がります。7805の出力は5Vピンにつなぎます。また、TO-92の小型の78L05はピンの順番が逆で(平らな面を手前にして1が出力、2がGND、3が入力)、負電圧用の7905ではGND、入力、出力の順です。使うパッケージのピン順は必ず確認してください。

コンデンサ:なぜ0.33 µFと0.1 µF?

メーカーのデータシートに載っている標準回路では、入力に0.33 µF、出力に0.1 µFのコンデンサを使います(入力を0.22 µFとしているメーカーもあります)。入力のコンデンサは、レギュレーターが電源の平滑コンデンサから離れた位置にあるとき、配線のインダクタンスによって起こる発振を防ぎます。出力のコンデンサは安定動作に必須ではありませんが、急な負荷変動のときに電圧をより安定させます。どちらもセラミックコンデンサを使い、できるだけピンの近くに置きます。0.33 µFのセラミックコンデンサには334、0.1 µFには104と表記されています。ほかの表記を読み解くにはコンデンサの表記ツールを使ってください。

実際には、これらの小さなコンデンサの横に電解コンデンサを加えるのがよい習慣です。入力側の10〜100 µFは電源からのリップルをならし、出力側の10〜47 µFはサーボモーター、リレー、Wi-Fiモジュールなど急に電流を引く負荷による電圧の落ち込みを減らします。出力に10 µFより大きいコンデンサを付ける場合は、入力がショートしたときに備えて、出力から入力へ1N4001ダイオードを入れます(通常動作では逆バイアス)。入力が急にゼロになっても、大きなコンデンサはレギュレーターではなくこのダイオードを通って放電します。入力に直列に入れたもう1本の1N4001は逆接続を防ぎますが、約0.7 Vの電圧降下が加わります。種類と向きについてはコンデンサとは?とダイオードとは?を参照してください。

ステップごとに:ブレッドボード上で7805を使った5 V電源

  1. 7805をブレッドボードに挿します。足はそれぞれ別の列に入れ、印字面を手前に向けます。
  2. 電源のプラス(例:9 VのACアダプター)を1番ピンの入力に、マイナスを2番ピンのGNDにつなぎます。逆接続を防ぎたい場合は、プラス側の線に1N4001を直列に入れます。
  3. 0.33 µF(334)のセラミックコンデンサを、入力とGNDの間のピンにいちばん近い穴に挿します。
  4. 0.1 µF(104)のセラミックコンデンサと、必要に応じて10〜47 µFの電解コンデンサを出力(3)とGNDの間に挿します。電解コンデンサの長い足がプラス側です。
  5. 負荷をつなぐ前にテスターで出力を測ります。4.8〜5.2 Vになっていれば正常です。
  6. 出力をArduinoの5Vピンに、GNDをArduinoのGNDにつなぎます。コードを書き込む間は、USBと外部電源を同時に使わないようにしてください。
  7. 数分間動かしたら、レギュレーターの温度を確認します。とても熱くなる場合は、下の発熱の計算をもとにヒートシンクを付けるか、入力電圧を下げます。
ブレッドボードで5 Vと3.3 Vをよく使うなら、レギュレーターがあらかじめ実装されたMB102ブレッドボード電源モジュールも使えます。こちらもAMS1117-5.0とAMS1117-3.3というリニアレギュレーターを使っているので、この記事のドロップアウト電圧と発熱のルールがそのまま当てはまります。

ドロップアウト電圧:最低限必要な入力電圧は?

リニアレギュレーターが出力を安定に保つには、入力が出力より一定以上高くなければなりません。その最小の電位差をドロップアウト電圧と呼びます。7805のドロップアウト電圧は1 A時に標準2 Vなので、5 V出力には入力に最低7 Vが必要で、データシートの試験条件も7〜7.5 Vから始まっています。電位差がそれを下回るとレギュレーターは安定化できなくなり、出力は入力より約2 V低い値でそのまま追従するだけになります。6 Vを入れると出力は4 V前後まで下がり、Arduinoがリセットしたりアナログの読み取り値がずれたりします。

重要なのは平均値ではなく、入力の最も低い点です。トランス、ブリッジ整流回路、平滑コンデンサで作る昔ながらの電源では、電圧が半周期ごとに波打ちます。リップルはおおよそΔV = I / (100 · C)です(50 Hzの商用電源で全波整流の場合。60 Hzの商用電源では100の代わりに120を使います。日本では東日本が50 Hz、西日本が60 Hzです)。500 mAの負荷と2200 µFのコンデンサではΔV ≈ 2.3 Vになります。9 VのACトランスを整流するとピークは約11.3 Vなので、リップルの底は9 V前後にとどまります。これは7 Vより上なので十分です。同じ理屈で、9 V電池は負荷がかかるとすぐに7 Vを下回るため、9 V電池で7805を動かしても長くはもちません。電池の選択肢についてはArduinoを電池で動かす方法のガイドを参照してください。

発熱の計算:P = (Vin − Vout) · I

7805が入力から引く電流は、出力に供給する電流とほぼ同じで、違いは数ミリアンペアの自己消費電流だけです。そのため、レギュレーターで熱に変わる電力はP = (Vin − Vout) · I、効率はおおよそVout / Vinです。例:500 mAを消費する回路を12 VのACアダプターから動かすと、P = (12 − 5) × 0.5 = 3.5 Wの熱が出ます。負荷に届く2.5 Wに対して3.5 Wが無駄になり、効率はわずか42%です。同じ回路を7.5 Vの電源で動かせば、損失は1.25 Wまで下がります。つまり必要以上に高い入力電圧は、レギュレーターに余計な熱を負わせるだけです。電流、電圧、電力をおさらいするにはオームの法則の記事をご覧ください。

入力(Vin)100 mA300 mA500 mA1 A
7 V0.2 W0.6 W1.0 W2.0 W
9 V0.4 W1.2 W2.0 W4.0 W
12 V0.7 W2.1 W3.5 W7.0 W
24 V1.9 W5.7 W9.5 W19 W

ヒートシンクの選び方

ジャンクション温度はTj = Tambient + P · θで、θ(シータ)は°C/W単位の熱抵抗です。ヒートシンクなしのTO-220パッケージは、ジャンクション〜周囲空気間の熱抵抗が50〜65 °C/Wなので、1 Wの損失でICは周囲より50〜65 °C高くなります。安全な設計ではジャンクション温度を125 °C未満に保つため、25 °Cの室内でヒートシンクなしの場合は最大でも約1.5 Wです。ケース内が50〜60 °Cまで温まるなら、限界は1 Wまで下がります。上の表で1 Wを超えるケースは、ヒートシンクを検討すべきです。

より大きな電力では、ヒートシンクの熱抵抗を計算します:θtotal = θJC + θCS + θSA。7805のジャンクション〜ケース間θJCは約5 °C/W、放熱グリスを塗ったケース〜ヒートシンク間θCSは約0.5〜1 °C/Wです。3.5 Wの例で、40 °Cのケース内でジャンクションを110 °Cに保つにはθtotal ≤ (110 − 40) / 3.5 = 20 °C/Wが必要なので、ヒートシンク自体はθSA ≤ 20 − 5 − 1 = 14 °C/Wでなければなりません。TO-220用のクリップ式の小型ヒートシンクはたいてい20〜30 °C/Wなので足りず、中型のフィン付きアルミ製ヒートシンクが必要です。ヒートシンクのメーカーはこの値を°C/Wでカタログに記載しています。

  • 放熱グリスを使う:パッケージとヒートシンクの間のわずかな空気の層は熱の伝わりを大きく妨げます。グリスは薄く塗れば十分です。
  • タブはGND:78xxでは金属タブがGNDにつながっているので、ヒートシンクを絶縁する必要がなく、複数の78xxで1つのヒートシンクを共有できます。79xxではタブが入力につながっているため、マイカ(雲母)シートと絶縁ブッシュで絶縁しなければなりません。
  • 過熱保護に頼らない:過熱した7805は自分で停止し、冷えると再び動き出します。数秒ごとに出力が途切れ、Arduinoがリセットを繰り返します。これは最後の砦の保護であり、通常の動作ではありません。
  • 発熱を分散する:最も効果的な対策は入力電圧を下げることです。24 Vから5 Vを得るなら、まず降圧コンバーターで7〜8 Vまで下げ、最終段に7805を使います。

78xxシリーズ:7805、7809、7812など

型番出力最小入力最大入力主な用途
78055 V7 V35 VArduino、センサー、リレーボード
78088 V10.5 V35 VArduinoのVin用の中間電源
78099 V11.5 V35 V9 Vの回路、ArduinoのVin
781212 V14.5 V35 V12 Vのファンやリレー(低電流)
781515 V17.5 V35 Vオペアンプ回路
782424 V27 V40 V24 Vの産業用センサー
78L055 V、100 mA7 V30 VTO-92パッケージ、低電流の回路
7905−5 V−7 V−35 V負電源(ピン順が異なる)

電圧を調整したい場合は、このファミリーの仲間であるLM317を使います。抵抗2本で1.25〜37 Vの任意の出力が得られ、出力はVout = 1.25 × (1 + R2 / R1)で決まります(R1は通常240 Ω)。発熱とドロップアウト電圧のルールは7805と同じです。500 mAの78M05は中電力版で、表面実装の基板でよく見かけます。どの型番を選んでもルールは変わりません。最小入力は出力より約2〜3 V高くなければなりません。

AMS1117-3.3(LDO):3.3 Vモジュール用

ESP32、Raspberry Pi Pico、nRF24L01、そして多くのセンサーは3.3 Vで動作します。7805からは3.3 Vを得られないので、その用途で最もよく使われるのがAMS1117-3.3です。AMS1117はLDO(低ドロップアウト)レギュレーターで、800 mA時のドロップアウト電圧は標準1.1 V、最大1.3 Vなので、5 Vから3.3 Vを楽に作れます。最大1 Aを供給でき、入力は最大15 Vまで、無負荷時の消費は約5 mAです。ほとんどのESP32開発ボードで5 Vを3.3 Vに下げているのも、このレギュレーターです。

AMS1117 3.3V電圧レギュレーターモジュール
AMS1117-3.3モジュール:5 VをVINとGNDに入れると、VOUTから3.3 Vが出ます。入力と出力には10 µF(106)と0.1 µF(104)のコンデンサがすでに実装されています。

AMS1117のSOT-223パッケージはピン順が7805と異なり、1:GND/ADJ、2:出力、3:入力で、大きなタブは出力につながっています。データシートでは安定動作のために出力に22 µFのタンタルコンデンサを推奨しています。市販のモジュールには10 µFのコンデンサが付いていて通常の負荷なら問題なく動きますが、自分で回路を組むなら出力に22 µFを付けてください。熱にもより敏感です。SOT-223パッケージの熱抵抗は基板の銅箔面積によって46〜90 °C/Wで、メーカーは約1.2 Wを超えると安定化を保証していません。5 Vから3.3 Vへ300 mAならP = 1.7 × 0.3 = 0.51 Wで問題ありませんが、12 Vから3.3 Vでは同じ電流で2.6 Wになり、モジュールはすぐにサーマルシャットダウンに入ります。

レギュレーター出力ドロップアウト電圧最大入力最大電流自己消費電流
7805(TO-220)5 V約2 V35 V1〜1.5 A3〜8 mA
AMS1117-3.3(SOT-223)3.3 V1.1〜1.3 V15 V1 A約5 mA
AMS1117-5.0(SOT-223)5 V1.1〜1.3 V15 V1 A約5 mA
MCP1700-3302(TO-92 / SOT-23)3.3 V約0.18 V(250 mA)6 V250 mA1.6 µA

電池で何か月も動かすプロジェクトでは、ドロップアウト電圧と同じくらい自己消費電流が重要です。AMS1117は何も給電していなくても約5 mAを消費し、これはディープスリープ中のESP32の消費の数百倍にあたります。また、AMS1117の1.1 Vの電圧降下は、Li-ionセル1本(3.0〜4.2 V)から3.3 Vを作るには大きすぎます。満充電の4.2 Vでも出力は約3.1 Vにしか届かず、電池が減るにつれてさらに下がります。こうしたプロジェクトには、自己消費電流がマイクロアンペア単位で、ドロップアウト電圧が0.2 V未満のMCP1700のようなLDOのほうが適しています。

リニア型か、スイッチング(降圧)型か?

スイッチング方式の降圧(バック)レギュレーターは、余分な電圧を熱として捨てません。入力を毎秒数万回オン・オフし、エネルギーをインダクタとコンデンサに蓄えながら出力へ送ります。そのため効率は80〜95%に達し、入力から引く電流は出力電流より少なくなります。たとえばLM2596を使ったモジュールは、4.5〜40 Vから最大3 Aの可変出力を得られ、150 kHzでスイッチングします。その代わり、出力には数十ミリボルトのスイッチングリップルが乗り、電磁ノイズが出て、部品も増えます。モジュールの調整と配線はLM2596降圧モジュールの記事で解説しています。

12 V → 5 V、1 Aの負荷7805(リニア)LM2596(降圧、効率約85%)
入力電流≈ 1 A≈ 0.49 A
熱として失われる電力7 W≈ 0.9 W
効率42%約85%
ヒートシンク大型のヒートシンクが必要通常は不要
出力ノイズ非常に少ない数十mVのリップル
部品点数IC 1個 + コンデンサ2個完成品のモジュール、またはインダクタ、ダイオード、コンデンサ
LM2596降圧(バック)モジュール
LM2596降圧モジュール:青い半固定抵抗で出力電圧を設定します。7805と同じ5 Vを、はるかに少ない発熱で作れます。

目安はこうです。入力と出力の差が小さく(2〜4 V)、電流が数百ミリアンペア未満なら、7805やLDOはシンプルで静かで安価です。差が大きい場合、電流が500 mAを超える場合、電池で動かす場合は降圧コンバーターを選びます。アナログ測定、オーディオ、敏感なセンサーに給電するときは、両者を組み合わせるのもよくある方法です。まず降圧で7〜8 Vに下げ、次に7805で低ノイズの5 Vを得ます。こうすれば効率ときれいな電源の両方が手に入ります。

Arduino自身のレギュレーターとVinの限界

Arduino Uno R3のDCジャックやVinピンに入れた電圧は、ボード上の1117ファミリーの5 V LDO(純正品ではNCP1117、互換品では多くの場合AMS1117)を通ります。ジャックの後ろには逆接続を防ぐ4007タイプのダイオードがあります。Arduinoの推奨は7〜12 Vで、ボードの限界は6〜20 Vです。下限はドロップアウト電圧によるもので、ダイオードとレギュレーターで合わせて約2 V失われるため、7 Vを下回ると5Vラインが下がります。上限は発熱によるもので、Vinに12 Vを入れて200 mAを引くと、小さなSOT-223のレギュレーターは(12 − 5) × 0.2 = 1.4 Wの熱を出し、触れないほど熱くなります。20 Vでは同じ負荷で3 Wになります。

ボードボード上のレギュレーター推奨入力限界
Arduino Uno R3/Mega5 V LDO(1117ファミリー)7〜12 V(ジャックまたはVin)6〜20 V
Arduino Nano5 V LDO(互換品はほぼAMS1117)7〜12 V(Vin)6〜20 V
Arduino Uno R4スイッチング(降圧)コンバーター6〜24 V(ジャックまたはVin)24 V
ESP32 DevKit3.3 V LDO(通常はAMS1117)5 V(USBまたは5Vピン)発熱のため6 V未満に抑える
Raspberry Pi Pico昇降圧(スイッチング)VSYS:1.8〜5.5 V5.5 V

ボードの5Vピンから電源を取ることもできますが、その電流も同じレギュレーターを通ります。USB給電では5VラインはUSBから直接来て、500 mAのヒューズで制限されます。ジャックから給電する場合は、レギュレーターの発熱で上限が決まります。そのため、サーボモーター、LEDテープ、モーターなどの負荷は、Arduinoの5Vピンではなく別の7805や降圧モジュールから給電し、グラウンドを共通にしてください。3.3Vピンは50 mAまでしか供給できません。ESP-01やアンテナ付きのnRF24L01など電流を多く使うモジュールには、別のAMS1117-3.3を使います。ピンの配置はArduino Unoのピン配置の記事を参照してください。

Arduinoでレギュレーターをテスト:入力、出力、発熱

下のコードは7805の入力電圧と出力電圧を測り、その差、消費電力、推定ジャンクション温度をシリアルモニタに表示し、ドロップアウト電圧に近づいたときやヒートシンクが必要なときに警告します。入力電圧は5 Vを超えるのでアナログピンに直接はつなげません。入力は100 kΩと22 kΩの分圧回路を通してA0に(約27 Vまで測れます)、出力は10 kΩの抵抗2本を通してA1につなぎます。手持ちの抵抗での比率は分圧計算ツールで確認できます。グラウンドはすべて共通にしてください。

C++ (Arduino IDE)
1// 7805 test istasyonu: giriş, çıkış ve ısı / 7805 test bench: input, output and heat
2// Kart: Arduino Uno / Nano (ATmega328P) / Board: Arduino Uno / Nano (ATmega328P)
3
4const float R1_IN  = 100000.0;  // giriş bölücü üst direnç / input divider top resistor
5const float R2_IN  = 22000.0;   // giriş bölücü alt direnç / input divider bottom resistor
6const float R1_OUT = 10000.0;   // çıkış bölücü üst direnç / output divider top resistor
7const float R2_OUT = 10000.0;   // çıkış bölücü alt direnç / output divider bottom resistor
8
9const float LOAD_A    = 0.30;   // multimetreyle ölçtüğün yük akımı (A) / load current measured with a multimeter (A)
10const float THETA_JA  = 60.0;   // soğutucusuz TO-220, °C/W / TO-220 without heatsink, °C/W
11const float T_AMBIENT = 30.0;   // ortam sıcaklığı (°C) / ambient temperature (°C)
12const float DROPOUT_V = 2.0;    // 7805 için gereken en az fark (V) / minimum headroom for the 7805 (V)
13
14// Gerçek besleme gerilimini dahili 1,1 V referansla ölçer (mV)
15// Measures the real supply voltage with the internal 1.1 V reference (mV)
16long readVcc() {
17  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);  // referans AVcc, kanal 1,1 V / AVcc reference, 1.1 V channel
18  delay(2);                                               // referansın oturmasını bekle / let the reference settle
19  ADCSRA |= _BV(ADSC);                                    // dönüşümü başlat / start a conversion
20  while (bit_is_set(ADCSRA, ADSC));                       // bitmesini bekle / wait until it finishes
21  long raw = ADCL;                                        // önce ADCL okunmalı / ADCL must be read first
22  raw |= ADCH << 8;
23  return 1125300L / raw;                                  // 1,1 x 1023 x 1000
24}
25
26// Bölücünün arkasındaki gerçek gerilimi hesaplar / Calculates the real voltage behind a divider
27float readVolts(uint8_t pin, float vcc, float r1, float r2) {
28  analogRead(pin);                                        // ilk okumayı at / discard the first reading
29  long sum = 0;
30  for (int i = 0; i < 16; i++) sum += analogRead(pin);    // 16 örneğin ortalaması / average of 16 samples
31  float vPin = (sum / 16.0) * vcc / 1023.0;
32  return vPin * (r1 + r2) / r2;
33}
34
35void setup() {
36  Serial.begin(9600);
37}
38
39void loop() {
40  float vcc  = readVcc() / 1000.0;
41  float vin  = readVolts(A0, vcc, R1_IN, R2_IN);
42  float vout = readVolts(A1, vcc, R1_OUT, R2_OUT);
43
44  float headroom = vin - vout;                    // regülatör üzerindeki gerilim / voltage across the regulator
45  float heatW    = headroom * LOAD_A;             // P = (Vin - Vout) x I
46  float tj       = T_AMBIENT + heatW * THETA_JA;  // tahmini yonga sıcaklığı / estimated junction temperature
47  float eff      = (vin > 1.0) ? 100.0 * vout / vin : 0.0;  // verim (%) / efficiency (%)
48
49  Serial.print(F("Vin "));      Serial.print(vin, 2);
50  Serial.print(F(" V | Vout ")); Serial.print(vout, 2);
51  Serial.print(F(" V | Fark ")); Serial.print(headroom, 2);
52  Serial.print(F(" V | Isi "));  Serial.print(heatW, 2);
53  Serial.print(F(" W | Tj ~"));  Serial.print(tj, 0);
54  Serial.print(F(" C | Verim %")); Serial.println(eff, 0);
55
56  if (headroom < DROPOUT_V) Serial.println(F("UYARI: giris dusuk, dropout / WARNING: input too low, dropout"));
57  if (tj > 125.0)           Serial.println(F("UYARI: sogutucu gerekli / WARNING: heatsink required"));
58  delay(1000);
59}

このコードは、アナログの読み取りの基準となる電源電圧を仮定せず、readVcc()関数で測定します。ATmega328Pの約1.1 Vの内部固定基準を読み取り、そこから実際のVccを逆算します。こうすれば、ArduinoがUSBで動いていても7805そのもので動いていても、読み取り値は正しく保たれます。この方法はUnoやNanoなどATmega328Pを使うボード向けです。内部基準はチップごとに約±10%ばらつくことがあるので、一度テスターで結果を比べて1125300の定数を調整してください。テスターで測った負荷電流をLOAD_Aに入力します。ヒートシンクを付けた場合は、THETA_JAをヒートシンクの計算で求めた熱抵抗の合計に置き換えます。

ESP32:AMS1117とWi-Fiの電流スパイク

ESP32の開発ボードは、ボード上のLDOで5 Vの入力を3.3 Vに下げています。ボードは通常50〜100 mAを消費しますが、Wi-Fi送信中は電流が一瞬300 mA前後まで跳ね上がります。そのためEspressifは、最低500 mAを供給できる電源を推奨しています。弱い電源、細くて長いUSBケーブル、熱くなったレギュレーターは、このスパイクの間に3V3ラインを落ち込ませ、ESP32はシリアルモニタに「Brownout detector was triggered」と表示して自らリセットします。下のコードは、直前のリセットがブラウンアウトによるものかどうかを知らせ、Wi-Fi接続中に3V3ラインが下がった最低電圧を記録します。3V3ピンは10 kΩの抵抗2本で作った分圧回路を通してGPIO 34につなぎます。

C++ (Arduino IDE)
1// ESP32: 3V3 hattını ve brownout resetini izle / ESP32: watch the 3V3 rail and brownout resets
2#include <WiFi.h>
3#include "esp_system.h"
4
5const char* WIFI_SSID = "AgAdi";   // Wi-Fi ağ adı / Wi-Fi network name
6const char* WIFI_PASS = "Sifre";   // Wi-Fi şifresi / Wi-Fi password
7const int SENSE_PIN = 34;          // 3V3 -> 10k -> GPIO34 -> 10k -> GND (yalnız giriş, ADC1) / input-only ADC1 pin
8
9int minMv = 9999;                  // görülen en düşük gerilim (mV) / lowest voltage seen (mV)
10
11int rail3v3() {
12  return analogReadMilliVolts(SENSE_PIN) * 2;  // bölücü yarıya indirir / the divider halves it
13}
14
15void setup() {
16  Serial.begin(115200);
17  delay(300);
18  if (esp_reset_reason() == ESP_RST_BROWNOUT) {
19    Serial.println("Son reset: BROWNOUT, besleme yetersiz / Last reset: BROWNOUT, weak supply");
20  }
21  Serial.printf("Wi-Fi oncesi 3V3: %d mV\n", rail3v3());
22
23  WiFi.begin(WIFI_SSID, WIFI_PASS);
24  unsigned long t0 = millis();
25  while (WiFi.status() != WL_CONNECTED && millis() - t0 < 15000) {
26    int mv = rail3v3();                        // bağlanırken sürekli ölç / keep sampling while connecting
27    if (mv < minMv) minMv = mv;
28    delay(1);
29  }
30  Serial.printf("Baglanirken en dusuk 3V3: %d mV\n", minMv);
31}
32
33void loop() {
34  int mv = rail3v3();
35  if (mv < minMv) minMv = mv;
36  Serial.printf("3V3: %d mV | en dusuk / min: %d mV\n", mv, minMv);
37  delay(1000);
38}

接続中の最低値が3.0 Vを下回るなら、電源が力不足です。ADCはごく短い落ち込みをすべては捉えられませんが、傾向ははっきりわかります。対策はたいてい簡単で、短くて太いUSBケーブル、ボードの近くで5VとGNDの間に入れる470 µFの電解コンデンサ、または最低500 mAを供給できる電源です。ESP32を12 Vで動かすなら、ボードのAMS1117に12 Vを入れず、まず降圧モジュールで5 Vに下げてください。詳しいトラブルシューティングはESP32のブラウンアウトとGuru Meditationの記事を参照してください。

Raspberry Pi Pico:VSYSと7805

Raspberry Pi Picoはリニアレギュレーターではなく効率のよい昇降圧(バックブースト)コンバーターを搭載しており、VSYSピンは1.8〜5.5 Vを受け付けます。12 VのシステムでPicoを動かすには、7805の出力をVSYSにつなげます。同時にUSBも使う場合は1N5819などのショットキーダイオードを間に入れてください。入れないとUSBの5 Vと7805がぶつかり合います。7805の出力を3V3ピンには絶対につながないでください。このピンは3.3 Vを超える電圧に耐えられません。下のMicroPythonコードは、7805の入力をGP26の分圧回路経由で、VSYSをボード上のGP29チャンネル経由で測ります。

MicroPython
1# Pico: 7805 girişini ve VSYS'i ölç / Pico: measure the 7805 input and VSYS
2from machine import ADC
3import time
4
5adc_in = ADC(26)            # GP26 (ADC0): 100k/22k bölücü / 100k/22k divider
6adc_vsys = ADC(29)          # GP29 (ADC3): kart üzerinde VSYS/3 / VSYS/3 on the board
7
8K_IN = (100 + 22) / 22      # bölücü oranı (~5,55) / divider ratio (~5.55)
9V_OUT = 5.0                 # 7805 çıkışı (V) / 7805 output (V)
10LOAD_A = 0.30               # ölçtüğün yük akımı (A) / load current you measured (A)
11
12def volts(adc, ratio, n=16):
13    total = 0
14    for _ in range(n):
15        total += adc.read_u16()          # 0-65535 arası ham değer / raw value 0-65535
16    return total / n * 3.3 / 65535 * ratio
17
18while True:
19    vin = volts(adc_in, K_IN)
20    vsys = volts(adc_vsys, 3)
21    heat = (vin - V_OUT) * LOAD_A        # P = (Vin - Vout) x I
22    print("Vin {:.2f} V | VSYS {:.2f} V | 7805 isi {:.2f} W".format(vin, vsys, heat))
23    if vin - V_OUT < 2.0:
24        print("UYARI: dropout / WARNING: dropout")
25    time.sleep(1)

PicoのADCは最大3.3 Vまでしか読めないので、100k/22kの分圧回路では約18 Vまで測れます。VSYSの値は、ショットキーダイオードによる約0.3 Vの電圧降下のため7805の出力より少し低くなりますが、これは正常です。Pico WではGP29が無線チップと共用されているため、VSYSの測定には追加の設定が必要です。その場合はGP26の読み取り値だけを使ってください。Picoが初めてなら、Raspberry Pi Picoとは?の記事から始めるのがおすすめです。

7805やほかのレギュレーターを使ったプロジェクトのアイデア

  • 卓上の5 V電源:12 VのACアダプター、7805、ヒートシンク、スイッチで小さな箱を作り、ブレッドボードのプロジェクトに安定した5 Vを供給します。
  • 電圧と発熱を表示する電源:上のテストコードをLCDに移し、入力、出力、損失をリアルタイムで表示します。測定の基本的な考え方はArduinoで電圧計を作るの記事にあります。
  • 車載Arduino:12〜14.4 Vのバッテリー電圧を降圧で7〜8 Vに、次に7805で5 Vに下げます。車内の電圧サージに備えて、入力にTVSダイオードを加えます。
  • 12 VのLEDテープとリレーの制御:LEDテープは12 Vから直接動かし、Arduinoとリレーモジュールには7805の出力から給電します。
  • サーボモーターとNeoPixel用の別ライン:1 A未満の負荷には7805、それ以上には降圧を使い、サーボモーターやWS2812B LEDを、グラウンドを共通にした別の5 Vラインから給電します。
  • 3.3 Vのセンサーボード:BME280やnRF24L01などの3.3 Vモジュールを、Arduinoとは別にAMS1117-3.3から給電します。信号レベルにはレベル変換モジュールを使います。

よくある失敗と対処法

症状考えられる原因対処
出力が5 Vではなく3.5〜4.5 V入力が7 V未満(ドロップアウト)、または電池が弱っている入力を7.5〜9 Vに上げ、負荷をかけた状態で測る
7805が数秒動いては止まる過熱保護が働いている、損失が大きすぎるヒートシンクを付ける、入力を下げる、または降圧を使う
出力が入力と同じ(例:12 V)GNDの足が断線している、またはレギュレーター内部が短絡故障しているGNDの接続を確認する。負荷を外して測り、必要なら交換する
出力が0 Vで、レギュレーターが冷たいままピン順の間違い(78L05や7905と混同)、または入力と出力の逆接続パッケージのピン順を確認する
Arduinoがランダムにリセットするコンデンサがない、またはピンから遠い0.33 µFと0.1 µFをピンの近くに付け、10〜47 µFの電解コンデンサを加える
Arduinoのレギュレーターがとても熱くなるVinに12 Vを入れ、5Vピンから大きな電流を引いている負荷は別の7805か降圧から給電し、Vinは7〜9 Vに保つ
Wi-Fiが始まるとESP32がリセットする電源またはAMS1117がピーク電流をまかなえない短いケーブル、470 µFのコンデンサ、最低500 mAの電源
AMS1117-3.3の出力が3 V前後入力が4.4 V未満(例:Li-ionセル1本)5 Vを入れるか、ドロップアウト電圧の低いLDOを選ぶ
レギュレーター回路のトラブルシューティングでは、必ず3つを測ります。入力電圧、出力電圧、そして負荷をかけた状態での両者の差です。差が2 V未満なら原因は電源、出力が入力と同じなら原因はGNDの接続かレギュレーターです。ボードが壊れたかもしれないと思ったら、Arduinoが壊れたかも?の記事のチェックに沿って確認してください。

適切な入力電圧、小さなコンデンサ2個、必要に応じたヒートシンクがあれば、7805は電子工作で最も信頼できる部品の1つで、何年も動き続けます。ルールを覚えておきましょう。入力と出力の差が大きいほど発熱も大きくなります。差が大きいなら降圧、3.3 VならAMS1117、電池を長持ちさせたいなら自己消費電流の少ないLDOを選びます。BlueGraysアプリでは、LCDディスプレイ付きデジタル電圧計、L298Nで作るBluetooth操作の車、障害物回避ロボット、スマート水やりステーション、ESP32のディープスリープのプロジェクトを、ステップごとの回路図とコード付きで見られます。それらの電源部は、このガイドの計算を使って自分で組み立てられます。

よくある質問

7805のどのピンが入力で、どれが出力ですか?

印字面を手前、足を下にして持つと、左から1番ピンが入力(IN)、2番ピンがGND、3番ピンが出力(OUT)です。金属タブもGNDにつながっています。TO-92の78L05では順番が逆(1が出力、2がGND、3が入力)なので、必ずパッケージを確認してください。

7805はどれくらいの電流を供給できますか?

TO-220の7805は十分なヒートシンクがあれば1 A、条件によっては最大1.5 Aを供給でき、ショート時には約2 Aで内部の電流制限が働きます。実際の限界は電流ではなく発熱です。ヒートシンクなしでは(Vin − Vout) · Iを1〜1.5 W未満に抑えてください。小型の78L05は100 mAしか供給できません。

7805が熱くなるのはなぜですか? ヒートシンクは必要ですか?

7805はリニアレギュレーターなので、入力と出力の間の余分な電圧を熱に変えます。12 V入力で500 mAを引くと3.5 Wの熱が出るので、ヒートシンクなしでは無理です。損失が1 W未満ならヒートシンクは不要です。それを超えるならヒートシンクを使い、数ワットを超えるなら降圧コンバーターを使ってください。

7805はコンデンサなしでも動きますか?

十分に平滑された電源の近くで短い配線なら動くことが多いですが、おすすめしません。入力の0.33 µFは配線による発振を防ぎ、出力の0.1 µFは急な負荷変動のときに電圧を安定させます。この安価な2個のコンデンサで、原因不明のリセットやノイズを防げます。

7805の最大入力電圧はいくつですか?

絶対最大定格は35 V(7824は40 V)ですが、発熱のため、その限界近くで動かすのは現実的ではありません。5 V出力なら、入力は7.5〜12 Vが理想です。24 Vのような高い電圧では、まず降圧コンバーターで電圧を下げるほうがはるかに賢明です。

7805で3.3 Vを得られますか?

いいえ、7805は5 Vしか出力しません。3.3 VにはAMS1117-3.3などのLDOを使います。5 V入力から3.3 Vを楽に作れ、最大1 Aを供給できます。電池で動かすプロジェクトには、自己消費電流がマイクロアンペア単位のMCP1700などのLDOのほうが適しています。

全プロジェクトを見る
LCDディスプレイ付きデジタル電圧計
#56中級
プレミアム

LCDディスプレイ付きデジタル電圧計

自作の測定器で、電池や電源アダプターが出力する電圧を調べます。2つの抵抗で作る分圧回路が、高い電圧をボードで読み取れるレベルまで下げます。Arduinoが元の電圧を計算し、2行のLCDディスプレイにボルト単位で表示します。この回路では約55ボルトまでの直流電圧を測定できます。コンセントの商用電源には絶対に接続しないでください。

4.5(27)
36
L298Nで作るBluetooth操作の車
#80上級
プレミアム

L298Nで作るBluetooth操作の車

スマートフォンをリモコンにして、自作のロボットカーを操作できます。ArduinoはBluetoothモジュールを通じてスマートフォンのリモコンアプリから指令を受け取り、モータードライバーで車輪を回します。前進、後退、左右や斜めへの移動ができ、速度もスマートフォンから調整できます。停止ボタンを押すと、短いブレーキ動作でモーターがすぐに止まります。

5.0(38)
65
障害物回避ロボット
#81上級
プレミアム

障害物回避ロボット

自分で進む道を見つける、賢い車を作ってみませんか?障害物回避ロボットは、前面の超音波センサーで周囲を常に調べます。障害物を見つけると停止し、サーボモーターで左右を確認して、最も障害物の少ない方向を選んで進みます。自動運転の基礎を学ぶのにぴったりの入門プロジェクトです。

5.0(38)
49
スマート水やりステーション
#83上級
プレミアム

スマート水やりステーション

旅行中も植物が枯れないよう、自動で水やりをするシステムです。土壌水分センサーで土の湿り具合を測定し、乾燥するとArduinoが給水ポンプを数秒間動かして、青いライトを点灯させます。水分が適切なときは緑のライトが点灯します。土がひどく乾燥すると、赤いライトが点滅し、ブザーが鳴って知らせます。

5.0(42)
57
ESP32のディープスリープで節電(OLED + RTC RAMカウンター)
#135上級
プレミアム

ESP32のディープスリープで節電(OLED + RTC RAMカウンター)

ESP32のディープスリープモードは、CPUとほとんどの周辺機器を停止し、消費電流を約10 µAまで抑えます。電池で動くIoT機器に欠かせない機能です。このプロジェクトでは、タイマー(15秒)、外部ピン(EXT0、ボタンはGPIO 33)、タッチ(T0/GPIO 4)の3種類の復帰方法を使います。RTC_DATA_ATTRを付けた変数はディープスリープ中も保持され、起動回数、タイマーによる復帰回数、ボタンによる復帰回数を継続して記録できます。復帰するたびにSSD1306 OLEDディスプレイに復帰理由と回数を表示します。

4.3(10)
16
ESP32 Wi-Fi STA接続(LCDディスプレイ付き)
#127上級

ESP32 Wi-Fi STA接続(LCDディスプレイ付き)

このプロジェクトでは、ESP32をステーション(STA)モードで家庭のWi-Fiネットワークに接続し、安全で障害に強い接続を実現します。SSIDとパスワードを別のsecrets.hファイルに保存してGitへの流出を防ぎ、自動再接続の仕組みを実装します。RSSIによる信号強度とIPアドレスはI2C LCDディスプレイに表示します。内蔵LEDは状態表示に使います。実運用を想定した接続管理の仕組みです。

4.4(21)
34
ESP32 WS2812B NeoPixel LEDテープの制御
#126中級
プレミアム

ESP32 WS2812B NeoPixel LEDテープの制御

WS2812B(NeoPixel)は、1本のデータピンで連結したLEDを個別に制御できるスマートなRGB LEDです。このプロジェクトでは、8個のLEDを備えたWS2812BテープをAdafruit_NeoPixelライブラリで制御し、滑らかな虹色のアニメーションを作ります。ESP32の3.3VロジックレベルはほとんどのWS2812Bのロットで問題なく動作しますが、不安定な場合に備え、470Ωの直列抵抗と1000µFのコンデンサを使う対策も紹介します。アニメーションは、HSV色空間の色相(hue)をずらして作ります。

4.9(19)
30