Qiのパケットを解析してみる

iPhoneにも 8 / X でQiが搭載されました。

Qiでは受電機器から充電器に対して通信を行うことで、充電の開始/停止や電力の調整を行いながら動作しています。これにより異常があれば即時充電を止めるようになっているわけですね。

通信速度は2kbpsで、受電側の負荷を変化させることで充電側に電力の変化として通信データを伝える後方散乱変調という仕組みが使われています。詳しくは以下のデータシートなどが参考になります。

https://toshiba.semicon-storage.com/info/docget.jsp?did=14812&prodName=TC7763WBG

 

実際にどんな通信がなされているか気になったので、この通信パケットをキャプチャしてみました。

回路

 回路図はこんな感じ。

f:id:NeoCat:20170925050717p:plain

適当に数回輪にした電線(INPUT)を受電機器と充電器の間に挟み、そこから信号を取り出します。Qi自体は120kHzくらいの交流波形を使って送電を行なっていますが、信号はこの2kHz前後の電流変化として現れるので、ダイオードで検波して直流成分を取り除き、オペアンプで増幅しています。

f:id:NeoCat:20170925012702j:plain

f:id:NeoCat:20170925011237j:plain

 ラフな感じにブレッドボード上に組みました。

f:id:NeoCat:20170925012001j:plain

受電機器はiPhone 8…ではなく、iPhone 6にQiアダプタをつけたやつです。

Ewin® Qi ワイヤレス充電器 Qiレシーバー USBケーブル付きiphone 7/7 plus/6 plus/6/6s/5/5s/5 se /Samsung Galaxy/Nexus/Xperia Qi対応全機種 置くだけ充電 シングルコイル Qi(チー)規格 無接点充電パッド

 

結果

オペアンプの出力(赤線)と、増幅前の波形(黄線)はこんな感じになります。この例ではPeak-to-peakで100mVくらい変化が取れているので、これを0.6V - 4Vくらいに増幅しています。置く位置には結構シビアで、いい感じに波形がでる受電機器と電線の位置を模索する必要があります(少しずれてるくらいの方が綺麗に取れる模様)。

各500msのスロットで2回HI/LOが切り替わってるのが1、1回しか切り替わってないのが0です。最初はプリアンブルで何bitか1が続き、各byteは0(start), bit0, bit1, ... bit7, parity(奇数), stop(1) の11個の信号で表現されます。

f:id:NeoCat:20170925012351j:plain

パケットの解析には、Arduino Pro Miniを使いました。(このところESPばかり使っていて本物のArduinoを久しぶりに使った…)スケッチはGistに。

Qi packet analyzer · GitHub

解析の結果、充電開始直後から出てきたデータがこちら。デコードしたデータをbyteごとに16進数表示しています。

f:id:NeoCat:20170925051502p:plain

本当は最初にping応答として送信開始パケット(「1」で始まる)を送っているはずですが、これは上図では拾えていません(稀に取れます)。

最初に出てきた「71」はIdentification Packetです。QIバージョン(1.0)や製造元ID(0x0010)、Basic Device ID(0x4551)などを送っています。最後の1byteはチェックサムで、全てのbyteのXORになっています。

その次の「51」はConfiguration Packetで、最大電力(0x0A = 5W)などを送っています。

それ以降、繰り返し出てくる「3」はControl Error Packetで、電力の増減を指示するためのもの。「4」はReceived Power Packetで受電した電力(ロスを補正したもの)を示し、これが送電量と大きくずれている場合は電力が正しく伝わっていないので充電が停止されます*1

 

〜〜〜〜 

ちなみに、世の中にはQiのパケットをキャプチャするUSBデバイスが売られていて、これは近くに置くだけでパケットが受信できるそうです。

Qi Sniffer

*1:試してみたことろ、LEDつけるくらいの電力は何事もなく奪い取れちゃいましたが。