はじめての電子回路「消費電流」入門:考え方と Python でのカンタン計算ツール

Python

電子工作や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. よくある落とし穴チェックリスト

  • スリープ電流を見落としていないか(意外と効いてくる)
  • LED の電流制限抵抗値は適切か(明るすぎ=無駄)
  • レギュレータの自己消費電流(Iq)を含めたか
  • 電源効率(降圧/昇圧)を考慮したか
  • 無線などピーク電流時に電圧ドロップしないか
  • 低温/高温で電池容量が目減りする前提で見積ったか
  • 長期運用なら自己放電経年劣化も考慮したか

6. まとめ

  • 消費電流は「並列の足し算」+「デューティ比」で平均値をざっくり算出できます。
  • バッテリー寿命は「mAh / 平均電流」で概算。電源効率などで補正すれば現実に近づきます。
  • Python で簡易ツールを作っておくと、パラメータの「ちょい変え比較」が即座にできて便利!

まずは記事のサンプルをコピペして、お手元のプロジェクトの値で試してみてください。数字が見えると、電池や部品選定の判断がかなりラクになります。

タイトルとURLをコピーしました