OrangePi-PCを使ってみる

オンボードの赤外線受信(sunxi_cir編)

OrangePi-PC にはオンボードの赤外線受信機が実装されています。
また、赤外線受信に使える2つの赤外線ドライバーが用意されています。
・sunxi_cir
・sunxi-ir-rx

最新のArmbianは「sunxi_cir」が標準ドライバーとなっていますので、これを使った赤外線の読み取り方法を紹介します。
こ ちらで紹介されている内容を翻訳しただけですが、リモコン学習時のコマンドは一部変えています。

@ドライバーの確認
まずは以下の手順でドライバーを確認します。

$ lsmod
Module                  Size  Used by
sunxi_cir               1601  0 → 赤外線ドライバー
8188eu                908230  0
8189es               1076034  0

$ ls /dev/lirc*
/dev/lirc0  /dev/lircd

$ cat /proc/bus/input/devices
I: Bus=0019 Vendor=0002 Product=0001 Version=0100
N: Name="vmouse"
P: Phys=vmouse/input0
S: Sysfs=/devices/virtual/input/input0
U: Uniq=
H: Handlers=mouse0 event0
B: PROP=0
B: EV=7
B: KEY=70400 0 0 0 0 0 0 0 0
B: REL=143

I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-gpiokey"
P: Phys=sunxikbd/input0
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=kbd event1 cpufreq_interactive
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0

I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-ths"
P: Phys=sunxiths/input0
S: Sysfs=/devices/virtual/input/input2
U: Uniq=
H: Handlers=event2
B: PROP=0
B: EV=9
B: ABS=100 0

I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-ir" → 赤外線ドライバー
P: Phys=sunxi-ir/input1
S: Sysfs=/devices/virtual/rc/rc0/input4
U: Uniq=
H: Handlers=kbd event3 cpufreq_interactive
B: PROP=0
B: EV=100013
B: KEY=1000000 0 0 0 0
B: MSC=10

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="MCE IR Keyboard/Mouse (sunxi-ir)"
P: Phys=/input0
S: Sysfs=/devices/virtual/input/input5
U: Uniq=
H: Handlers=sysrq kbd mouse1 event4
B: PROP=0
B: EV=100017
B: KEY=30000 0 7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: REL=3
B: MSC=10

もし、上記のように表示されないときは、「/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="default"
# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="sunxi_cir"

# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""

A使えるリモコンを探す
次に手元のリモコンが使えるかどうか確認します。
マウスやキーボードなどの周辺機器の有無で、デバイススペシャルファイル(/dev/input/event3)は変わるかもしれません。
「Input device name: "sunxi-ir"」と表示されるデバイスを探してください。

$ sudo evtest /dev/input/event3
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "sunxi-ir"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 152 (KEY_SCREENLOCK)
  Event type 4 (EV_MSC)
    Event code 4 (MSC_SCAN)
Key repeat handling:
  Repeat type 20 (EV_REP)
    Repeat code 0 (REP_DELAY)
      Value    500
    Repeat code 1 (REP_PERIOD)
      Value    125
Properties:
Testing ... (interrupt to exit)

ここまで表示されたらリモコンを発射します。

Event: time 1480486039.158592, type 4 (EV_MSC), code 4 (MSC_SCAN), value 15
Event: time 1480486039.158603, -------------- EV_SYN ------------
Event: time 1480486051.291252, type 4 (EV_MSC), code 4 (MSC_SCAN), value 09
Event: time 1480486051.291262, -------------- EV_SYN ------------
Event: time 1480486052.079401, type 4 (EV_MSC), code 4 (MSC_SCAN), value 07
Event: time 1480486052.079411, -------------- EV_SYN ------------

このように表示されたら OrangePi PC で使うことができるリモコンです。

Bリモコンの学習
以下のコマンドでリモコンの学習を行います。
ここで注意する点が2つあります。
コマンドの引数に「-n」をつけないと、あらかじめ定義されている名前でしかボタンを登録できません。
事前に定義されている名前は「irrecord -l」で確認することができます。
また、コマンド実行時に以下のエラーとなることがあります。

$ sudo irrecord -n -d /dev/lirc0 my.conf

irrecord -  application for recording IR-codes for usage with lirc

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

irrecord: could not open /dev/lirc0
irrecord: default_init(): Device or resource busy
irrecord: could not init hardware (lircd running ? --> close it, check permissions)

エラーとなるときは「sudo /etc/init.d/lirc stop」でサービスを止めてから実行します。

$ sudo irrecord -n -d /dev/lirc0 my.conf

ずらずら表示される

Please send the finished config files to <lirc@bartelmus.de> 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.

(Enterキー)

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.→
(Enter キー)
(リモコンのボタンを押し続ける 同じボタンでOK)
................................................................................
Found gap: 129204
Please keep on pressing buttons like described above.
(リモコンのボタンを押し続ける 適当に押すボタンを変える)
................................................................................
Space/pulse encoded remote control found.
Signal length is 71.
Found possible header: 9005 4476
Found trail pulse: 566
No repeat code found.
Signals are space encoded.
Signal length is 34
Now enter the names for the buttons.

Please enter the name for the next button (press <ENTER> to finish recording)
→OK(登録するボタンの名前)

Now hold down button "OK".
(OKボタンとして登録するボタンを1回だけ押します)

Please enter the name for the next button (press <ENTER> to finish recording)
→UP(登録するボタンの名前)

(UPボタンとして登録するボタンを1回だけ押します)

Now hold down button "UP".

Please enter the name for the next button (press <ENTER> to finish recording)
→(Enterキー)
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.→(Enterキー)
(適当なボタンを押し続ける)
.............................
No toggle bit mask found.
Successfully written config file.

my.conf のファイルができます。

Cコンフィグファイルの修正と lirc の起動
出来上がった my.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 Wed Nov 30 09:07:32 2016
#
# contributed by
#
# brand:                       my.conf
# model no. of remote control:
# devices being controlled by this remote:
#

begin remote

  name  my.conf
  bits           16
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  header       9018  4453
  one           592  1651
  zero          592   530
  ptrail        591
  pre_data_bits   16
  pre_data       0xFF
  gap          141030
  toggle_bit_mask 0x0

      begin codes
          OK                       0xA857
          UP                       0x02FD
          DOWN                     0x9867
          LEFT                     0xE01F
          RIGHT                    0x906F
      end codes

end remote


<修正後>
赤字の部分が修正したところです。
name は何でもいいですが、私はどのリモコンか分かりやすい名前(今回はコダックのフォトフレームに付いてきたリモコン)を付けました。
# 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(devinput) on Fri Mar 18 12:44:29 2016
#
# contributed by
#
# brand:                       my.conf
# model no. of remote control:
# devices being controlled by this remote:
#

begin remote

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

  header       9018  4453
  one           592  1651
  zero          592   530
  ptrail        591
  pre_data_bits   16
  pre_data       0xFF
  gap          141030
  toggle_bit_mask 0x0

      begin codes
          OK                       0xA857
          UP                       0x02FD
          DOWN                     0x9867
          LEFT                     0xE01F
          RIGHT                    0x906F
      end codes

end remote

コンフィグファイルを登録してlircを起動します。

$ sudo cp my.conf /etc/lirc/lircd.conf
$ sudo /etc/init.d/lirc start
$ sudo shutdown -r now


Dリモコンの確認
以下のコマンドでリモコンの登録状況を確認することができます。

$ irsend LIST "" ""
irsend: KODAC

$ irsend LIST KODAC ""
irsend: 000000000000a857 OK
irsend: 00000000000002fd UP
irsend: 0000000000009867 DOWN
irsend: 000000000000e01f LEFT
irsend: 000000000000906f RIGHT

また、以下のコマンドでリモコンが認識されるか確認することができます。
irw を起動してリモコンを発射し、以下が表示されれば完了です。

$ irw
0000000000ffa857 00 OK KODAC
0000000000ff02fd 00 UP KODAC
0000000000ff9867 00 DOWN KODAC
0000000000ffe01f 00 LEFT KODAC
0000000000ff906f 00 RIGHT KODAC




Eリモコンでのコマンド実行
サンプルとして以下の2つのシェルファイルを作ります
オンボード上のLEDをLチカするシェルです。

/home/orangepi/RedLed.sh
#!/bin/bash
modprobe gpio_sunxi
for i in {1..10}
do
sh -c "echo 1 > /sys/class/leds/red_led/brightness"
sleep 1
sh -c "echo 0 > /sys/class/leds/red_led/brightness"
sleep 1
done

/home/orangepi/YellowLed.sh
#!/bin/bash
modprobe gpio_sunxi
for i in {1..10}
do
sh -c "echo 1 > /sys/class/leds/green_led/brightness"
sleep 1
sh -c "echo 0 > /sys/class/leds/green_led/brightness"
sleep 1
done

「/home/orangepi/.lircrc」 を以下の内容で作ります。
begin
 button = UP
 prog   = irexec
 config = sudo /home/orangepi/RedLed.sh
end

begin
 button = DOWN
 prog   = irexec
 config = sudo /home/orangepi/YellowLed.sh
end

リモコンでsudoコマンドを実行する場合は、ユーザがパスワードなしでsudoできるようにしておく必要があります。
これをしないと、sudoコマンドを実行したときにパスワード入力待ちになってしまいます。
/etc/sudoersの末尾に、
ユーザ名 ALL=(ALL) NOPASSWD: ALL
を加えます。
なお、/etc/sudoersの修正には専用のコマンドを使います。

$ sudo visudo

例えば、orangepiユーザにこの権限を与える場合は

orangepi ALL=(ALL) NOPASSWD: ALL

を追加します。
変更後の「/etc/sudoers」は以下の様になります。

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
orangepi ALL=(ALL) NOPASSWD: ALL

ここまで準備ができたら、以下のコマンドを実行後にリモコンのボタンを押すと、オンボードのLEDがLチカします。
以下のコマンドを実行後にリモコンのボタンを押すと、オンボードのLEDがLチカします。
$ irexec /home/orangepi/.lircrc    お試しで起動したいとき

$ irexec -d /home/orangepi/.lircrc    デーモンで起動したいとき

ブート時にデーモンで起動するときは「/etc/rc.local」に登録しますが、少し待ち時間を設けた方がいいです。
sleep 10
irexec -d /home/orangepi/.lircrc

私はもっぱらRebootとShutdownをリモコンで行っています。

次回は、「sunxi-ir-rx」 ドライバーの使い方を紹介します。