IR202赤外線カメラのデータを取得

IR202 という携帯電話に接続する赤外線カメラを買ってみました。
解像度80x60とちゃんと画像として見られるレベルながら比較的安価です(最近円安のせいか値上がりしていますが…)。
PerfectPrime IR202 赤外線サーマルイメージャーカメラ (Android TypeC)

通常は対応する携帯のアプリを入れて使用します。
IR202 Thermal Camera Viewer - Google Play のアプリ
https://play-lh.googleusercontent.com/ovxdbSB7FARB0o621YUwia3-WEvh9elqrjbAuOWlIsV7XNUXl-96Ml2gA4FUCF5oXWe5=w5120-h2880

実は普段私はiPhoneを使っていますが、敢えてAndroid版を購入。USB Type-C接続なので、PCに繋いでデータが取れるんじゃないかと思ったからです。

さっそくPC (Linuxで試しましたが、MacWindowsでも同様に認識されます) に繋いで見ると、Virtual COMというデバイスとして見え、USBモデム(シリアルポート)として認識されました。

$ lsusb | grep COM
Bus 003 Device 021: ID 0416:b002 Winbond Electronics Corp. USB Virtual COM
$ dmesg | tail
[12151.951595] usb 3-1.4: new full-speed USB device number 21 using xhci_hcd
[12152.069983] usb 3-1.4: New USB device found, idVendor=0416, idProduct=b002, bcdDevice= 3.00
[12152.069989] usb 3-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[12152.069991] usb 3-1.4: Product: USB Virtual COM
[12152.069993] usb 3-1.4: Manufacturer: Nuvoton
[12152.109110] cdc_acm 3-1.4:1.0: ttyACM0: USB ACM device

データシートなどは見つけられなかったので、アプリの動作を調べてみました。起動時に初期化/データ送信開始コマンド、終了時にデータ送信停止コマンドを送っているようでした。
シリアルポートに 115200bps で接続し、下記コマンドを送ってやると、想定どおりデータを取得できました。
#[size (hex 4B)][command (4B)][data][CRC (hex 4B)] という構造をしているようです。デバイスからのデータも同様の形式でした。

内容 コマンド
初期化 #000CWREGB40402F3
データ送信開始 #000CWREGB10302DE
データ送信停止 #000CWREGB10002DB

バイスからのデータを眺めると、GFRA というcommandで、ヘッダらしきもの(詳細不明)の後に80×62のピクセル値(little endian 16bit)が続くという形式でした。仕様よりも実際は2行多いようです。
これを温度に変換したいのですが、変換規則を調べるためにカップウォーマーとか保冷剤とかいろんな温度の物を撮ってアプリの結果と比べるという方法で対応を調べました。1次関数で大丈夫そうです。ただ、他の放射温度系と較べてみると、アプリの出力は高温は高く、低温は低く表示されがちでした。対象物との距離にも多少影響されます。あくまで周囲との高低を見る程度にして温度はあまり厳密でないと思ったほうが良さそうですね。

IR202 Graph

あとはこれを画像化してやればOK。Rubyでデータを取得してWebSocketで送りJavaScriptCanvasに描画してみました。
生データだと結構なノイズが乗るので、適当にフィルタを噛ましています(何か色々やってますがなるべく応答速度を犠牲にしすぎずにノイズを減らそうとした結果です)。
コードはこちら。

クリックした位置の温度、最高/最低温度およびその場所が表示されます。
下のスクリーンショットで青くなっているのはエアコンの吹き出し口です。

PCでデータ処理できるようになったので、温度監視とか動きの認識とかに応用できそうですね。