ESP32などに最適なLDOを探す旅 その7 ESP32での実験

概要

前回は各LDOのドロップアウトの実験をしました。今度はPPK2を使って電流変化を測定してみたいと思います。

ESP32のスケッチ

#include <WiFi.h>

void setup() {
  WiFi.begin("TEST", "TEST");
  delay(3000);
  WiFi.disconnect(true);
}

void loop() {
}

結果が同じになるように存在しないSSIDに対して接続をするスケッチを動かすことにしました。

PPK2の自動化

PPK2は正式にはSDKはなく、PythonなどであるAPI群はすべて非公式のものになります。そして、APIの場合には公式アプリと同じ精度では情報取得できない点にあります。また、自分でグラフを描いてしまうとせっかくPPK2を使った意味がないというか、精度が信じられなくなってしまいます。

そのため純正アプリでの計測をしたいと思うのですが、純正アプリには結構な欠点があります。それは計測開始と電源出力が個別にあり、連携していません。測定開始ボタンを押してから、出力をONにする操作をするのですが、どうしてもタイミングがバラけてしまいます。

そこでPythonで自動操作をして、同じタイミングでの計測を実現したいと思います。

import datetime
import os
import sys
import time
import pyautogui
import pygetwindow

os.chdir(os.path.dirname(os.path.abspath(__file__)))

name = sys.argv[1]
setv = sys.argv[2]

start_x, start_y = pyautogui.position()
start_window = pyautogui.getActiveWindow()

ppk2win = pygetwindow.getWindowsWithTitle("Power Profile")[0]
ppk2win.activate()
ppk2win.width = 1310
ppk2win.height = 1000

print(ppk2win)

# V
pyautogui.moveTo(ppk2win.left + 190, ppk2win.top + 190)
pyautogui.doubleClick()
pyautogui.write(setv)

# Clear
pyautogui.moveTo(ppk2win.left + 138, ppk2win.top + 485)
pyautogui.click()

# Start
pyautogui.moveTo(ppk2win.left + 138, ppk2win.top + 442)
pyautogui.click()

time.sleep(0.5)

# Output on
pyautogui.moveTo(ppk2win.left + 220, ppk2win.top + 235)
pyautogui.click()

time.sleep(5)

# Output off
pyautogui.moveTo(ppk2win.left + 220, ppk2win.top + 235)
pyautogui.click()

# Stop
pyautogui.moveTo(ppk2win.left + 138, ppk2win.top + 442)
pyautogui.click()

filename = datetime.datetime.now().strftime(
    "img/%Y%m%d_%H%M%S_" + name + "_" + setv + ".png"
)

wx = ppk2win.left
wy = ppk2win.top

if ppk2win.left < 0:
    ppk2win.left = 0
if ppk2win.top < 0:
    ppk2win.top = 0

left = ppk2win.left
top = ppk2win.top
width = ppk2win.width
height = ppk2win.height

pyautogui.screenshot(filename, region=(left, top, width, height))

ppk2win.left = wx
ppk2win.top = wy

start_window.activate()
pyautogui.moveTo(start_x, start_y)

はい、できました。

pip install pyautogui

pyautoguiを入れることで、自動操作することが可能になります。

ppk2win = pygetwindow.getWindowsWithTitle("Power Profile")[0]
ppk2win.activate()
ppk2win.width = 1310
ppk2win.height = 1000

上記でPPK2のアプリを探して、アクティブにしてからサイズを固定します。

自動化しないといけないのは、左側メニューにあります。上から出力電圧、出力ボタン、計測開始ボタン、計測結果をクリアするボタンになります。

  1. 出力電圧をセット
  2. 履歴をクリア
  3. 計測開始
  4. 0.5秒待機
  5. 電源出力オン
  6. 5秒待機
  7. 電源出力オフ
  8. 計測停止
  9. 画面キャプチャ

上記の作業を自動実行しています。ポイントとしては画面キャプチャは座標が0以上である必要があります。マルチディスプレイなどで左や上にモニタを設置していると座標がマイナスになります。そのため画面キャプチャの瞬間だけプラス座標に移動してからキャプチャしています。

画像のトリミング

さて、上記で自動計測ができるようになりましたがPPK2のアプリだと本体のシリアル番号などが表示あれています。そこで不要な場所をマスクするかトリミングしたほうが使いやすい画像となります。

import os
from PIL import Image
import glob

os.chdir(os.path.dirname(os.path.abspath(__file__)))

files = glob.glob("img/*.png")

for file in files:
    print(file)
    img = Image.open(file)
    img_cropped = img.crop((15, 90, 1280, 790))
    img_cropped.save("img2/" + os.path.basename(file))

シンプルなスクリプトですがこんな感じの処理になりました。

os.chdir(os.path.dirname(os.path.abspath(__file__)))

上記はあまり必要ないのですがvscode上で実行するとカレントディレクトリが別の場所にあるので、スクリプトファイルの場所に移動しています。

files = glob.glob("img/*.png")

imgフォルダに入っているpngファイルをすべて検索します。

for file in files:
    print(file)
    img = Image.open(file)
    img_cropped = img.crop((15, 90, 1280, 790))
    img_cropped.save("img2/" + os.path.basename(file))

画像を開いて、crop関数で切り抜いて別のフォルダに保存しています。これでオリジナル画像は残ったまま、加工したファイルが別の場所に保存されました。

ESP32の動作電圧チェック

3V3端子にPPK2から電源入力をして、消費電力を計測してみました。LDOを経由していない経路での電源入力になります。利用したボードはType-Cで動くサードパーティーのESP32のDevKitになります。

3.3V

こんな感じのグラフとなりました。

番号を追加した画像です。①の起動直後にスパイクがありますが、これはある程度しかたないスパイクな気がします。②はWi-Fi接続時に500mA以上のスパイクがあります。このスパイクでLDOが電圧低下するのが問題のようです。③は接続していない状態でもWi-Fiをオンにすることで消費電力が上がっている状態です。④はWi-Fiをオフにしたことで消費電力が下がりました。

3.6V

上限電圧の3.6Vでも正常に動作します。ただし、消費電力をみると少しだけ増えています。高い電圧を与えても消費電力が増えるだけなんですね。

3.0V

下限電圧の3.0Vです。正常に動作していまして、消費電力は減っています。

2.6V

完全に下限を下回っていますが動いています。無印ESP32なのですが、結構動くものなんですね。

2.5V

なにやら電源が入った直後の波形がおかしいです。初期化に失敗したのかな。少し怪しいですが動いています。今回は実際にSSIDには接続していないので2.5Vでも動いているようにみえますが、実際に使うとなるとこの電圧は完全にアウトだと思います。

実際に接続して通信をする処理のほうが好ましいのですが、接続できるまでの時間が毎回違うので評価しにくいんですよね。。。

2.4V

完全におかしい波形になったので、起動しなくなったと思います。

LDO経由での実験

いろいろ試しましたが、端的にいうと失敗したというか得られるものがなかったです。PPK2からの電圧を前回の実験用LDO基板を経由してESP32に入れたところほぼPPK2単体と同じ動きでした。つまり、出力電圧が2.5Vぐらいまではなんとか動きました。

オシロスコープでLDOからの出力電圧をみていたのですが、ほぼ動かず。PPK2経由の電源だと供給側が安定しているのであまり電圧低下しないみたいでした。たぶん、測定ポイントがおかしいので、正しい場所で測定できれば取得できるかもしれません。

ちなみにオシロスコープ側の自動計測も色々検討したのですがSCPIなどの自動計測用のプロトコルを利用するよりは、上記のような画面キャプチャをPPK2と同じように取得したほうがわかりやすいと思いました。実データより画像データがほしいので、細かい制御を書くよりは画面上で設定をしてシングルトリガーで取得した画面をキャプチャしたほうがシンプルな気がしました。

PicoScopeはSDKがあるのですがSCPIではなくて独自形式なんですよね。HantekのオシロスコープはLANもしくはUSB経由でSCPIで取得可能ですが条件設定などをスクリプトからすべて設定する必要があるので面倒です。

まとめ

というわけで、かなり計測の自動化ができるようになってきたのですがLDOの性能評価は難しいです。実験に利用したESP32のDevKitなのですが、実はUSB経由で5Vを供給してもWi-Fiに接続しようとするとハングアップすることがあります。ただし、しばらく通電しておくと動くようになります。。。

いろいろな要素がからんでいるみたいでして、安定的な評価は難しいという結論に達しました。電子負荷を使ってオン・オフの動きを確認するなど他の評価方法も試してみたいと思います。

コメント