Raspberry PiのLIRC (Linux Infrared Remote Control) パッケージを使って、簡単な赤外線リモコンコードの読み取りと、発信を行うサンプル回路を作成する。
テスト回路作成
必要な部品は次の通り
パーツ名 | 仕様 | 個数 | 参考価格 |
---|---|---|---|
赤外線受信モジュール | IRM-3638N3 (940nm, 38kHz, Vcc=0〜6V) | 1個 | 216円 |
赤外線LED | L53F3BT (940nm, V=5.0V, I=50mA) | 1個 | 21円 |
NPNトランジスタ | 2SC1815 | 1個 | 21円 |
抵抗 Rc | 51 Ω | 1個 | 5円 |
抵抗 Rb | 2.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 Ωを用いることとする。
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
を設定する
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 に追記する。機器名称の赤で着色部は書き換えておく。
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
複数の機器のリモコンコードを登録する場合は、単純に設定ファイルの内容を結合するだけ
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 # # 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