ものづくりブログ

ゼロからスタートして何かを作って世に出すまでのことを書くブログです.

Raspberry Piでリモコンの信号の送受信をしてみる

 

こんにちは.

 

前回は1か0という比較的単純な信号の入力を行いました.これだけでもかなり色々なことができるのですが,入力と言うのはそんなに単純なものばかりではありません.例えば電話で通話しているときの相手の音声なんかも信号として入力されてきているのです.

 

今回はそんな複雑な信号の一例である,赤外線リモコンの信号を取り扱ってみたいと思います.今回は入力も出力もやってみます.

 

必要なものは下記の通りです(以前の記事から引用).

 

赤外線LED

5mm赤外線LED OSI5FU5111C−40 (5個入): LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

上記でLEDを光らせるために購入したLEDは赤色に光るものでしたが,こちらは赤い光の代わりに赤外線を発するLEDです.光は全て電磁波で,波長が長いほど赤色に近く,波長が短いほど青色に近付くのですが,赤外線は赤よりもより波長が長い電磁波です.そして赤外線は人間の目には見えません.人間の目には見えないので,LEDを光らせる実験には不向きですが,下記のリモコン受信モジュールと併用すると面白いことが出来ます.

 

リモコン受信モジュール

赤外線リモコン受信モジュールOSRB38C9AA(2個入): センサ一般 秋月電子通商 電子部品 ネット通販

テレビとかに使用されているリモコンの信号を受信するモジュールです.モジュールと言うのは複数の素子を組み合わせてある機能を持たせた部品のことです.

このリモコン受信モジュールは赤外線信号を受信することが出来るので,家庭用のリモコンからの信号を受信してラズパイで読み取って保存し,上記の赤外線LEDから発信させるとかも可能(なはず)です.

ラズパイはインターネットにも繋がりますし,遠隔地からインターネット経由でラズパイに指令を出して,家庭内の家電をコントロールしたり,旅行中毎日一定の時刻にテレビをONにして人がいますよアピールをしたり,と言ったことができます.

まるでIRKitとかPlutoステーションみたいですね.

 

 

------------------引用以上---------------------

 

これを下記の図を参考に配線します.

 

f:id:daisukekmr:20150129092635p:plain

 

f:id:daisukekmr:20150129092641p:plain

 

 

f:id:daisukekmr:20150128234920j:plain

 

配線が完了したらラズパイの電源を入れてログインしましょう.

 

後の作業は以下の通りです.

 

 

 

1. LIRCをインストールする

2. リモコンの信号を読み取ってみる

3. リモコンの信号を送信してみる

 

さっそくそれぞれの工程の詳細を見ていきましょう.

 

 

 

1. LIRCをインストールする

 

LIRCとは,Linux Infared Remote Control)の略です.Linuxでリモコンなどの信号をデジタルデータに翻訳してくれるアプリケーションです.こういったツールが豊富にあることもラズパイの魅力の1つです.

 

次のコマンドを実行してインストールします.

 

sudo apt-get install lirc

 

次に,LIRCモジュールがラズパイ起動時に自動的に読み込まれるよう設定します.LIRCモジュールとは,ラズパイがLIRCを使うためのドライバのようなものです.最近はドライバをインストールする機器も減りましたが,昔はプリンタを使うときも最初にコンピュータにドライバをインストールしてから接続する必要がありました.最近は自動的にインストールしてくれることが多いですね.

 

sudo nano /etc/modules

 

上記のコマンドでmodulesを開いたら,最後に下記の2行を加えます.

 

lirc_dev

lirc_rpi gpio_in_pin=17 gpio_out_pin=18

 

書き込めたらcntrol+Oで保存し,control+Xでnanoを閉じて,下記のコマンドで再起動しましょう.

※Raspbian 2015-01-31(NOOBS 1.3.12)以降では、 /etc/modules ファイルではなく /boot/config.txt ファイルに下の行を追加します。

 

dtoverlay=lirc-rpi,gpio_in_pin=17,gpio_out_pin=18

 

追加したら再起動します.

 

sudo shutdown -r now

 

ここで-hオプションを使うと普通にシャットダウンでしたが,-rオプションを使うと再起動になるわけですね.

 

ラズパイが再起動したら再度ログインします.再起動前には無かった/dev/lirc0というファイルが作成されているはずですので,見てみましょう.

 

ls -l /dev/lirc0

 

ちなみに,LIRCをインストールするとそれ以降ラズパイを起動するたびに同時に起動するようになります.特に問題はありませんが,無駄なアプリケーションが走るのを避けたいという方は下記のコマンドで自動起動しないように設定ができます.

 

sudo update-rc.d lirc remove

 

逆に再度自動で起動させたい場合は下記のコマンドを実行します.

 

sudo update-rc.d lirc defaults

 

 

 

2. リモコンの信号を読み取ってみる

 

次は実際にリモコンの信号を読み取ってみます.以下のコマンドを実行し,一旦LIRCを終了した後,mode2というコマンドを実行します.

 

sudo /etc/init.d/lirc stop

mode2 -d /dev/lirc0

 

実行出来たらリモコン受信モジュールにリモコンを向けて適当なボタンを押してみましょう.

以下のような画面が出たら成功です.

 

f:id:daisukekmr:20150128231911p:plain

 

赤外線の信号は,信号のありとなしが切り替わる時間の長さで表すのですが,pulseが信号あり,spaceが信号なしを表しています.それぞれの右に書かれている数字がそれぞれの時間を表しています(単位はミリ秒?).

 

無事読み込みテストが完了したら,control+Cで終了しましょう.

 

次は色々なボタンの信号を記憶させていきます.まず,LIRCが起動していたら下記のコマンドで停止させます.

 

sudo /etc/init.d/lirc stop

 

次に,リモコンの信号を記憶させるために,下記のコマンドを実行してlircd.confというファイルを作成します.

 

irrecord -n -d /dev/lirc0 lircd.conf

 

以下の文字列が出たらEnterキーを押します.

 

Press RETURN to continues.

 

しばらく待つと以下の文字列が表示されますので,リモコンを片手に持って再度Enterキーを押します.

 

Press RETURN now to start recording.

 

 すぐにリモコンをリモコン受信モジュールに向けて色々なボタンを押しまくります.この作業でシステムにそのリモコンの特性を覚えさせるのです.反応すると画面中の「.」が増えていくので,それをみてきちんとリモコンの信号を受信できているか確認しながら続けましょう.下記の画面が表示されたら終了です.

 

Now enter the names for the buttons.

 

ここからはボタンを学習させていきます.順序は,

 

1. ボタン名入力してEnterキーを押す => 2. リモコンのボタンを押す

 

これの繰り返しです.以下は私が実行した例です.

 

f:id:daisukekmr:20150128233113p:plain

 

全て入力し終わったらボタン名に何も入力せずにEnterキーを押せば終了できます.

 

 

 

これで完了なのですが,念のため信号が記憶されているか確認してみましょう.

 

nano lircd.conf

 

以下の画面のようになっていれば成功です.

 

f:id:daisukekmr:20150128233330p:plain

 

この中で,「begin code」と「end code」の間がボタンに関するデータです.また,「name」のところがリモコンの名前を表しているので,わかりやすいものに変えておくと良いです.この画面で私は"regza"という名前にしています.

 

 

このファイルを,以下のコマンドで/etc/lirc/にコピーします.

 

sudo cp lircd.conf /etc/lirc/.

 

次に設定ファイルを編集します.

 

sudo nano /etc/lirc/hardware.conf

 

以下の4か所を下記の通りに修正します.

 

LIRCD_ARGS="--uinput"

DRIVER="default"

DEVICE="/dev/lirc0"

MODULES="lirc_rpi"

 

以下のコマンドでLIRCを再起動して設定を反映させたら完了です.

 

sudo /etc/init.d/lirc restart

 

 

 

3. リモコンの信号を送信してみる

 

ここまででリモコンの信号をラズパイに記憶させることが出来ました.実際にラズパイが信号を記憶しているか,動作確認をしてみましょう.以下のコマンドを実行して,リモコン受信モジュールに向かって先ほど記憶させたリモコンのボタンを押してみましょう.

 

irw

 

記憶させたボタン名が表示されたら成功です.control+Cで終了しましょう.

 

次に記憶した信号を赤外線LEDから送信してみたいと思います.以下は赤外線信号を送信するときに使用するコマンドの例です.

 

irsend SEND_ONCE regza power

 

ここで,SEND_ONCEは送信モードです.他には,SEND_STARTやSEND_STOPがあります.SEND_STARTを実行すると,SEND_STOPが実行されるまで信号を送り続けます.

TVはlircd.confの中にあった機器名です.上の方にあったnameの右に書いた文字列です.

powerはボタン名です.リモコンのボタンを記憶させたときに入力したボタン名を入力します.

 

これで赤外線LEDから信号が送られていれば,リモコンと同じように機器が操作できるはずです.もしできない場合は以下のような原因が考えられます.

 

  • 何らかの設定が間違っていて出力できていない
  • 距離が遠すぎて信号が届かない
  • 純正リモコンの信号が複雑すぎてラズパイが正しく記憶(送信)できない

 

原因によって特定方法は様々ですが,赤外線LEDはデジタルカメラを通すと肉眼で見ることが出来るので利用してみてください.

ちなみに私の場合,LEDの光が弱すぎてテレビにほんとにくっつけるくらい近づけないと反応しませんでした.このあたりは実用化しようと思ったらもう少し工夫が必要ですね.

 

もし解決しなかったらコメント欄やTwitterなどでご連絡いただければできる限りサポートします.

 

参考文献

[1]Raspberry Piで遊ぼう! 改訂第3版 〜 モデルB+完全対応

[2]Raspberry Piブログ(http://blog.livedoor.jp/victory7com/archives/34652043.html)

 

編集履歴

2015/2/8 Raspbian 2015-01-31向けの設定方法を追記しました