現: 2022-05-20 (金) 16:41:37 yuji ソース
Deleted an attach file: IRMan.dll at 2022-05-23 (月) 19:12:54 at 2022-05-24 (火) 08:13:38 at 2022-05-24 (火) 14:20:48 at 2022-05-24 (火) 14:24:50 at 2022-05-25 (水) 13:04:07 at 2022-05-25 (水) 14:05:12 at 2022-05-25 (水) 14:07:52, Deleted an attach file: avrir.png at 2022-06-10 (金) 16:57:53, Deleted an attach file: rcvsend.ino at 2022-12-17 (土) 06:58:45 at 2022-12-17 (土) 07:00:21, Deleted an attach file: avrlirc.ino at 2022-12-17 (土) 07:02:07 at 2022-12-20 (火) 12:11:31 at 2022-12-20 (火) 12:13:29 at 2023-02-13 (月) 15:57:12 at 2023-02-13 (月) 16:01:07 at 2023-03-17 (金) 09:47:21 at 2023-03-17 (金) 09:49:38 at 2023-03-17 (金) 09:50:40
Line 1: Line 1:
 +* IRリモコン [#t3f14e68]
 +Windows PCを赤外線リモコンを使って操作したいため,USBで接続出来るIRリモコンレシーバーを作成してみた。~
 +以前LinuxのMythTVやRaspberry Piで[[学習リモコン>/PC/RaspberryPi/WEBリモコン/学習リモコンを作る]]を作るときに[[LIRC>https://www.lirc.org/]]を使ったので,WindowsのLIRCである[[WinLIRC>http://winlirc.sourceforge.net/]]を使いたいが,元々WinLIRCというかLIRCは,古いシリアルポートのDCDに赤外線受信センサーを接続したハードウェアのためのツール。~
 +
 +このためシリアルポートが搭載されていない最近のPCでは使うのが難しい。シリアルポートが無いPCでシリアルポートを利用したい場合,普通は[[FTDI>https://ftdichip.com/]]等のチップを搭載した[[USB-Serialコンバーター>https://amzn.to/3nyqw4F]]を使うのだが,このようなコンバーターのDCDに赤外線センサーをつけてもWinLIRCのプログラムはうまく動作してくれない。~
 +これはWinLIRCではリモコン信号の解析などにクリティカルなタイミングでの操作が必要なのだが,USB-Serialコンバーターを使うとどうしてもダイレクトに操作が出来ないため。~
 +実際にFTDIのFT232RLなんかを使っていろいろやってみたが,受信データが正常に得られないためうまく動作しなかった。おそらくBig-Bangモードを使えばうまく行くと思うのだが,Bit-Bangモードがよくわからない。
 +
 +ただWinLIRCの0.9.0以降のバージョンでは,プラグインによってシリアルポート以外のハードウェアに対して多少対応するようになった。~
 +
 +PCのMic入力に赤外線センサーの出力を接続してAudioCapture.dllプラグインを使う方法もあるので試してみたが,なかなか安定してリモコンデータが取得できなかった。うまく動けばハードウェアとしては一番簡単だし,どんなPCでも使えるのでメリットがあるのだが。~
 +
 +COMポート接続のIRMan IR ReceiverやUSB接続の[[USB IR Toy>http://dangerousprototypes.com/docs/USB_Infrared_Toy]]も使えるようだ。これらのCOMポート接続タイプ・USB接続タイプでは機器側でリモコンデータを解析するようになっていて,WinLIRCではそのリモコンデータをプラグイン経由でそのまま使用するようにして対応している。~
 +
 +そこで作成したIRリモコン・レシーバーは,WinLIRCのIRManプラグインで使えるようにしてみた。~
 +これでWinLIRCと各種のコンパニオンツールが使えるようになると思われ,Windows PCでリモコン操作することが実現出来そう。~
 +
 +残念ながら''IRManプラグインではIR信号の送信はサポートされてないので,今回は受信専用となる。''
 +
 +** ハードウェア [#v3ee0b78]
 +[[FTDI>https://ftdichip.com/]]のUSBコンバーターが実装されている自作のATMEL AVRボード(ATmega168P)に,手持ちのIR受信センサーを接続した。市販のボードを使う場合は,[[Arduino Nano互換ボード>https://amzn.to/3LSjQZa]]なんかが良さそう。~
 +
 +回路図:IR受信センサーのVCC,GND,OUTピンをボードのAVRのポートに接続する。~
 +  IR受信センサー            ATMEL AVR Board
 +  SHARP GP1UD281XK          ATmega168P
 +  +---------+              +--------------+
 +  |  OUT 1 |---------------|PD2 受信      |
 +  |  VCC 2 |---------------|+5V          |
 +  |  GND 3 |---------------|GND          |
 +  +---------+              |              |
 +  +5V      +5V            |              |
 +   +--- R    +--- R        |          MOSI|-----+
 +         |15ohm    |15ohm  |              |    |
 +     IR A      IR A        |              |    SW
 +     LED K    LED K        |              |    |
 +         |        |        |              |    GND
 +         +---------+        |              |
 +         |                  |              |
 +         +------ D          |              |
 +                   G -- R --|PD3 送信      |
 +         +------ S    10ohm |              |
 +         |    2SK1748      |              |
 +         |                  |          USB |<============> PC
 +         |                  |              |  USB
 +         +------------------|GND          |
 +                           |              |
 +                           +--------------+
 +IR受信センサーは[[38KHzの物>https://akizukidenshi.com/catalog/g/gI-04659/]]なら何でも良い。~
 +&ref(avrir.png,,10%); 作成してみた基板。
 +
 +*** 動作チェックプログラム [#oadfe402]
 +以下のプログラム''rcvsend.ino''でハードウェアの動作チェックをした。~
 +使用する''[[Arduino IDE>/開発/AVR/Arduino#ab3a1e26]]と[[IRremote>https://github.com/Arduino-IRremote/Arduino-IRremote]]ライブラリ(version 3.x以降)は,自作のAVRボード(ATmega168P)を扱えるように若干改造している。''~
 +
 +#code(c,nonumber,rcvsend.ino)
 +
 +リモコン送信機のボタンを押すとリモコン信号を学習する。MOSIピンをLowにして送信モードにするとそのデータを送信する。機器が反応すれば動作していることになる。~
 +
 +シリアルコンソールで,リモコンの押されたボタンのコードが確認できる。
 +
 +** IRMan IR Recieverプロトコル [#hddf93e1]
 +#ref(irman.png,around,10%)
 +IRMan IR Reciever(もう販売はされていない)は,シリアルポートでPCと接続する。~
 +リモコン信号はIRMan IR Recieverで解析して,そのデータをPCに送るようになっている。~
 +#clear
 +- PCとのSerial通信パラメータ~
 + Baudrate:9600
 + Data:8bit
 + Stop bit:1 stop
 + Parity: non parity
 +- HostからRTSとDTRをHiにする~
 +これによりIRMan IR Recieverに電源が供給されて起動される。~
 +- Hostからスタートコマンドを送信~
 +Hostから''IR''と送信する。(''I''と''R''の間は最小500usの時間が必要。)~
 +- IRManデバイスから''OK''の返答~
 +Hostからの''IR''への返答。''OK''を返す。~
 +- IRManデバイスで受信したリモコンのリモコン・コードをHostに送信する~
 +リモコンから受信したデータを,
 + 0x1E, 0xXX, 0x00,0x00,0x00,0x00
 +という6byteのパケットデータでPCに非同期で送信するようだが,1Byte目は0x1E固定で,2byte目がリモコンコマンドを表していてその後はオプションのようだ(と思う)。~
 +- HOSTからIRManデバイスへIRリモコン・コードを送信~
 +WinLIRCのIRManデバイスでは,リモコン・コードの送信は残念ながら実装されていない。~
 +//|コマンド      |内容                                                            |h
 +//|0x00          |リセット,リモコンデコードモードに移行。                        |
 +//|0x01          |SUMP(SUMP logic analyzer)? モード                            |
 +//|0x02          |SUMP? ID(返答:"1ALS")                                        |
 +//|0x52 r/R      |ハンドシェイクコマンド。(返答:"OK")                          |
 +//|0x58 x/X      |raw IR/IOモードにする。(返答:"X01")                          |
 +//|s/S            |IRサンプリングモードに入る。(返答:"S01")                      |
 +//|t/T            |セルフテストの実行。                                            |
 +//|v/V            |ハードウェア・ファームウェアの表示。(返答:"V1##")            |
 +//|u/U            |USBシリアルコンバーターモードに入る。(返答:"U01")            |
 +//|0x24 $        |ブートローダーに移行。                                          |
 +//[[DANGERROUS PrototypesのUSB IR Toy>http://dangerousprototypes.com/docs/USB_Infrared_Toy]]も,このIRManプロトコル準拠のようである。~
 +
 +** ソフトウェア [#j8675cb2]
 +作成したIRリモコン・レシーバーをWinLIRCで使用するために,IRMan IR Reciver準拠の(実際のIRManは見たこと無いので知らないけど・・・)プログラム''avrlirc.ino''を作成して書き込んだ。~
 +
 +今回は2-5byteにリモコンデータをそのままマッピングした。WinLIRCのプラグインIRMan.dllでは,受け取ったパケットデータを全てデータとして利用しているのでこれでも問題ない。~
 +おそらく,0x1Eのヘッダーもなくても良いんだと思う。~
 +
 +#code(c,nonumber,avrlirc.ino)
 +
 +* PC側のソフトウェア [#mcb97dba]
 +Windows PCには,[[WinLIRC>http://winlirc.sourceforge.net/]]とWinLIRCに対応しているコンパニオンツールを使用する。
 +
 +[[WinLIRC>http://winlirc.sourceforge.net/]]は作成したIRリモコンとPCをUSBで接続して,以下のことを行う。~
 +- リモコンからのデータを受信する。~
 +- リモコンからのデータを解析・学習してリモコンを識別・管理する。~
 +- コンパニオンツールやアプリケーションへリモコンデータ情報を提供する。~
 +NetworkのTCP通信でリモコンの情報をツールやアプリケーションに送る。~
 +直接WinLIRCに接続出来るアプリケーションは,そんなに多くはない。~
 +- リモコン信号をリモコンに代わって機器に送信する。~
 +IRManプラグインでは対応していない。~
 +
 +[[iREx>https://ramscan.com/irex/]]や[[EventGhost>http://www.eventghost.net/]]はWinLIRCに対応しているコンパニオンツールで,WinLIRCが受信したリモコンデータからWindows PCでのキー入力やMouse操作をエミュレーションしたり,任意のアプリを起動したりすることが出来るようになる。~
 +
 +これらでPCをリモコンで操作出来るようになる。
 +
 +** WinLIRC [#cce417e4]
 +[[LIRC>https://www.lirc.org/]]のWindows版である[[WinLIRC>http://winlirc.sourceforge.net/]]をダウンロードする。ダウンロードするバージョンは[[0.9.0i>https://sourceforge.net/projects/winlirc/files/winlirc/0.9.0i/winlirc-0.9.0i.zip/download]]。~
 +インストールはダウンロードしたzipファイルを任意の場所に解凍すればOK。
 +
 +ダウンロードしたWinLIRCとプラグイン''IRMan.dll''を使ってみたところ,作成したIRレシーバーとうまく接続出来ないで,IRRecordでの学習モードに移行しないですぐに終了してしまう。~
 +
 +DTR信号が出力されると自作のIRレシーバーのCPUがResetされちゃう((Arduinoのボードはプログラムを内蔵ファームウェアを使って書き込むために,DTR信号でResetしファームウェアを起動させるようになっている。自作のボードでも同じようにしてあるため。))のと,ヘッダー送信前にゴミデータが受信されているのが原因と思われる。~
 +
 +しょうがないので,WinLIRC 0.9.0iのIRMan.dllのソースコードを少し修正してDTR信号が出力された後のwaitタイミングを長めに変更した。~
 +''この&ref(IRMan.dll,,修正したIRMan.dll);ファイルを,WinLIRCをインストールした場所にあるpluginsディレクトリのIRMan.dllと入れ替える。''~
 +
 +これでうまく動作するようになった。~
 +
 +*** WinLIRCでリモコンを学習する [#k4d34fd2]
 +WinLIRCを起動して,最初に使用するプラグインをInput PluginでIRMan.dllに設定する。~
 +そして使用するCOMポートをPlugin Setupボタンで設定する。~
 +その後作成するconfigファイルを指定した上で,Create Configボタンをクリックするとリモコンの学習を行うIRRecordプログラムが起動する。~
 +コマンドプロンプトを開いて,
 + > IRRecord -d IRMan.dll ..\px-w3u4.conf
 +とかしても同じ。~
 +
 +リモコン信号の学習は以下の手順。~
 +- 「Enterを押せ」と表示される~
 +説明を読んでEnterを押す。~
 +- 「任意のリモコンボタンを押し続けろ」と指示される~
 +リモコンのどれかのボタンを押しっぱなしにする。~
 +.....というようにドットが表示されていく。これでリモコン信号の解析を行っている。~
 +かなり入力されると,このフェーズが終了する~
 +- 「学習対象のラベルを入力して,リモコンのボタンを押せ」と指示が出る~
 +リモコン送信機の学習したいボタンに相当する名前を入力する。~
 +- 学習させたいリモコンのボタンを押す~
 +リモコン送信機のボタン信号を一つ一つ学習していく。ボタンは学習するまで押しっぱなしにする。~
 +学習したいボタンを繰り返し同じように行う。~
 +- 全て終わったらラベル入力時にEnterのみを押す。~
 +- さらに「Enterを押せ」と表示される~
 +Enterを押す。~
 +- リモコンのいくつかのボタンを1回づつ押していく~
 +ボタンは押しっぱなしにはしないで1回だけ押す。学習データを最適化するために行うようだ。~
 +
 +設定ファイルが作成されたら,nameのところを任意のわかりやすいものに変更しておく。~
 +コンパニオンツールのiRExでのリモコン指定は,このnameを参照する。~
 +
 +*** WinLIRCを再起動する [#z08fbb64]
 +その後WinLIRCを再起動すると,リモコン信号の受信待ち状態になりシステムトレイに丸のアイコンが表示される。~
 +&ref(tray.png,,50%);リモコンのボタンを押した時にこのアイコンが緑に変化すれば,学習したリモコン信号に反応していることになる。~
 +
 +PX-W3U4の付属リモコンを学習させて作成したファイル:''px-w3u4.conf''~
 +#code(text,nonumber){{
 +# Please make this file available to others
 +# by sending it to <winlirc.configs@gmail.com>
 +#
 +# this config file was automatically generated
 +# using lirc-0.9.0(irman) on Wed Dec 14 14:59:07 2022
 +#
 +# contributed by
 +#
 +# brand: PLEX
 +# model no. of remote control: PX-W3U4
 +# devices being controlled by this remote: USB TV-Tunner PX-W3U4
 +#
 +
 +begin remote
 +
 +  name  PXW3U4
 +  bits          16
 +  eps            30
 +  aeps          100
 +
 +  one            0    0
 +  zero            0    0
 +  pre_data_bits  40
 +  pre_data      0xFFFF1E2010
 +  post_data_bits  8
 +  post_data      0x0
 +  gap          110000
 +  toggle_bit_mask 0x0
 +
 +     begin codes
 +         Power                    0x20DF
 +         Mute                    0x2AD5
 +         Recbtn                  0x04FB
 +         Epg                      0x25DA
 +         Tv                      0x06F9
 +         Dvd                      0x07F8
 +         Hidari                  0x08F7
 +         Cc                      0x09F6
 +         PlayerOn                0x02FD
 +         PlayerOff                0x03FC
 +         SndChange                0x0CF3
 +         Full                    0x0EF1
 +         Up                      0x0DF2
 +         Down                    0x13EC
 +         Left                    0x0FF0
 +         Right                    0x11EE
 +         Ok                      0x30CF
 +         Info                    0x0BF4
 +         Rec                      0x18E7
 +         Pause                    0x16E9
 +         Play                    0x35CA
 +         Stop                    0x17E8
 +         Back                    0x19E6
 +         Fwd                      0x3AC5
 +         LeftSkip                0x1BE4
 +         RightSkip                0x1CE3
 +         1                        0x1DE2
 +         2                        0x1EE1
 +         3                        0x1FE0
 +         4                        0x21DE
 +         5                        0x42BD
 +         6                        0x43BC
 +         7                        0x45BA
 +         8                        0x26D9
 +         9                        0x47B8
 +         0                        0x4AB5
 +         *                        0x49B6
 +         #                        0x4BB4
 +         ChUp                    0x40BF
 +         ChDown                  0x44BB
 +         VolUp                    0x48B7
 +         VolDown                  0x4CB3
 +         Tunner                  0x4DB2
 +         Clr                      0x4EB1
 +         Input                    0x2FD0
 +         Data                    0x4FB0
 +         Blue                    0x50AF
 +         Red                      0x51AE
 +         Green                    0x52AD
 +         Yellow                  0x22DD
 +     end codes
 +
 +end remote
 +}}
 +
 +複数のリモコンを使いたい場合は,各リモコンの設定ファイルを一つのファイルにマージすればいいみたいだ。~
 +LinuxのLIRCではそれぞれの設定ファイルを読み込めたのだが,WinLIRCではそのようには出来なかった。
 +
 +*** WinLIRCの動作確認 [#h6cda731]
 +WinLIRCの動作確認をしてみる。~
 +
 +telnetでWinLIRCに接続する。~
 +リモコンのボタンを押すとトレイアイコンが緑に点灯し,以下のようにメッセージが返答があればOK。
 + > telnet 127.0.0.1 8765
 + Trying 127.0.0.1...
 + Connected to 127.0.0.1.
 + Escape character is '^]'.
 + ffff1ef30c080420 00 Ok PXW3U4
 + ffff1e7788080420 00 Right PXW3U4
 + ffff1e47b8080420 00 1 PXW3U4
 + ffff1e8778080420 00 2 PXW3U4
 + ffff1e07f8080420 00 3 PXW3U4
 + ffff1e7b84080420 00 4 PXW3U4
 + telnet> \q
 + Connection closed.
 +
 +** iREx [#ea149d34]
 +WinLIRCに対応したツールとしては,[[iREx>https://ramscan.com/irex/]]や[[EventGhost>http://www.eventghost.net/]]等多くある。
 +ここではiRExを使ってみた。~
 +
 +iRExのインストールは上記のリンクのDownloadから[[irex.zip>https://ramscan.com/download.php?file=irex.zip]]をダウンロードして任意の場所に解凍すればOK。
 +
 +下記のような設定ファイルを用意してirex.exeをダブルクリックで起動すればOK。
 +
 +*** iRExの設定ファイル [#j4f4250a]
 +設定ファイルirexe.cfgをテキストエディタで作成する。~
 +設定できる内容は,readme.txtに書かれている。~
 +
 + リモコン名<space>ボタン名<space>タイプ<space>動作内容
 +の設定を1行に1動作を定義する。
 +
 +エミュレーションできる機能のタイプと動作内容には以下がある。~
 +- exe~
 +アプリケーションを実行する。アプリケーションはフルパスで設定する。~
 +- key~
 +キーボードの入力をエミュレーションする。通常のキーボードはその文字を設定すれば良い。
 +-- 特殊なキー~
 +文字では表せないキーは,以下のようにする。~
 + enter, space,back, +, -, pgup, pgdn, home, end, insert
 + delete, help, pause, tab, print, shift, ctrl, alt, win
 + shift-alt, shift-ctrl, alt-ctrl, esc
 + up(カーソルキー), down(カーソルキー), left(カーソルキー), right(カーソルキー)
 + apps, F1, ... F19(ファンクションキー), num0-num9(テンキー)
 +-- マルチメディアキー~
 + next, prev, play, stop
 +-- 一部のPCに搭載のキー~
 + mail, select, app1, app2
 +-- WEBブラウザを制御するキー~
 + b-back,b-forward,b-refresh,b-stop,b-search,b-favorites,b-home
 +- vol~
 +音量を調整する。~
 + v-up(音量を上げる), v-down(音量を下げる),v-mute(音をミュート)
 +- mouse~
 +Mouseの動きをエミュレーションする。移動量は数字で指定する。~
 + up ###, down ###, right ###, left ###
 + lmb(左ボタン), rmb(右ボタン), mmb(中ボタン)
 +###は移動量。~
 +
 +一つのリモコンボタンに複数イベントを発生するには,同じリモコンボタンに2行で設定するとエミュレートされる。
 +
 +その他の設定。~
 +- server~
 + ip  WinLIRCが動作しているIP Address
 + port WinLIRCが動作しているport(8765)
 +- editor~
 +設定ファイルを編集するテキストエディターを設定する。~
 +
 +*** 設定ファイルの例 [#y0721619]
 +作成したPX-W3U4のリモコン用の''irex.cfg''ファイル。~
 +#code(text,nonumber){{
 +; remote    key  type  command
 +server  ip 127.0.0.1
 +server  port 8765
 +
 +trayicon    on
 +
 +mixer line  main
 +
 +editor C:\WinApl\Sakura\sakura.exe
 +
 +PXW3U4 1 key 1
 +PXW3U4 2 key 2
 +PXW3U4 3 key 3
 +PXW3U4 4 key 4
 +PXW3U4 5 key 5
 +PXW3U4 6 key 6
 +PXW3U4 7 key 7
 +PXW3U4 8 key 8
 +PXW3U4 9 key 9
 +PXW3U4 0 key 0
 +PXW3U4 VolUp key up
 +PXW3U4 VolUp key v-up
 +PXW3U4 VolDown key down
 +PXW3U4 VolDown key v-down
 +PXW3U4 Power key Q
 +PXW3U4 Tunner key Z
 +PXW3U4 Cc key C
 +PXW3U4 Data key D
 +PXW3U4 Full key F
 +PXW3U4 SndChange key S
 +PXW3U4 Mute key M
 +PXW3U4 Mute key v-mute
 +PXW3U4 Epg key E
 +PXW3U4 Up key up
 +PXW3U4 Down key down
 +PXW3U4 Left key left
 +PXW3U4 Right key right
 +PXW3U4 Ok key enter
 +PXW3U4 Play key play
 +PXW3U4 Stop key stop
 +PXW3U4 Pause key space
 +PXW3U4 ChUp key left
 +PXW3U4 ChDown key right
 +PXW3U4 RightSkip key >
 +PXW3U4 LeftSkip key <
 +PXW3U4 Fwd key right
 +PXW3U4 Back key left
 +PXW3U4 Tv exe C:\WinApl\TV\TVTest64\TVTest.exe /d BonDriver_Mirakurun.dll
 +PXW3U4 DvD exe "C:\Program Files\SMPlayer\smplayer.exe"
 +}}
 +
 +この設定ファイルで,リモコンのTVボタンを押すとテレビ視聴アプリのTVTestが起動され,チャンネルや音量なんかが操作ができるようになった :)
 +
 +任意のアプリを起動することも出来るので便利!
 +
 +* 使ってみて [#bda13624]
 +作成したIRリモコン・レシーバーとWinLIRC/iRExを組み合わせると,Windows PCをリモコンで操作できるようになった。~
 +
 +PCでテレビを見る時に,リモコンでいろいろ操作出来るようになって便利。けっこう高速に反応するのでストレスなどは感じない。
 +
 +IRMan.dllにはPCからリモコン信号を送信するコードが実装されていない。そのうち送信できるようにしたい。
  

  • PC/IRリモコン のバックアップ差分(No. All)
    • 現: 2022-05-20 (金) 16:41:37 yuji
      • Deleted an attach file: IRMan.dll at 2022-05-23 (月) 19:12:54 at 2022-05-24 (火) 08:13:38 at 2022-05-24 (火) 14:20:48 at 2022-05-24 (火) 14:24:50 at 2022-05-25 (水) 13:04:07 at 2022-05-25 (水) 14:05:12 at 2022-05-25 (水) 14:07:52, Deleted an attach file: avrir.png at 2022-06-10 (金) 16:57:53, Deleted an attach file: rcvsend.ino at 2022-12-17 (土) 06:58:45 at 2022-12-17 (土) 07:00:21, Deleted an attach file: avrlirc.ino at 2022-12-17 (土) 07:02:07 at 2022-12-20 (火) 12:11:31 at 2022-12-20 (火) 12:13:29 at 2023-02-13 (月) 15:57:12 at 2023-02-13 (月) 16:01:07 at 2023-03-17 (金) 09:47:21 at 2023-03-17 (金) 09:49:38 at 2023-03-17 (金) 09:50:40

トップ   差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 1003, today: 2, yesterday: 0