2015年2月8日日曜日

RuneAudio 0.3 でもシャットダウンボタンと赤外線リモコンを使う Using a shutdown button and IR remote controller

リモコンの設定を手っ取り早く見たい場合は こちら へ.
For quickly review the instruction for the remote controller settings, go to this page.

Volumio ではプッシュボタンスイッチ (長押しでシャットダウン,短く押すと play/pause のトグル) と IR リモコンを導入した.Volumio できたのだから,RuneAudioでもやらなくては(笑)
I introduce a push-button switch  and an IR remote control.  The push button enables us shutdown when long push, and play/pause toggle when short push.
I succeeded on Volumio.  So I have to on RuneAudio too :-)

ところが,これが大変だった.何より,まったく馴染みのない systemd になっているところがきつい.また,RuneOS は起動は速いのだが,shutdown に妙に時間がかかることが多い.すっと落ちるときもあるので,理由はわからないのだが.そのため,動作確認のための再起動のたびにかなりのタイムロスがあり,心理的にはこれがじわじわ来た.

えらく苦労はしたが,とりあえず動くようになったので,そのメモ.

But ... the work was hard and stressfull, because I have no experience on systemd.  After many trials and errors, I succeeded what I want.

システムのアップデート Updating the system

注意.
最初にこのメモを作ったときはよかったのだが,5月の時点で upgrade をかけると変更点が多すぎて,以下の記述通りには作業できなくなる.ということで,upgrade はかけないことを推奨.自力で何とかできる人はどうぞ.
Warning! 
You should not upgrade the system!  ArchLinux system is under continuous improvement, and the system configuration manners are also being changed.

必須の作業ではないが,とりあえずやっておく.ただし,仕様変更等で何がおこるかわからないというリスクがあるので,しないという選択肢ももちろんある.

# pacman -Syu

apt-get でいうところの update が y,upgrade が u ということのようだ.
現時点では uname -r で出てくるのは 3.12.26-1-ARCH
This is optional, and may potentially cause serious problem.
Options y and u respectively correspond to update and upgrade in apt-get.
The current kernel version is 3.12.26-1-ARCH (displayed by uname -r).


プッシュスイッチと LED 制御のデーモンスクリプトの修正と導入 Modifying and installing the daemon script for push button and LED control
/etc/rc.local は RuneOS では使えなくなっているので,systemd 系の操作の練習というか勉強を兼ねて,まずは簡単なところを.
On RuneOS, /etc/rc.local is not available.  In order to learn and exercise systemd, I tried first to set up the daemon script for controlling a push button switch and an LED indicator for the system shutdown. and paly/pause toggle.

プッシュボタンスイッチ (プッシュオンタイプ) は GPIO の pin 15 (GPIO22) と pin 17 (+3.3 V) に接続.
LED は pin 22 (GPIO25) に A (+) 端子,pin 20 (GND) に K (-) 端子を接続.抵抗はなくてもよいが,赤LEDなら47Ω程度を直列に入れるとさらに安心.
A push button switch (momentary-on type) is connected to GPIO pin 15 (GIPO22) and pin 20 (+3.3 V).
An LED is connected to GPIO pin 22 (GPIO25) for the anode (A, +) terminal and GPIO pin 20 (GND) for the cathode (K, -).  A protective resister of 47 ohm (or so) in series is recommended for especially a red LED.

プッシュボタンを長押しすると shutdown に入る.shutdown 動作に入るときに LED が点灯するので,ボタンを離すタイミングがわかりやすい.
A long push of the button starts the shutdown process.  The LED indicates entering the shutdown process.  You push the button until the LED turns on, then you can release the button.  The system goes to shutdown.

基本手順は以下のような感じ
The essential procedures are:
  1. 起動するスクリプトを /usr/bin/ あたりに入れる.
  2. 起動情報を書く .service ファイルを /usr/lib/systemd/system/ に作る.
  3. 自動起動の設定

  1. Install the script at /usr/bin/
  2. Create .service file that describes start-up information at /usr/lib/systemd/system/
  3. Enable auto start up.


ex. /usr/lib/systemd/system/shutdownbt.service
[Unit]
Description=Enabling Push Button on GPIO22 and LED on GPIO25

[Service]
Type=forking
ExecStart=/usr/bin/shutdownbt_led.sh
TimeoutSec=0

[Install]
WantedBy=multi-user.target

/usr/bin/shutdownbt_led.sh は,Volumio のときと違って,これ単独でデーモンになってくれないと困るので (ExecStart の右に & が使えるのかどうかは確認していない),スクリプト自体を以下のように変更

/usr/bin/shutdownbt_led.sh
#!/bin/sh
GPIO_SW=22          # GPIO port for SW
GPIO_LED=25         # GPIO port for LED
SLEEP_INTERVAL=0.2  # interval for sleep command
PUSHTIME_SD=5       # push-and-hold time for shutdown
PUSHTIME_PP=1       # push-and-hold time for play/pause toggle

#Initializing GPIO ports 22 & 25
echo "$GPIO_SW" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio$GPIO_SW/direction
echo "low" > /sys/class/gpio/gpio$GPIO_SW/direction   # pull-down
echo "$GPIO_LED" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio$GPIO_LED/direction

# main loop
loop() {
  cnt=0
  while : 
  do
    data=`cat /sys/class/gpio/gpio$GPIO_SW/value`
    if [ "$data" -eq "1" ] ; then
      cnt=`expr $cnt + 1`
    else
      cnt=0
    fi
    if [ $cnt -gt $PUSHTIME_PP ] ; then
      sleep $SLEEP_INTERVAL
      sleep $SLEEP_INTERVAL
      data=`cat /sys/class/gpio/gpio$GPIO_SW/value`
      if [ "$data" -eq "0" ] ; then
        mpc toggle
      fi
    fi

    if [ $cnt -gt $PUSHTIME_SD ] ; then
      break
    fi

    sleep $SLEEP_INTERVAL
  done

  # Turns on GPIO for LED (25)
  echo 1 > /sys/class/gpio/gpio$GPIO_LED/value

  # executing shutdown process
  shutdown -h now
  exit 0
}

loop &
exit 0

登録したスクリプトのテスト起動.
Trial start of the script for test.

# systemctl start shutdownbt.service

問題なければ自動起動を有効にする.
If no problem, enable auto start.

# systemctl enable shutdownbt.service


IRレシーバの接続 Installing IR receiver
こちらと同じ.
The receiver module is Rohm RPM7138-R which works at 5 V Vcc. As Raspberry Pi's GPIO input is not 5 V-tolerant, the receiver output is limited using a 39 kohm resister as the following schematic.  Each connection to the corresponding GPIO pin is also shown.



lircパッケージのインストール Installing lirc package
現時点でのバージョンは 0.9.2.1月に出たようだ.
The current version is 0.9.2 released in this January.

# pacman -S lirc

普通に入る.
Done without problems :-)

/etc/conf.d/lircd.conf を以下の内容で作成.
Create /etc.conf.d/lircd.conf as below.
LIRCD_ARGS="--uinput"
DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

これは Volumio 1.5 (あるいは他の Debian 系のシステム) では /etc/lirc/hardware.conf に書いた内容.
The above is described in /etc/lirc/hardware.conf on Volumio 1.5 (or other Debian-based systems).
これで再起動をかけると,
After robooting, you can activate GPIO and lirc by executing the following command

# modprobe lirc_rpi gpio_in_pin=14 gpio_out_pin=17

とかやって,GPIO と lirc をつなぐことができるようになる.

# ls /dev/lirc0

でデバイスファイルができていることが確認でき,
You can confirm the device file as above.

# cat /sys/kernel/debug/gpio

で,GPIOピンへの割り付けも表示される.debugfs へのマウント操作はいらない.
The above operation gives you the GPIO pin assignments.
GPIOs 0-53, bcm2708_gpio:
 gpio-14  (lirc_rpi ir/in      ) in  hi
 gpio-16  (led0                ) out  hi
 gpio-17  (lirc_rpi ir/out     ) in  lo
 gpio-22  (sysfs               ) out lo
 gpio-25  (sysfs               ) out lo
この状態で irrecord を動かすと信号を記録できる.
Now, you can record remote controller signals using irrecord command.

なお,irrecord 自体は (lirc の新しいメジャーリリース (0.9.2) になったせいか) Volumioで入れたときと動作が少し違う.最初のボタンを一通り押すという過程がなく,いきなり各キーに名前を付けて学習させるというモードに入る.
For the 0.9.2 release of lirc, the irrecord procedure is changed.  You can use conf files created with the older lirc package.

現時点では,RuneOS 用 (というか,Raspberry Pi 用 ArchLinux)  lirc パッケージの irrexec では正しい conf ファイルが作れないようだ.私は Volumio で作ったのをそのまま使ったので,気づかなかったが,こちらの指摘を受けて試してみたらやはりだめであった.
Currently, irrecord included in lirc package for RuneOS (or ArchLinux for Raspberry Pi) does not work properly.  I created conf file on Volumio and the file works well on Rune.  See here.

lirc_rpi に渡すパラメータは /etc/modprobe.d/lirc.conf に記述.中身は
The below is the parameters for lirc_rpi module, and is described in /etc/modprobe.d/lirc.conf
options lirc_rpi gpio_in_pin=14 gpio_out_pin=17
これで

# modprobe lirc_rpi

だけでパラメータを指定した状態で lirc_rpi が組み込まれるようになる.
Then you can activate lirc_rpi with the options described in /etc/modprobe.d/lirc.conf as above.

ちなみに,modprobe -r lirc_rpi で組み込んだドライバを外せる.チェック用に.
You can remove lirc_rpi module by "modprobe -r lirc_rpi".  This is useful for checking.

lirc_rpi ドライバの自動組み込み設定  Auto-load of lirc_rpi module
modprobe で組み込めるのだから,自動で組み込めなくてはいけないのだが,これまた RuneOS ではやり方が違う.
/etc/modules-load.d/lirc.conf を作成し,中身は lirc_rpi の1行を記述.
再起動して,lsmod あたりでドライバの組み込みを確認.
Create /etc/modules-load.d/lirc.conf and write a line "lirc_rpi".
Reboot and check the loading using lsmod command (eg. lsmod | grep lirc).

lircd にリモコンデータを渡す設定 Configuring lircd for interpretation of controller signals
/etc/lirc/lircd.conf.d/ ディレクトリに irrecord で作ったデータをコピーしておく.名前は *.conf になっていればよい.
Copy the data created with irrecord command to /etc/lirc/lircd.conf.d/ directory.  The file name should be of *.conf style.

lircd のチェックと自動起動の設定 Auto start-up of lircd
まず起動できるかどうかのチェックとして,
First, check lircd settings.

# sytemctl start lircd

これで起動できれば,設定ファイル等は問題なし.
When no error, the settings are proper.
irw を起動.
Start irw.

# irw

この状態でリモコンを押すと,送信されたキー情報が表示されることを確認.
irw は ^C で終了.
Press buttons on the controller and confirm the signals received.
Stop irw by ^C.


自動起動のために enable を設定.
Enable auto-start as below.

# systemctl enable lircd

再起動して,lircd が自動で読み込まれていることを確認.たとえば ps -A | grep lircd
Reboot the system and check lircd loaded (eg. with "ps -A | grep lircd")

irexec の自動起動の設定 Auto start-up of irexec
これだけで丸1日がかりの探索,試行錯誤になった.
結果的にうまくいった方法だけ.
This is the final result after the many trials and errors within a whole day.

/usr/lib/systemd/system/irexec.service を作る.中身は
Create /user/lib/systemd/system/irexec.service :
[Unit]
Description=Start irexec daemon
Wants=lircd.service
After=network.target

[Service]
Type=simple
ExecStartPre=/usr/bin/sh -c "sleep 3"
ExecStart=/usr/bin/irexec /etc/conf.d/lircrc

[Install]
WantedBy=multi-user.target
キモは,ExecStartPre.ここでウェイトを入れることで,irexecの読み込みが成功する.Wants や Requires で lircd を先に読むようにしても,ちゃんと起動して使用可能になる前に irexec のロードに入ってしまうようで,ウェイトを入れないとどうしても irexec のロードに失敗する.だからいったんシステムが立ち上がって,lircd がちゃんと動いてしまった後で systemctl で読み込むのであれば ExecStartPre がなくても成功するが,自動起動では失敗するということのようだ.
ウェイトは 3 入れているが,1 だとうまくいかないときがあったので余裕を見ている.
/etc/conf.d/lircrc は,リモコンのキーと実行される命令を書いたファイルで,Volumio等で作ったものを流用できる.
The key point is "sleep 3" in ExecStartPre.
/etc/conf.d/lircrc contains the list of command keys and the corresponding respective  commands to be executed.  You can use one created with the older package or the other distributions.

一応,

# systemctl start irexec.service



# systemctl status irexec.service

でチェックをした後,
Check as above two operations, and enable the auto-start as below.

# systemctl enable irexec.service

で自動起動を有効化しておく.


現状の RuneAudio の実用上の問題は,Raspberry pi を起動するときには DAC が使えるようになっていなくてはならないこと.後から入れるのではだめ.ただし,起動時に認識させておけば,その後はDAC側だけなら電源を ON/OFF しても大丈夫.つまり,Raspberry pi 側は止めない,という運用をすればよいということに.

Volumioと比べると,どっちもどっちという気がする.
RuneAudio をメインにするなら,Raspberry pi は常時稼働,電気代はしれていると割り切るのがよい気がする.
Volumio はどのみち先に DAC の電源が入ってないとだめなので,聴き終わったら shutdown すべきなんだろうなあ.
DAC がコンポ内蔵のものだからこういう問題が起こるので,コンポとは別にすればいいのだが,そうすると,このコンポを選んだ意味がなくなってしまうなあ.




0 件のコメント:

コメントを投稿