USB-UIRTを使ってリモコンの赤外線をパソコンで受信できるようにする

世の中には多くの赤外線リモコンがある。

これらの赤外線リモコンをパソコンが受信するにはどうしたら良いだろう?

 

「何に使うの?」

 

と聞かれそうだけど、例えば

 

パソコンの操作を赤外線リモコンでできる

 

ようになる。

これによりリモコン操作のUX(ユーザ体験)をパソコン上で実現できるため、ハッカソンやアイデアソンで重宝する。

そもそもパソコンには赤外線の受光部がないため受光機器の接続が必要。

USB-UIRT (Universal Serial Bus-Universal Infrared Transceiver) は、USBポートに接続して赤外線信号を送受信できるデバイス。

海外品だが日本にも輸入可能(7,000円程度)。

USB-UIRT Home
Send and receive Infrared Remote Control signals from your PC. Use your PC to control your Consumer Electronics equipment. Use you Infrared Remote Controls with...

これにより、PCを介して家電製品のリモコン操作や、逆に家電製品からの赤外線信号をPCで受信することが可能。

パソコンのモニターには赤外線受光部がついたものもあるっぽいけど非常に稀だ。

モニター内臓の赤外線受光部とEventGhostを使って自作PCをリモコン操作 | なにも思いつかなくなったブログ
こちらの記事は古くなっております。移転先のなにブロ自作&ジャンク隊にてEventGhostとリモコンを使って完全テレパソ化を書いておりますので、そちらをど...

実現までの試行錯誤をブログにしてるが結論は4日目を見ると良い。

【1日目】EventGhost(32ビット版) を使った簡単な方法

赤外線受信可能なら前述のブログのようにWindowsならEventGhost(32ビット版)を使えばよい。

EventGhost(32ビット版)はイベントに応じにアクションを設定できるソフトウェア。

  • キーボード入力
  • マウス操作
  • ファイル操作
  • システムイベント

赤外線受信に限らず、

 

特定のUSBデバイスが接続されたときに自動で音楽を再生

特定のウィンドウが開いたときに特定のアプリケーションを起動

 

など自由に設定できる便利なアプリ。

赤外線リモコンを使うには、リモコン長押しでEventGhostに学習させる。前述ブログに詳しい。

ゼロからPython(64ビット版)で実装する

こっちが本題。

10年前にも挑戦して無理だったが、今ならOSSとLLMから御神託を賜ることで実現できる気がしてる。

 

© 泡沫に神は微睡む/安田 のら/KADOKAWA

 

EventGhost(32ビット版)は「uuirtdrv.dll(32ビット版)」を使用し、USB-UIRTの専用プロトコル(ProntoコードやRAWデータ形式)を適切に処理している。

しかし、64ビット版のPythonを使用する場合には「uuirtdrv.dll(64ビット版)」が公式サイトに提供されていないので試行錯誤が必要だ。

【2日目】libusbやpyusb、pyftdiを使用

次のライブラリを使えばUSB-UIRTで赤外線受信ができる。

  • pyusb: USBデバイス通信用
  • pylibftdi: FTDIデバイス制御用(USB-UIRTはFTDIチップを使用)
  • libusb

その際にはドライバーの強制的な変更が必要。

Zadigで汎用USBドライバーに設定変更

Zadig.exeは、

  • WinUSB
  • libusb-win32
  • libusb0.sys
  • libusbK

などのソフトウェア無線が使う汎用USBドライバーが包含された、USBデバイスへのアクセスを支援するWindowsアプリケーション。

Zadig - USB driver installation made easy

このソフトを使って強制的にドライバーを書き換えてしまう。

Zadig はどのUSBポートでもドライバーの書き換えができるソフトなので、細心の注意を払って操作すること。

実行して動作検証する

  • OS: Windows11(64ビット)
  • Python: Python 3.13(64ビット)
  • DLL: libusb-1.0.dll
  • ドライバ: libusbK または WinUSB(Zadigで設定済み)

 

USBデバイスが認識するなら考え方は以前の記事と同じ。

未知のUSB機器をPythonで認識させてPC上で「越後製菓」と吠えさせる
古い購入物を整理していたら、不明なUSB機器出てきた。AVerMedia Live Gamer HD AVT-C985。配信に対応したPC内蔵型のキャプチャーボードっぽいけど肝心のキャプチャボードは存在してお...

 

ソースコードは割愛するが、結果としてUSB-UIRTデバイスは検出されているが、IR信号の正しいRAWデータが取得できなかった。

ログ(Raw timings (pre-scaled): [254])から、受信データが常に0xFE(254)のみで、期待されるIR信号(リーダーパルス、スペース、マーク、終端子0xFFなど)が取得できていない。

pyftdiの限界かもしれない。

pyftdiはFTDIチップ(USB-UIRTのFT232Rなど)の低レベル制御を提供する。

しかしUSB-UIRTのIR受信プロトコル(特にRAWモード)を正しく処理するための専用コマンドやデータフォーマットを完全にサポートしてないのだと思う。

Zadigで設定したものをアンインストールする方法

これはハマった……。

DriverStore Explorerを利用する必要がある。

デバイスドライバーのインストール / 削除 / エクスポート を行うことができるドライバー管理ツール。
DriverStore Explorer - k本的に無料ソフト・フリーソフト
デバイスドライバーのインストール / 削除 / エクスポート を行うことができるドライバー管理ツール「DriverStore Explorer」。

これを使わないと何度デバイスをアンインストールしてもlibusbKに戻るようになってしまった。

【3日目】uuirtdrv.dllの64ビット版を手に入れる(sagetv利用)

SageTVは、クロスプラットフォームのネットワーク対応DVR(デジタルビデオレコーダー)およびメディア管理システム。

  • テレビ番組の録画・再生(DVR)
  • メディアファイル(動画、音楽、写真)の管理・ストリーミング
  • リモコンやネットワーク経由でのデバイス制御(USB-UIRTやLIRCをサポート)
  • プラグインやカスタムUIで機能を拡張可能

2011年にGoogleが買収し、2015年にオープンソース化(Apache License 2.0)。

このSageTVはUSB-UIRTの受信機能を保有しておりソースコードも存在する。

sagetv/third_party/USB-UIRT at master
SageTV is a cross-platform networked DVR and media management system - google/sagetv

これをビルドしてDLLを作ってみる。

Visual Studio 2022を使ってビルドする

インストール時には「C++によるデスクトップ開発」を選択することをお忘れなく。

手順は次のとおり。

  • Visual Studio 2022を起動
  • 「ファイル」→「新しいプロジェクト」→「C++」カテゴリを選択
  • 「空のプロジェクト(Empty Project)」を選択
  • プロジェクト名:例 uuirtdrv

既存コードを追加する。

プロパティページから設定も変更が必要。

  • 構成の種類:ダイナミックライブラリ(.dll)
  • 追加のインクルードディレクトリ: ftd2xx.hの場所(例:C:\Program Files\FTDI\D2XX)
  • 追加のライブラリディレクトリ: ftd2xx.libの場所(例:C:\Program Files\FTDI\D2XX)
  • リンカ入力: ftd2xx.libを追加

ソースコード修正も必要だったが割愛。

だってDLLは出来たが内部に必要な実装が入ってなくゴミができたからね……

チクショウ……次の案!

インストールしてDLLを取り出す

最初からこうするべきだった……でも今までの学習は無駄じゃない!

Releases
Windows releases for SageTV. Contribute to OpenSageTV/sagetv-windows development by creating an account on GitHub.

SageTVSetupx64_xxx.exeをインストールし「C:\Program Files\SageTV\redist\usbuirt\amd64\uuirtdrv.dll」からDLLファイルを見つける。

取り出したDLLは確かに64ビット。

そしてSageTV、EventGhostと色々なツールをインストールしたので「devcon.exe」「tasklist」を利用して、デバイス接続確認とタスク終了させる。

「devcon.exe」は次から簡単に手に入る。

https://download.microsoft.com/download/1/4/0/140EBDB7-F631-4191-9DC0-31C8ECB8A11F/wdk/Installers/787bee96dbd26371076b37b13c405890.cab

filbad6e2cce5ebc45a401e19c613d0a28fというファイルがdevcon.exeそのものであるから適当な場所へコピーしてdevcon.exeにリネームする。

【4日目】64ビットDLLを使ったリモコンによるPC操作

SageTVのインストールにより64ビットのuuirtdrv.dllを手に入れたら、Pythonで受信スクリプトを作成する。

ソースコードは最後にリンク。

なんかイメージしていたサークスコードとは違うけど、赤外線ボタン押すと異なるデータを受け取れているので、これにて一旦終了。

おわりに

多くの読者には意味不明なブログになってしまったが、技術的には重要で提供すべきと判断してまとめた。

AI(XのGrok AI利用)によるサポートが無ければ実現できなかった。

 

因みにUSB—UIRTによる赤外線送信はIRコード(EventGhostで取得可能)を知っているなら簡単。

uutx.exeのオプション一覧は下記のとおり

ただしEXEが見つかりにくいので、uutx_0_3に置いておく。

またLinuxでは、LIRC(Linux Infrared Remote Control)がUSB-UIRTのRAWモードを含むIR信号の送受信をサポートしている。

Lirc_USB-UIRT - Community Help Wiki

ソースコード

Githubに置いてある。

GitHub - nehori/py-usb-uirt_receiver
Contribute to nehori/py-usb-uirt_receiver development by creating an account on GitHub.
タイトルとURLをコピーしました