2017年3月10日金曜日

RaspberryPi で赤外線リモコンを制御してみた

概要

RaspberryPi + 赤外線受信モジュール + 赤外線 LED を使って自作リモコンを作ってみました
今回学習したリモコンはテレビのリモコンで SONY BRAVIA RM-JD025 のリモコンになります

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 8.0 (Jessie)
  • LIRC 0.9.0~pre1-1.2
  • Kernel Version 4.1.7+
  • Python 2.7.9
  • ジャンパケーブル オスxメス 12 本
  • 赤外線受信機 OSRB38C9AA
  • 赤外線リモコン OSI5FU5111C-40

リモコンから出る赤外線情報を学習する

はじめに LIRC ( Linux Infrared Remote Control ) という仕組み使って市販のリモコンから送信される赤外線情報を学習します

配線

赤外線リモコン受信モジュールである OSRB38C9AA を使って学習します
まずは学習するだけの配線を準備しましょう
rpi_Infrared_receiver_circuit.jpg

受信モジュールは出っ張っている方 ( 受信する方 ) を手前にして左から「OUTPUT」「GND」「VCC」になります
RaspberryPi と接続するときはそれぞれ「GPIO14」「GND」「5.0V」になるように接続します

今回使用した受信モジュールは Max 5.5V まで耐えられるので電源は 5.0V に接続しています
受信モジュールによっては 3.3V でなければいけないものもあるので、使用するモジュールの説明書等の電気特性を見て適宜変更してください

LIRC のインストール

赤外線信号を制御するためのパッケージをインストールします

  • sudo apt-get install lirc

0.9.0~pre1-1.2 というバージョンがインストールされました
インストールされただけでは RaspberryPi 上で LIRC は使用できません
デバイスを有効にして使えるようにします

  • sudo vim /boot/config.txt

で 51 行目あたりの dtoverlay=lirc-rpi をコメントアウトしましょう
そして GPIO 14 番を赤外線信号の受信に使って、GPIO 22 番を信号の送信に使うように設定します

51c51
< dtoverlay=lirc-rpi,gpio_in_pin=14, gpio_out_pin=22
---
> #dtoverlay=lirc-rpi

※別のサイト等で LIRC 用の GPIO の設定を modprobe コマンドで実施する方法を紹介していますが、自分の環境だと modprobe ではできませんでした
※GPIO も当初 24 と 25 を使っていたのですが、うまく動作せず 14 と 22 に後から切り替えました

設定が変更できたら有効にするために一旦再起動します
再起動したらデバイスが有効になっているか確認してください

  • lsmod | grep lirc

lirc_rpi 8602 0
lirc_dev 11060 1 lirc_rpi
rc_core 23630 1 lirc_dev

基本上記のようになっていれば問題ないですが、念のためデバイスファイルが作成されているかも確認するといいと思います

  • ls -l /dev/lirc*

学習する

これで LIRC が使えるようになったのでさっそくリモコンを受信モジュールに向けて学習してみたいと思います

まずは受信モジュールがちゃんと信号を受信するかテストしてみます

  • mode2 -d /dev/lirc0

で受信待ちになるので何かリモコンを向けてボタンを押してみてください
以下のように表示されれば OK です

pulse 4100698
space 3433
pulse 1635
space 475
pulse 363
space 479
pulse 1235
space 466
pulse 345
space 480
pulse 1202

一回ボタンを押しただけでも結構ずらーっと数字が流れると思います

/dev/lirc0 はデバイスファイルで特に他に使っていなければ 0 から始まります
デバイスファイルの番号が異なる場合は適宜変更してからコマンドを実行してください

信号送信用のファイルを作成する

これで信号を学習することができるようになりました
赤外線 LED を使って学習した信号を送信するには専用の設定ファイルを作成する必要があります
学習した信号を設定ファイルにするには irrecord コマンドを使います

  • mkdir -p ~/work/lirc
  • cd ~/work/lirc
  • irrecord -n -d /dev/lirc0 tv_controller.conf

引数に設定ファイルを作成するパスを指定します

でここからが結構面倒くさいです
まず Enter を 2 回押します
するとリモコンの信号を待ち受ける状態になるので受信モジュールに向けて学習したいボタンも含めていろいろなボタンを押します
まだ、ボタンを作成するフェーズではないのでとにかくいろんなボタンを押します
するとドットが次々増えていくので、80 個以上になるまでボタンを押しましょう
1 回 80 個を超えると再度 80 個を超えるまでリモコンの信号を待ち受ける状態になります

これが終了するとようやく信号を学習してリモコンを作ることができるようになります
先に作成したいボタンの名前を入力します
以下の例では「POWER_ON」というボタンを作成しています
入力したら、リモコンを受信モジュールに向けて電源 ON ボタンを押します
成功すれば設定ファイルに POWER_ON ボタンの定義が記載されているはずです

「Something went wrong」と出てうまく学習できない場合は再度ボタンの連打からやり直してみてください
コツは

  • 各ボタンを順番に 1 秒くらいの長押しにする
  • 実際にリモコンで操作できるデバイスや家電が近くにないところで学習させる

かなと感じました
これに関しては正直根気強く頑張るしかないかなと思います

※デバッグ文の一部抜粋

Press RETURN now to start recording.
................................................................................
Found const length: 134711
Please keep on pressing buttons like described above.
................................................................................
Space/pulse encoded remote control found.
Signal length is 99.
Found possible header: 3419 1639
Found trail pulse: 462
No repeat code found.
Signals are space encoded.
Signal length is 48
Now enter the names for the buttons.

Please enter the name for the next button (press <ENTER> to finish recording)
POWER_ON

Now hold down button "POWER_ON".

設定ファイルが上手く作成できたら LIRC の設定ファイルを配置する場所にコピーします

  • sudo cp /etc/lirc/lircd.conf{,.back}
  • sudo cp tv_controller.conf /etc/lirc/lircd.conf

LIRC を起動する

  • sudo lircd --driver=default --device=/dev/lirc0 /etc/lirc/lircd.conf

で LIRC のデーモンを起動しましょう
※ここがいろいろ悩んだんですが、なぜか systemctl 経由だとうまく起動できず手動で起動しました

停止したい場合は sudo pkill lircd で停止してください

赤外線 LED を使って信号を送信する

学習したリモコンの赤外線情報を LED を使って送信します
今度は赤外線 LED を使って配線します

配線

赤外線 LED を使って配線します
写真だとブレッドボード上に受信モジュールもまだ配線していますが、外してしまっても問題ありません
rpi_infrared_led_circuit.jpg

赤外線 LED は信号を送信するか家電などに向けてください
アノード側は GPIO22 -> 抵抗 47Ω と挟んで接続し、カソード側は GND に接続しています
抵抗は 47Ω で問題なく動作しましたが、もう少し大きめの抵抗にしたほうがいいかもしれません
また、トランジスタを使って信号を増幅する回路もありましたが、自分の場合は特に増幅しないでも信号を送信できました

信号送信

では LED から信号を送信しましょう
まずは学習したリモコン情報を確認します

  • irsend LIST '' ''
  • irsend LIST tv_controller.conf ''

これで先ほど登録したボタン「POWER_ON」が表示されることを確認してください
ここで学習したボタン情報が表示されない場合は lircd のデーモン起動がうまくいっていません

  • irsend SEND_START tv_controller.conf POWER_ON

これで赤外線 LED から信号を送信します
LED を家電に向けてコマンドを実行してください

距離はだいたい 1 - 2m くらい近づかないとダメです
また、家電等の赤外線受信口にほぼ真っすぐ向けないと反応しないので気をつけてください

赤外線 LED からちゃんと信号が送信されているか確認する方法としては携帯のカメラを使って覗き込むとちゃんと光っているか確認できるかと思います ( iPhone6 だとダメなのでガラケやデジカメを使ってください )

最後に

あとから気づいたのですが、今回一番苦労したのは lircd のデーモンが起動しなかったことでした
最終的に systemctl 経由ではなく lircd を直接起動して解決しました
本来は systemctl 経由で起動されるべきだと思うので、これは今後の課題かなと思います
いろいろと Web で調べると Jessie で試しているケースが少なかったので OS のバージョンやカーネルのバージョンが影響しているのかもしれません
たぶん /etc/init.d/lirc を少し書き換えれば動くとも思うのですが。。。

あとハマりポイントとしては最後の irsend の部分で SEND_ONCE というコマンドで信号を送信するサイトが多くあったのですが自分の場合は SEND_START でないとうまく信号を送信できませんでした

学習するリモコンも何個か試してみたのですが、学習しやすいリモコンと学習しづらいリモコンがあると感じました
学習しやすいと感じたリモコンは 80 個のドットを埋めるときにスムーズに埋まるほど学習しやすいリモコンかなと感じました
なかなか反応しないリモコンは学習しづらい印象でした ( 完全に所感になります )

とりあえず動いたので良かったですが、ちょっと力技な点があったのでそこは反省です

参考サイト

0 件のコメント:

コメントを投稿