電子工作やIoTの試作でまず気になるのが「この回路、どれくらい電流を食うの?」というポイント。消費電流は電源設計(電池の持ち・レギュレータ選定)や発熱・信頼性に直結するため、最初に見積もっておくと後の手戻りが減ります。
この記事では、初心者の方向けに
- 消費電流の基本(オームの法則・直列/並列の電流の流れ方)
- 実機でよくあるケース(待機/動作の「デューティ比」で平均電流を計算)
- バッテリー寿命の概算(mAh と平均電流)
- Python を使った 消費電流計算スクリプト(例:簡易版 / コンポーネント別 / CSV 入力対応)
までを、順番に解説します。記事末には「よくある落とし穴」チェックリストも載せました。
1. 消費電流の超基礎
1-1. オームの法則
電圧 V [V]、電流 I [A]、抵抗 R [Ω] の関係は
\[I=\frac{V}{R},V=IR\]
LED+抵抗のような単純負荷の電流はこれで求められます。
1-2. 直列と並列
- 直列回路:同じ電流が流れる。抵抗値は足し算。
- 並列回路:各枝の電流は別々に流れ、合計電流は各枝の電流の和。
\[I_{\text{total}} = \sum I_k\]
- 実際の電子回路は、マイコン、センサ、無線、LED…と並列にぶらさがるイメージに近いので、各デバイスの電流を足し合わせて総電流を概算します。
1-3. デューティ比(稼働率)で平均電流を出す
センサや無線モジュールは「待機(スリープ)」と「動作(計測/送信)」を繰り返すことが多いです。
このときの平均電流は以下で概算できます。
\[I_{\text{avg}}=\sum\bigl(I_{\text{active}} \cdot D + I_{\text{sleep}}\cdot (1-D)\bigr)
\]
ここで (D) は「動作している時間の割合(デューティ比)」。
例:
- マイコン:アクティブ 10 mA(10%の時間)、スリープ 0.2 mA(90%の時間)
\[→ 平均 (= 10 \times 0.1 + 0.2 \times 0.9 = 1.18) mA\]
2. 電池の持ち(バッテリー寿命)の概算
バッテリー容量(mAh)と平均電流(mA)からざっくりの稼働時間(h)を見積もります。
\[\text{稼働時間 [h]} \approx \frac{\text{容量 [mAh]}}{I_{\text{avg}} [mA]}\]
注意
- 温度・自己放電・古い電池・パルス負荷・レギュレータ効率などで実測は目減りします。
- DC/DC など電源回路の効率は別途かけて見ておくと現実に近づきます(例:80%効率 → 容量×0.8 とみなす)。
3. Python で「消費電流の見積り」を自動化しよう
環境準備
- Python 3.x
- この記事のコードは標準ライブラリだけで動きます(外部ライブラリ不要)。
サンプル1:超シンプルな Ohm の法則・LED計算
抵抗を何Ωにすれば LED に「狙いの電流」を流せるか、あるいはそのときの電流が何mAかを確認する小ツールです。
# simple_ohms_law.py
def current_from_v_r(v_supply: float, v_forward: float, r_ohm: float) -> float:
"""
電源電圧 v_supply[V]、LED 順方向電圧 v_forward[V]、抵抗 r_ohm[Ω] から
流れる電流[A]を返す
"""
v_r = v_supply - v_forward
if r_ohm <= 0:
raise ValueError("抵抗値は正の値にしてください")
return max(0.0, v_r / r_ohm)
def resistor_for_current(v_supply: float, v_forward: float, target_i_a: float) -> float:
"""
目標電流 target_i_a[A] で流したいときの抵抗値[Ω]
"""
if target_i_a <= 0:
raise ValueError("目標電流は正の値にしてください")
v_r = v_supply - v_forward
if v_r <= 0:
raise ValueError("電源電圧がLEDの順方向電圧以下です")
return v_r / target_i_a
if __name__ == "__main__":
# 例:5V電源、赤色LED(2.0V想定)、330Ωのときの電流
i = current_from_v_r(5.0, 2.0, 330.0)
print(f"LED電流: {i*1000:.1f} mA")
# 例:5V電源、白色LED(3.2V想定)、10mA流したいときの抵抗
r = resistor_for_current(5.0, 3.2, 0.010)
print(f"必要な抵抗: {r:.1f} Ω")
サンプル2:構成部品ごとに「アクティブ/スリープ+デューティ比」で平均電流を集計
IoT ノードのように、複数デバイス(MCU、無線、センサ)がそれぞれ動作・休止する想定で平均電流を計算します。
# current_budget.py
from dataclasses import dataclass
from typing import List
@dataclass
class Block:
name: str
i_active_mA: float # 動作時電流
i_sleep_mA: float # 待機時電流
duty: float # 動作比率(0.0~1.0)
def avg_current(self) -> float:
return self.i_active_mA * self.duty + self.i_sleep_mA * (1.0 - self.duty)
def total_avg_current(blocks: List[Block]) -> float:
return sum(b.avg_current() for b in blocks)
def estimate_battery_life_hours(capacity_mAh: float, avg_current_mA: float, efficiency: float = 1.0) -> float:
"""
capacity_mAh: バッテリー容量[mAh]
avg_current_mA: 回路の平均電流[mA]
efficiency: 電源効率(0.0~1.0) 例: 0.85
"""
if avg_current_mA <= 0:
return float("inf")
effective_mAh = capacity_mAh * efficiency
return effective_mAh / avg_current_mA
if __name__ == "__main__":
blocks = [
Block("MCU", i_active_mA=10.0, i_sleep_mA=0.2, duty=0.10), # 10% アクティブ
Block("BLE", i_active_mA=15.0, i_sleep_mA=0.05, duty=0.05), # 5% 送信
Block("Sensor", i_active_mA=3.0, i_sleep_mA=0.01, duty=0.10), # 10% 測定
Block("LED", i_active_mA=5.0, i_sleep_mA=0.0, duty=0.02), # 2% 点灯
]
i_avg = total_avg_current(blocks)
print(f"平均電流: {i_avg:.3f} mA")
hours = estimate_battery_life_hours(capacity_mAh=2000, avg_current_mA=i_avg, efficiency=0.85)
days = hours / 24
print(f"推定稼働時間: {hours:.1f} 時間(約 {days:.1f} 日)")
ポイント
- 1つ1つのブロックに「動作時」「待機時」電流と「動作比率(デューティ)」を入れるだけ。
- ざっくりでも**比較(A案/B案)**が回しやすくなります(例:BLE の送信周期を長くしたら? LED を消したら?)。
サンプル3:CSV から構成パラメータを読み込み(非エンジニアと共有しやすい)
メンバーが Excel で編集した CSV を読み込んで、そのまま平均電流・バッテリー寿命を出力する例です。
# current_from_csv.py
import csv
from typing import List, Tuple
def load_blocks_from_csv(path: str) -> List[Tuple[str, float, float, float]]:
"""
CSV 例:
name,i_active_mA,i_sleep_mA,duty
MCU,10,0.2,0.1
BLE,15,0.05,0.05
Sensor,3,0.01,0.1
LED,5,0,0.02
"""
rows = []
with open(path, newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
for r in reader:
rows.append((
r["name"],
float(r["i_active_mA"]),
float(r["i_sleep_mA"]),
float(r["duty"]),
))
return rows
def avg_current_by_row(name: str, i_active: float, i_sleep: float, duty: float) -> float:
return i_active * duty + i_sleep * (1.0 - duty)
def main():
rows = load_blocks_from_csv("blocks.csv")
total = 0.0
for name, ia, islp, duty in rows:
i = avg_current_by_row(name, ia, islp, duty)
print(f"{name:8s}: {i:.3f} mA")
total += i
print("-" * 24)
print(f"合計平均電流: {total:.3f} mA")
# ついでに稼働時間の概算
capacity_mAh = 2000.0
efficiency = 0.85
hours = (capacity_mAh * efficiency) / total if total > 0 else float("inf")
print(f"推定稼働時間: {hours:.1f} 時間({hours/24:.1f} 日)")
if __name__ == "__main__":
main()
CSV の例(blocks.csv)
name,i_active_mA,i_sleep_mA,duty
MCU,10,0.2,0.1
BLE,15,0.05,0.05
Sensor,3,0.01,0.1
LED,5,0,0.02
4. 現実に近づけるための「ひと工夫」
4-1. 電源効率
降圧/昇圧の DC/DC を使うと損失が出るため、**効率(例:85%)**を掛けて見積もりましょう。上のサンプル2/3のように「効率 0.85」を掛けておけば、理想値より少し短めに出ます。
4-2. パルス電流(無線送信など)
短時間だけドンっと大電流が流れる場合、平均が同じでも電池やレギュレータが不安定になることがあります。
- 電池の内部抵抗(低温で上がる)で電圧降下 → MCU リセット
- レギュレータのピーク電流や出力コンデンサの容量不足
→ スパイク対策(コンデンサ増量、送信出力を下げる、送信間隔を伸ばす)も検討。
4-3. 実測で補正
データシートの値と実測がズレるのは普通です。USB 電流計やDMM+シャント抵抗などで要所を測り、スクリプトのパラメータを補正すると、設計の精度がぐっと上がります。
5. よくある落とし穴チェックリスト
6. まとめ
- 消費電流は「並列の足し算」+「デューティ比」で平均値をざっくり算出できます。
- バッテリー寿命は「mAh / 平均電流」で概算。電源効率などで補正すれば現実に近づきます。
- Python で簡易ツールを作っておくと、パラメータの「ちょい変え比較」が即座にできて便利!
まずは記事のサンプルをコピペして、お手元のプロジェクトの値で試してみてください。数字が見えると、電池や部品選定の判断がかなりラクになります。