Raspberry Piで赤外線リモコン

ウェブブラウザを使って遠隔地から自宅の家電(今回は液晶テレビ)を赤外線で操作してみた。

ハードウェア

赤外線受信モジュールCRVP1738 fo=38KHz
送信用赤外線LEDOSI5FU5111C-40 λ=940nm If(max)=100mA Vf=1.35-1.6V

※現在CRVP1738は入手困難。

※OSI5FU5111C-40は半減角が15°と狭い(指向性が強い)ので照射方向がかなりシビアだ。もう少し半減角の広いLEDの方がいい。

ソフトウェア

Raspberry PiのOSバージョンの確認

2012-12-16-wheezy-raspbian

  1. $ uname -a
  2. Linux raspberrypi 3.2.27+ #250 PREEMPT Thu Oct 18 19:03:02 BST 2012 armv6l GNU/Linux

準備

  1. $ sudo apt-get update
  2. $ sudo apt-get dist-upgrade
  3. $ sudo apt-get upgrade

LIRCをインストール

  1. $ sudo apt-get install lirc

ファームウェアのアップデート

  1. $ sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update
  2. $ sudo chmod +x /usr/bin/rpi-update
  3. $ sudo rpi-update

ドライバの設定。回路に合わせて、使用するGPIOのピンを受信がGPIO4(ピン7)、送信がGPIO17(ピン11)と設定する。ちなみに、デフォルトでは、受信がGPIO18、送信がGPIO17である。

  1. $ sudo nano /etc/modules
  2.  :
  3. lirc_dev
  4. lirc_rpi gpio_in_pin=4 gpio_out_pin=17

リブートしてドライバーの確認

  1. $ sudo reboot
  2.  :
  3. $ dmesg | grep lirc
  4. [ 12.912771] lirc_dev: IR Remote Control driver registered, major 248
  5. [ 13.033477] lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned.
  6. [ 13.055223] lirc_rpi lirc_rpi.0: lirc_dev: driver lirc_rpi registered at minor = 0
  7. [ 13.075415] lirc_rpi: driver registered!
  8. [ 14.031796] lirc_rpi: auto-detected active low receiver on GPIO pin 4
  9. [ 14.624119] input: lircd as /devices/virtual/input/input0

2つのドライバが確認できる

  1. $ lsmod | grep lirc
  2. lirc_rpi 7109 0
  3. lirc_dev 10156 1 lirc_rpi

キャラクタデバイス(メジャー=248、マイナー=0)が作成される

  1. $ ls -l /dev/lirc*
  2. crw-rw---T 1 root video 248, 0 2月 21 12:54 /dev/lirc0

GPIOピンへの割り当てが正しく反映されていることを確認

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

実際にリモコンのボタンを押して赤外線を照射すると、次のようにパルス列を認識する。

  1. $ mode2 -d /dev/lirc0
  2. space 2432460
  3. pulse 3436
  4. space 1638
  5. pulse 500
  6. space 313
  7. pulse 499
  8.  :

リモコンボタンを学習する。irrecordコマンドの指示に従って、リモコンのボタンを押して赤外線を照射する。この学習の結果が、~/lircd.confに保存される。

  1. $ irrecord -n -d /dev/lirc0 ~/lircd.conf

~/lircd.confのnamaeの項目をわかりやすい名前に変更するなどして、最終的なLIRCの設定ファイルにする。

  1. $ nano ~/lircd.conf
  2.  :
  3. name AQUOS
  4.  :
  5. $ sudo cp ~/lircd.conf /etc/lirc/

もうひとつ、LIRCの設定ファイルを次のように編集する。

  1. $ sudo nano /etc/lirc/hardware.conf
  2. # /etc/lirc/hardware.conf
  3. #
  4. # Arguments which will be used when launching lircd
  5. LIRCD_ARGS="--uinput"
  6. #Don't start lircmd even if there seems to be a good config file
  7. #START_LIRCMD=false
  8. #Don't start irexec, even if a good config file seems to exist.
  9. #START_IREXEC=false
  10. #Try to load appropriate kernel modules
  11. LOAD_MODULES=true
  12. # Run "lircd --driver=help" for a list of supported drivers.
  13. DRIVER="default"
  14. # usually /dev/lirc0 is the correct setting for systems using udev
  15. DEVICE="/dev/lirc0"
  16. MODULES="lirc_rpi"
  17. # Default configuration files for your hardware if any
  18. LIRCD_CONF=""
  19. LIRCMD_CONF=""

LIRCDがブート時に自動起動するよう設定し、LIRCDを開始する。

  1. $ sudo update-rc.d lirc defaults
  2. $ sudo /etc/init.d/lirc start

リモコンボタンが正しく登録されたことを確認

  1. $ irsend LIST "" ""
  2. irsend: AQUOS
  3. $ irsend LIST AQUOS ""
  4. irsend: 000000000000688b power
  5. irsend: 000000000000d880 disp
  6. irsend: 000000000000ab84 size
  7. irsend: 0000000000009a86 halt
  8. irsend: 0000000000008489 catv
  9. irsend: 0000000000005a46 3digit
  10. irsend: 000000000000f147 preference
  11.  :

リモコンのボタンを押して赤外線を照射し、学習したボタンが正しく認識されることを確認する。

  1. $ irw
  2. 0000555af1484a8b 00 select AQUOS
  3. 0000555af1484a8b 01 select AQUOS
  4. 0000555af1481b8f 00 right AQUOS
  5. 0000555af1480481 00 down AQUOS
  6. 0000555af148eb80 00 left AQUOS
  7. 0000555af148ea81 00 up AQUOS
  8.  :

今度は学習したリモコンボタンの信号が送信されることを確認する。

  1. $ irsend SEND_ONCE AQUOS power
  2. $ irsend SEND_ONCE AQUOS up down left right select

赤外線LEDが発光している事を肉眼で確認することはできないが、携帯のカメラやデジカメなどを通してみると確認できる。オシロで確認した出力波形(GPIO17の電圧)は次の通り。

フレーム信号の先頭。3.5msのマーク、1.6msのスペースで始まり、その後ろにデータビットが続く。データビットの0は400usのマーク+400usのスペース。データビットの1は400usのマーク+800usのスペース。このケースの場合、0101010101011010...つまり16進で555A...と読み取れる。

拡大。38KHz、デユーティー50%の搬送波になっている。

最後にWebIOPiを使ってコンテンツを作成する。WebIOPiを使う特別な理由はない。WebIOPiよりもっとスマートな方法があるかもしれない。私のような馬鹿チョンでも出来る方法を選んだまでである。 

WebIOPiサーバとMJPG_Streanerの自動起動を設定する。

  1. $ sudo nano /etc/rc.local
  2.  :
  3. (cd /home/pi/telecon ; sudo python telecon.py) &
  4. export PLUGINPATH=/usr/local/lib
  5. sudo mjpg_streamer -i "$PLUGINPATH/input_uvc.so -f 25 -r 320x240 -d /dev/video0" -o "$PLUGINPATH/output_http.so -w /usr/local/www -p 8001" &
  6. exit 0

ソース

使用感

(左)ウェブブラウザの画面(右)SHARP AQUOS 液晶テレビ用リモコンGA826WJSA

2013年02月23日