Raspberry piでリモコン操作1

前回の記事でRaspberry piにOSを入れてセットアップしました.

doctor.hatenablog.jp

今回は前々からやりたいなーと思っていたRaspberry piでリモコン操作に挑戦したいと思います.

目的

Raspberry piでリモコンを実現

結果

結果的にはテレビのリモコンなら動作できましたが,エアコンや照明のリモコンはデータ長が長くうまくできませんでした.

作った回路

f:id:doctor428:20160222113904j:plain



回路

回路はこちらを参考にしました.

feijoa.jp

以下が今回作った回路です.左が発光部,右が受光部です.発光部はGPIO 18pin,受光部はGPIO 17pinにつながっています.

f:id:doctor428:20160222100547p:plain

使用部品
  • Raspberry pi B+
  • 抵抗:1kΩ


手元に何ら電子部品はなかったので秋月電子とスイッチサイエンスで調達しました.

特にスイッチサイエンスでは抵抗詰め合わせパックというのがあるので助かりました.

feijoa.jp様では赤外線LEDを3つ使われてましたが,今回は実験的なので1つだけ.

電子回路の知識は殆ど無いので,抵抗値などは適当です.最終的にとりあえず動作はしました.

注意したいのは,

一方、GPIOは5V耐圧ではありませんので、受信モジュールは3.3Vで駆動します。

http://d.hatena.ne.jp/penkoba/20131228/1388243358

とのことで3.3Vで受光モジュールは動作させています.


Lircのインストール・設定


まず調べるとLircというソフトでできそうなことが分かりました.

qiita.com

ということでインストールします.

$ sudo apt-get install lirc


GPIOピンを設定しますがサイトによって設定する項目が異なりました.動作したものを説明します.

参考:Raspberry Piで赤外線リモコンを学習し発信する (r271-635)

$ sudo modprobe lirc-rpi gpio_in_pin=17 gpio_out_pin=18

※自動動作させるために,以下で/etc/modprobe.d/lirc.confを作成

options lirc-rpi gpio_in_pin=17 gpio_out_pin=18
デバイスが作成されたか確認
$ ls -l /dev/lirc*
crw-rw---- 1 root video 245, 0  2月 22 10:32 /dev/lirc0
lrwxrwxrwx 1 root root      21  2月 22 10:32 /dev/lircd -> ../var/run/lirc/lircd

/dev/lirc0がありますね(大丈夫そう)

$ sudo mount -t debugfs debugfs /sys/kernel/debug
mount: debugfs is already mounted or /sys/kernel/debug busy
       debugfs is already mounted on /sys/kernel/debug
$ sudo cat /sys/kernel/debug/gpio
GPIOs 0-53, bcm2708_gpio:
 gpio-17  (lirc_rpi ir/in      ) in  hi
 gpio-18  (lirc_rpi ir/out     ) in  lo
 gpio-47  (led0                ) out lo

lirc_rpi ir/in ir/outがありますね(大丈夫そう)

/etc/lirc/hardware.confの設定を編集しておきます.(編集する項目のみ)

LIRCD_ARGS="--uinput"
LOAD_MODULES=true
DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

赤外線受信を確認

mode2でとりあえず赤外線が受信できるか確認します.さきほどの設定されたデバイスを指定して実行…

$ mode2 -d /dev/lirc0
mode2: could not open /dev/lirc0
mode2: default_init(): Device or resource busy

…失敗です.どうやらlircが動作していたらダメのようです.

$ sudo killall lircd

サービスを止めてもう一度.実行して,リモコンを受光部に向けボタンを押すと

$ mode2 -d /dev/lirc0
space 16777215
pulse 8956
space 4475
pulse 575
space 556
︰

うまくいきました.

リモコンの学習

ではリモコンを学習してみましょう.今回は日立のテレビのリモコンです.
学習した結果をtv.confファイルに保存します.

$irrecord -n -d /dev/lirc0 tv.conf
Press RETURN to continue.
//Enter押す

Press RETURN now to start recording.
//Enter押す
//学習させるリモコンの様々なボタンを1秒ずつくらい押し続ける
................................................................................

Found const length: 107411
Please keep on pressing buttons like described above.
Please enter the name for the next button (press <ENTER> to finish recording)
power //ボタンのラベルを入力(ここではpower)

Now hold down button "power".
//リモコンの電源ボタンを押す

Got it.
Signal length is 67

Please enter the name for the next button (press <ENTER> to finish recording)
︰
//学習させたいボタンの数だけ繰り返す.空文でEnterを押すと終了する.

終わると先ほどのファイルに記録されます

# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.9.0-pre1(default) on Sun Feb 21 20:39:43 2016
#
# contributed by
#
# brand:                       tv.conf
# model no. of remote control:
# devices being controlled by this remote:
#

begin remote

  name  hitachi_tv
  bits           16
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  header       8933  4501
  one           540  1702
  zero          540   594
  ptrail        539
  repeat       8933  2260
  pre_data_bits   16
  pre_data       0xAF5
  gap          107402
  toggle_bit_mask 0x0

      begin codes
          power                    0xE817
          volup                    0x48B7
          voldown                  0xA857
          channelup                0x9867
          channeldown              0x18E7
          change_source            0x906F
      end codes

end remote

nameは初期でファイル名になっていますがわかりやすい名前に書き換えておきます.

このファイルを/etc/lirc/lircd.confに追記します.

$ sudo cat tv.conf /etc/lirc/lircd.conf > /etc/lirc/tmp.conf
$ sudo rm /etc/lirc/lircd.conf
$ sudo mv /etc/lirc/tmp.conf /etc/lirc/lircd.conf


lircサービスをスタートさせる

$ sudo /etc/init.d/lirc restart
[ ok ] Restarting lirc (via systemctl): lirc.service.

リモコン操作してみる

お待たせしました.
登録されているリモコンを確認します.

$ irsend LIST '' ''
irsend: hitachi_tv

指定したリモコンの登録されているボタンを確認します.

$ irsend LIST hitachi_tv ''
irsend: 000000000000e817 power
irsend: 00000000000048b7 volup
irsend: 000000000000a857 voldown
irsend: 0000000000009867 channelup
irsend: 00000000000018e7 channeldown
irsend: 000000000000906f change_source

送りたい機能を選び赤外線送信(hitachi_tvのpower)

$ irsend SEND_ONCE hitachi_tv power

赤外線LEDをテレビに向ければリモコンの機能が実現できました.