Raspberry Pi で赤外線リモコン

ようやく、というかずっとやる予定でやっていなかった Raspberry Piを赤外線リモコンにする というのをやってみました。

参照:http://homebrew.jp/show?page=1480

ハードウェア

パーツ

パーツは "Arduinoでリモコン" で使ったのと同じ物を使います。

秋月で購入しました。
この他に抵抗、トランジスタが必要です。

接続

以下の図のような感じで回路を組みました。

電源については注意が必要で、 http://elinux.org/RPi_Low-level_peripherals によると3.3Vから供給できるのは50mAまで、とのことですがLEDには50mA(最大100mAの半分)流す計算で行くので、他のデバイスもあるので足りません。また、複数のLEDを接続する場合は余計にです。なので、LEDは5Vで駆動します。ちなみに5V端子は他とショートさせると壊れる可能性が高いので注意してください。
一方、GPIOは5V耐圧ではありませんので、受信モジュールは3.3Vで駆動します。

LEDの直列抵抗は50mA流すとして (5-1.35) / 0.05 = 73(Ω) なので、これに近い値のものを使います。

配線は少し整理してこんな感じにしてあります。

LED拡散キャップ

使用している赤外線LEDは、照射方向に非常にシビア(データシートによると半減角15度:中心から7.5度)で、ちょっとずれただけで全然反応しなくなるので実際に使おうとすると位置決めが面倒です。
そこで、LED拡散キャップというのを使用してみました(上の写真はつけていない状態です)。

すると、距離さえ近ければ角度にはかなり寛容になり、1m程度の距離で30度くらいずれてても反応するようになりました。距離的にはまだ改善の余地がありますが、近くにさえ置いておけばテレビ+レコーダーなど複数機器のコントロールが無理なく可能となります。

ソフトウェア

LIRC

LIRCという、Linuxで赤外線リモコンを使用するためのソフトウェアがありますのでこれを使用します。
http://www.lirc.org/

$ sudo apt-get install lirc

ちなみに、エアコンはリモコン信号が長いためLIRCで扱えない可能性が高いです(機種によると思いますが)。具体的にはLIRCで扱えるのは64bitまでですが、うちで使用しているエアコンの信号は80bitとか144bitだったりしています。

カーネルモジュール

Raspbianには必要なモジュールがすでに入っていますが、私はkernel(3.11.y)を自前でコンパイルしており、configを3.6.11のからmake oldconfigした関係で必要なモジュールがコンパイルされていませんでした。CONFIG_LIRC_RPI が必要となるのですが、configメニューの階層は以下です。

Device Drivers --->
  Staging Drivers --->
    Media staging drivers --->
      Linux Infrared Remote Control IR receiver/transmitter drivers --->
        Homebrew GPIO Port Receiver/Transmitter for the RaspberryPi

入出力に使うGPIO番号を指定してモジュールをロードします。(依存関係でlirc-devモジュールもロードされます)

$ sudo modprobe lirc-rpi gpio_in_pin=24 gpio_out_pin=25

恒久的な設定にする場合は、/etc/modprobe.d/lirc.conf を以下の内容で作成します。

options lirc-rpi gpio_in_pin=24 gpio_out_pin=25

モジュールのロード自体はlircdの起動時に自動で行われますので、 /etc/modules への追加は不要です。

バイスファイルができていることを確認

$ ls  -l /dev/lirc*
crw-rw---T 1 root video 249, 0 12月 23 13:23 /dev/lirc0

debugfsで、GPIOのアサインを確認(これは知りませんでした)

% sudo mount -t debugfs debugfs /sys/kernel/debug
% sudo cat /sys/kernel/debug/gpio
GPIOs 0-53, bcm2708_gpio:
 gpio-16  (led0                ) out hi
 gpio-24  (lirc_rpi ir/in      ) in  hi
 gpio-25  (lirc_rpi ir/out     ) in  lo
受信動作確認

何でもよいので赤外線リモコンを用意し、mode2を使って信号が受信できているかどうか確認します。

% mode2 -d /dev/lirc0
(リモコンを赤外線受信モジュールに向けて何かボタンを押す)
space 3809471
pulse 2370
space 602
pulse 1211
space 583
pulse 588
space 599
pulse 1204
space 584
pulse 594
 :

このような反応があればOKです。

lircdのconfig作成

リモコンコマンドを発信する準備として、irrecordを使ってリモコン信号を学習し、lircdのconfigを作成します。最終的には必要なボタンについて全て学習する必要があるので結構面倒です。
コマンド中に要求されるステップは3つあります。

  • いろんなボタンを1秒くらいずつ押す
  • 記録する各ボタンに名前をつけて、学習する
  • ボタンを短く繰り返し押す

以下はソニーのテレビリモコンを学習させた例です。

% irrecord -n -d /dev/lirc0 tv.conf
irrecord -  application for recording IR-codes for usage with lirc

Copyright (C) 1998,1999 Christoph Bartelmus(lirc@bartelmus.de)

 :

Please send the finished config files to  so that I
can make them available to others. Don't forget to put all information
that you can get about the remote control in the header of the file.

Press RETURN to continue.
(リターンを押す)


Now start pressing buttons on your remote control.

It is very important that you press many different buttons and hold them
down for approximately one second. Each button should generate at least one
dot but in no case more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have been
generated.

Press RETURN now to start recording.

(リターンを押す)
(リモコンを受信モジュールに向け、いろんなボタンを1秒くらいずつ押す)
................................................................................
Found const length: 44706
Please keep on pressing buttons like described above.
................................................................................
Space/pulse encoded remote control found.
Signal length is 25.
Found possible header: 2359 629
Found trail pulse: 582
No repeat code found.
Signals are pulse encoded.
Signal length is 12
Now enter the names for the buttons.

(以降、学習するボタンの名前を入力し、ボタンを押していく)
Please enter the name for the next button (press  to finish recording)
power

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

Please enter the name for the next button (press  to finish recording)
1

Now hold down button "1".
(リモコンの1chボタンを押す)

 :

Please enter the name for the next button (press  to finish recording)
(リターンを押す)

Checking for toggle bit mask.
Please press an arbitrary button repeatedly as fast as possible.
Make sure you keep pressing the SAME button and that you DON'T HOLD
the button down!.
If you can't see any dots appear, then wait a bit between button presses.

Press RETURN to continue.
(リモコンの任意のボタンを繰り返し押す)
.....................
No toggle bit mask found.
Successfully written config file.

以下のtv.confが生成されました。

# 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 Mon Dec 23 13:48:00 2013
#
# contributed by
#
# brand:                       tv.conf
# model no. of remote control:
# devices being controlled by this remote:
#

begin remote

  name  tv.conf
  bits           12
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  header       2359   600
  one          1167   616
  zero          575   616
  gap          44706
  min_repeat      2
#  suppress_repeat 2
#  uncomment to suppress unwanted repeats
  toggle_bit_mask 0x0

      begin codes
          power                    0xA90
          1                        0x010
          2                        0x810
          3                        0x410
          4                        0xC10
          5                        0x210
          6                        0xA10
          7                        0x610
          8                        0xE10
          9                        0x110
          10                       0x910
          11                       0x510
          12                       0xD10
      end codes

end remote
リモコンフォーマットに関する話

少し本筋から離れますが、リモコンのフォーマットに関して確認しておきます。

ここでは(簡単のためもありますが)電源とチャンネルボタンしか学習しなかったのですが、今時のリモコンはボタンがたくさんあってこれがLIRCにとっては多少ややこしいことを引き起こします。例えば「番組表」ボタンを含めて学習すると、記録されるフォーマットは全く違ったものになります。詳細は別エントリで試していきたいと思いますが、ボタンによってコマンド長が異なることが原因です。

ここで学習したコマンドはすべて12bitで、SONYフォーマットで 5bitのプロダクトIDと7bitのコマンドからなります。一般的にリモコン信号はLSBファーストで送信されるのですが、上記confファイルに記録されているのはLSBファーストの信号をそのままの順番で表現したものになります。これを逆順(MSBファースト)にすると以下のようになりますが、"SONYテレビのリモコンコマンド" で書いたものと一致します。リモコンコードを表現する場合はこちらの方が普通だと思います。

power: 0x095
1:     0x080
2:     0x081
3:     0x082
4:     0x083
5:     0x084
6:     0x085
7:     0x086
8:     0x087
9:     0x088
10:    0x089
11:    0x08a
12:    0x08b
lircdの設定と起動

生成された tv.conf を以下のように少し修正を入れてから /etc/lirc/lircd.conf として置きます。

# brand:                       SONY
# model no. of remote control: RM-JD018
  name  BRAVIA

ちなみに、複数のリモコンの信号を登録する場合は生成した複数のconfファイルを単純につなげればOKです。

次に、/etc/lirc/hardware.conf を以下のように編集します。

# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"

#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="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=""

lircd起動

% sudo /etc/init.d/lirc start

自動で起動する場合は、update-rc.dで登録します。

% sudo update-rc.d lirc defaults
lircdを利用したコマンドの実行

irsendで登録されているコマンドの確認や発信ができます。

リモコンとコマンドの確認

% irsend LIST '' ''
irsend: BRAVIA
% irsend LIST BRAVIA ''
irsend: 0000000000000a90 power
irsend: 0000000000000010 1
irsend: 0000000000000810 2
irsend: 0000000000000410 3
irsend: 0000000000000c10 4
irsend: 0000000000000210 5
irsend: 0000000000000a10 6
irsend: 0000000000000610 7
irsend: 0000000000000e10 8
irsend: 0000000000000110 9
irsend: 0000000000000910 10
irsend: 0000000000000510 11
irsend: 0000000000000d10 12

発信

% irsend SEND_ONCE BRAVIA power

テレビの電源が入りました。

また、irwで学習したコマンドを受信して認識することもできます。

% irw
(リモコンの電源ボタン押す)
0000000000000a90 00 power BRAVIA
0000000000000a90 01 power BRAVIA
0000000000000a90 02 power BRAVIA

まとめ

基本的な使い方ができるところまでひと通りやってみましたが、やはり実物の家電を操作できるのは楽しいです。あとはいろんなリモコンで試したり、ブラウザからのコントロール音声認識、逆にリモコンでRaspberry Piを操作したりとかの応用編もいろいろやってみたいですね。