Bluetoothで値が読めるUSB電圧・電流モニター「UM24C」を使ってiPhone Xの充電状況を測ってみる

Bluetooth接続ができるUSB電圧・電流テスター「UM24C」を買ってみました。

公式のAndroid端末やWindows用のソフトを使って値を読み出すことができます。が、自作のプログラムからこれを読み出してみました。

 

f:id:NeoCat:20180414222359p:plain

カラーLCDがついていてなかなか派手ですが見やすい。上下に左右2つのボタンがついていて、これで操作します。操作HELP表示(英語)つき。これ単体で電圧や電流変化のグラフを見ることもできたりして、なかなか高機能です。

入手方法

Amazonでも購入できます

慣れてる人なら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                                                                                      

      json = JSON.generate({

        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のバッテリー残量は、MaciPhoneを接続した状態で 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時間半の充電中の状況です。

f:id:NeoCat:20180414230918p:plain

ちょっと単位が入り混じってしまっていますが、92-93%くらいまで充電されたところで充電電流がカクッと減る様子などがみて取れます。

なお、電流積算値はiPhoneアプリ 「Battery Care」を使って取得した最大容量 2700mAhと結構ぴったり一致しました。(iPhone Xの最大容量は2800mAhですが、使っているうちに僅かに劣化したようです。) とはいえ充電中も電源はONなので、iPhoneの消費と誤差がたまたま相殺したのでしょうかね。