Linuxで外部機器をコントロール -赤外線リモコン-

['06/11/01] 公開
['06/03/15] 初稿
■はじめに
■Linuxを核に据えたHA(Home Automation)
 HA,『ホーム オートメーション』という言葉は凄まじく昔から使われている言葉 ですので,今この言葉を使うのは『OA化を進めましょう!』と,今頃叫ぶような恥ずかしい感 じがします. しかし,代わりの適当な用語が見付からなかったため,あえて本ページではHAと言うことにし ます.『うわっ.古っ.こっちの方が良いのに』と,いう用語をご存じの方は,読みながら クスクスしてください :-)

 さて,HA の厳密な定義は各メーカー様々なようですが,大枠では,各種家電や警報装置, その他諸々の家庭内の機器をインテリジェント化し,遠隔操作や自動制御する…と,いう理解 で大きく外してはいないと思います.また,今のところ各機器をインテリジェント化させ, 独立で/自律的に動くという手法は採らず,大抵は中央にコントロール用のコンピュータを置き, 非インテリジェントな機器類をリモートコントロールするという方式が一般的なようです.

 本ページで解説するのは,この『核』の部分に LinuxBOX を据え,外部機器をコントロール する方法です.また,一般に HA システムで使用される各種(コントロールされる)機器類は 特殊なものが使用されることが多いようですが,本ページで解説するのは,一般家庭で使用 されているような機器類をコントロールする方法を対象とします.

■如何に外部機器をコントロールするか
 ふと周りを見回すと,実に多くの家電製品に囲まれて生活していることに気が付きます.そして それらのほぼ全ては,リモートコントロールの手段として赤外線を用いており,リモコン側 は,ボタンを押すことにより,それぞれに割り付けられた所定のコードを送信するようになってい ます.そして機器側は,受信したコードに割り当てられた機能を実行するようになっています.

 つまり,これら機器をコントロールするためには,リモコンの各ボタンを押した際に送出 される赤外線コードを学習し,全く同じコードを送出することが出来れば良いことになります. これが学習リモコンの大雑把な原理ですが,テレビやビデオのリモコンには,コントロールする 機器のメーカーを設定することにより,予め登録してあるコードを送出可能なものもあります (例えば三菱のビデオのリモコンでSONYのテレビをコントロールする等).

 この赤外線フォーマット規格には,現在国内では大きく分けて,家電製品協会フォーマットNECフォーマットが使われることが多く,その他に,メーカーの独自フォーマット が使われることもあります.これらは基本的に,信号の送信に赤外線光の強弱を利用することは無く, 一定の周期(搬送波)に合わせてパルス状に発光のON/OFFを組み合わせることにより,データ 列を送受信します.

参考URL:Remocon2 page

 そしてハード的には,送信側は赤外線発光ダイオードを用い,受信側はフォトダイオード/フォト トランジスタ/赤外線受光ICを用いて受信を行います.何れも安価かつ入手も容易なパーツですので, その気になれば送信部・受信部の自作は可能です.

■Linux でリモコン用赤外線インターフェイス
 では,今回の目的を実現するために,LinuxBOX で赤外線の送信(および赤外線コードの学習 のための受信)を行うには,どのようにすれば良いのでしょうか?

 このような目的のための Linux 用ドライバ/ソフトとしては, LIRCがメジャーです. 市販されている多くの赤外線 Receiver(受信機)やTransmitter(送信機)がサポート されている他,これら機器を自作し,シリアルポートに接続して利用するための回路図なども 掲載されています.このソフトを使用することにより,LinuxBox を赤外線で操作したり (赤外線受信),他の機器を LinuxBox からコントロール(赤外線送信)することが可能になります.

 LIRC は非常にメジャーなソフトであるため,特に受信に関しては多くのソフトでサポートされて います.例えば CX23416GYC-STVLP/Rのリモコン機能を使えるようにセットアップすれば,MythTV で 非常に便利に使えようになることでしょう.

 しかし残念なことに,LIRCでサポートされている単機能の受信機や送信機は,日本国内では入手困難な 物が多く,また,ハンダゴテを握ったことの無い人にとっては回路の作成は高い障壁となること でしょう.特に回路の自作に関して少し補足説明すると,公開されているLIRC用回路の大半は, 保護回路無しで,かつ,電源をシリアルポートから取るようになっています.そのため,製作に 失敗していたり,公開されている一部の送信回路のように,シリアルポートからの給電可能な 電流をオーバーするのでは…と,いったものを接続した場合,PC本体に深刻なダメージを与える 可能性があります.

 そのため,誰でも手軽に使える…と,いう状況にはありません.

■メーカー直販の赤外線インターフェイスを利用することに
 そんな折り,2004の後半が近付いてきた頃,某巨大掲示板の MythTV スレにて,USB接続タイプ の送受信機をWinに繋ぎ,Linuxからネットワーク経由でこれを制御してMythTVで CATV の STB を コントロールしているという話題が書き込まれました (外部チューナーをコントロールする).

 Tira-2を使用しているということを伺って メーカーのページから辿った ページで確認すると, APIは公開されており,Linux 用のサンプルアプリのソースコードも公開している. そしてLIRCも受信機能に関してはサポートしており,送信機能も近々サポートされるだろうとのこと (しかし,2006年10月現在,状況は以前と同じ).

 公開されているサンプルを少し眺めた後,『行くしか!』と,思い, 即座に発注したのは2004年の10月28日のことでした.

Products
------------------------------------------------------
1 x Tira-2.1 = $49.00
          Cable Not included

1 x Girder = $12.20 (※保険のために,Windows用のソフトもオーダー :-P)

1 x 16 ft Active USB extender = $19.44
------------------------------------------------------
Sub-Total: $80.64
Federal Express (1 x 0.95lbs) (International Priority (1-3 Days)): $50.77
Total: $131.42

 レートは1$=106.32円だったので,約14k円也.10/30には発送の連絡メールが届き, 高く付いたけど International Priorityで配送をオーダーしていたこともあり, 速攻で届きました.一昔前では考えられなかったスピードですな.待ち時間的には国内 のショップで買うのとあまり変わらず.

 なお,一時期『ぷらっとほーむ』でも扱っていたようですが,現在は扱いが無いようです.

■Home-electronics Tira-2.1購入
■Tira-2.1
Tira-2.1とUSB 延長コード(5m).
Tira-2.1 には USB ケーブルが同梱されていないので,USB A<->B のケーブルが別途必要です.
また,Windows用ソフトである『Girder』は,ライセンスIDが書かれた紙が入っていました. Webからダウンロードしてインストールする形になります.

延長コードはホントに延長するだけ.Tira-2.1は USB の Bタイプのコネクタなので,この 延長コードがそのまま使えないのに注意.
Tira-2.1本体
何はともあれ分解 :-)
作りは非常にシンプルです
発光部と受光部.
左から,送信用の発光ダイオード*2 (18-80kHz対応), ショートレンジ用の受光部(18-80kHz対応),ロングレンジ用受光部(36-40kHz対応)
端子類.
左から PC との接続用の USB 端子("B"型),外部送信機接続用の3.5mmジャック.
1/72 レオパルド2ANとの比較 :-)
非常にコンパクトで,マッチ箱(最近殆ど見ませんな…)くらいの大きさです.
■Tira-2.1を使う
■動作に至るまでの道1
 下準備など諸々する以前に届いたので,まずはとりあえず繋げてみました.

 Linux 側からは USB接続のシリアル変換器として認識されているのが確認出来ます.

※下記のログは,最近 Vine4.0β2 (kernel 2.6.16)に接続した際のログ.
kernel: usb 3-2: new full speed USB device using uhci_hcd and address 2
kernel: usb 3-2: configuration #1 chosen from 1 choice
kernel: usbcore: registered new driver usbserial
kernel: drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
kernel: usbcore: registered new driver usbserial_generic
kernel: drivers/usb/serial/usb-serial.c: USB Serial Driver core
kernel: drivers/usb/serial/usb-serial.c: USB Serial support registered for
       FTDI USB Serial Device
kernel: ftdi_sio 3-2:1.0: FTDI USB Serial Device converter detected
kernel: drivers/usb/serial/ftdi_sio.c: Detected FT232BM
kernel: usb 3-2: FTDI USB Serial Device converter now attached to ttyUSB0
kernel: usbcore: registered new driver ftdi_sio
kernel: drivers/usb/serial/ftdi_sio.c: v1.4.3:USB FTDI Serial Converters Driver

※kernel によっては, 『usbserial.c: Home-Electronics TIRA-1 IR Transceiver converter detected』と認識される 場合もあります

 普段は一番手間取る認識が無問題でパス出来たので,楽勝かに思えたのですが, メーカーサイトから落としていたサンプルのソースがすんなりビルドできません.

 具体的には,make するとドライバ本体が Shared ライブラリになり,それを読み込んで操作 するサンプルアプリ(インタラクティブに操作できるフロントエンド)が別に出来るという感じな のですが,エラーが出まくりでドライバ本体がビルド出来ません.

 gccのバージョン依存で若干エラーが出る…とかそういったレベルではなく,モノを購入して いなければ即座に諦めるかも…と,いったレベルです.個々のエラーを丹念に潰そうかと細かな所まで 覗いて見ると唖然.コードが非常に読みにくく,クラクラして来ます…

 その後,四苦八苦しながら弄りまくり,何とかドライバがビルド出来るようになり,それを使用した フロントエンドプログラムも気合いで作成し, '04/11/05 版tira2_ctrlの公開に漕ぎ着け ました.何とかすると宣言してしまった手前,意地でも何とかせねば…と,いう気持ちが最後まで 私を突き動かしていました :-)

 教訓:背水の陣は水深を測ってから構えるべし :-)

※諸々面倒なので,この版は使用しない方が良いです.この版を使用したい場合は, 同梱のドキュメントを参照してください

これを使用したdipsi氏の解説ページは こちら

■動作に至るまでの道2
 とりあえずこれで Vine と FC2 では問題なく動くようになった….良かった,良かった,と思った のも束の間.FC3 ではメーカー提供のドライバが動かないとのレポート有り.色々と試みるも, 砂漠に水を撒いているかのような徒労感を感じ始めたので,メーカー提供のドライバに非依存の プログラムを作ることにしました.

 うまい具合にメーカーから,Tira-2.1をコントロールするためのプログラムが提供されていた ので(ここから辿れる 『Protocol2.pdf』),早速落として熟読.諸々試した末,りトリッキーな手法を使わず, オーソドックスな方法でコーディング.そのためもあり,最近聞いた話では,FC6 でもすんなり 動作したとのこと.

 現状の最新版は, tira2_ctrl_v2 '05/12/27版 です.
 ※旧版とはキャプチャしたIRコードファイルに互換性が無いので注意

 調べてみたら, perl で Tira-2.1 をコントロールするスクリプトを書かれている方もおられた模様.

 ざっとソースを読んでみると,使用言語が C か perl かの違いだけでは無く,学習のさせ方や BSA コードへの圧縮の仕方が異なります.基本的には行うことは同じなので,環境に合わせ, お好きな方を使うのが良いかと思います.

■環境のセットアップ
 こちらから, '05/12/27版 tira2_ctrl_v2 をダウンロードして展開してください.詳しい使い方に関しては, 同梱したドキュメントに記述してありますので,御一読下さい.

 プログラムのインストールを行うと,/usr/local/bin 以下に,tira2_rec2 と tira2_trans2 という2つのプログラムがインストールされます.

■IR codeの学習と送出
 まずは,tira2_rec2 を使用し,IR code をキャプチャします.
tira2_rec2 tv_1ch.ir
※"tv_1ch.ir"はキャプチャしたコードの保存ファイル名

 のように実行し,リモコンを Tira-2.1 の受信機の方向に向け,ピッとボタンを 押して下さい.エラーが出なければ,キャプチャ成功です.

 次に,キャプチャしたデータの送信を試します.

tira2_trans2 tv_1ch.ir
※"tv_1ch.ir"はキャプチャしたコードのファイル名

 のように実行し,先程キャプチャしたデータを指定して送信してみて下さい. うまく行けば,リモコンのボタンを押したときと同じ動作をする筈です.

 うまく行かない場合は,もう一度 tira2_rec2 でキャプチャをし直してみて 下さい.

■応用編
 複数のリモコンボタン押下の組み合わせをエミュレートする場合,例えば 1 -> 2 -> 3 と 3つのボタンのコードを連続して送信したい場合は,"1","2","3"の各ボタンのキャプチャ データを用意し,tira2_trans2 で順に送信するようにします. スクリプトを組み,1回の送信毎に 少し sleep を入れておくと良いかもしれません.

 応用としては,SOHO のマシンルームのような所に設置した PC の CPU や M/B 温度を監視 するようにしておき,一定以上の温度になったらエアコンを付けたり,設定温度を下げるよう な用途に利用すると便利かもしれません.また,LinuxBox で cron を走らせておき,指定時刻 になったら,コンポや照明,はたまたテレビを点けるようにするのも良いかもしれません.

 その他,最近は実際に利用されている方が徐々に増えてきているようですが,Tira-2.1 を 利用すれば, CATV の STB や外部チューナをコントロールし,MythTV から任意のチャンネルの予約 録画をすることが出来るようになります.

 後者の具体的な方法に関しては,sg氏のサイト の掲示板に多くの情報がある他, くま氏のサイトに詳細な 設定方法が解説されています

■まとめ
 毎度の事ながら,書ける素材が一通り揃った後で,公開まで2年近く経ってしまいました…

 現在の手元の Tira-2.1 はと言うと,家の引っ越し後は LinuxBox から外されています.が,最近 CATV の契約をデジタルにしたので,録画システムを本格的にそちらに移行しようと画策している 所です(キャプチャカードの Tuner 入力は使わないようにし,デジタル放送を STB の S-Video 出力 を使って録画することにする.そして STB のチャンネル変更は Tira-2.1 で行う).

 デジタル放送の波が大きく打ち寄せてきていますが,現状,日本国内では Linux でデジタル 録画する手段はありません.いずれは MPEG2-TS をそのまま録画出来る環境が到来することを切に 願いつつ,デジタル放送をアナログ録画する形で凌ぎたいと思います.

 『デジタル放送をアナログに落としてしまったら意味無いジャン』 と,お思いのあなた, 一度試してみて下さい. アンテナ線のグレードや取り回しに四苦八苦し,ゴーストリデューサやYC分離チップのパラメータ チューニングに情熱を傾けてていたのに(私だけ?),STB のアナログ出力でデジタル放送を録画 すれば,あっさりと美麗な画質で録画出来てしまい,拍子抜けすることでしょう.ただ難点は, CATV 契約していない方にとっては,外部デジタルチューナーがまだまだ高価な事でしょうか.

 また,小さなお子様がおられる家庭であれば,Tira を使って家の中の機器を PC に向かって しらっとコントロールすれば,『魔法使い』と畏怖と尊敬の眼差しを向けられるか,はたまた 『ポルターガイスト現象』(テレビや照明を点滅させると効果的)と戦かれることでしょう.

 まぁ何れにしましても,Tira-2.1 は1台持っておくと何かと便利なガジェットです.お宅にも 1台如何でしょうか?


『Asus Terminator 活用メモ』 へ戻る