21 July 2014

Raspberry Piで赤外線リモコンを学習し発信する

Raspberry PiのLIRC (Linux Infrared Remote Control) パッケージを使って、簡単な赤外線リモコンコードの読み取りと、発信を行うサンプル回路を作成する。

テスト回路作成

20140721-rpi_ir_test_circuit.png

必要な部品は次の通り

パーツ名仕様個数参考価格
赤外線受信モジュールIRM-3638N3 (940nm, 38kHz, Vcc=0〜6V)1個216円
赤外線LEDL53F3BT (940nm, V=5.0V, I=50mA)1個21円
NPNトランジスタ2SC18151個21円
抵抗 Rc51 Ω1個5円
抵抗 Rb2.4k Ω1個5円

抵抗値の決定は、次のような計算で行った

・Rc : コレクタ側(LED側)の抵抗

LEDに流せる電流は、LEDのデータシートより10mA〜50mA(グラフの実線部分)、50mA〜
100mA(グラフの破線部分)より、定格を越えてオーバードライブするなら100mAを流せると勝手に解釈した。 (定格最大は50mA)

LEDの順方向電圧 VF = 1.2V 〜 1.5V
RPiからの供給電圧 V = 5.0V
LEDに流す電流値 IF = 50mA 〜 100mA

という条件で計算すれば

Rc = ( V - VF) / IF = ( 5.0 - 1.5 ) / 0.050 = 70 Ω
Rc = ( V - VF) / IF = ( 5.0 - 1.5 ) / 0.100 = 35 Ω

今回はこの中間値の 50 Ω程度の抵抗を使うことにする。

・Rb : ベース側の抵抗(スイッチング抵抗)

ベース電圧 V = 3.3V
半導体損失 0.6V
コレクタ電流 Ic = 70 mA …… Rc=50 Ohmの場合 Ic = ( 5-1.5 ) / 50 = 0.070
Hfe = 約200 … テスタでの実測値
Hfe余裕率 = 3 程度とすれば、 200/3 = 67 程度の増幅率と考える

Rb = ( V - 0.6 ) / ( Ic / (Hfe / 3) ) = (3.3-0.6) / (0.07/(200/3)) = 2584 Ω

今回は 2.4k Ωを用いることとする。

20140721-rpi_ir_board.jpg
ブレッドボード上に作成したテスト回路

LIRC のインストール

ライブラリをインストールする

$ sudo apt-get install lirc

次に、回路をRaspberry Piに接続してから、モジュールをロードする。今回、GPIO 4, 17を使っているのが、別のポートを使う場合は、modprobeでそのポート番号を設定すれば良い

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

デバイスが作成されたことを念の為確認する

$ ls -l /dev/lirc*
crw-rw---T 1 root video 248, 0  7月 21 12:11 /dev/lirc0
lrwxrwxrwx 1 root root      21  7月 21 12:57 /dev/lircd -> ../var/run/lirc/lircd

※ lirc サービスの自動起動停止

modprobe lirc-rpi gpio_in_pin=4 gpio_out_pin=17を行う前に、起動時にlircサービスが起動すると、意図しないGPIOに自動割り当てが行われる。それを回避するために、自動起動を停止する。

$ sudo sysv-rc-conf lirc off

※ lircサービスを自動起動させる場合は、/etc/modprobe.d/lirc.conf を設定する

/etc/modprobe.d/lirc.conf
options lirc-rpi gpio_in_pin=4 gpio_out_pin=17

※ GPIO割り当て状況を確認する

$ sudo mount -t debugfs debugfs /sys/kernel/debug
$ sudo cat /sys/kernel/debug/gpio
GPIOs 0-53, bcm2708_gpio:
 gpio-4   (lirc_rpi ir/in      ) in  hi
 gpio-16  (led0                ) out hi
 gpio-17  (lirc_rpi ir/out     ) in  lo

リモコンコードを受信できるかテストする

$ mode2 -d /dev/lirc0
〜 リモコンのボタンを押すと、次のような読み取り結果が表示される 〜
space 1830900
pulse 9061
space 4388
pulse 785
space 343
pulse 728
space 1543
pulse 649
space 453
〜 以下省略 〜

リモコンコードの学習

irrecord でリモコンコードを読み取り、結果を適当なファイルに書き出す。そのファイルを /etc/lirc/lircd.conf にコピーする。

$ irrecord -n -d /dev/lirc0 ~/test.conf
 
Press RETURN to continue.  ← ここで ENTER キーを押す
 
Press RETURN now to start recording.     ← ここで ENTER キーを押す
 
........................................................ ← 学習させたいリモコンのボタンを、どんどん押してゆく
Found const length: 107659
Please keep on pressing buttons like described above. ← 画面1行分が終われば、10秒間次のデータがないか待つ
irrecord: no data for 10 secs, aborting
Creating config file in raw mode.
Now enter the names for the buttons.
 
Please enter the name for the next button (press <ENTER> to finish recording)
volup ← ボタン名をキーボードから入力
 
Now hold down button "up". ← それに対応するリモコンのボタンを押す
Got it.
Signal length is 67
 
Please enter the name for the next button (press <ENTER> to finish recording)
 ← これ以下、複数のボタンで同様にボタン名とリモコンのボタン対応を作っていく
 ← 最後に ENTER キーを押して終了

このようにして作成された学習データを、/etc/lirc/lircd.conf に追記する。機器名称の赤で着色部は書き換えておく。

/etc/lirc/lircd.conf
begin remote
 
  name  yamaha_rxs600
  flags RAW_CODES|CONST_LENGTH
  eps            30
  aeps          100
 
  gap          107686
  
      begin raw_codes
 
          name volup
             9062    4378     702     427     676    1594
              650     495     649    1556     672    1595
              760    1464     672    1599     650     450
              700    1569     651     451     699    1547
              724     400     723     401     725     398
              779     349     700    1570     778     326
              673    1574     727     397     726    1524
              677    1602     677     424     675     450
              700     425     722    1524     724     401
              752    1501     775     364     729     372
              700    1571     649    1596     679    1569
              655
 
          name voldown
             9058    4384     674     453     697    1549
              674     450     724    1544     675    1573
              649    1596     649    1576     701     424
              698    1570     649     475     702    1522
              675     456     703     417     681     441
              699     427     776    1471     673    1596
              676    1574     649     454     724    1528
              693    1547     671     452     698     428
              699     424     699     427     698     426
              696    1571     679     424     675     451
              697    1552     669    1576     669    1599
              650
 
          name movie
             9136    4313     674     451     726    1522
              725     398     723    1546     676    1570
〜 中略 〜
              649     452     698    1549     674     448
              698    
 
      end raw_codes
 
end remote

複数の機器のリモコンコードを登録する場合は、単純に設定ファイルの内容を結合するだけ

/etc/lirc/lircd.conf
begin remote
 
  name  yamaha_rxs600
  flags RAW_CODES|CONST_LENGTH
  eps            30
  aeps          100
 
  gap          107686
  
      begin raw_codes
 
          name volup
             9062    4378     702     427     676    1594
              650     495     649    1556     672    1595
              760    1464     672    1599     650     450
〜 中略 〜
              649     452     698    1549     674     448
              698    
 
      end raw_codes
 
end remote
 
begin remote
 
  name  dvd_recorder
  flags RAW_CODES|CONST_LENGTH
  eps            30
  aeps          100
 
  gap          108006
 
      begin raw_codes
 
          name play
             9083    4410     728    1545     680     437
              675    1574     675     464     726     411
              701     438     700    1550     674     464
〜 中略 〜
              680     441     671    1595     706    1545
              704    1546     652    1598     668    1568
              666
 
      end raw_codes
 
end remote

その他の設定

/etc/lirc/hardware.conf
# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS=""
 
#Don't start lircmd even if there seems to be a good config file
#START_LIRCMD=false
 
#Don't start irexec, even if a good config file seems to exist.
#START_IREXEC=false
 
#Try to load appropriate kernel modules
LOAD_MODULES=true
 
# Run "lircd --driver=help" for a list of supported drivers.
#DRIVER="UNCONFIGURED"
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev 
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"
 
# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""

lircサービスのスタート

$ sudo /etc/init.d/lirc restart
[ ok ] Stopping remote control daemon(s): LIRC:.
[ ok ] Loading LIRC modules:.
[ ok ] Starting remote control daemon(s) : LIRC :.

リモコンコードを送信してみる

登録された機器名一覧の表示

$ irsend LIST "" ""
irsend: yamaha_rxs600
irsend: dvd_recorder

指定した機器に登録されたコードの一覧

$ irsend LIST yamaha_rxs600 ""
irsend: 0000000000000001 volup
irsend: 0000000000000002 voldown
irsend: 0000000000000003 movie
〜 以下省略 〜

コードを送信する

$ irsend SEND_ONCE yamaha_rxs600 vup