Bluetooth接続ができるUSB電圧・電流テスター「UM24C」を買ってみました。
公式のAndroid端末やWindows用のソフトを使って値を読み出すことができます。が、自作のプログラムからこれを読み出してみました。
カラーLCDがついていてなかなか派手ですが見やすい。上下に左右2つのボタンがついていて、これで操作します。操作HELP表示(英語)つき。これ単体で電圧や電流変化のグラフを見ることもできたりして、なかなか高機能です。
入手方法
慣れてる人ならAliExpressで購入した方が安く買えます。Alibaba グループ | AliExpress.comの 電圧メートル からの UM24C 2.0カラー液晶ディスプレイusb電圧テスター電流計電圧計amperimetroバッテリー充電ケーブル抵抗30% 中の UM24C 2.0カラー液晶ディスプレイusb電圧テスター電流計電圧計amperimetroバッテリー充電ケーブル抵抗30%
↑ UM24 (Cがつかない) も選べますが、そちらはBluetooth通信機能がありませんのでご注意を。購入から1週間くらいで届きました。
※ 上位版?のUM25Cというのも出ているようですね。USB Type-Cボートがついているらしい。
早速読み出してみる
USB電源につないだ状態でBluetoothデバイスを表示させてみると、普通のSPP(シリアルボートプロファイル)として見えます。
Windowsマシンでは、UM24Cを追加すると、PINを聞かれ、「1234」を入力すれば接続できます。COMボートが2つ追加され、どちらか一方に接続して利用します。公式のソフトがあり、これを導入すれば良いのですが、これがNational Instrumentsの計測プラットフォーム(NI-VISA)が丸っと入るため、かなり巨大です。
Macではペアリング自体は簡単にできるのですが、追加されるPort ( /dev/tty.Port-UM24C )に接続してもデータが読めず。(Windowsでも2つのうち1つのCOMポートは全く応答がないので、これだけが見えてしまっているのでしょうか…?)
USB-Bluetoothアダプタを接続したLinuxボード (Debianで試しました) からは以下の手順で接続できました。
$ sudo apt install bluez bluez-utils # 必要なパッケージの導入
$ sudo bluetoothctl -a
・デバイスをスキャン
[bluetooth]# scan on
[NEW] Device 00:BA:55:XX:XX:XX UM24C
・発見されたUM24Cをペアリング
[bluetooth]# pair 00:BA:55:XX:XX:XX
Attempting to pair with 00:BA:55:XX:XX:XX
Request PIN code
[agent] Enter PIN code: 1234
[CHG] Device 00:BA:55:XX:XX:XX UUIDs: 00001101-0000-1000-8000-00805f9b34fb
[CHG] Device 00:BA:55:XX:XX:XX Paired: yes
Pairing successful
[bluetooth]# trust 00:BA:55:XX:XX:XX
[CHG] Device 00:BA:55:XX:XX:XX Trusted: yes
Changing 00:BA:55:XX:XX:XX trust succeeded
・rfcommで接続
$ sudo rfcomm bind 0 00:BA:55:XX:XX:XX
これで、 /dev/rfcomm0 として UM24C に接続できるようになりました。
あとは、適当なプログラムでこのポートを開き、「0xf0」の1バイトを送信すると、130バイトほどのレスポンスが返ってきます。なお jerm コマンドは jerminal というターミナル接続ソフトです。
$ (printf "\xf0"; sleep 2) | jerm /dev/rfcomm0 | xxd
...
00000000: 0963 0207 000a 0000 0033 0016 0048 0000 .c.......3...H..
00000010: 0000 020b 0000 09da 0000 0003 0000 000f ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0030 0030 0000 0000 0000 0000 0000 000a .0.0............
00000070: 0000 0000 0000 0001 0002 0000 1446 0000 .............F..
00000080: fff1 ..
16bit Big Endian値が並んでいる感じで、最初は固定値?0x963、
電圧 0x207 = 519 -> 5.19V
電流 0x0a = 10 -> 0.010 A
…
他にも電流積算値や抵抗値など、画面上に出ているものは大体そのまま全て並んでいることがわかります。
ちなみに、他にも「0xf1」を送ると画面切り替え、「0xf2」を送ると画面回転、「0xf3 」「0xf4」で積算値グループの切り替えやクリアができたりします。
プログラムでロギングしてみる
Rubyでログを記録するプログラムを書いてみました。
#!/usr/bin/ruby
require 'serialport'
require 'timeout'
require 'json'
Signal.trap(:PIPE) { exit }
sp = SerialPort.new('/dev/rfcomm0')
sleep 2
failure = 0
loop do
sp.write "\xf0"
begin
Timeout.timeout(2) do
s = sp.read(130)
if !s || s.length < 130
warn 'incomplete data'
failure += 1
next
end
data = s.unpack('n*')
# p data
T: Time.now,
V: data[1]/100.0,
A: data[2]/1000.0,
W: data[4]/1000.0,
C: data[5],
mAh: 256 * data[8] + data[9],
mWh: 256 * data[10] + data[11],
ohm: data[62]/10.0,
})
puts json
STDOUT.flush
failure = 0
end
rescue Timeout::Error
warn 'timeout'
failure += 1
end
if failure > 5
warn 'Too many failure. quit.'
exit 1
end
sleep 1
end
これを実行すると1秒ごとにJSON形式で計測値が出力されます。
{"T":"2018-04-14 23:01:48 +0900","V":5.17,"A":0.089,"W":0.46,"C":21,"mAh":6,"mWh":31,"ohm":58.0}
{"T":"2018-04-14 23:01:49 +0900","V":5.17,"A":0.089,"W":0.46,"C":21,"mAh":6,"mWh":31,"ohm":58.0}
{"T":"2018-04-14 23:01:50 +0900","V":5.17,"A":0.089,"W":0.46,"C":21,"mAh":6,"mWh":31,"ohm":58.0}
...
iPhone Xの充電状況を計測してみる
これを使ってiPhone Xの充電中の電流などを計測してみました。
なお、iPhoneのバッテリー残量は、MacにiPhoneを接続した状態で libimobiledevice を使って取得することができます。
$ brew install libimobiledevice # インストール
$ idevice_id -l
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # <- IDを確認
$ ideviceinfo -u XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -q com.apple.mobile.battery
BatteryCurrentCapacity: 96 # <- バッテリー残量
BatteryIsCharging: false
ExternalChargeCapable: false
ExternalConnected: false
FullyCharged: false
GasGaugeCapability: true
HasBattery: true
これを定期的に記録して、UM24Cで測った計測値と合わせてグラフ化してみました。
以下が残り5%の状態から100%までの、2時間半の充電中の状況です。
ちょっと単位が入り混じってしまっていますが、92-93%くらいまで充電されたところで充電電流がカクッと減る様子などがみて取れます。
なお、電流積算値はiPhoneアプリ 「Battery Care」を使って取得した最大容量 2700mAhと結構ぴったり一致しました。(iPhone Xの最大容量は2800mAhですが、使っているうちに僅かに劣化したようです。) とはいえ充電中も電源はONなので、iPhoneの消費と誤差がたまたま相殺したのでしょうかね。