部品 · 読了まで19分

LM2596降圧コンバーターを5 Vや3.3 Vに調整する方法

LM2596降圧コンバーターの調整方法を解説します。半固定抵抗とテスターで5 Vや3.3 Vに合わせ、12 VからArduinoやサーボに給電する方法、発熱、電流、7805との違いまで紹介します。

LM2596の調整とは、モジュールに電源を入れ、出力をテスターで測りながら青い半固定抵抗の真ちゅうのネジを回して、目的の電圧(たとえば5 Vや3.3 V)に合わせる作業です。LM2596降圧(バック)モジュールは、12 VのACアダプター、車のバッテリー、2SのLi-ionパックから、Arduino、ESP32、サーボ、LEDテープ用の低い電圧を効率よく作る、安価でとても一般的なレギュレーターです。4.5〜40 Vの入力を約1.25 V〜35 Vの任意の電圧に下げ、最大3 Aまで流せます。鉄則は一文で言えます。負荷をつなぐ前に、必ず出力を調整して測ってください。

このガイドでは、降圧コンバーターのしくみ、モジュールのピンと部品、半固定抵抗とテスターで5 Vと3.3 Vにステップごとに合わせる方法、出力を決めるVout = 1.23 × (1 + R2 / R1)の式を学びます。続いて、12 VからArduinoとサーボに給電する方法、電流制限と発熱、効率と7805との違い、よくある間違い(逆接続、負荷時の電圧低下)を見てから、Arduino、ESP32、Raspberry Pi Picoで出力を測るコードに進みます。

LM2596降圧コンバーターモジュール
LM2596降圧モジュール:IN+ / IN−の入力、OUT+ / OUT−の出力、出力を決める青い多回転型の半固定抵抗、エネルギーを蓄える大きなインダクタ、入力と出力のコンデンサが1枚の基板にまとまっています。

LM2596とは?しくみは?

LM2596はスイッチング方式の降圧レギュレーターICで、もともとNational Semiconductorが開発し、現在はTexas Instrumentsが製造しています。7805のようなリニアレギュレーターは余分な電圧を熱に変えて捨てますが、LM2596は内部のパワートランジスタを1秒間に約150,000回(150 kHz)オン・オフします。トランジスタがオンの間、電流はインダクタを通って負荷に流れ、インダクタは磁界にエネルギーを蓄えます。トランジスタがオフになると、インダクタはショットキーダイオードを通して、そのエネルギーを負荷に供給し続けます。出力コンデンサがこのパルスを平滑化します。トランジスタがオンになっている時間の割合をデューティ比と呼び、おおよそD ≈ Vout / Vinです。12 Vから5 Vを作るなら、スイッチは約42%の時間オンになります。

エネルギーを燃やして捨てないので、効率は約80〜90%で、入力から引く電流は出力の電流より少なくなります。12 Vから5 Vで2 Aを供給するモジュールが入力から引くのは約1 Aだけです。出力電圧を一定に保つのはFB(フィードバック)ピンです。チップはFBの電圧を内部の1.23 Vの基準電圧と比べ、それに合わせてデューティ比を調整します。市販のモジュールでは、FBピンにつながる分圧回路の片側が多回転型の半固定抵抗になっていて、ネジを回すと分圧比が変わり、出力電圧も変わります。LM2596には3.3 V、5 V、12 Vの固定版もありますが、Arduinoの世界で最も一般的なのは、可変(ADJ)版で作られた青いモジュールです。

項目LM2596チップ(データシート)市販のモジュール(一般的な値)
入力電圧4.5〜40 V(絶対最大定格45 V)4.5〜40 V、出力より1.5〜2 V以上高いこと
出力電圧ADJ:1.23〜37 V、固定版:3.3 / 5 / 12 V半固定抵抗で約1.25〜35 V
出力電流3 Aヒートシンクなしで連続約2 A、ありで3 A
スイッチング周波数150 kHz(127〜173 kHz)150 kHz
フィードバックの基準電圧1.23 V1.23 V
効率73〜90%(電圧と電流による)12 V → 5 Vで通常80〜88%
自己消費電流標準5 mA、最大10 mA、ON/OFFでオフにすると80 µA5〜10 mA+電源LED(ある場合)
電流制限標準4.5 Aのピーク(3.6〜6.9 A)調整不可(CC/CV版にだけ設定がある)
保護機能電流制限と過熱保護逆接続保護なし

モジュールのピンと基板上の部品

青いLM2596モジュールには4つの接続点があります。IN+とIN−が入力、OUT+とOUT−が出力です。IN−とOUT−は基板上でつながっています。降圧コンバーターは入力と出力を絶縁しないので、電源、モジュール、給電するボードは共通のGNDを持ちます。基板には、5ピンのLM2596Sチップ(TO-263パッケージ:VIN、出力、GND、FB、ON/OFF)、多くの場合330か470と書かれた33〜47 µHの大きなインダクタ、SS34のような3 Aのショットキーダイオード、入力側と出力側に1個ずつの電解コンデンサ(通常100〜220 µF)、103(10 kΩ)と書かれた多回転型の半固定抵抗が載っています。インダクタの表記は「インダクタコード」ツールで読み解けます。ほとんどのモジュールではチップのON/OFFピンがGNDにつながっているので、電源を入れるとすぐに動作を始めます。

モジュールのピン機能接続先
IN+入力のプラス(4.5〜40 V)ACアダプター、バッテリー、電池パックのプラス
IN−入力のマイナス(GND)電源のマイナス
OUT+安定化された出力のプラスArduinoの5VまたはVin、ESP32の5V、PicoのVSYS、サーボの赤い線
OUT−出力のマイナス(IN−と同じGND)ボードのGND、サーボの茶色または黒の線
LM2596モジュールには逆接続保護がありません。入力を一瞬でも逆につなぐと、多くの場合チップとダイオードはすぐに壊れます。チップが内部でショートし、それ以降は入力をそのまま出力に通してしまうこともあります。接続する前にIN+とIN−の表示を2回読み、テスターで電源の極性を確かめ、常設の回路では入力に直列のショットキーダイオード(たとえばSS34や1N5822、電圧降下は約0.4〜0.5 V)を入れてください。入力と出力を取り違えてOUT側に電源をつないでも、モジュールは壊れます。

LM2596をステップごとに調整する方法:テスターで5 Vまたは3.3 Vに

  1. 出力には何もつながないでください。モジュールは無負荷で調整します。ArduinoやESP32をつなぐのは、正しい電圧を確認してからです。
  2. プロジェクトで実際に使う電源(たとえば12 V 2 AのACアダプター)を入力につなぎます。プラスをIN+に、マイナスをIN−に。基板にLEDがあれば点灯します。
  3. テスターを直流電圧(20 Vレンジかオート)に合わせ、赤のテスト棒をOUT+に、黒のテスト棒をOUT−に当てます。工場出荷時の設定は分からないので、最初の値は入力電圧に近いことがあります。
  4. 小さなマイナスドライバーで半固定抵抗の真ちゅうのネジを一方向に2〜3回転させ、表示を見ます。電圧が下がれば正しい方向です。上がる場合は逆に回してください。方向は半固定抵抗の配線によって、モジュールごとに異なることがあります。
  5. 約25回転の多回転型の半固定抵抗では、全範囲を動かすのに20回転以上かかることがあります。ネジにはストッパーがなく、端まで来るとかすかなクリック音とともに空回りし、電圧が変わらなくなります。そうなったら逆方向に戻してください。
  6. 目標に近づいたら1/4回転ずつ、さらに細かく回します。5 Vなら5.00〜5.10 V、3.3 Vなら3.30〜3.35 Vの間にします。ESP32やPicoのような3.3 Vのボードでは、3.6 Vを絶対に超えないでください。
  7. 負荷をつなぐか、5 Vで約500 mAを流す10 Ω / 5 Wの抵抗でテストし、負荷をかけた状態でもう一度測ります。電圧が0.1〜0.2 V以上下がる場合は、電源と配線を確認してください。
  8. 調整が終わったら、半固定抵抗のネジにマニキュアかホットボンドを1滴たらします。振動するロボットでは、時間がたつと設定がずれることがあります。
なぜここまで慎重に? まだ12 Vのままの出力をArduinoの5Vピンや、ESP32の3V3ピンにつなぐと、数秒でボードが壊れます。測定に慣れていなければ、「テスターの使い方」のガイドを読んでください。小さな3桁の電圧計表示が付いたLM2596モジュールでも、最初の設定はテスターで確認してください。この表示は約0.1 Vずれていることがあります。

出力の式:Vout = 1.23 × (1 + R2 / R1)

LM2596は、FBピンの電圧が1.23 Vになるように出力を調整します。出力とFBの間の抵抗をR2、FBとGNDの間の抵抗をR1とすると、出力はVout = 1.23 × (1 + R2 / R1)です。モジュールでは10 kΩの半固定抵抗がR2の役割を担い、R1は基板上の小さな固定抵抗です。この式から2つの重要なことが分かります。R2がゼロに近くても出力は1.23 Vより下がらないこと、そしてR2をどれだけ大きくしても出力は入力を超えないことです。半固定抵抗を上げすぎると、チップはスイッチをオンにしたままになり、出力は入力より約1〜2 V低い値で止まります。これが「モジュールで電圧が下がらない」という相談の最も多い原因です。

振動のあるプロジェクトや長く使うプロジェクトで、半固定抵抗の代わりに固定抵抗を使いたい場合は、データシートに従ってR1を240 Ω〜1.5 kΩの範囲で選びます。R1 = 1 kΩなら、5 VにはR2 = 1 kΩ × (5 / 1.23 − 1) ≈ 3.07 kΩとなり、誤差1%の3.09 kΩの抵抗で出力は5.03 Vです。3.3 VならR2 ≈ 1.68 kΩで、誤差1%の1.69 kΩで3.31 Vになります。これは実は分圧回路そのものです。比率は「分圧計算ツール」で確かめられます。

目標の出力推奨する最低入力主な用途
3.3 V5 VESP32やPicoの3V3ピン、3.3 Vのセンサー
4.0〜4.1 V6 VSIM800L GSMモジュール
5.0 V7 VArduinoの5Vピン、ESP32の5Vピン、SG90サーボ、WS2812B LED
6.0 V8 VMG996Rサーボ(SG90とMG90Sの上限)
7.5〜9 V10〜11 VArduinoのDCジャックまたはVinピン
12 V14〜15 V24 Vの系統からの12 Vのファン、リレー、LEDテープ

表の最低入力は2〜3 Aの負荷の場合の値です。LM2596のスイッチは3 Aで標準1.16 Vの電圧降下があり、インダクタと配線がさらに数百ミリボルト加わります。軽い負荷(約1 A)なら差は約1.5 Vまで下がります。7.4 Vの2S Li-ionパックは放電すると約6.4 Vまで下がります。1 Aの5 Vラインにはまだ足りますが、6 Vのサーボ用ラインには足りません。4 Vが必要なGSMモジュールの準備については「SIM800L」の記事を見てください(日本ではGSMのサービスがないため、技適を取得したLTEモジュールが必要です)。

12 VのACアダプターやバッテリーからArduinoに給電する

LM2596でArduinoに給電する正しい方法は2つあります。1つ目は、モジュールを5.0 Vに合わせ、出力を直接5Vピンにつなぐ方法です。ボード自身のレギュレーターを通らないので、ほとんど発熱せず最も効率のよい方法ですが、ボードを守るものは何も残りません。半固定抵抗がずれたり、モジュールが故障して入力を出力に通したりすると、12 Vがそのままマイコンに入ります。この接続のままUSBケーブルも挿すと、パソコンのUSB電源とモジュールの出力がつながってしまいます。コードを書き込むときはモジュールを外すのが最も安全です。

2つ目は、モジュールを7.5〜9 Vに合わせ、DCジャックかVinピンにつなぐ方法です。この場合、最終的な安定化はボードのレギュレーターが行い、ジャック入力のダイオードが逆接続から守ります。12 Vを直接ジャックに入れても動きますが、200 mAの負荷ではボードの小さなレギュレーターが(12 − 5) × 0.2 = 1.4 Wの熱を出します。LM2596を7.5 Vに合わせれば、この損失は(7.5 − 5) × 0.2 = 0.5 Wに下がります。すべての給電方法は「Arduinoの電源の取り方」の記事に、ピンの位置は「Arduino Unoのピン配置」にまとめています。

接続LM2596の設定メリット注意点
Arduinoの5Vピン5.0〜5.1 V最も発熱が少なく効率がよい保護なし、USBを同時に挿さない
ArduinoのDCジャック7.5〜9 V逆接続防止ダイオードとボードのレギュレーターが守るダイオードで約0.7 V下がる
ArduinoのVinピン7.5〜9 Vジャック不要、ボードのレギュレーターが守る逆接続保護なし
ESP32の5V(VIN)ピン5.0 Vボード上のLDOが3.3 Vを作る3V3ピンに5 Vを絶対に入れない
ESP32の3V3ピン3.30 Vボードのレギュレーターを通らない3.6 Vを超えるとESP32が壊れることがある
PicoのVSYSピン5.0 VVSYSは1.8〜5.5 Vを受け付けるUSBも接続するならショットキーダイオードを入れる
どの接続を選んでも、モジュールのOUT−はボードのGNDとつなぐ必要があります。GNDが分かれたシステムでは信号が意味を失い、センサーはでたらめな値を読みます。調整済みのモジュールを別のプロジェクトに移すときは、出力をもう一度測ってください。先週は12 VのLEDテープ用に合わせてあったかもしれません。

サーボやモーターへの給電:電流を計算する

LM2596の最も多い用途はサーボの電源です。SG90は動いている間100〜250 mAを流し、起動時や負荷がかかると600〜700 mAに跳ね上がります。MG996Rは6 Vで拘束されると約2.5 Aに達します。モジュールを選ぶときは平均値で考えず、同時に負荷がかかりうるすべてのサーボの電流を足してください。ヒートシンクなしのLM2596に連続2 Aを期待するのは現実的です。SG90なら3個は余裕で動きますが、4〜6個のMG996Rを使うロボットアームを1つのモジュールで動かすと、リセットやジッターが起きて当然です。その場合はサーボ1〜2個ごとに別のモジュールを使うか、XL4015のような5 Aのモジュールを使ってください。

MG996Rサーボモーター
MG996Rサーボ:4.8〜7.2 Vで動作し、負荷時には最大2.5 Aを流します。6 Vに合わせたLM2596を使うなら、MG996R 1〜2個ごとに別のラインを用意するのが安全です。

入力電流も計算しておきましょう。ACアダプターが追いつかなければ、モジュールがどれだけよくても出力は下がるからです。式はIin = (Vout × Iout) / (Vin × η)です。効率85%で12 Vから5 V・2 Aを作る場合、Iin = 10 W / (12 V × 0.85) ≈ 0.98 Aなので、12 V 2 AのACアダプターで足ります。同じ負荷は7.4 Vの2S電池パックからは約1.6 Aを引きます。サーボ用ラインのすぐ近くに470〜1000 µFの電解コンデンサを置くと、起動時の電流をモジュールではなくコンデンサが供給してくれます。サーボが原因のリセットのあらゆる対策は「Arduinoがリセットを繰り返すとき」を、サーボの配線は「サーボモーターとは?」と「MG996Rサーボモーター」を見てください。

電流制限、発熱、ヒートシンク

降圧コンバーターは効率がよいものの、損失がゼロではありません。失われる電力はおおよそPloss = Pout × (1/η − 1)で、チップ、ショットキーダイオード、インダクタで分け合います。効率85%で5 V 2 A(10 W)を出力すると、約1.8 Wの熱が出ます。モジュールのLM2596SはTO-263パッケージで、小さな銅箔の面にはんだ付けされています。データシートによると、空気への熱抵抗は銅箔の面積によって30〜50 °C/Wです。そのため2 Aではチップは指を当てていられないほど熱くなり、3 Aでは小さな貼り付け式のアルミ製ヒートシンクと風通しが欠かせません。密閉したケースの中では、この限界はさらに下がります。

負荷(12 V → 5 V)出力電力推定損失状態
0.5 A2.5 W約0.4 W温かい程度、ヒートシンク不要
1 A5 W約0.8 W熱いが問題なし
2 A10 W約1.8 Wとても熱い、風通しが必要
3 A15 W約3.5 Wヒートシンクとファンが必須

LM2596の電流制限はユーザーが調整できません。スイッチのピーク電流が約4.5 A(製造のばらつきで3.6〜6.9 A)に達すると、チップはパルスを短く切り、過負荷では周波数を下げ、過熱すると自分で停止します。これらの保護は短絡時にたいていモジュールを守ってくれますが、ヒューズの代わりにはなりません。パワーLEDの駆動や電流制限付きのテスト用電源づくりのように、電流を設定する必要がある用途には、電流用の2つ目の半固定抵抗を備えたCC/CV(定電流 / 定電圧)のLM2596モジュールがあります。短絡に強いラインにしたい場合は、入力にも適切な定格のヒューズを入れてください。

市場に出回る安いモジュールの中には、偽物や表示を書き換えたチップを使ったものがあります。150 kHzよりずっと低い周波数で動き、リップルが大きく、3 Aに届くはるか手前で熱くなって電圧が下がるものもあります。ラベルの3 Aを信用せず、連続2 Aで設計してください。それ以上必要なら、負荷を2つのモジュールに分けるか、XL4015のようなより強力なモジュールに切り替えます。

効率と7805との比較

同じ役目をする「7805電圧レギュレーター」と比べると、差の大きさがはっきりします。12 Vから5 Vで1 Aを供給するとき、7805は入力からも1 Aを引き、(12 − 5) × 1 = 7 Wを熱に変えます。効率はわずか42%で、大きなヒートシンクが必要です。LM2596は同じ負荷で入力から約0.49 Aしか引かず、損失は1 W未満です。電池で動くプロジェクトでは、この差がそのまま動作時間に表れます。効率が2倍になれば、電池はおよそ2倍長く持ちます。

降圧コンバーターの代償はノイズです。データシートによると、出力ののこぎり波状のリップルは通常出力電圧の0.5〜3%、つまり5 Vで25〜150 mVで、さらに150 kHzのスイッチングノイズが乗ります。Arduino、サーボ、リレー、LEDには問題ありませんが、精密なアナログ測定、マイク、オーディオアンプに給電すると影響が出ます。その場合は2つを組み合わせます。まずLM2596で7〜8 Vに下げ、次に7805かLDOできれいな5 Vを作れば、効率と静かさの両方が得られます。ブレッドボードでの電流の少ない小さな実験には、市販の「MB102ブレッドボード電源モジュール」が手軽です。

項目LM2596(降圧)7805(リニア)AMS1117-3.3(LDO)
しくみ150 kHzのスイッチング、インダクタにエネルギーを蓄える余分な電圧を熱に変える余分な電圧を熱に変える
12 Vからの効率80〜90%5 V出力で約42%3.3 V出力で約27%(入力は最大15 V)
最大電流3 A(実用上は連続2 A)1〜1.5 A0.8〜1 A
入出力の最低電圧差約1.5〜2 V約2 V約1.1〜1.3 V
出力ノイズ数十mVのリップルとても低いとても低い
出力の設定半固定抵抗で1.25〜35 V5 V固定3.3 V固定
自己消費電流5〜10 mA3〜8 mA約5 mA
向いている用途大きな電圧差、大電流、電池小さな電圧差、小電流、静かな電源5 Vから3.3 V、数百mA
LM2596降圧モジュール
LM2596降圧モジュール
LM7805レギュレーター
LM7805レギュレーター
AMS1117-3.3レギュレーター
AMS1117-3.3レギュレーター
MB102電源モジュール
MB102電源モジュール

ArduinoでLM2596の負荷時の出力を測る

負荷をかけたときに電圧がどれだけ下がるかを知るには、負荷を動かしながら電圧降下を測るのがいちばんです。下のコードはサーボを0度と180度の間で動かし続け、LM2596の出力で観測した最低電圧と最高電圧をシリアルモニタに表示します。配線は次のとおりです。サーボの赤い線をOUT+に、茶色の線をOUT−に、信号線をD9につなぎます。OUT+とGNDの間に47 kΩと10 kΩの「分圧回路」を組み、その中点をA0につなぎます。ArduinoはUSBから給電し、OUT−は必ずArduinoのGNDとつなぎます。

C++ (Arduino IDE)
1// LM2596 yük testi: servo dönerken çıkış gerilimini izle / LM2596 load test: watch the output while a servo moves
2// Kart: Arduino Uno / Nano (ATmega328P) / Board: Arduino Uno / Nano (ATmega328P)
3#include <Servo.h>
4
5const int SENSE_PIN = A0;          // OUT+ -> 47k -> A0 -> 10k -> GND
6const int SERVO_PIN = 9;           // servo sinyal kablosu / servo signal wire
7const float R_TOP = 47000.0;       // bölücü üst direnç / divider top resistor
8const float R_BOTTOM = 10000.0;    // bölücü alt direnç / divider bottom resistor
9const float AREF_V = 1.1;          // dahili referans, multimetreyle düzelt / internal reference, calibrate with a multimeter
10const float LOW_LIMIT = 4.6;       // 5 V hat için uyarı sınırı / warning limit for a 5 V rail
11
12Servo servo;
13float vMin, vMax;
14
15float readOutput() {
16  long sum = 0;
17  for (int i = 0; i < 8; i++) {
18    sum += analogRead(SENSE_PIN);  // 8 örneğin toplamı / sum of 8 samples
19  }
20  float vPin = (sum / 8.0) * AREF_V / 1023.0;
21  return vPin * (R_TOP + R_BOTTOM) / R_BOTTOM;  // bölücüyü geri hesapla / undo the divider
22}
23
24void track() {
25  float v = readOutput();
26  if (v < vMin) vMin = v;          // en düşük değer / lowest value
27  if (v > vMax) vMax = v;          // en yüksek değer / highest value
28}
29
30void setup() {
31  Serial.begin(9600);
32  analogReference(INTERNAL);       // 1,1 V referans, beslemeden bağımsız / 1.1 V reference, independent of the supply
33  for (int i = 0; i < 10; i++) {   // referans otursun, ilk okumaları at / let the reference settle, drop first readings
34    analogRead(SENSE_PIN);
35    delay(5);
36  }
37  servo.attach(SERVO_PIN);
38}
39
40void loop() {
41  vMin = 99.0;
42  vMax = 0.0;
43  for (int a = 0; a <= 180; a += 2) {     // 0 -> 180 derece / 0 -> 180 degrees
44    servo.write(a);
45    for (int k = 0; k < 5; k++) { track(); delay(2); }
46  }
47  for (int a = 180; a >= 0; a -= 2) {     // 180 -> 0 derece / 180 -> 0 degrees
48    servo.write(a);
49    for (int k = 0; k < 5; k++) { track(); delay(2); }
50  }
51  Serial.print(F("Min: "));
52  Serial.print(vMin, 2);
53  Serial.print(F(" V  Max: "));
54  Serial.print(vMax, 2);
55  Serial.print(F(" V  Dusus / Drop: "));
56  Serial.print(vMax - vMin, 2);
57  Serial.println(F(" V"));
58  if (vMin < LOW_LIMIT) {
59    Serial.println(F("UYARI: gerilim cok dusuyor / WARNING: voltage sags too much"));
60  }
61  delay(1000);
62}

このコードはArduino自身の電源電圧ではなく、ATmega328Pの内部1.1 V基準電圧(analogReference(INTERNAL))を使うので、USBが4.7 Vでも5.1 Vでも読み取り値は影響を受けません。47k/10kの分圧回路で測れる最高電圧は約6.2 Vです。6 Vのサーボ用ラインでは、基準電圧の誤差を見込んで上側の抵抗を56 kΩにし、R_TOP定数を変更してください。内部基準電圧はチップごとに約±10%ばらつくので、一度テスターで出力を測り、2つの結果が一致するまでAREF_V(例:1.08)を調整します。サーボが動いている間の電圧降下が0.3 Vを超えるなら、配線を短く太くし、サーボ用ラインに470 µFを追加してください。0.1 V未満なら電源は健全です。

ESP32:12 Vのバッテリーで動かして監視する

12 VのバッテリーでESP32を動かすのは、庭のセンサーステーションや車載のトラッカーでよくある構成です。LM2596を5.0 Vに合わせ、ESP32ボードの5V(VIN)ピンにつなぎます。3.3 Vはボード自身のLDOが作ります。ESP32がWi-Fiで送信するときの短い電流のピークも、LM2596なら余裕でまかなえます。電源が弱いときの症状は「ESP32のブラウンアウトエラー」の記事で詳しく紹介しています。下のコードは100 kΩ / 22 kΩの分圧回路を通してGPIO34でバッテリー電圧を読み、電圧が鉛蓄電池の安全な下限に達したら、ESP32を10分間ディープスリープにします。

C++ (Arduino IDE)
1// ESP32: LM2596 ile 12 V aküden beslen, aküyü izle / ESP32: run from a 12 V battery via an LM2596, monitor the battery
2#include <Arduino.h>
3#include "esp_sleep.h"
4
5const int BAT_PIN = 34;                           // GPIO34: yalnız giriş, ADC1 / input-only, ADC1
6const float RATIO = (100.0 + 22.0) / 22.0;        // 100k / 22k bölücü (~5,55) / divider (~5.55)
7const float LOW_V = 11.8;                         // kurşun asit akü alt sınırı / lead-acid low limit
8const uint64_t SLEEP_US = 10ULL * 60 * 1000000;   // 10 dakika (mikrosaniye) / 10 minutes (microseconds)
9
10float batteryVolts() {
11  uint32_t mv = 0;
12  for (int i = 0; i < 16; i++) {
13    mv += analogReadMilliVolts(BAT_PIN);          // kalibre edilmiş mV / calibrated mV
14  }
15  return mv / 16.0 / 1000.0 * RATIO;              // bölücüyü geri hesapla / undo the divider
16}
17
18void setup() {
19  Serial.begin(115200);
20  delay(200);
21}
22
23void loop() {
24  float v = batteryVolts();
25  Serial.printf("Aku / Battery: %.2f V\n", v);
26  if (v < LOW_V) {
27    Serial.println("Aku zayif, 10 dk uyku / Battery low, sleeping 10 min");
28    Serial.flush();
29    esp_sleep_enable_timer_wakeup(SLEEP_US);      // zamanlayıcıyla uyan / wake up by timer
30    esp_deep_sleep_start();                       // derin uyku / deep sleep
31  }
32  delay(5000);
33}

この分圧回路は、14.4 Vの充電電圧でも約2.6 Vまで下げるので、ESP32のADCの測定範囲に収まります。鉛蓄電池は休止状態で約12.6〜12.8 Vなら満充電です。11.8 Vを下回ると深い放電に近づき、寿命が縮みます。1つ落とし穴があります。LM2596自体は無負荷でも5〜10 mAを消費します。ESP32がディープスリープでマイクロアンペアしか使わない間も、モジュールは1日に120〜240 mAhを消費し、それだけで7 Ahのバッテリーは1〜2か月で空になります。自分の値での計算は「電池寿命計算ツール」でできます。何か月も眠らせるプロジェクトには、電源を完全に切るためにEN(ON/OFF)ピンが引き出されたモジュールか、自己消費電流がとても少ない降圧コンバーターが必要です。スリープの手法は「ESP32のディープスリープ」の記事で詳しく解説しています。

Raspberry Pi Picoで作る調整の補助ツール(MicroPython)

調整をパソコンの画面で見たい場合は、Picoを簡単な電圧計として使えます。PicoのADCが読めるのは最大3.3 Vなので、LM2596の出力を100 kΩと10 kΩの分圧回路を通してGP26につなぎます。この比率なら36 Vまで安全に測れるので、まだ調整していないモジュールが入力に近い電圧を出してもPicoは壊れません。PicoはUSBから給電し、GNDどうしをつなぎます。コードは目標値に対して「high」(高い)または「low」(低い)と表示し、出力が±1%以内に入ると内蔵LEDを点灯します。Picoが初めてなら「Raspberry Pi Picoとは?」から始めてください。

MicroPython
1# Pico: LM2596 ayar yardımcısı / Pico: LM2596 adjustment helper
2from machine import ADC, Pin
3import time
4
5adc = ADC(26)                  # GP26 (ADC0): OUT+ -> 100k -> GP26 -> 10k -> GND
6led = Pin("LED", Pin.OUT)      # dahili LED (Pico ve Pico W) / onboard LED (Pico and Pico W)
7RATIO = (100 + 10) / 10        # bölücü oranı 11, en fazla ~36 V / divider ratio 11, up to ~36 V
8VREF = 3.3                     # ADC referansı (V) / ADC reference (V)
9CAL = 1.000                    # multimetreyle düzeltme katsayısı / multimeter correction factor
10TARGET = 5.00                  # hedef: 5.00 ya da 3.30 / target: 5.00 or 3.30
11
12def read_volts(n=64):
13    total = 0
14    for _ in range(n):
15        total += adc.read_u16()                    # 0-65535 ham değer / raw value
16    return total / n / 65535 * VREF * RATIO * CAL
17
18while True:
19    v = read_volts()
20    err = (v - TARGET) / TARGET * 100              # hedeften sapma (%) / deviation from target (%)
21    led.value(abs(err) <= 1.0)                     # ±%1 içinde LED yanar / LED on within ±1%
22    if err > 1.0:
23        hint = "yuksek, dusur / high, lower it"
24    elif err < -1.0:
25        hint = "dusuk, artir / low, raise it"
26    else:
27        hint = "tamam / OK"
28    print("{:.2f} V  {:+.1f} %  {}".format(v, err, hint))
29    time.sleep(0.3)

PicoのADCは約1〜2%ずれることがあるので、一度テスターと比べてCAL係数を補正してください。それでも最終的な設定はテスターで確認するのがいちばんです。あとでPicoもLM2596から給電したい場合は、5.0 Vの出力を1N5819ショットキーダイオードを通してVSYSピンにつなぎます。USBを挿したとき、2つの電源がぶつかり合うのをダイオードが防ぎます。モジュールの出力をPicoの3V3ピンには絶対につながないでください。

LM2596のプロジェクトアイデア

  • ロボットカー:2Sの18650パック(7.4 V)がL298Nを通してモーターに直接給電し、5 Vに合わせたLM2596がArduinoとセンサーに給電します。手順は「Arduinoロボットカーの作り方」の記事にあります。
  • ロボットアーム:6 Vに合わせたLM2596で、Arduinoから独立したMG996Rサーボ用の強いラインを作ります。詳しくは「Arduinoのロボットアーム」のガイドで。
  • 12 Vのスマート温室:1台の12 VのACアダプターでファンとポンプに給電し、LM2596が同じラインからArduino、リレー、LCD用の5 Vを作ります。「スマート温室プロジェクト」を見てください。
  • 可変の卓上電源:LM2596、古いノートパソコンのACアダプター、出力をディスプレイに表示する「Arduinoで作るデジタル電圧計」を組み合わせて、小さな実験用電源を作ります。
  • WS2812B LEDテープ:60個のLEDを白で最大に光らせると最大3.6 Aを流すことがあります。明るさを制限し、5 VのLM2596で2 A未満に抑えてください。電流の計算は「WS2812B NeoPixel」の記事にあります。
  • 車載のESP32デバイス:12〜14.4 Vのバッテリー電圧を5 Vに下げます。入力にヒューズを、車内の電圧サージ対策にTVSダイオードを入れてください。

よくある間違いと直し方

症状考えられる原因対策
出力が入力とほぼ同じ(例:12 Vから11 V)半固定抵抗が最大の位置にある、または目標が入力より高い無負荷で、下げる方向に10〜20回転させながら測る
半固定抵抗を回しても値が変わらない多回転型の半固定抵抗が端で空回りしている逆方向に5〜10回転させる。それでも変わらなければモジュールの故障の可能性
負荷をつなぐと5 Vが4.3 Vに下がるACアダプターの電流不足、入出力の電圧差が小さすぎる、または配線が細すぎる負荷時の入力を測る、2 V以上の余裕を残す、短く太い配線を使う
サーボが動くとArduinoがリセットするサーボとArduinoが同じ弱い電源を共用しているサーボ用に別のモジュール、470〜1000 µFのコンデンサ、共通GND
数分後にモジュールが止まって再起動する過熱保護が働いている負荷を減らす、ヒートシンクと風通しを追加する、または5 Aのモジュールに替える
逆接続のあと出力が0 V、または入力と同じチップとダイオードが焼損しているモジュールを交換し、入力に直列のショットキーダイオードを入れる
アナログの読み取り値や音声にノイズが乗る150 kHzのスイッチングによるリップル出力にLCフィルタを入れるか降圧+LDOにする、GNDの経路を短くする
時間がたつと設定がずれる振動で半固定抵抗が回ったマニキュアやシリコンで半固定抵抗を固定するか、固定抵抗を使う
トラブルシューティングでは3つを測ります。負荷時の入力、負荷時の出力、そしてその差です。差が2 V未満なら原因は電源です。入力に問題がないのに出力が低いなら、モジュールか配線が原因です。配線とブレッドボードの接点の合成抵抗が0.1〜0.2 Ωあると、2 Aで0.2〜0.4 Vの電圧降下が起きます。「オームの法則計算ツール」で確かめられます。ブレッドボードのレールには1 Aを超える電流を流さないでください。ボードが壊れたかもしれないと思ったら、「Arduinoが壊れたかも?」の確認手順に従ってください。

正しく調整し、入出力の電圧差に十分な余裕をとり、2 Aの限界を守れば、LM2596は1台のACアダプターや電池でプロジェクトを動かすための最も実用的な部品の1つです。順番を覚えておきましょう。まず無負荷で調整し、次に負荷をかけて測り、ボードは最後につなぎます。BlueGraysアプリでは、L298Nで作るBluetooth操作の車、障害物回避ロボット、サーボのプロジェクト、32個のサーボのダンス、WS2812B LEDテープの制御、LCDディスプレイ付きデジタル電圧計、スマート水やりステーションなど、別電源が必要なプロジェクトを、ステップごとの回路図とコード付きで紹介しています。

よくある質問

LM2596はどうやって調整しますか?

入力に電源をつなぎ、出力には何もつながない状態で、テスターのテスト棒をOUT+とOUT−に当てます。小さなドライバーで青い半固定抵抗のネジを回し、目的の値(例:5.00 V)が表示されたら止めます。最後に負荷をつなぎ、負荷をかけた状態でもう一度測ります。

LM2596は何アンペアまで流せますか?

LM2596チップは3 A用に設計されていて、内部の電流制限は約4.5 Aのピーク電流で働きます。市販のモジュールは、ヒートシンクなしで連続約2 Aなら余裕で動きます。3 Aにはヒートシンクと風通しが必要です。安いモジュールの偽物のチップはそれより少ない電流しか出せないことがあるので、2 Aで設計するのが最も安全です。

LM2596の半固定抵抗は、電圧を上げるにはどちらに回しますか?

方向は半固定抵抗の基板への配線によってモジュールごとに異なることがあるので、記憶に頼らないでください。ネジを一方向に2〜3回転させてテスターを確認し、電圧が下がればその方向が下げる方向です。半固定抵抗は約25回転で、ストッパーがないため、端まで来るとカチッと空回りするだけです。

LM2596の出力電圧が下がらないのはなぜですか?

最も多い原因は、半固定抵抗が最大の位置にあることです。多回転型の半固定抵抗では、電圧が変わり始めるまで10〜20回転必要なことがあります。設定値が入力より高い場合、出力は入力より1〜2 V低い値で止まったままになります。いくら回しても変わらず、出力が入力と同じなら、チップが内部でショートしています。モジュールを交換してください。

LM2596でArduinoに給電するには?

モジュールを5.0 Vに合わせて出力をArduinoの5Vピンにつなぐ方法があります。最も発熱の少ない方法ですが、ボードを守るものが何もありません。より安全なのは、モジュールを7.5〜9 Vに合わせてDCジャックかVinピンにつなぐ方法です。どちらの場合も、モジュールのOUT−をArduinoのGNDにつなぐ必要があります。

LM2596と7805、どちらがよいですか?

入出力の電圧差が大きく電流も多いなら、LM2596のほうがはるかに優れています。12 Vから5 Vで1 Aを流すと、7805は7 Wの熱を出しますが、LM2596の損失は1 W未満です。電圧差が小さく、電流も少なく、静かな電源が必要なら7805のほうが簡単です。敏感なアナログ回路では、2つを順につないで使うこともできます。

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

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

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

4.5(27)
36
サーボモーターの使い方
#35初級
プレミアム

サーボモーターの使い方

小型サーボモーターのアームが、一方の端、中央、もう一方の端の3つの位置へ順番に回り、それぞれの位置で2秒間止まります。Arduinoが保持する角度をモーターに指示すると、モーターはその位置まで動いて止まります。ロボットアームや自動開閉するふたが動く仕組みを学べます。

4.7(48)
67
L298Nで作るBluetooth操作の車
#80上級
プレミアム

L298Nで作るBluetooth操作の車

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

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

障害物回避ロボット

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

5.0(38)
49
サーボの円形ダンス — 32個のサーボで動く模様
#102上級
プレミアム

サーボの円形ダンス — 32個のサーボで動く模様

Arduino Megaで、円形に並べた32個のサーボモーターを動かすビジュアルアニメーションのプロジェクトです。サーボは1つの配列で管理し、Megaの22–53番ピンに接続します。ランダムな角度でばらばらに振動する動き、全体が同時に動く同期スイープ、円周を滑らかに巡る波、左右に揺れる方位磁針の針という4種類の動きを見せます。回転する波の効果は、各サーボと動作中のサーボとの関係によって生まれます。

4.5(40)
62
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
スマート水やりステーション
#83上級
プレミアム

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

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

5.0(42)
57