世の中には多くの赤外線リモコンがある。
これらの赤外線リモコンをパソコンが受信するにはどうしたら良いだろう?
「何に使うの?」
と聞かれそうだけど、例えば
パソコンの操作を赤外線リモコンでできる
ようになる。
これによりリモコン操作のUX(ユーザ体験)をパソコン上で実現できるため、ハッカソンやアイデアソンで重宝する。
そもそもパソコンには赤外線の受光部がないため受光機器の接続が必要。
USB-UIRT (Universal Serial Bus-Universal Infrared Transceiver) は、USBポートに接続して赤外線信号を送受信できるデバイス。
海外品だが日本にも輸入可能(7,000円程度)。

これにより、PCを介して家電製品のリモコン操作や、逆に家電製品からの赤外線信号をPCで受信することが可能。
パソコンのモニターには赤外線受光部がついたものもあるっぽいけど非常に稀だ。

実現までの試行錯誤をブログにしてるが結論は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ポートでもドライバーの書き換えができるソフトなので、細心の注意を払って操作すること。
実行して動作検証する
- OS: Windows11(64ビット)
- Python: Python 3.13(64ビット)
- DLL: libusb-1.0.dll
- ドライバ: libusbK または WinUSB(Zadigで設定済み)
USBデバイスが認識するなら考え方は以前の記事と同じ。

ソースコードは割愛するが、結果としてUSB-UIRTデバイスは検出されているが、IR信号の正しいRAWデータが取得できなかった。
pyftdiの限界かもしれない。
pyftdiはFTDIチップ(USB-UIRTのFT232Rなど)の低レベル制御を提供する。
しかしUSB-UIRTのIR受信プロトコル(特にRAWモード)を正しく処理するための専用コマンドやデータフォーマットを完全にサポートしてないのだと思う。
Zadigで設定したものをアンインストールする方法
これはハマった……。
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の受信機能を保有しておりソースコードも存在する。

これをビルドして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を取り出す
最初からこうするべきだった……でも今までの学習は無駄じゃない!

SageTVSetupx64_xxx.exeをインストールし「C:\Program Files\SageTV\redist\usbuirt\amd64\uuirtdrv.dll」からDLLファイルを見つける。
取り出したDLLは確かに64ビット。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
>"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64\dumpbin.exe" \dumpbin.exe" /headers uuirtdrv.dll Microsoft (R) COFF/PE Dumper Version 14.44.35211.0 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file uuirtdrv.dll PE signature found File Type: DLL FILE HEADER VALUES 8664 machine (x64) 7 number of sections 4E1763D2 time date stamp Sat Jul 9 05:08:50 2011 0 file pointer to symbol table 0 number of symbols F0 size of optional header 2022 characteristics Executable Application can handle large (>2GB) addresses DLL OPTIONAL HEADER VALUES 20B magic # (PE32+) 8.00 linker version |
そしてSageTV、EventGhostと色々なツールをインストールしたので「devcon.exe」「tasklist」を利用して、デバイス接続確認とタスク終了させる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
デバイス接続確認 >devcon findall *VID_0403* USB\VID_0403&PID_6010\GGGGGGGG : USB Composite Device USB\VID_0403&PID_6010&MI_00\6&954A5A&0&0000 : Mstar USB Debug Tool USB\VID_0403&PID_F850\5&21D57120&0&9 : USB-UIRT Device USB\VID_0403&PID_6010&MI_01\6&954A5A&0&0001 : Mstar USB Debug Tool 4 matching device(s) found. ドライバ状態 >devcon status "*VID_0403&PID_F850*" USB\VID_0403&PID_F850\5&21D57120&0&9 Name: USB-UIRT Device Driver is running. 1 matching device(s) found. SageTV、EventGhost、その他USB-UIRTを使用するプロセスを終了 >tasklist | findstr "SageTV" >taskkill /IM SageTVService.exe /F >tasklist | findstr "EventGhost" >taskkill /IM EventGhost.exe /F |

filbad6e2cce5ebc45a401e19c613d0a28fというファイルがdevcon.exeそのものであるから適当な場所へコピーしてdevcon.exeにリネームする。
【4日目】64ビットDLLを使ったリモコンによるPC操作
SageTVのインストールにより64ビットのuuirtdrv.dllを手に入れたら、Pythonで受信スクリプトを作成する。
ソースコードは最後にリンク。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>C:\Python313\python usb_receiver.py 2025-07-11 09:58:35.021223: IR信号を待機中... 2025-07-11 09:58:37.530534: Prontoコード: 190002A022E2 2025-07-11 09:58:38.353705: Prontoコード: 190002A0A2E2 2025-07-11 09:58:39.927320: Prontoコード: 19000220A0EA 2025-07-11 09:58:42.473186: Prontoコード: 19000220A0E2 2025-07-11 09:58:44.917883: Prontoコード: 190002A028EA 2025-07-11 09:58:48.047810: Prontoコード: 190002A028E2 2025-07-11 09:58:49.487692: Prontoコード: 190002A028E0 2025-07-11 09:58:50.211958: Prontoコード: 190002A028CA 2025-07-11 09:58:53.426349: Prontoコード: 190002A0A8E2 2025-07-11 09:58:53.957535: Prontoコード: 1F00D18220E0 2025-07-11 09:58:55.883127: Prontoコード: 1F00848A28CA |
なんかイメージしていたサークスコードとは違うけど、赤外線ボタン押すと異なるデータを受け取れているので、これにて一旦終了。
おわりに
多くの読者には意味不明なブログになってしまったが、技術的には重要で提供すべきと判断してまとめた。
AI(XのGrok AI利用)によるサポートが無ければ実現できなかった。
因みにUSB—UIRTによる赤外線送信はIRコード(EventGhostで取得可能)を知っているなら簡単。
1 |
uutx.exe -d1 "0000 0064 0000 000D 0064 0018 0032 0018 0019 0018 0032 0019 0019 0018 0032 0018 0032 0019 0032 0019 0032 0018 0019 0018 0019 0018 0019 0019 0019 0423" |
uutx.exeのオプション一覧は下記のとおり
1 2 3 4 |
UUTX Usage: uutx [-r<repeatCount> ] [-d<deviceNumber> ] [-s<sleepms>] " -or- uutx [-r<repeatCount> ] [-d<deviceNumber> ] [-s<sleepms>] -f<fileName> <IRCodeName> |
ただしEXEが見つかりにくいので、uutx_0_3に置いておく。
またLinuxでは、LIRC(Linux Infrared Remote Control)がUSB-UIRTのRAWモードを含むIR信号の送受信をサポートしている。

ソースコード
Githubに置いてある。
