six-9のブログ

おっさんのブログ。エロゲとかアニメとか。

MCP1640+Li-ion+ブレッドボードで起動が不安定だった原因を徹底解析 ― ソフトスタートと負荷条件、そして出力コンデンサの重要性 ―

【技術ブログ】MCP1640+Li-ion+ブレッドボードで起動が不安定だった原因を徹底解析

― ソフトスタートと負荷条件、そして出力コンデンサの重要性 ―

Li-ion(3.7V)を入力に、MCP1640 を使って 4.7V を生成する小型ブースト電源を試作したところ、負荷をつないだまま起動すると 4.2V 付近で頭打ちになるという現象に遭遇した。ところが、無負荷で起動してから負荷を接続すると 4.7V を維持できる。この“起動時だけ弱い”挙動の原因を調べたところ、MCP1640 の ソフトスタート仕様と負荷条件の相性が本質であることが分かった。


■ 試験回路

MCP1640のデータシート記載のtypical application circuit
フィードバック用のV(FB)の上側抵抗は100kΩ、下側抵抗は33.3kΩ(100kΩを3並列)、4.7uHのインダクタは、4.7uHを2直列で9.4uHでも試してみた*1。入力コンデンサは10uF/50Vのアルミ電解コンデンサと4.7uF/50V/X7SのMLCC, 出力コンデンサは 10uF/50Vのアルミ電解コンデンサ*2と、4.7uF/50V/X7SのMLCCを3並列にした。


■ 起動時に 4.2V で頭打ちになる理由

MCP1640 のソフトスタートは、内部コンデンサを弱い電流源で充電しながら、スイッチのピーク電流制限を段階的に引き上げる方式になっている。データシートでは、起動直後はピーク電流が 50% 程度に制限され、整流スイッチも 約 100mA に制限されると明記されている。

このため、起動中は「本来の能力の半分以下」でしか動けない。
260Ω(約 18mA)程度の負荷でも、出力コンデンサの初期充電が重なると VOUT が 4.7V まで上がりきる前に電流制限に達し、4.2V 付近で飽和してしまう。

実際に V(FB) を測定すると 1.1V(本来 1.21V)で止まっており、「上げたいけど上げられない」状態であることが確認できた。


■ 重負荷(80Ω)では逆に 4.5V まで上がる理由

興味深いことに、80Ω(約 56mA)という“より重い負荷”では 4.5V まで上がった。これは直感に反するが、理由は単純で、重負荷では起動直後から PWM 連続動作に振り切られ、制御が安定するためである。

一方、260Ω付近は軽負荷と重負荷の境界で、PFM/PWM の切り替えや電流制限の影響が重なり、最も不安定な領域になる。

PFM/PWMの切り替え電流値(データシートより抜粋)


■ 出力コンデンサの改善が劇的に効いた

当初は出力に アルミ電解 10µF/50V を使用していたが、負荷時の電圧が ±0.3V 程度ふらつく問題があった。
そこで、4.7µF X7S MLCC を 3 個並列(合計 14.1µF)で追加したところ、ふらつきは ±0.1V 以下に改善した。

アルミ電解は ESR が高く、スイッチングリップルを十分吸収できないため、低 ESR の MLCC を並列に入れることが必須であると分かった。


■ 起動を安定させる最も効果的な方法

MCP1640 の仕様上、起動時に負荷をつながないのが最も確実である。

  • シュミットトリガ+MOSFET で 10ms 遅延して負荷を接続
    データシートではソフトスタートの時間は750usと記載されているので、10ms程度で十分
    ソフトスタートの波形例(データシートより抜粋)
  • または Vishay SiP32431/432 のような ロードスイッチ IC の EN を制御

これにより、毎回必ず
「無負荷で 4.7V まで立ち上げ → 負荷をオン」
という理想的なシーケンスを実現できる。


■ まとめ

  • MCP1640 は起動時に電流制限が強く、負荷付き起動が苦手
  • 260Ω付近の“境界負荷”では 4.2V で頭打ちになりやすい
  • 重負荷では逆に PWM に振り切れて安定することもある
  • 出力 MLCC の追加で電圧ふらつきは大幅に改善
  • 起動時に負荷を切り離す設計が最も確実

小型ブースト IC を Li-ion とブレッドボードで扱う際には、ソフトスタートの制限と出力コンデンサの ESRを意識した設計が重要だと痛感した。


*1:結果は変わらなかった

*2:抜いても変わらなかった

電子工作プロジェクト 進捗

プロジェクト:リモコン制御のHTTP化

Raspberry Pi Pico W を使用した赤外線リモコン制御システムについて、HTTPサーバー経由での制御改善を実施した。

従来のプログラムでは main ループ内に sleep() が多く存在しており、その間 HTTP サーバーがアクセス受付できない状態になっていた。そのため、不要な待機処理を削除し、HTTP サーバーの応答性を改善した。

特に、socket.settimeout() を利用してアクセス待機時間を確保するよう修正した。以下のように s.settimeout(60) を設定し、60秒間クライアント接続を待ち受ける構成としている。

MicroPython HTTPサーバー部分

# =========================
# HTTPサーバ
# =========================
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

# 60秒待つ
s.settimeout(60)

# =========================
# main loop
# =========================
while True:

    # =========================
    # ① HTTP処理
    # =========================
    # ここで s.settimeout(60) [秒]だけ待つ
    try:
        cl, addr = s.accept()

        request = cl.recv(1024).decode()

        print("Request:")
        print(request)

        # 応答
        response = "HTTP/1.0 200 OK\r\nContent-type: text/plain\r\n\r\nOK"
        cl.send(response)

        cl.close()

    except OSError:
        # timeout時など
        pass

    # =========================
    # ② その他処理
    # =========================
    # センサ読み取り
    # 赤外線送信
    # GPIO処理など

修正効果

  • HTTPアクセス受付時間が増加
  • ブラウザからの接続失敗が減少
  • リモコン操作レスポンスが安定
  • sleep() によるブロッキング問題を軽減

MicroPythonでは単純なループ構造でも通信受付性能に影響しやすく、特に sleep() の扱いが重要だと再確認した。


プロジェクト:Scoppy修理

故障していた Scoppy の修理を実施した。

原因と考えられていた反転チャージポンプIC、Texas Instruments製 LM2776DBVT が届いたため交換作業を行ったところ、無事に動作を確認できた。

交換作業では Raspberry Pi Pico 取付用ピンソケットがかなり邪魔になり、SMDはんだ付けの難易度が高かった。作業中に VBUS 端子部分を溶かしてしまい、その箇所のみピンソケットを交換することになった。

また、LM2776DBVT の 1番ピンマーキングが datasheet のイメージと異なっており、実装方向の判断にかなり悩まされた。

届いたICは「縦棒マーキング」になっており、一般的なドットマーキングとは違っていたため、実装ミスのプレッシャーが大きかった。SOT系パッケージは一度実装するとやり直しが大変なので、慎重に作業した。

備忘録として、今回届いたICのマーキング特徴を記録しておく。

LM2776DBVTのマーキング模式図

作業内容

  • LM2776DBVT交換
  • VBUS端子周辺修復
  • Pico用ピンソケット一部交換
  • 動作確認完了

学んだ点

  • SMD部品交換時は周辺コネクタが非常に邪魔になる
  • TI製ICでもマーキング形状が datasheet と異なる場合がある
  • 実装前にテスターでピン位置確認すると安心

プロジェクト:マイク+アンプ+スピーカー

秋月電子の2階で販売されていた、24粒100円の ECM(Electret Condenser Microphones)を購入し、動作確認を行った。

以下のような簡易回路を組み、マイク出力確認を試した。

使用回路

  • 電源:3.3VDC
  • バイアス抵抗:6.8kΩ
  • カップリングコンデンサ:47µF
    ECM動作確認回路図

    試験結果

出力信号を確認できなかった。

マイク端子の極性を逆にして試したが改善せず、原因を調査したところ、はんだレスのスプリング端子による接触不良の可能性が高そうだった。

今回使用したECMはリード線ではなく、バネ接触式の端子構造になっていたため、ブレッドボード実験との相性が悪かったと考えられる。

今後の方針

  • スプリング端子型ECMの使用は断念
  • リード線端子付きECMを新規購入予定
  • 次回はオシロスコープでバイアス電圧も含めて確認予定

低価格ECMは実験用途として魅力的だが、接触品質や端子形状に注意が必要だと感じた。

電子工作プロジェクト 優先順位

電子工作プロジェクト計画(2026年4月)

いろいろやりかけでわけわかんなくなってきたので、いったんやりたいこととかまとめてみる。

1. プロジェクト一覧

プロジェクト ToDo
リモコン制御 HTTPサーバー制御用プログラム修正、ケース加工、赤外線受信IC追加
IoTポスト ケース設計
scoppy修理 反転チャージポンプ回路をブレッドボードで検証
Arduinoオシロスコープ 基板設計、部品手配
Wi-Fi検波 ブザー設計、電源設計、フロントエンドアンプ設計(3SK294 デュアルゲートMOSFET使用)
STP3005修理 不具合箇所特定・調査(※オシロスコープ修理後)
マイク+アンプ+スピーカー マイク出力確認、スピーカー選定
Liイオン電池充電基板 3.3V / 5V / 12V 出力追加
Raspberry pi 5 自宅内サーバー リモコン制御ハブ、IoTポストハブ、週間天気予報

2. 開発方針(優先順位)

フェーズ1(最優先)

■ リモコン制御のHTTP化

  • Pico W を用いたWebサーバ実装
  • ブラウザから赤外線制御を可能にする
  • 赤外線送受信機能の統合

フェーズ2

■ Scoppy(簡易オシロスコープ)修理

  • 電源系(特に負電源)の復旧
  • 反転チャージポンプ回路の再設計・検証

フェーズ3

■ Arduinoオシロスコープ設計

  • 回路設計
  • PCB設計(KiCad想定)
  • 部品選定・発注

3. 技術検討メモ

3.1 リモコン制御(HTTP化)

システム構成

[ブラウザ] ↓ HTTP [Pico W] ↓ GPIO [赤外線送信 / 受信回路]

実装ポイント

  • socketベースのHTTPサーバ
  • URLルーティング(例:/on, /off
  • 非同期処理 or 簡易ポーリング
  • 軽量HTML UI

技術課題

  • レスポンス遅延
  • 同時接続数の制限
  • 試しに動作させてみたが、応答が遅く1分以上待つ。Pico Wがメインループ内部でスリープしているせいかもしれない。

3.2 Scoppy修理(反転チャージポンプ)

目的

  • 負電源生成(例:-5V〜-9V)

構成要素

  • スイッチング回路
  • ダイオード
  • コンデンサ(1µF〜10µF)

検証項目

  • TJ7660Nを10uFの電解コンデンサを買ってきた。外付けで動作するか確認

3.3 Wi-Fi検波回路

構成

  • アンテナ
  • 検波ダイオード
  • フロントエンドアンプ(3SK294)
  • ブザー駆動回路

技術ポイント

  • 微弱信号の増幅(RFフロントエンド設計)

3.4 マイク+アンプ+スピーカー

構成

  • ECM(エレクトレットコンデンサマイク)
  • プリアンプ
  • パワーアンプ(LM386)
  • スピーカー

スピーカー選定検討

  • LM386の出力:約0.2W程度
  • 比較:
    • 0.5W品:250円/個
    • 8W品:100円/個

結論(設計判断)

  • 音量は「入力電力」で決まり、スピーカー定格では変わらない
  • 8Wスピーカー採用が合理的
    • コスト優位
    • 余裕のある定格で破損リスク低
  • ECMは秋月二階で24粒100円で売っていた。たぶんOBE-22SA*1

3.5 Liイオン電池充電基板

追加仕様

  • 出力:
    • 3.3V(LDO or DCDC)
    • 5V(昇圧)
    • 12V(昇圧)

Liイオン電池を電源とすると、3.2Vから4.2V程度の電圧なので、3.3V出力はLDOが合理的かと思う。Back-Boostコンバーターもあるけれど、設計が面倒。 Arduino Uno R3とR4の電源としても活用したいので、12VDC出力もつけておきたい。Arduinoの外部DC入力は7VDC-12VDCなので、9VDCでも良いが。

技術課題

  • 効率(特に12V昇圧)
  • 発熱(LDOは放熱用ヒートシンクが必要かも)

3.6 Raspberry pi 5 自宅内サーバー

仕様

  • Raspberry Pi 5にIoTポストの表示、リモコン制御用Pico Wの表示・制御、週間天気予報(洗濯予定)

4. 実行ステップ

Step1

  • Pico W HTTPサーバ実装
  • 赤外線制御統合

Step2

  • Scoppy電源修理
  • 動作確認

Step3

  • Arduinoオシロスコープ設計開始
  • 回路図 → PCB

5. 設計ポリシー

  • 電源設計を最優先
  • 必ずブレッドボードで事前検証
  • 回路のモジュール化
  • 測定環境(オシロスコープ)を先に整備

Raspberry Pi Pico (2) W を用いた環境センシング+IR制御システム

ここらへんでちょっと触れたリモコン制御基板を改めてまとめる。*1

six-9.hatenablog.com

概要

本システムは、Raspberry Pi Pico W を用いて以下を統合したIoTノードである。

  • 温度・湿度・照度のセンシング
  • BLEによるリアルタイム通知
  • Wi-Fi経由でのクラウド送信(Ambient)
  • Google Sheetsによる遠隔制御
  • 赤外線(IR)による家電制御

システム構成

+-----------------------------+
| Raspberry Pi Pico W         |
|                             |
|  ADC                        |
|   ├─ サーミスタ (温度)       |
|   └─ フォトセンサ (照度)     |
|                             |
|  I2C                        |
|   └─ AHT20 (温湿度)         |
|                             |
|  GPIO                       |
|   ├─ IR送信 x3              |
|   ├─ IR受信                 |
|   └─ ステータスLED          |
|                             |
|  Wi-Fi                      |
|   ├─ Ambient送信            |
|   └─ Google Sheets取得      |
|                             |
|  BLE                        |
|   └─ 温度・照度通知         |
+-----------------------------+

回路設計(アナログフロントエンド)

1. サーミスタ温度測定回路

  • 構成:分圧回路
  • 使用素子:

    • NTCサーミスタ(103AT-2)
    • 基準抵抗:9.99kΩ
 VREF (3.3V)
   |
  [RREF]
   |
   +-----> ADC (GPIO27)
   |
 [Thermistor]
   |
  GND

設計ポイント

  • 分圧式で抵抗値をADC電圧に変換
  • 温度はB定数式で算出
R = RREF * (ADC / (FS - ADC))
T = 1 / (1/T0 + (1/B) * ln(R/R0))

2. 照度センサ回路

  • フォトトランジスタ + 抵抗
 VREF
   |
 [Resistor 2.2kΩ]
   |
   +-----> ADC (GPIO26)
   |
 [Photo Sensor]
   |
  GND

特徴

  • 電流→照度変換(対数特性)
lux = 10^{(-0.24004 + 0.971342 log10(I))}

ソフトウェア構成


BLE通信クラス

class BLETemperature:

機能

  • GATTサーバ実装
  • 通知(Notify)でデータ送信

特徴

  • 温度 / 照度 / WiFi状態を別Characteristicで管理
  • 複数接続対応(set構造)

センサ処理

サーミスタ温度

R_thermistor = RREF * (adc_value / (adc_fs - adc_value))
  • 分圧逆算
  • B定数で温度変換

内部温度(RP2040)

temp = 27 - (V - 0.706) / 0.001721

照度計算

lux = 10 ** (-0.24004 + 0.971342 * math.log10(current_microamps))

通信処理

1. Wi-Fi接続

wlan.connect(SSID, PASSWORD)

設計ポイント

  • 接続失敗時自動リブート(30秒)
if elapsed_time >= REBOOT_INTERVAL_WIFI:
    reset()

2. Ambient送信

payload = {
    'd1': illuminance,
    'd2': temperature1,
    'd3': temperature2
}
  • HTTP POSTで送信
  • 5分周期

3. Google Sheets制御

value = data['values'][0][0]

特徴

  • 状態変化検知でIR送信
if value != previous_value:

赤外線制御

def send_ir(cmd):

構成

  • IR送信:3系統(tx1, tx2, tx3)
  • 冗長送信(2回送信)

設計意図

  • 家電の受信失敗対策
  • 複数機器同時制御

メインループ

while True:

処理内容

  1. 温度・照度取得
  2. Ambient送信(周期)
  3. Google Sheets監視
  4. IR制御
  5. BLE送信

設計上の工夫

1. フェイルセーフ

  • Wi-Fi未接続 → 自動リブート
  • APIエラー → 再試行 → リブート

2. ノイズ対策(重要)

  • ADC平均化(20回)
average_count = 20

→ ランダムノイズ低減


3. リアルタイム性

  • BLE:5秒周期
  • Sheets:20秒周期

4. 消費電力考慮

  • 不要時LED OFF
  • IR送信はイベント駆動

回路図


回路動作

全体構成

本回路は大きく以下のブロックで構成される:

1. MCU(Raspberry Pi Pico W or 2 W)
2. 赤外線送信回路(IR LED × 複数)
3. 赤外線受信モジュール
4. センサ入力(サーミスタ / 照度)
5. LED表示回路
6. トランジスタドライバ回路

1. MCU部

使用デバイス

  • Raspberry Pi Pico W または 2W *2

役割

  • センサ値取得(ADC / I2C)
  • IR送信制御
  • Wi-Fi / BLE通信
  • 外部入力監視

BOM

Reference Value Footprint Qty Description
A1 SC0918 Raspberry_Pi_Pico_W_Kicad_Files-main:MODULE_SC0918 1 IC
C1 47u Capacitor_THT:CP_Radial_D6.3mm_P2.50mm 1 Capacitor
D1, D4, D6 OSI5LA5113A LED_THT:LED_D5.0mm, LED_THT:LED_D5.0mm_IRGrey 3 Infra-Red Transmitter
D2 Power LED LED_THT:LED_D5.0mm 1 Green LED
D3 STATUS LED 1 LED_THT:LED_D5.0mm 1 Amber LED
D5 STATUS LED 2 LED_THT:LED_D5.0mm 1 Blue LED
Q1, Q2, Q4, Q5, Q6 DTC114EKAT146 SOT95P280X130-3N 5 Digital Transistor
Q3 NJL7302L-F3 LED_THT:LED_D3.0mm_Clear 1 Photo-transistor
R1, R3, R8, R11, R15, R18 130 Resistor_SMD:R_1210_3225Metric_Pad1.30x2.65mm_HandSolder 6 Current-limit resistor
R2 10k Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal 1 Precision resistor
R9 47 Resistor_SMD:R_1210_3225Metric_Pad1.30x2.65mm_HandSolder 1 Resistor
R10 2.2k Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal 1 Precision resistor
R12 0 Resistor_SMD:R_1210_3225Metric_Pad1.30x2.65mm_HandSolder 1 Resistor (Jumper)
RT1, RT2 103AT-2 SamacSys_Parts:103AT2 2 NTC Thermistor (10kΩ, 1%)
U1 AHT25 AHT25y:AHT25 1 Temperature & Humidity Sensor
U2 AHT21B AHT21B 1 Temperature & Humidity Sensor
U3 GP1UXC41QS *3 GP1UXC4xQS:GP1UXC4xQS 1 Infra-Red Receiver

2. 赤外線送信回路(重要)

構成

  • IR LED
  • デジタルトランジスタ → DTC114EKAT146

回路構成

GPIO ──> DTC114(内蔵抵抗付きNPN)
           │
           ├── IR LED ── VCC
           │
          GND

動作原理

● DTC114の内部構造

GPIO ──[内蔵R]──B  NPN  C── IR LED ── VCC
                  E
                 GND

● 特徴

  • ベース抵抗内蔵 → 外付け不要
  • スイッチング用途に最適

設計評価

◎ 良い点

  • GPIO直結可能
  • 部品点数削減
  • IR LED駆動に十分
IR LED直列に 47Ω 追加して、50mA(DTCの最大電流付近)をドライブできるようにした。

3. 赤外線受信回路

使用デバイス

  • GP1UXC41QS

特徴

  • 搬送波(約38kHz)復調済み出力
  • デジタル信号出力

動作

赤外線信号 → 内部で検波・復調 → デジタル出力

👉 重要ポイント:

  • 外付け検波回路(ダイオード+RC)は不要

5. センサ回路

サーミスタ(103AT-2)

  • 分圧回路構成
VCC
 │
[R]
 │── ADC
 │
[NTC]
 │
GND

設計ポイント

  • 基準抵抗 ≒ 10kΩ
  • 温度範囲に対して最適

照度センサ

フォト素子 → 抵抗 → ADC
  • 電流→電圧変換方式

6. LED表示回路

種類

  • Power LED
  • Status LED(複数)

駆動方式

  • DTC114使用(同様)

特徴

  • GPIO → トランジスタ → LED

7. トランジスタ回路まとめ

使用デバイス

  • DTC114EKAT146(デジタルトランジスタ)

メリット

  • ベース抵抗内蔵
  • 実装容易 (ベース抵抗内蔵で実装面積を削減)
  • 安定動作

8. 電源設計

  • Pico Wの3.3V使用

9. 基板設計

2層基板で設計。Raspberry Pi Pico Wのアンテナ特性を悪化させないように、Picoの下面はベタGNDを抜いた。 外部へIR送受信する都合上、基板外部にIR LEDと赤外線受信モジュールを配置した。

基板レイアウトの3D(左)と2D(右)。*4


10. MicroPythonプログラム

■ インポート

import network
import urequests
import requests
import time, math, bluetooth
from machine import ADC, Pin, I2C, reset
from UpyIrTx import UpyIrTx
from UpyIrRx import UpyIrRx
from ahtx0 import AHT20

■ BLE UUID定義

BLE_UUID_TEMPERATURE_SERVICE = bluetooth.UUID(0x1811)
BLE_UUID_TEMPERATURE_CHAR = bluetooth.UUID(0x2A1D)
BLE_UUID_WIFI_STATUS_CHAR = bluetooth.UUID("00002a56-0000-1000-8000-00805f9b34fc")
BLE_UUID_LUX_CHAR = bluetooth.UUID("00002a57-0000-1000-8000-00805f9b34fc")

■ 動作パラメータ

REBOOT_INTERVAL = 86400        # 24時間
REBOOT_INTERVAL_WIFI = 30      # Wi-Fi未接続時リブート
POLLING_INTERVAL = 20          # Sheetsポーリング
INTERVAL_AMBIENT = 300         # Ambient送信
INTERVAL_BLE = 5               # BLE送信

■ 時間管理

start_time = time.time()
ambient_start_time = time.time()

■ BLEクラス

class BLETemperature:

    def __init__(self):
        self.ble = bluetooth.BLE()
        self.ble.active(True)
        self.ble.irq(self.ble_irq)

        self.service = (
            BLE_UUID_TEMPERATURE_SERVICE,
            (
                (BLE_UUID_TEMPERATURE_CHAR, bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY),
                (BLE_UUID_WIFI_STATUS_CHAR, bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY),
                (BLE_UUID_LUX_CHAR, bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY),
            )
        )

        ((self.temp_handle, self.wifi_status_handle, self.lux_handle),) = \
            self.ble.gatts_register_services((self.service,))

        self.connections = set()
        self.advertise()

    def ble_irq(self, event, data):
        if event == 1:
            conn_handle, _, _ = data
            print("Connected:", conn_handle)
            self.connections.add(conn_handle)

        elif event == 2:
            conn_handle, _, _ = data
            print("Disconnected:", conn_handle)
            self.connections.discard(conn_handle)
            self.advertise()

    def set_temperature(self, temp):
        temp_str = "{:.2f}".format(temp / 100) + "deg.C"
        data = temp_str.encode()

        for conn in self.connections:
            try:
                self.ble.gatts_notify(conn, self.temp_handle, data)
            except OSError as e:
                print("Temp error:", e)

    def set_lux(self, lux):
        lux_str = "{:.2f}".format(lux / 100) + "lux"
        data = lux_str.encode()

        for conn in self.connections:
            try:
                self.ble.gatts_notify(conn, self.lux_handle, data)
            except OSError as e:
                print("Lux error:", e)

    def send_wifi_status(self, status):
        data = status.encode()

        for conn in self.connections:
            try:
                self.ble.gatts_notify(conn, self.wifi_status_handle, data)
            except OSError as e:
                print("WiFi status error:", e)

    def advertise(self):
        name = 'PicoW_Temp_Lux_2F'
        adv = bytearray('\x02\x01\x06' + chr(len(name) + 1) + '\x09' + name, 'utf-8')
        self.ble.gap_advertise(100, adv)

■ GPIO / IR設定

onboard_led = Pin('LED', Pin.OUT)
status_led1 = Pin(10, Pin.OUT)
status_led2 = Pin(5, Pin.OUT)

tx1 = UpyIrTx(0, Pin(14, Pin.OUT))
tx2 = UpyIrTx(1, Pin(15, Pin.OUT))
tx3 = UpyIrTx(2, Pin(28, Pin.OUT))

rx = UpyIrRx(Pin(16, Pin.IN))

■ ADC設定

adc0 = ADC(Pin(26))   # 照度
adc1 = ADC(Pin(27))   # サーミスタ

adc_fs = 65536
VREF = 3.3

■ サーミスタ定数

R25 = 10000.0
BETA = 3435.0
RREF = 9990.0

■ I2Cセンサ

i2c = I2C(0, scl=Pin(1), sda=Pin(0))
sensor = AHT20(i2c)

■ 温度取得関数

adc_internal = ADC(4)

def read_internal_temperature():
    val = adc_internal.read_u16()
    v = val * (VREF / adc_fs)
    return 27 - (v - 0.706) / 0.001721

■ サーミスタ温度

def read_thermistor_temperature():
    total = 0

    for _ in range(20):
        total += adc1.read_u16()
        time.sleep(0.1)

    adc_value = total / 20

    R = RREF * (adc_value / (adc_fs - adc_value))
    temp_k = 1 / (1/(273.15+25) + (1/BETA)*math.log(R/R25))

    return temp_k - 273.15

■ 照度計算

def read_photoluminance():
    adc = adc0.read_u16()
    v = adc * (VREF / adc_fs)

    current = v / 2203
    current_uA = current * 1e6

    if current_uA > 0:
        lux = 10 ** (-0.24004 + 0.971342 * math.log10(current_uA))
    else:
        lux = 0

    return lux

■ LED点滅

def blink_led(led, times, interval):
    for _ in range(times):
        led.value(0)
        time.sleep(interval)
        led.value(1)
        time.sleep(interval)
    led.value(0)

■ Wi-Fi接続

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)

while not wlan.isconnected():
    if time.time() - start_time > REBOOT_INTERVAL_WIFI:
        reset()

■ Ambient送信

def send_to_ambient(lux, t1, t2):
    payload = {
        'writeKey': AMBIENT_WRITE_KEY,
        'd1': lux,
        'd2': t1,
        'd3': t2
    }

    try:
        r = urequests.post(AMBIENT_URL, json=payload)
        r.close()
    except:
        pass

■ Google Sheets取得

def check_google_sheets(url):
    try:
        r = requests.get(url)
        val = r.json()['values'][0][0]
        r.close()
        return val
    except:
        time.sleep(POLLING_INTERVAL)
        reset()

■ IR送信

def send_ir(cmd):
    if cmd not in signal_lists:
        return

    signal = signal_lists[cmd]

    for tx in [tx1, tx2, tx3]:
        tx.send(signal)
        time.sleep(1)
        tx.send(signal)

■ メインループ

while True:

    # センサ取得
    t_int = read_internal_temperature()
    t_aht = sensor.temperature
    t_th = read_thermistor_temperature()
    lux = read_photoluminance()

    # Ambient送信
    if time.time() - ambient_start_time > INTERVAL_AMBIENT:
        send_to_ambient(lux, t_th, t_aht)

    # Sheets制御
    val = check_google_sheets(URL)
    val_light = check_google_sheets(URL_LIGHT)

    if val in signal_lists:
        send_ir(val)

    if val_light in signal_lists:
        send_ir(val_light)

    # BLE送信
    if ble_temp.connections:
        ble_temp.set_temperature(int(t_th * 100))
        ble_temp.set_lux(int(lux * 100))
        ble_temp.send_wifi_status("wifi:ON")

    time.sleep(INTERVAL_BLE)
    time.sleep(POLLING_INTERVAL)

*1:Chat GPTで記事を書いているが、文字数が多すぎて、ちょっと読みづらいかも。文字数も制限して出力したほうが良いかな。

*2:回路はPico Wでも 2Wでも一緒。ADC周りのプログラムが少し違う。

*3:秋月電子で2024年に購入したが、現在は販売終了。後継型番は、赤外線リモコン受信モジュール OSRB38C9AA。販売コード:104659。電源電圧・フットプリントは同等なので、基板変更なしで使えるはず。

*4:これ部品3D乗ってないけれど、設定がなんか違うのか。

Wi-Fi検波回路の進捗報告


Wi-Fi検波回路の進捗報告

1. 概要

Wi-Fi帯の電波を検知し、可視化するための検波回路を試作した。 現状は、Wi-Fi信号の検出からLED点灯までを確認済みである。


2. これまでの課題と対策

以前うまく動作しなかった原因

  • 当初使用していたダイオードは容量が大きく、高周波検波に不向きだった可能性
  • そのため、十分な検波電圧が得られなかったと推定

対策

  • 高周波用・低容量のショットキーダイオードへ変更
  • 検波後はチップコンデンサで平滑化し、微小DCを生成

3. 現在の回路構成

  • 検波部

    • 高周波用ショットキーダイオード
    • 0.01 µF のチップコンデンサによる整流・平滑
  • 増幅・駆動部

    • オペアンプによる検波電圧の増幅
    • 増幅後の信号でLEDを駆動

4. 実測結果

  • ショットキーダイオード+コンデンサで整流した後のDC電圧を測定

  • Wi-Fiルーター直近で以下のレベルを確認

    • 10 mV ~ 50 mV
  • この微小電圧をオペアンプで増幅することで、LED点灯が可能となった


5. 今後の拡張予定

機能追加

  • 検波電圧に応じて音量が変化する機能を追加予定
  • 光(LED)+音(圧電ブザー)による検知を目指す

音出力部

  • 圧電ブザー PKM13EPYH4000-A0 を使用
  • Raspberry Pi Pico 2 W で駆動する実験済み
  • 今後は検波電圧に応じて音量を可変にする予定

6. 電源回路の改善予定

現在は Li-ion 電池駆動であるが、以下にも対応予定:

  • ACアダプター駆動
  • 単3/単4などの 1.5 V 乾電池駆動
  • 過放電・過電流保護を含む電源回路

7. 今後の展開

  • 基板化(PCB化)を検討
  • 電源部と音出力部を含めた統合回路設計
  • 検知感度の最適化と安定性評価

作成回路

以下、実験結果をChat GPTでまとめた。


RF検波+非反転増幅+LED駆動回路の解説

シミュレーション回路と実際にLED点灯を確認した様子。左手の下に、WiFiルーターがある。

本回路は、高周波信号を検波し、直流化した後に増幅して負荷(LED)を駆動する回路である。 入力は1 GHz帯の微小RF信号を想定している。

回路は大きく以下のブロックに分かれる。

  1. RF検波(整流)部
  2. 平滑・検波電圧生成部
  3. 非反転増幅(オペアンプ)部
  4. トランジスタによるLED駆動部

① RF入力と検波ダイオード部

入力源 V1 は以下の条件の正弦波信号:

SINE(0 0.2 1G)
  • 周波数:1 GHz
  • 振幅:0.2 V(ピーク)
  • DCオフセット:0 V

この信号が、ショットキーダイオード 1SS154 Schottky Barrier Diode に入力される。

このダイオードは以下の役割を担う。

  • 高速応答(高速RF対応)
  • 微小信号の整流
  • 高周波検波(RF Detector)

R4 = 1Ω はほぼ直列抵抗に近い値で、配線インピーダンス相当として機能する。


② 検波・平滑ネットワーク

ダイオードの後段は、包絡線検波回路である。

構成要素

  • C1 = 0.01 nF
  • C2 = 0.01 nF
  • R1 = 100 kΩ

この部分は以下の機能を持つ:

  • 整流されたパルス波を平滑化
  • RF成分を除去し、包絡線(DCレベル)を抽出
  • RCフィルタとして機能

結果としてノード V_det に、入力RF信号の振幅に比例したDC電圧が現れる。


③ 非反転増幅回路(オペアンプ)

使用オペアンプ: LT1014

構成は非反転増幅回路

増幅率設定

帰還抵抗と入力抵抗は以下:

  • R3 = 100 kΩ
  • R2 = 1 kΩ

増幅率は以下で決まる:

A_v = 1 + \frac{R_3}{R_2}

数値代入すると:

[ A_v = 1 + \frac{100k}{1k} = 101 ]

したがって、検波電圧は約100倍に増幅される

V2 = 5V はオペアンプの電源供給。


④ トランジスタによるLED駆動段

オペアンプ出力はそのままLEDを駆動せず、NPNトランジスタを介している。

構成

  • NPNトランジスタ:Q1
  • ベース抵抗:R5 = 2.2kΩ
  • ベース‐エミッタ保護抵抗:R7 = 2.2kΩ
  • LED電流制限抵抗:R6 = 100Ω
  • LED:D1

動作

  • 増幅されたDC電圧がベース電流を制御
  • トランジスタは電流増幅を担当
  • LEDは電流駆動される

この構成により、

  • オペアンプにLED電流を流させない
  • LEDを安定駆動できる

回路全体の動作まとめ

ブロック 機能
RF入力 1 GHzの微小信号生成
ダイオード 高周波整流(検波)
RC平滑 包絡線検波・DC化
オペアンプ 約100倍の非反転増幅
トランジスタ LED電流駆動
LED 検波レベルの視覚化

技術的ポイント

  • 微小RF信号を扱うためショットキーダイオードが必須
  • 検波後は非常に小さい電圧のため高ゲイン増幅が必要
  • オペアンプ出力で直接LEDを駆動せずトランジスタでバッファ
  • 非反転構成により高入力インピーダンスを確保

シミュレーション結果
以下に、シミュレーション結果を、記載します。LTSpiceでシミュレーションしながら回路試作した。


シミュレーション結果の解説

シミュレーションでは、検波出力電圧、増幅後電圧、負荷電圧およびLED電流の時間変化を確認した。 各ノードの意味は以下の通りである。

ノード / 項目 意味
V(v_det) 検波後(平滑後)の電圧
V(v_led) オペアンプ出力電圧
V(v_load01) トランジスタ出力側(LED側)電圧
I(R6) LEDに流れる電流(負方向はLED電流方向)

① 検波電圧 V(v_det) の挙動

V(v_det) は約 15〜30 mV 程度で推移しており、1 GHz の高周波入力が検波されて微小な直流電圧に変換されていることが分かる。

これは、以下の構成による効果である。

  • ショットキーダイオードによる整流
  • RC平滑回路による包絡線抽出

入力振幅が小さいため、検波後電圧も数十mVと小さいが、後段の高ゲイン増幅によって利用可能なレベルまで引き上げられる。


② オペアンプ出力 V(v_led) の変化

V(v_led) は初期状態で約 4.8 V 付近にあり、その後時間経過とともに低下していく挙動を示す。

これは以下の理由による。

  • 非反転増幅回路として高いゲイン(約100倍)が設定されている
  • 微小な V(v_det) の変動が大きく増幅される
  • トランジスタ段の駆動により負荷条件が時間的に変化

特に、トランジスタのベース電流が増えるにつれて、オペアンプ出力は負荷されて電圧が低下していく。


③ LED駆動電圧 V(v_load01) の挙動

V(v_load01) は時間とともに徐々に上昇し、最終的には 約2.1 V付近で安定している。

これは、

  • トランジスタが徐々に導通
  • LEDに十分な順方向電圧が印加

されることで、LED点灯状態に移行していることを示している。


④ LED電流 I(R6) の挙動

I(R6) は時間経過とともに増加し、最終的には 約18 mA 程度に達している。

この電流値は、以下により決まる。

  • オペアンプ出力電圧
  • トランジスタの増幅作用
  • 電流制限抵抗 R6 = 100Ω

⑤ 回路動作のまとめ

シミュレーション結果から、以下が確認できる。

  • 微小RF信号が確実に検波されている
  • 検波電圧は数十mVと小さいが、十分に増幅されている
  • トランジスタ段によりLEDを確実に駆動できている
  • 最終的にLED電流は十数mAレベルに達する

これにより、RF信号検出 → DC化 → 増幅 → 表示という一連の動作が成立していることが分かる。


技術的考察

  • 検波電圧が小さいため、高ゲイン増幅は必須
  • トランジスタを挟むことで、オペアンプに大電流を流さずに済む
  • シミュレーション上の電流立ち上がり時間は、RC時定数とトランジスタ動作点に依存

シミュレーション回路と実際の試作回路の相違点(追記)

本記事の回路図およびシミュレーションでは、汎用・入手性・モデル精度の観点から部品を選定しているが、実際の試作では動作安定性と入手性を優先して一部の定数・部品を変更している


① オペアンプの変更

シミュレーション上では、オペアンプとして LT1014 を使用している。

しかし実機試作では手元在庫の関係から、以下のオペアンプを使用した。

  • 実機:MCP6002-E/P

差異と注意点:

  • 両者とも単電源動作可能な汎用オペアンプ
  • 帯域幅・スルーレートは異なるが、本回路のような低速包絡線信号増幅では実用上問題なし
  • ピン配置が異なるため、基板設計時にはデータシート確認が必須

② トランジスタ段の構成変更

シミュレーションでは、以下のディスクリート構成としている。

  • NPNトランジスタ:Q1
  • ベース抵抗:R5 = 2.2 kΩ
  • ベース‐エミッタ抵抗:R7 = 2.2 kΩ

しかし実機では、部品点数削減と実装簡素化のため、抵抗内蔵型トランジスタを採用した。

  • 実機:DTC123EL

この部品は以下を内蔵している:

  • ベース抵抗
  • ベース‐エミッタ抵抗

そのため、R5・R7・Q1を1個の部品に置き換え可能である。

利点:

  • 部品点数削減
  • 実装面積縮小
  • ベース電流制限が自動で決まり、設計が容易

③ 平滑コンデンサ容量の変更

シミュレーションでは、検波後の平滑用コンデンサ C1

  • 0.01 µF

としているが、実機では

  • 1 µF のリード線タイプMLCC

を使用した。

効果:

  • 平滑効果が大きくなり、検波後のDC電圧がより安定
  • LEDの点灯が明らかに明るくなった
  • 微小な検波電圧を扱う本回路では、容量増加による効果が顕著

この変更は、実機での動作改善に非常に有効であった。


まとめ(実機変更の妥当性)

項目 シミュレーション 実機 効果
オペアンプ LT1014 MCP6002-E/P 低速検波用途では問題なし
トランジスタ NPN+抵抗2本 DTC123EL 同等機能、省スペース化
平滑コンデンサ 0.01 µF 1 µF 検波電圧安定、LED輝度向上

このように、回路動作原理を維持したまま、実装性と安定性を高めた構成となっている。

定数変更の実験結果

平滑キャパシタと非反転増幅回路の倍率を変えて実験した結果を整理しました。


実験結果一覧(LED点灯評価)

平滑キャパシタ C1容量 [µF] 非反転増幅回路の R1 [kΩ] 非反転増幅回路の倍率 [倍] OPAMP出力電圧DC 最大値 [V] LED点灯の様子
1 0.5 200 4.92 緑色、かなり明るい・連続点灯
1 1 100 4.92 緑色、かなり明るい・連続点灯
1 1 100 4.92 青色、明るい・連続点灯
1 1 100 4.89 赤色、かなり明るい・連続点灯
なし 0.5 200 0.23 緑色、明るい・点滅
なし 1 100 0.39 緑色、明るい・点滅
1 2.2 45 1.76 赤色、ほどほどの明るさ・点滅

※ OPAMP出力電圧DCは変動が大きいため、最大値を記録。 ※ 明るさの差(緑 > 赤 > 青)は、視感度の違いLEDの順方向電圧の違いによるものと推定される。


電子工作プロジェクト整理メモ

わかんなくなってきたから、趣味の電子工作プロジェクトの課題とか調べたことをまとめておく。

1. ラズパイPicoオシロ基板 PL2407AFE修理・電源事故

  • 破損内容

    • 反転チャージポンプIC (LM2776) が破損。
    • Raspberry Pi Pico W も同時に破損。
  • 原因

    • Scoppy をリチウムイオンポリマー電池駆動に改造中、誤って VBUS に約20V入力。
    • VBUS 短絡状態となり、バックブーストコンバータが過熱。
  • 対処

    • PL2407AFE の IC 交換で修復可能と予想。反転出力した-5VDCをLM2776の出力ピンに入力したら、問題なく-3.3VDCが出力された。
    • 交換不可なら新規購入を検討。
    • LM2776自体は通販などで入手困難だから、同パッケージの反転チャージポンプへ交換する方向で検討中。
    • 別の Pico W を接続して挙動を確認済み。
    • まずはオシロスコープが無いと、基板製作のデバッグができないので最優先で進める。反転チャージポンプが故障したため、アナログオシロ用のオペアンプ負電源が動作しない。ロジックアナライザー機能は問題なく使用できる

1枚目の写真右のU4が反転チャージポンプLM2776。シルクで[U4]とは書いて無いが、U3付近にあるICがU4。なお、-3.3Vレギュレーターは、2枚目の回路図ではU6のXC6902N331PR-Gが実装されていた。


2. IoTポスト関連

進捗

  • とりあえず基板製作して動いた。
    Ambientに送信したログ。橙色(右軸)のToFセンサー測距値が17cmから6cm程度に変化していることが確認できる。2枚目から4枚目は設置状況。

筐体作成

  • IoTポストのハードウェア筐体製作。

プログラム改修

  • 動作時間を延長するための改修を検討。

基板改修

  • 修正点:

    • デバッグ用スイッチ追加(Disable Pin を High にできるように)。
    • U3 フットプリント修正。
    • EDLC (WEC3R0505QG) のピン間隔を修正(狭すぎた)。
    • 47µF キャパシタの実寸に合わせてフットプリント修正。
    • 3.3VDC DCDC のフットプリント幅を修正(約2mm広すぎた)。
    • Amazon 購入品 VL53L0X ボード対応のためピンアサイン変更。

U3のフットプリントを間違えた。パッドが露出していない。カッターで削ってハンダ付けしたが、二回目はやりたくない。


3. ToFセンサー不具合解析

  • 使用センサー:VL53L0X (Amazon購入品)
  • 状況:2台とも不具合。購入品の初期不良の可能性あり。
  • 調査ポイント:

    • スイッチサイエンスの注意書きに「シルクと実際の配線が異なる」と記載あり。
    • ピンアサインや基板配線の違いを調査予定。

前回記事で書いた内容。 VL53L0X型ToFセンサーの動作不良調査 - six-9のブログ


4. WiFi点灯LED作成

  • 試作:低電圧 LED +ダイオード(BAT54AT。たしか。)で点灯確認。
  • 結果:点灯せず。
  • 今後必要な部品:

    • 順方向電圧の低いダイオード。
    • 順方向電圧の低い LED。

WiFi LED点灯を試した。WiFiルーター直上でも電子レンジの上でも点灯しなかった。

インターネットで検索すると、色々出てくるので、できると思うのだけど。例えば以下。 WiFiで光るレクテナの作成

https://www.youtube.com/watch?v=jWNspstSvwc

www.youtube.com


5. リチウムイオンバッテリー充電基板改修

  • 現状:基板はできて、充電と放電を制御できた。ただ、使ってみてわかったが、3.7V(リチウムイオン電池電圧)をそのまま出すだけだと、何かと不便。しかも、ショットキーダイオードの電圧降下で0.2Vくらいは落ちる。
    リチウムイオンバッテリー充電基板
  • 目的:Scoppy 用の携帯電源化。
  • 改修内容:

    • 5VDC 出力 DCDC を追加(ショットキーダイオードによる電圧降下を考慮し 5.2VDC 程度を想定)。
  • 電力要件:

    • PL2407AFE 消費電流:20mA (typ.)。
    • リポバッテリー:3.7V/640mAh = 約2.4W。
    • 必要出力:5V/200mA = 約1W 供給可能な設計を目標。

VL53L0X型ToFセンサーの動作不良調査

購入経緯

現在IoTポストで使用しているのは、スイッチサイエンスのボード。Amazon購入品の不良原因を調査中。 Amazonで購入したボードが動作しないときは、「安物買いの銭失い」かなあ、などと思って後悔したものだけれど、流石に1000円超えの買い物ボードが動かないのは悔しいので、時間を見て調査している次第。


VL53L0X仕様確認


プルアップ抵抗の影響

  • スイッチサイエンス基板

    • I2Cライン(SDA/SCL)にプルアップ抵抗(R5, R6)が未実装。
      スイッチサイエンス基板の回路図。
      スイッチサイエンス基板の表側
      スイッチサイエンス基板の裏面。こちらには部品が実装されていない。
  • Amazon基板

    • I2Cラインに10kΩのプルアップ抵抗あり。
    • 信号立ち上がりが遅くなり、動作不良の可能性。

Amazon基板の表側。
Amazon基板の裏側。

👉 実際に使用しているのは 400kHz。 → 推奨プルアップ抵抗:2.2kΩ(または1.5kΩ) が妥当。 → E3系列の2.2kΩは入手性が良く、実装向き。 → Amazon基板の 10kΩ は仕様範囲外。


回路構成の比較

  • Amazon基板

    • レギュレーター:Torex XC6206シリーズ(入力1.8~6.0V → 出力3.3V)
    • レベルシフトIC:JCET製 2N7002DW
  • スイッチサイエンス基板

    • レギュレーター:ROHM BU33TD3WG-TR
    • レベルシフトIC:Nexperia BSS138PS

→ 部品メーカーは異なるが、回路構成はほぼ同一。 → 動作の違いは主にプルアップ抵抗値による可能性が高い。


今後の調査方針

  1. I2C信号波形を確認

    • 使用機材:Scoppy + PL2407AFE(帯域幅500kHz)
    • 400kHzでは帯域幅が不足気味なので、まずは100kHz(Standard-mode)で観測。
  2. プルアップ抵抗を外付けして動作確認

    • SDA/SCLラインに2.2kΩ程度の抵抗を追加
    • 動作が改善すれば、原因はプルアップ不足と確定。
  3. 電源電圧を確認

    • VL53L0XのVDDに3.3VDCが正しく供給されているかをチェック。

まとめ

  • Amazon購入品のVL53L0X基板は、I2Cプルアップ抵抗が10kΩであり、Fast-mode (400kHz) の条件を満たしていない。
  • 今後は、外付けで2.2kΩ程度のプルアップ抵抗を追加し、波形観測によって動作不良の原因を切り分ける予定。