部品 · 読了まで16分

TP4056の配線ガイド:18650充電モジュール、保護回路、ESP32

TP4056充電モジュールの配線方法:B+/B-とOUT+/OUT-ピン、保護付きDW01版、LEDの意味、Rprogによる電流設定、MT3608で作る5 V、ESP32での電池電圧の測定を解説します。

TP4056の配線は、1セルの18650やLiPo電池をUSBから安全に充電し、その電池でArduino、ESP32、Raspberry Pi Picoのプロジェクトを動かすいちばん安上がりな方法です。USBケーブルはモジュールの入力に、電池はB+とB-に、保護付きモジュールでは自分の回路をOUT+とOUT-につなぎます。モジュールは定電流・定電圧方式で電池を4.2 Vまで充電し、満充電になると自動で充電を止め、状態を2つのLEDで表示します。この爪ほどの大きさの基板は、持ち運べる気象観測装置、ロボット、充電式ライト、ワイヤレスセンサーなど、コンセントから離れて動くプロジェクトの心臓部です。

ただし、この安いモジュールにはいくつか落とし穴があります。保護付きと保護なしでは配線が違い、初期設定の1 Aという充電電流は小さな電池には大きすぎ、充電中に回路へ給電すると充電がいつまでも終わらないことがあり、直列につないだ2本の電池はこのモジュールでは絶対に充電できません。この記事では、各ピンの役割、LEDの意味、Rprog抵抗で充電電流を設定する方法、5 Vが必要なボードのためにMT3608昇圧モジュールを追加する方法、そしてESP32で電池電圧を測ってパーセントに変換する方法をステップごとに学びます。

USB-C入力の保護付きTP4056 18650充電モジュール
保護付きTP4056モジュール:左側にUSB-C入力とIN+/IN-パッド、右側にB+/B-(電池)とOUT+/OUT-(出力)パッドがあります。中央の大きなチップがTP4056で、隣の小さなチップがDW01A保護ICと8205AデュアルMOSFETです。

TP4056とは?その仕組み

TP4056は、1セルのリチウムイオン(Li-ion)電池とリチウムポリマー(LiPo)電池用に作られたリニア充電ICです。リチウム電池は、適当なアダプターでは充電できません。決まった充電プロファイルが必要で、TP4056はそれを単独でこなします。電池が2.9 V未満なら、まずプリチャージ(トリクル充電)段階で、設定電流の約10分の1、1 A設定なら約130 mAでやさしく充電します。電圧が2.9 Vを超えると定電流(CC)段階に移り、設定電流をすべて流します。電池が4.2 Vに達すると定電圧(CV)段階が始まり、電圧を4.2 Vに保ったまま電流が徐々に減っていきます。電流が設定値の10分の1(1 A設定なら100 mA)まで下がると充電終了です。その後、電池が約4.05 Vまで下がると、モジュールは自動で充電を再開します。チップがとても熱くなると自分で充電電流を絞るので、充電中にモジュールが温かくなるのは正常です。

項目値
入力電圧4.0〜8 V(推奨5 V、micro USBまたはUSB-C)
充電終止電圧4.2 V(±1.5%)
充電電流最大1 A。モジュールの初期設定は1 A(Rprog = 1.2 kΩ)
プリチャージ2.9 V未満では設定電流の約1/10
充電終了電流が設定値の1/10まで下がったとき(C/10)
再充電電池が約4.05 Vまで下がると自動で開始
状態出力CHRG(充電中)とSTDBY(満充電)のLED
対応する電池1セル(1S)3.7 VのLi-ionとLiPoのみ。LiFePO4は不可

保護付き(DW01)と保護なしのTP4056モジュールの違い

同じ名前で2種類の基板が売られています。保護なしモジュールにはTP4056チップしかなく、接続点はIN+/IN-とBAT+/BAT-の4つです。電池の充電はしますが、放電中は何も監視しません。保護付きモジュールにはDW01A保護ICと8205AデュアルMOSFETが追加されていて、パッドはIN+/IN-、B+/B-、OUT+/OUT-の6つです。保護回路は、電池のマイナス端子と回路のマイナス端子(OUT-)の間にスイッチのように入っています。電池が過放電や過充電になったとき、回路が電流を流しすぎたとき、出力がショートしたときに、このスイッチを開いて電池を回路から切り離します。

項目保護なしモジュール保護付きモジュール(DW01A + 8205A)
パッドIN+、IN-、BAT+、BAT-IN+、IN-、B+、B-、OUT+、OUT-
過充電保護TP4056の4.2 V制限のみさらに約4.25〜4.3 Vで遮断
過放電保護なし約2.4 Vで遮断、3.0 V前後で復帰
過電流・ショートなし約3 Aやショート時に遮断
選ぶ場面電池に保護回路が内蔵されている場合保護なしの裸セルを使う場合、つまりほぼすべてのプロジェクト
どちらかは簡単に見分けられます。電池側に6つのパッド(B+、B-、OUT+、OUT-)があり、TP4056の隣に小さなチップがさらに2つあれば保護付きです。BAT+とBAT-としか書かれていなければ保護なしです。価格差はごくわずかなので、必ず保護付きを選びましょう。

18650電池:知っておきたい電圧

18650という名前はセルのサイズに由来します。直径18 mm、長さ65 mmです。公称電圧は3.6〜3.7 Vですが、これは平均値で、満充電のセルは4.2 V、空のセルは3.0 V前後です。実際の容量は2000〜3500 mAhで、6800 mAhや9900 mAhと書かれたセルは偽物で、1000 mAhも出ないことがよくあります。保護回路を内蔵した保護付き18650は数ミリ長く、すべてのホルダーに入るとは限りません。電池1本でプロジェクトがどれくらい動くかは電池寿命計算ツールで計算でき、容量の単位についてはmAhとWhで解説しています。

状態電圧備考
満充電4.20 VTP4056はここで充電を終了する
公称3.6〜3.7 Vラベルに書かれた値、平均的な動作電圧
空とみなす3.0〜3.3 Vここでプロジェクトを止めると電池が長持ちする
保護による遮断2.4〜2.5 VDW01Aが出力を切る。ここまで放電させないようにする
危険域2.0 V未満長時間この電圧のままだったセルは充電せず、交換する
18650リチウムイオン電池
18650リチウムイオン電池:直径18 mm、長さ65 mm、公称3.7 V。電池ホルダーか、スポット溶接したニッケルタブで接続します。
18650セルにはんだごてで直接はんだ付けするのは絶対にやめてください。熱でセルの内部が傷み、危険です。電池ホルダーか、スポット溶接したニッケルタブを使いましょう。つぶれた、膨らんだ、外装フィルムが破れたセルは使わず、燃えにくい場所で充電し、0 °C未満では絶対に充電しないでください。市販のモジュールではTEMPピンがGNDにつながっているため、電池の温度は監視されません。充電中はときどきセルに触れて、熱くなっていないか確かめてください。

TP4056の配線:IN、B+/B-、OUT+/OUT-ピン

パッド接続先備考
USB入力5 VのACアダプターまたはパソコンmicro USBまたはUSB-C。いちばん簡単な方法
IN+ / IN-外部5 V電源のプラスとマイナスUSBの代わりにはんだ付けで給電する場合。両方を同時に使わない
B+ / B-18650電池のプラスとマイナスここには電池だけをつなぐ
OUT+ / OUT-回路(負荷)のプラスとマイナス保護付きモジュールでは負荷は必ずここにつなぐ
BAT+ / BAT-(保護なし)電池と負荷の両方保護なし。負荷は電池と並列につなぐ
  1. 電池ホルダーの赤い線をB+に、黒い線をB-にはんだ付けします。電池はまだ入れません。
  2. 回路のプラス電源線をOUT+に、マイナス(GND)線をOUT-にはんだ付けします。5 Vが必要なボードに給電する場合は、間にMT3608昇圧モジュールを入れます。
  3. はんだ付けした箇所を確認し、テスターでB+とB-の間がショートしていないことを確かめます。
  4. 極性に注意して電池を入れます。保護付きモジュールの中には、最初は出力がオフになっているものがあります。USBを一度挿すと保護がリセットされ、出力がオンになります。
  5. USBケーブルを挿します。赤いLEDが点灯すれば充電が始まっています。満充電になると赤いLEDが消え、青または緑のLEDが点灯します。
  6. テスターでOUT+とOUT-の間に電池電圧(3.0〜4.2 V)が出ていることを確認したら、回路の電源を入れてかまいません。
最もよくある失敗は、保護付きモジュールで回路をB+とB-につないでしまうことです。この配線でも回路は動きますが、DW01Aの保護が素通りになります。電池が2 V未満まで放電することがあり、ショートしたときの電流も無制限です。電池を逆向きにつなぐと、モジュールは一瞬で壊れます。TP4056には逆接続保護がありません。

TP4056のLEDの意味は?

赤LED(CHRG)青または緑LED(STDBY)意味
点灯消灯充電中
消灯点灯充電完了(4.2 V)
点滅、またはちらつく点灯電池が入っていない、または接触不良
消灯消灯入力が4 V未満、またはUSBから給電されていない
何時間も点灯消灯負荷のせいで充電が終わらない、または電池が劣化している

電池が入っていないときに青LEDが点灯し、赤LEDがちらつくのは正常です。モジュールが、空いている電池端子にあるコンデンサの充電と放電を繰り返しているためです。充電時間は容量 / 電流 × 1.2でおおよそ見積もれます。2600 mAhのセルなら1 Aで約3時間です。最後の段階で電流が徐々に減るので、単純な割り算より少し長くかかります。

充電電流の設定:Rprog抵抗

充電電流は、TP4056のPROGピン(2番ピン)とGNDの間にある抵抗1本で決まります。ほとんどのモジュールでは、この抵抗にR3と記され、1.2 kΩを意味する122というコードが印字されていて、これで1 Aになります。こうした表示はSMDコード解読ツールで読み解けます。計算式はおおよそI (mA) = 1200 / Rprog (kΩ)です。電流を変えるには、SMD抵抗をはんだごてで取り外し、目的の値の抵抗をはんだ付けします。合うサイズのSMD抵抗が見つからなければ、小さなリード線付き抵抗を2つのパッドの間にはんだ付けしてもかまいません。

Rprog充電電流対応する電池
10 kΩ130 mA200〜300 mAhの小型LiPo
5 kΩ250 mA300〜500 mAhのLiPo
4 kΩ300 mA500〜600 mAhのLiPo
3 kΩ400 mA800 mAh前後
2 kΩ580 mA1000〜1200 mAh
1.5 kΩ780 mA1500 mAh以上
1.2 kΩ1000 mA2000 mAh以上の18650(モジュールの初期設定)

一般的な目安は、充電電流を電池容量の半分程度(0.5C)にすることです。500 mAhのLiPoなら250 mA、2600 mAhの18650なら1 Aが適しています。発熱も考慮しましょう。TP4056はリニア方式なので、入力と電池の電圧差がそのまま熱になります。5 V入力で3.6 Vのセルを1 Aで充電すると、チップは(5 − 3.6) × 1 = 1.4 Wを熱として消費します。そのためモジュールはかなり熱くなり、自分で電流を絞ることがあります。こうした電力の計算はオームの法則計算ツールでもできます。パソコンのUSB 2.0ポートは500 mAしか供給できないので、パソコンから充電することが多いなら、電流を500 mA前後に下げておくのが賢明です。

充電中に回路へ給電する(ロードシェアリング)

USBを挿している間もプロジェクトを動かし続けたいなら、いちばん簡単なのは回路をOUT+とOUT-につないだままにすることです。こうするとTP4056は電池の充電と回路への給電を同時に行います。しかしチップは、電池に流れる電流と回路に流れる電流を区別できません。回路が常に100 mAより多く消費していると、合計電流が充電終了のしきい値を下回らず、充電がいつまでも終わらないまま、電池が何時間も4.2 Vに保たれて寿命が縮みます。回路が1 A近く消費していると、電池は満充電にすらなりません。ディープスリープ中のESP32や数mAしか消費しない小さな回路なら、直接つないでも実用上問題はありません。常時動作するWi-Fiプロジェクト、モーター、LEDテープにはロードシェアリング(負荷分離)回路を組みましょう。

部品接続役割
ショットキーダイオード(1N5817、SS14)アノードをUSB 5 V(IN+)に、カソードを回路のプラス入力にUSBがあるときは回路に直接給電する
PチャネルMOSFET(AO3401、DMG2305)ドレインを電池(OUT+)に、ソースを回路のプラス入力にUSBがないときに電池を回路につなぐ
MOSFETのゲートの接続USB 5 V(IN+)に直接USBを挿している間はMOSFETがオフのままで、電池は充電されるだけ
100 kΩの抵抗MOSFETのゲートとGNDの間USBを抜くとゲートを0 Vに引き下げ、MOSFETをオンにする
この回路では、USBを挿している間は回路がダイオード経由の約4.7 Vで動き、TP4056は電池の充電だけを行うので、充電が正しいタイミングで終わります。USBを抜くとMOSFETがすぐにオンになり、回路はほとんど途切れることなく電池で動き続けます。MOSFETの仕組みはArduinoでMOSFETを使う方法で、ダイオードの選び方はダイオードとは?で解説しています。

5 Vが必要なら:MT3608昇圧モジュールを追加する

18650の電圧は3.0〜4.2 Vの間で変わります。これでは、5 Vを必要とするArduino Uno、リレーモジュール、サーボモーター、WS2812B LEDには足りません。解決策は、電圧を上げる昇圧(ステップアップ)コンバーターです。最も一般的なのがMT3608モジュールで、2〜24 Vの入力から最大28 Vまでの調整可能な出力が得られ、1.2 MHzでスイッチングし、内部スイッチの電流制限は4 Aです。実際には、18650 1本から5 Vで安全に取り出せるのは0.5〜1 A程度で、それ以上ではモジュールが熱くなり効率も下がります。逆に電圧を下げたいときは、正反対の働きをするLM2596降圧モジュールを使います。

  1. MT3608のVIN+とVIN-入力を、TP4056のOUT+とOUT-につなぎます。
  2. 出力にはまだ何もつながずに、VOUT+とVOUT-の間にテスターを当てます。
  3. 青い半固定抵抗(トリマー)を小さなドライバーで回し、出力を5.0〜5.1 Vに合わせます。多回転型なので、何回か回してからようやく電圧が変わり始めることがあります。根気よく回してください。
  4. 調整が済んだら、ボードの5VピンをVOUT+に、GNDピンをVOUT-につなぎます。
  5. 回路を動かした状態でもう一度電圧を測ります。負荷をかけたときに4.8 V未満に下がるなら、配線を短くするか、消費電流を減らしてください。
ボード18650 1本での給電方法備考
Arduino Uno / NanoMT3608で5.0 V → 5Vピン5Vピンはレギュレーターを通らない。5.5 Vを絶対に超えないこと
Arduino Pro Mini 3.3 V(8 MHz)OUT+をRAWピンに直接低ドロップアウトのレギュレーターなので電池電圧で動作できる
ESP32 DevKitMT3608で5 V → VIN(5V)ピン基板上のAMS1117で約1 V下がる。電池を直接つながないこと
Raspberry Pi PicoOUT+ → ショットキーダイオード → VSYS(39番ピン)VSYSは1.8〜5.5 Vに対応、昇圧は不要
SIM800L GSMモジュールOUT+とOUT-に直接3.4〜4.4 Vが必要で、Li-ionにぴったり
MT3608は、調整する前に絶対にボードにつながないでください。出荷時の出力電圧は分からず、5 Vをはるかに超えていることも多いので、ArduinoやESP32を一瞬で壊すことがあります。また、昇圧コンバーターには出力を切り離す機能がありません。モジュールがスイッチングしていなくても、電池の電圧はインダクタ(コイル)とダイオードを通って出力に出てきます。プロジェクトの電源を本当に切るには、電池とモジュールの間にスイッチを入れてください。

昇圧モジュールの出力をつないだまま、コードを書き込むためにボードをUSBに挿すと、2つの電源をつなぎ合わせることになります。最も安全なのは、書き込み中は昇圧モジュールの出力を外しておくことです。Arduinoにどのピンからどう給電するかはArduinoへの給電方法で詳しく解説しています。

直列の電池はTP4056では充電できない

TP4056が充電できるのは1セル(1S)を4.2 Vまでだけです。ロボットカーでよく使われる18650を2本直列にしたパック(2S)は公称7.4 V、満充電で8.4 Vです。これを1つのTP4056につないでも充電されず、モジュールやセルを傷めるおそれもあります。セルごとに別々のTP4056を付けてもうまくいきません。各モジュールのマイナス入力は同じUSB電源でつながり、上側のモジュールのマイナスが下側のセルのプラスに接続されているため、下側のセルがショートしてしまいます。終止電圧が4.2 Vに固定されているので、3.6 Vで充電を止める必要があるLiFePO4電池にもTP4056は使えません。

  • 並列につなぐ(1S2P):2本を並列にすると電圧は3.7 Vのままで容量が2倍になり、TP4056で充電できます。つなぐ前に、2本のセルの電圧がそろっていることを確認してください。
  • 昇圧する:7〜12 Vが必要なら、並列にしたセルの出力をMT3608で昇圧します。
  • 2S用の充電回路を使う:直列パックには、8.4 VのCC/CV充電器とバランス機能付きの2S BMS基板が必要です。
  • セルを取り出して充電する:直列パックのセルをホルダーから外し、別の18650用充電器で1本ずつ充電する方法もあります。

電池電圧の測定:分圧回路の配線

電池がどれくらい残っているかを知るには、電圧を測れば十分です。ただし、4.2 Vの電池をESP32やPicoのアナログピンに直接つなぐことはできません。これらのADC入力は最大3.3 Vまでだからです。解決策は、同じ値の抵抗2本で作る分圧回路です。100 kΩ + 100 kΩなら4.2 Vを2.1 Vに下げ、電池から流れる電流もわずか21 µAです。値は分圧回路計算ツールで計算でき、回路の仕組みは分圧回路で解説しています。測定点とGNDの間に100 nFのコンデンサを追加すると、高い抵抗値を通した読み取り値がはっきり安定します。

接続Arduino UnoESP32Raspberry Pi Pico
上側の抵抗(100 kΩ)OUT+ → 中点OUT+ → 中点OUT+ → 中点
下側の抵抗(100 kΩ)中点 → GND中点 → GND中点 → GND
中点(測定)A0GPIO 34(ADC1)GP26(ADC0)
100 nFのコンデンサ任意中点 → GND中点 → GND
TP4056 OUT-GNDGNDGND
ADCの範囲0〜5 V、10ビット約0〜3.1 V、12ビット0〜3.3 V、12ビット
ESP32で電池を測るときは、ADC1のピン(GPIO 32〜39)だけを使ってください。ADC2のピンはWi-Fiがオンの間は読み取れず、誤った値を返します。GPIO 34〜39は入力専用ピンなので、まさにこの用途にぴったりです。

Arduino UnoのADCは5 Vを基準にしています。分圧回路のおかげで4.2 Vの電池はA0では2.1 Vとして見え、10ビットの読み取りで0〜1023の値が得られます。ボードをUSBや昇圧モジュールから給電していると、5Vピンがちょうど5.00 Vとは限りません。テスターで測ってコードのVREFに入力すると、精度がはっきり上がります。

C++ (Arduino IDE)
1// Arduino Uno: 18650 pil voltajı, A0'da 100k + 100k bölücü / battery voltage, 100k + 100k divider on A0
2const float VREF = 5.0;      // 5V pinini multimetreyle ölçüp yaz / measure the 5V pin and enter it
3const float DIVIDER = 2.0;   // bölücü oranı / divider ratio
4
5void setup() {
6  Serial.begin(9600);
7}
8
9void loop() {
10  long sum = 0;
11  for (int i = 0; i < 16; i++) {      // 16 ölçümün ortalaması / average of 16 readings
12    sum += analogRead(A0);            // 0-1023
13    delay(2);
14  }
15  float v = (sum / 16.0) * VREF / 1024.0 * DIVIDER;
16  Serial.print(F("Pil / Battery: "));
17  Serial.print(v, 2);
18  Serial.println(F(" V"));
19  if (v < 3.3) Serial.println(F("Pil zayif / Battery low"));
20  delay(1000);
21}

ESP32で電池電圧を測り、パーセントで表示する

ESP32のADCは完全に直線的ではなく、ボードごとにばらつきがあります。そのため、生のanalogReadではなく、チップの工場出荷時キャリブレーションを適用してミリボルト値を直接返すanalogReadMilliVoltsを使うほうが正確です。下のコードは16回の測定値を平均し、分圧比を掛けて電池電圧を求め、表を使ってパーセントに変換し、電池が3.3 Vを下回るとESP32を10分間ディープスリープさせます。

C++ (Arduino IDE)
1// TP4056 + 18650: ESP32 ile pil voltajı ve yüzdesi / battery voltage and percentage with ESP32
2const int BAT_PIN = 34;          // ADC1 pini, Wi-Fi açıkken de çalışır / ADC1 pin, works with Wi-Fi on
3const float DIVIDER = 2.0;       // 100k + 100k bölücü: pil / 2 / 100k + 100k divider: battery / 2
4const float LOW_BAT = 3.30;      // bu değerin altında uykuya geç / go to sleep below this voltage
5
6// Yaklaşık gerilim-yüzde tablosu (dinlenen pil) / approximate voltage-percent table (resting cell)
7const float volts[]   = {3.30, 3.60, 3.70, 3.80, 3.85, 3.90, 4.00, 4.10, 4.20};
8const int   percent[] = {   0,    5,   12,   40,   55,   63,   78,   89,  100};
9const int POINTS = 9;
10
11float readBattery() {
12  uint32_t sum = 0;
13  for (int i = 0; i < 16; i++) {           // 16 ölçümün ortalaması / average of 16 readings
14    sum += analogReadMilliVolts(BAT_PIN);  // kalibre edilmiş mV / calibrated millivolts
15    delay(2);
16  }
17  return (sum / 16.0) * DIVIDER / 1000.0;  // pil gerilimi (V) / battery voltage (V)
18}
19
20int toPercent(float v) {
21  if (v <= volts[0]) return 0;
22  if (v >= volts[POINTS - 1]) return 100;
23  for (int i = 1; i < POINTS; i++) {
24    if (v < volts[i]) {                    // iki nokta arasında doğrusal / linear between two points
25      float k = (v - volts[i - 1]) / (volts[i] - volts[i - 1]);
26      return (int)(percent[i - 1] + k * (percent[i] - percent[i - 1]));
27    }
28  }
29  return 100;
30}
31
32void setup() {
33  Serial.begin(115200);
34  analogReadResolution(12);                // 0-4095 aralığı / 0-4095 range
35}
36
37void loop() {
38  float v = readBattery();
39  Serial.printf("Pil / Battery: %.2f V  %%%d\n", v, toPercent(v));
40
41  if (v < LOW_BAT) {                       // yazılımla derin deşarj koruması / software deep-discharge guard
42    Serial.println("Pil zayif, uyku / Battery low, sleeping");
43    esp_sleep_enable_timer_wakeup(10ULL * 60 * 1000000);  // 10 dakika sonra tekrar bak / check again in 10 min
44    esp_deep_sleep_start();
45  }
46  delay(5000);
47}
電池電圧おおよその残量
4.20 V100%
4.10 V89%
4.00 V78%
3.90 V63%
3.80 V40%
3.70 V12%
3.60 V5%
3.30 V0%(プロジェクトを停止)

これらの値は、しばらく休ませて電圧が落ち着いたセルの場合です。ESP32がWi-Fiで送信するときに大きな電流を瞬間的に流すと電池電圧は少し下がり、充電中はTP4056が電圧を見かけ上押し上げます。そのため、最も正確な値が得られるのは、Wi-Fiをオンにする前で、充電器を外しているときです。電池を長持ちさせるには、数分ごとに測定し、その間はESP32のディープスリープを使いましょう。また、USBシリアル変換チップと電源LEDを搭載したDevKitボードは、スリープ中でも数mAを消費することも覚えておいてください。何か月も電池で動かすプロジェクトには、低消費電力のボードが向いています。

Raspberry Pi Picoで電池を測る(MicroPython)

この点でPicoは恵まれています。VSYSピンは1.8〜5.5 Vを受け付ける基板上の昇降圧(buck-boost)レギュレーターにつながっているので、18650 1本で昇圧モジュールなしに動きます。TP4056のOUT+をショットキーダイオード(1N5817)経由でVSYS(39番ピン)に、OUT-をGND(38番ピン)につなぎます。ダイオードは、USBを挿したときにPicoの5 Vが電池へ逆流するのを防ぎます。電池電圧は、GP26につないだ100k + 100kの分圧回路で測れます。標準のPicoではGP29がもともとVSYSの3分の1を測っていますが、その値はダイオードの電圧降下の分だけ低く出ます。Pico WではこのピンがWi-Fiチップと共用なので、外付けの分圧回路のほうが確実です。

MicroPython
1from machine import ADC
2import time
3
4adc = ADC(26)                  # GP26 = ADC0, 100k + 100k bölücü / divider
5CONV = 3.3 / 65535             # read_u16 değerini volta çevirir / converts read_u16 to volts
6DIVIDER = 2                    # bölücü oranı / divider ratio
7
8while True:
9    total = 0
10    for _ in range(16):        # 16 ölçümün ortalaması / average of 16 readings
11        total += adc.read_u16()
12        time.sleep_ms(2)
13    v = total / 16 * CONV * DIVIDER
14    print("Pil / Battery: {:.2f} V".format(v))
15    if v < 3.3:
16        print("Pil zayif / Battery low")   # projeyi durdur / stop the project
17    time.sleep(2)

read_u16は0〜65535の値を返します。3.3 / 65535を掛けるとピンの電圧に、さらに分圧比の2を掛けると電池電圧になります。Picoが初めてなら、Raspberry Pi Picoとは?でMicroPythonのインストール方法をステップごとに説明しています。

TP4056と18650を使ったプロジェクトのアイデア

  • 持ち運べる気象観測装置:ESP32、温度センサー、OLEDディスプレイを18650 1本で動かし、画面の隅に電池残量(%)を表示します。
  • ソーラー給電のセンサー:開放電圧が8 Vを超えない小型の6 VソーラーパネルをIN+/IN-につなぎ、ディープスリープを使ってESP32を何日も動かし続けます。
  • SMSアラームボックス:SIM800Lは3.4〜4.4 Vが必要なので18650から直接給電でき、動きを検知するとSMSを送ります(日本ではGSM回線が使えないため、実際には技適を取得したLTEモジュールが必要です)。
  • 充電式ナイトライト:LDRで暗くなると点灯し、USB-Cで充電できるライトを作ります。
  • ロボットカー:並列にした18650 2本をTP4056で充電し、モーター用の電圧を昇圧モジュールで上げます。詳しくはArduinoロボットカーの作り方をご覧ください。
  • スマホに電池残量の警告:電池が20%を下回ったら、ESP32からTelegramボットでメッセージを送らせます。

よくある失敗と対策

症状考えられる原因対策
OUT+とOUT-の間に電圧が出ない保護回路がラッチしている(過放電、または電池を初めて入れたとき)USBを数秒間挿すと保護がリセットされる
赤LEDが何時間も消えない負荷が100 mAより多く消費している、または電池が劣化しているロードシェアリング回路を組み、電池単体でテストする
両方のLEDが消灯入力が4 V未満:ケーブルの不良やアダプターの能力不足別のケーブルと、1 A以上のアダプターを試す
USB-C同士のケーブルで充電できない安価なモジュールの中にはCC抵抗がないものがあるUSB-A – USB-Cケーブルを使う
モジュールがとても熱くなる1 Aのリニア充電では正常な損失(約1.4 W)Rprogを大きくして電流を下げ、基板に風が通るようにする
ESP32が何度も再起動する電池が弱っている、またはAMS1117の電圧降下によるブラウンアウト昇圧して5 Vを供給し、電池電圧を確認する
測定した電圧がテスターの値と違う分圧比または基準電圧が間違っているテスターと比べて、コードの係数を修正する
電源を入れる前に各ポイントをテスターで測っておけば、ほとんどの失敗は防げます。電池は3〜4.2 V、OUT端子は電池電圧、MT3608の出力は5.0 Vになっているはずです。テスターに慣れていないならテスターの使い方が役に立ちます。電池が少なくなるとESP32が何度も再起動する場合は、ESP32のブラウンアウトエラーをご覧ください。

正しく配線すれば、TP4056はプロジェクトをケーブルから解放してくれる、信頼性が高く安価な部品です。電池をB+とB-に、回路をOUT+とOUT-につなぎ、電池に合わせて電流を設定し、5 Vが必要なら昇圧モジュールを追加して、電池電圧をソフトウェアで監視しましょう。BlueGraysアプリでは、ESP32のディープスリープによる省電力、LCDデジタル電圧計、温度ロガーなど、電池駆動に向いたプロジェクトを、回路図とすぐに使えるコード付きでステップごとに学べます。

よくある質問

TP4056モジュールのB+とOUT+の違いは何ですか?

B+とB-は電池をつなぐためだけの端子です。OUT+とOUT-は保護回路を通った出力で、回路はここにつなぎます。保護付きモジュールでは、OUT+は実はB+と同じ点です。違いはマイナス側にあり、必要なときに電池を切り離すMOSFETがOUT-とB-の間に入っています。

TP4056で18650を充電するのに何時間かかりますか?

初期設定の1 Aなら、2500〜3000 mAhの18650は約3〜3.5時間で充電できます。最後の段階で電流が徐々に減るため、容量を電流で割った値より約20パーセント長くかかります。電流を下げている場合は、同じ比率で時間も延びます。

TP4056は充電しながら回路に給電できますか?

はい、OUT端子につないだ回路は充電中も動き続けます。ただし、回路が常に100 mAより多く消費していると充電が終わらないことがあり、電池がずっと4.2 Vに保たれてしまいます。大きな負荷には、ショットキーダイオードとPチャネルMOSFETでロードシェアリング回路を組むほうがよいでしょう。

TP4056で18650を2本充電できますか?

並列にした2本(3.7 V)なら問題なく充電できます。時間が長くかかるだけです。直列にした2本(7.4 V)はTP4056では充電できません。モジュールは1セル用の4.2 Vで止まるからです。直列パックには8.4 Vの2S充電器と、バランス機能付きのBMS基板が必要です。

TP4056の赤と青のLEDは何を意味しますか?

赤いLEDは電池が充電中であることを、青または緑のLEDは充電が完了したことを示します。電池が入っていないときは青いLEDが点灯し、赤いLEDがちらつきます。両方とも消えている場合は、モジュールに十分な入力電圧が来ていません。

ESP32は18650電池で直接動かせますか?

ESP32チップは3.3 Vで動作するため、4.2 Vの電池をチップに直接つなぐことはできません。DevKitボードのAMS1117レギュレーターでは約1 V電圧が下がるので、電池が3.7 Vまで下がると電圧が足りなくなります。いちばん簡単なのは、MT3608で5 Vを作ってVINピンに入れるか、低ドロップアウトの3.3 Vレギュレーターを使う方法です。

全プロジェクトを見る
ESP32でLEDを点滅
#103初級

ESP32でLEDを点滅

ESP32のGPIO出力の基本を学びます。デジタルピンからLEDを点灯・消灯させて、点滅させます。Arduino UNOの定番のLED点滅プロジェクトのESP32版です。Arduino環境で使う基本的な点滅コマンドは同じですが、ESP32のピン配置と3.3 VのGPIO電圧レベルはArduino UNOとは異なります。

4.7(37)
99
ESP32とLDRモジュールで光の強さを読み取る
#113初級

ESP32とLDRモジュールで光の強さを読み取る

LDRモジュールの生のADC値と、暗い状態・明るい状態の基準値から計算した相対的な明るさの割合を、シリアルモニタでリアルタイムに確認します。この割合はルクスの測定値ではありません。モジュールの校正の仕組みを学べます。しきい値の決定に使うため、プロジェクト10の前に取り組むのが適しています。

4.6(36)
55
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
LCDディスプレイ付きデジタル電圧計
#56中級
プレミアム

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

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

4.5(27)
36
ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)
#144上級
プレミアム

ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)

ESP32で日時付きの温度・湿度記録システムを作ります!DHT22で1分ごとに温度と湿度を読み取り、DS1307 RTCから取得した日時とともにmicroSDカードへCSV形式で記録します。OLEDには最新の温度を大きな文字で表示し、湿度のパーセント値、日時、総記録数も表示します。SDカードの/temp_log.csvファイルはExcel、Google Sheets、Pythonのpandasで開いて分析できます。温室の監視、家や部屋の温度管理、実験室のデータ収集、食品の保管環境や養蜂箱の監視に適しています。

4.7(7)
12
ESP32 HTTPClient+天気API(SSD1306 OLED付き)
#134上級
プレミアム

ESP32 HTTPClient+天気API(SSD1306 OLED付き)

このプロジェクトでは、ESP32でHTTPClient.hを使い、インターネット経由で天気API(wttr.in)をREST APIとして呼び出します。前のI2C LCD版とは異なり、SSD1306 OLED(128×64)ディスプレイを使うため、大きな文字やベクターアイコンで、1つの画面に豊かな表現ができます。天気を表す7種類のベクターアイコン(晴れ、晴れ時々曇り、曇り、雨、雪、嵐、霧)を実行時に描画するので、ビットマップファイルは不要です。気温は中央に3倍の大きさの文字で表示します。

4.3(10)
19
ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)
#145上級
プレミアム

ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)

PIRセンサーが動きを検知するとブザーとLEDを作動させ、同時にTelegramで持ち主に即座に通知するスマート防犯アラームです。アラームが繰り返される頻度を抑えるため、30秒のクールダウン(待ち時間)を設けています。この仕組みはPIRの検知が正しいかを確認したり、誤検知をなくしたりするものではありません。家の防犯、ガレージの監視、倉庫や作業部屋などに使えます。ESP32-CAMなら写真付きの通知を追加でき、通常のESP32 DevKit V1ではテキストで通知します。

0.0(0)
9
L298Nで作るBluetooth操作の車
#80上級
プレミアム

L298Nで作るBluetooth操作の車

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

5.0(38)
65