RaspberryPiでLIRCする

 2014-03-30
RaspberryPiではLIRCする環境が整っています。それ用のモジュールとかあるよ。
ありがたく使わせてもらいます。
 
LIRCってのはLinuxで赤外線リモコンを受信したり発信したりするソフトウェア環境のこと。かな。
以前もFT232RLでLIRCの送受信モジュールを味見とか、FT232RLでLIRCするブツ などの記事で触れているものです。

LIRCは存在自体は以前から知っていたのですが、リモコンの種類によってはその発信パターンを学習できないことがあり、別途PICなりで自作する必要があるかなぁと思っていました。
・・・が、実は学習しなくとも、受信したコードをそのまま出力するモードがあることを知りました。(下記参考資料)

参考資料:

スマートフォンでエアコンとシーリングライトを制御する。その1
きままな生活:So-netブログ : http://lovehobby1075.blog.so-net.ne.jp/2013-10-24



RAW_CODEというモードで、受信したパターンをそのまま出力できる! うむ!これは良い。
LIRCで一番動かしたいのがエアコンなのですが、エアコンの信号は実は結構学習しにくい。以前やってみた時もリモコンは学習できず終いでした。
今度こそ、リベンジ!


外付け回路


DSC_2779.jpg DSC_2780.jpg
RaspberryPiのGPIOから入力と出力を一本ずつもらって、それぞれ赤外線センサーと、赤外線LEDに接続。これだけ。
細かくは、赤外線センサーの電源GNDにパスコンを1つと、赤外線LEDドライブ用に2SC1815を1石と電流制限用に抵抗を適量。これだけです。以前試した際のLIRCはRS232Cにつなぎましたが、RaspberryPiではGPIOからとれるので無駄にシリアルをふさぎません。いいね!

RaspberryPiの準備


まずlircをインストールする
pi% sudo apt-get install lirc

lircのモジュールを起動時に読み込むよう、/etc/modules に設定を書いておく
今回は入力(受信)端子をGPIO23、出力(発信)端子をGPIO24にした。端子割り当てがGPIOのみだったのでここにした。別の端子でも問題ない。
lirc-rpi gpio_in_pin=23 gpio_out_pin=24

受信できるかお試し。
pi% mode2 -d /dev/lirc0
space 712164
pulse 8274
space 4596
pulse 607
space 1610
pulse 591
:
後略
できてる。

リモコンコードパターンの取得


生データファイルの作成

上記のmode2コマンドでリモコンが発信するパルスのパターンが得られるのでそれをファイルに保存する。
それを欲しいリモコンのボタンの数だけ繰り返す。たとえばエアコンOFFのコードと、エアコン始動暖房23度のコード、、、、といった感じ。ただしこれはエアコンの機種によりいろいろあるだろう。
pi% mode2 -d /dev/lirc0 | tee AIRHOT23
space 837425
pulse 3482
space 1750
pulse 432
:
略 
teeコマンドで受けて、ファイルに保存しつつ画面にも出して確認しながら進めました。ボタン一回押したら受信できてることをみて、Ctrl+Cで終了させてファイル保存完了。

lircdが起動していると、/dev/lirc0が開けずにerrorになるので、適宜lircdを終了させること。
pi% sudo /etc/init.d/lirc stop


データ集計

得られたデータは誤差をたくさん含んでいますので集計してみます。また、どのようなコードが出されているのか集計して推測してみます。

light_rawcode.png シーリングライトの 「OFF」 リモコンコード
横軸は出力されたspaceとpulseの数字(マイクロ秒単位?) 縦軸は出現頻度、です。
10回分のデータを集計しました。これによると、spaceは約600程度で一定、pulseは600と1800くらいところに山が二つできています。つまり、pulseの長短でデータを送っているらしいことがわかります。

aircon_rawcode.png エアコンの「OFF」 リモコンコード
先ほどと同様のグラフで、エアコンのデータです。
こちらもspaceが一定でpulseの長短でデータを送っているようです。ただし先ほどとは違い、spaceは450、pulseは420と1300くらいに山があります。

以上のことから、シーリングライトはNECフォーマット(?)、エアコンはAEHAフォーマットではないか?と推測できます。(実際には上記のグラフや通信の最初のリーダーコードの長さなどを見て判断しています。)

データ整形

それぞれのリモコンのフォーマットが推測できたので、採取したデータにこれを当てはめていきます。
たとえば、下記のようなデータ
space 1292028
pulse 8236
space 4612
pulse 597
space 1667
pulse 594
space 574
 :
これを、space600,pulse(短)600,pulse(長)1800,リーダー9600,4800で整形しちゃいます(この辺の数字は適当に決め打ちしちゃいます)
9600
4800
600
1800
600
600
600
:
という感じにしておきます。
生データの先頭にあるspaceはリモコンのボタンを押すまでの時間であり無効データなので省きます。
また、pulseやspaceという部分もlircの設定としては不要なので省きます。

上記はあくまで「推測」に過ぎないので、一応、10回の平均値のデータも作成しました。
8274
4599
562
1698
559
598
550
:
ただし結局これは使いませんでした。

Excelでちょいちょいとやれば簡単です。 Excelがない? LibreOfficeあたりを。


LIRC用の設定ファイルを準備

作成したデータをlircで読み込めるようにリモコン別の設定ファイルを作成します。
詳細はlircのマニュアルを参照するとして、RAW_CODEをコピペするだけです。
begin remote

name light
flags RAW_CODES
eps 30
aeps 100

gap 200000
toggle_bit_mask 0x0

begin raw_codes
name off
9600 4800 600 1800 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 1800 600 600 600 1800 600 1800 600 1800 600 1800 600 600 600 600 600 600 600 1800 600 600 600 600 600 600 600 600 600 1800 600 1800 600 1800 600 600 600 1800 600 1800 600

name on
9600 4800 600 1800 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 1800 600 600 600 1800 600 1800 600 600 600 600 600 600 600 600 600 600 600 1800 600 600 600 600 600 1800 600 1800 600 1800 600 1800 600 1800 600 600 600 1800 600 1800 600

end raw_codes

end remote
fragsにRAW_CODESを指定し、あとは begin raw_codes ...... end raw_codes にペタペタとコピペしていけばok。
照明はON/OFFができれば十分なので二種類しか登録していませんが、必要なボタンをいくつでも(最大数はあるかもですが?)登録できます。

エアコンの設定ファイルは長いのでここには貼りませんが下記です。

エアコンのコードはとっても長い。しかも途中にひときわ長いspaceがありました。これは一回のボタン押下でコードを二種類発信していると思われます。これのせいでLIRCが学習できなかったのかなぁっと。。。

この設定ファイルですが、当初はRAW_CODEを一行にまとめていましたが、それだとlircが読み込んでくれなかったので、80文字くらいで改行をいれてあります。 一行の制限文字数があったのかな。。


LIRCの設定ファイルを作成

上記で作成したリモコン別のファイルを全部つなげて、一つのLIRCの設定ファイルにします。
とくに何もすることはなく、catでファイルをつなぎ合わせればokです。
pi% cat *.conf > /etc/lirc/lircd.conf


リモコン発信!

LIRCの設定ファイル(/etc/lirc/lircd.conf)を更新したら、lircdを再起動させておきます。
pi% sudo /etc/init.d/lirc restart


まず設定が読み込まれているか確認します。
[pi]% irsend LIST "" ""
irsend: aircon
irsend: light
irsend: proj
irsend: tvtune

[pi]% irsend LIST aircon ""
irsend: 0000000000000001 off
irsend: 0000000000000002 H21
irsend: 0000000000000003 H22
irsend: 0000000000000004 H23
irsend: 0000000000000005 H24
irsend: 0000000000000006 H25
irsend: 0000000000000007 H26
irsend: 0000000000000008 C23
irsend: 0000000000000009 C24
irsend: 000000000000000a C25
irsend: 000000000000000b C26
irsend: 000000000000000c C27
irsend: 000000000000000d C28

[pi]% irsend LIST proj ""
irsend: 00000000000040bf power
irsend: 00000000000004fb info
irsend: 000000000000f00f menu-exit
irsend: 00000000000010ef auto
irsend: 00000000000008f7 mode-enter
irsend: 000000000000d02f up
irsend: 000000000000b04f left
irsend: 000000000000708f right
 <中略>
irsend: 000000000000a45b timer-on
irsend: 000000000000649b timer-setup
irsend LIST "" "" で登録機器のリスト、irsend LIST <機器名> "" で機器毎の登録済みコマンドのリストが出ます。 今回エアコンはRAW_CODEで登録したので、LISTでみてもただ順番に番号がついているだけですが、RAW_CODEではなくちゃんと学習させた場合には該当するデータのコードが表示されます。(projはプロジェクタのリモコンを学習させたもの)

ちゃんと設定が読み込まれているようなら、あとはコマンドをたたくだけで赤外線LEDから発信できます!
pi% irsend SEND_ONCE light on





お疲れ様でした。
これで赤外線リモコンで操作できる機器が、RaspberryPiから操作できるようになりました。

今回はデータを10回採取して平均を~なんてやりましたが、赤外線リモコンのフォーマットはできる限り誤差を許容できるように設計されているので、多少であれば決め打ちで大丈夫です。 今回はエアコンのコードが長かったため、誤差蓄積を恐れてデータ集計を行ったかたちです。
多少は大丈夫です。多少は。



lirc関連:

●RaspberryPiでLIRCする(2016/04仕様変更?)
●RaspberryPiでLIRCする(2015/02仕様変更?)
●RaspberryPiで、webからLIRCしたり、twitterからLIRCしたりする
●RaspberryPiでLIRCする←いまここ
●FT232RLでLIRCするブツ
●FT232RLでLIRCの送受信モジュールを味見




コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/159-45f3be6e
≪ トップページへこのページの先頭へ  ≫