##はじめに
以前投稿した記事の続きとして、人感センサを用いて起動とシャットダウンを行うように改良することになりました。
自動でラズパイの起動とシャットダウンを行えるようにするために、メカトラックス社様からお借りしたslee-Pi2 plusを使用します。
また、起動時間をどこまで短縮できるのかにも挑戦しました。
##環境
・slee-Pi2 Plus
・業務用microSDカード (起動時間を短縮するために業務用のものを用いました)
・人感センサ(人感 赤外線 センサー リレー スイッチ 防犯 DC12-24V)
##作業の流れ
1.ラズパイの準備
2.slee-Pi等の組み立て
3.slee-Piのソフトウェアの準備
4.人感センサによる起動
5.ラズパイの起動時にpythonファイルを実行する
6.自動でシャットダウンする
7.起動時間の短縮化
##システム構成図
##1.ラズパイの準備
Raspberry Pi Imagerを使ってSDカードにraspbian(buster)を入れます。
Imagerがインストールされていれば、約4分ほどで完了します。(簡単!便利!)
raspberry pi 4のセットアップ
##2.slee-Pi等の組み立て
ここでは、slee-Pi2 Plusと人感センサとラズパイの組み立てを説明していきます。
組み立て方は、ラズパイとslee-Piの40ピンヘッダを向きを合わせて刺すだけです。(早!簡単!)
下の写真は組み立て後の写真で、手前がslee-Piで奥にラズパイがあります。
##3.slee-Piのソフトウェアの準備
mechatrax/slee-pi2 ソフトウェア
raspbian busterの場合を参考にします。
リポジトリの追加
pi@raspberrypi:~ $ curl https://mechatrax.github.io/setup.sh | sudo bash
パッケージのインストールをします。
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install sleepi2-firmware sleepi2-utils sleepi2-monitor
再起動を行います。
pi@raspberrypi:~ $ sudo shutdown -r now
##4.人感センサによる起動
人感センサとslee-Pi2 Plusをつなげます。
下の写真は今回用いた人感センサです。
###外部入力端子への配線
メカトラックさんに人感センサに保護用のリレー回路等をつなげた状態にしていただきました。
公式ドキュメントにハードウェアの説明が書かれています。
mechatrax/slee-pi2 ハードウェア
ドキュメントを見てつなぐ位置を確認します。
下の写真は接続後の状態です。
そして、起動要因を確認しておきます。
pi@raspberrypi:~ $ sudo sleepi2ctl --get wakeup-flag
poweron
- poweron : 電源接続が起動要因です。
- watchdog : ウォッチドッグタイマのタイムアウトによる再起動が起動要因です。
- alarm : リアルタイムクロックのアラーム発生が起動要因です。
- switch : プッシュスイッチの押下が起動要因です。
- extin : 外部入力の検出が起動要因です。(slee-Pi2 Plusのみ)
- ri : RI 信号の検出が起動要因です。
外部入力をエッジ検出するため以下のコマンドを実行します。
pi@raspberrypi:~ $ sudo sleepi2ctl --set extin-trigger 0
レベル検出を行いたい場合は最後の数字を0ではなく1にすることで設定できます。
エッジ検出とレベル検出については、「エッジトリガとレベルトリガ」に書いてあるので参考にしてください。
そしてシャットダウンを行います。
pi@raspberrypi:~ $ sudo shutdown -h now
人感センサに手をかざしたりすることでラズパイが起動するようになります。
起動後に起動要因を確認を行うと
pi@raspberrypi:~ $ sudo sleepi2ctl --get wakeup-flag
extin
poweronからextinに変わります。
####参考URL
slee-Pi 2 を操作するためのツール類の紹介
slee-Piを使った間欠動作(タイマー動作)と死活監視
##5.ラズパイの起動時にpythonファイルを実行する
起動時にファイルの実行をするならsystemdを使った方がいいという記事を多く目にしたので、systemdを用いてpythonファイルの実行を試みましたができませんでした。
(筆者はsystemdでできるはずだと思い込んでいたためここでめちゃくちゃ詰まりました 泣)
GUIのプログラムではDISPLAYが見つからないといったエラーが出てしまいファイルの実行ができませんでした。
そこで、autostartを用いることにしました。
/etc/xdg/lxsession/LXDE-pi/autostart
に存在するautostartの最後の行に、
@lxterminal -e sh /home/pi/Techblog/main.sh
と追記しました。
main.shファイルには
#!/bin/bash
cd /home/pi/Techblog
sudo python3 main.py
そして再起動をすると無事pythonファイルも同時に起動しました。
####参考URL
RaspberryPi起動時にPythonのGUIを動かしたい
##6.自動でシャットダウンする
main.shに一定時間人感センサの反応が無くなったらシャットダウンするスクリプトを書きます。
下記のコマンドを実行することで、外部入力のカウント値を得ることができます。
pi@raspberrypi:~ $ sudo sleepi2ctl --get extin-count
外部入力のカウント値が一定時間0のままの時にシャットダウンするようにします。
#!/bin/bash
cd /home/pi/Techblog
sudo python3 main.py &
count=0
while true
do
input=`sudo sleepi2ctl --get extin-count` #inputにカウント値を代入する
sleep 1 #1秒ごとにコマンドを実行する
echo "input":$input ",count":$count
if [ $input = 0 ]; then
count=`expr $count + 1`
if [ $count = 60 ]; then #60秒間外部入力が無い場合に中の処理を行う
sudo shutdown -h now
exit 0
fi
else
count=0
fi
done
そして、このシェルスクリプトを実行します。
pi@raspberrypi:~ $ ./main.sh
countの値が60に達した時にシャットダウンされるようになります。
この後は、センサが人を検知するとラズパイが起動しpythonファイルを自動で実行すると共にセンサが反応していない時間を監視して設定した時間になると自動でシャットダウンするようになります。
##7.起動時間の短縮化
まず、現在の起動時間を下記のコマンドで確認します。
現状では約13秒かかっています。
pi@raspberrypi:~ $ systemd-analyze time
Startup finished in 1.005s (kernel) + 12.401s (userspace) = 13.406s
理想は、人を検知して起動しその人が画面に到達するまでにプログラムを実行させられることです。
今回用いた人感センサの感知範囲が距離2mから8m程度であり、人間の歩く速度は約1m/秒(1秒で1メートル)なので、最低でも8秒程度で起動できるようにしたいです。
現状の13秒から5秒以上の短縮を目指します!
次に、時間がかかっている順にサービスの起動時間を表示します。
pi@raspberrypi:~ $ systemd-analyze blame
6.885s hciuart.service
2.358s dev-mmcblk0p2.device
2.269s sleepi2-start.service
1.818s raspi-config.service
1.766s udisks2.service
1.250s rpi-eeprom-update.service
1.135s sleepi2-hctosys.service
728ms dphys-swapfile.service
720ms lightdm.service
636ms wpa_supplicant.service
時間のかかっている呼び出しチェーンを表示します
pi@raspberrypi:~ $ systemd-analyze critical-chain
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.
graphical.target @12.175s
└─multi-user.target @12.174s
└─huiuart.service @5.298s +6.873s
└─basic.target @5.040s
└─sockets.target @5.038s
└─triggerhappy.socket @5.037s
└─sysinit.target @5.010s
└─sys-fs-fuse-connections.mount @11.230s +24ms
└─systemd-modules-load.service @938ms +140ms
└─systemd-journald.socket @916ms
└─-.mount @889ms
└─systemd-journald.socket @916ms
└─...
停止しても大丈夫そうなサービスを停止していきます。
(一番時間のかかっているhuiuart.service
はbluetooth関連らしくて在室の確認でBLE検知を行うため停止することができません)
pi@raspberrypi:~ $ sudo systemctl disable raspi-config.service
pi@raspberrypi:~ $ sudo systemctl disable dphys-swapfile.service
pi@raspberrypi:~ $ sudo apt-get autoremove 'plymouth*'
pi@raspberrypi:~ $ sudo systemctl disable rpi-eeprom-update.service
再起動し、時間がかかっている順にサービスの起動時間を確認してみます。
pi@raspberrypi:~ $ systemd-analyze blame
6.900s hciuart.service
2.298s sleepi2-start.service
2.178s dev-mmcblk0p2.device
1.568s udisks2.service
1.122s sleepi2-hctosys.service
936ms user@1000.service
521ms keyboard-setup.service
503ms systemd-timesyncd.service
495ms lightdm.service
485ms systemd-udev-trigger.service
いくつか停止できていることがわかると思います。
ここで起動時間がどのくらいになったかを確認します。
pi@raspberrypi:~ $ systemd-analyze time
startup finished in 1.164s (kernel) + 11.981s (userspace) = 13.146s
あれ、、、約0.25sしか減ってない、、、
これでは目標に全然到達できていないため、
試しにhciuart.service
を停止して起動時間を確認してみます。
pi@raspberrypi:~ $ sudo systemctl disable hciuart.service
再起動します。そして、起動時間を確認すると
pi@raspberrypi:~ $ systemd-analyze time
Startup finished in 1.162s (kernel) + 7.466s (userspace) = 8.628s
8秒代まで速くなりました!!(目標達成??)
このままでは起動してすぐにBLE検知ができないため、
1.教授が出勤し退勤するまでは常時起動にし、BLE検知ができるようにする
2.教授が退勤したらBLE検知を停止し、人感センサで節電間欠動作にする
この2つのモードを切り替えらるようにする必要がありそうです。(今回は割愛)
####参考URL
Raspberry Pi 3 Model B の起動時間の高速化
Raspberry Pi -RASPBIAN- のswapを無効化
Fedora 25: plymouth-quit-waitが遅い問題
Raspberry Pi でパッケージをアンインストールする
Raspbianのデフォルトサービスの要否を調べる
##最後に
今回は人感センサとメカトラックスさんからお借りしたslee-Pi2 Plusを使って自動でラズパイの起動とシャットダウンを行えるようにしました。使わない時にはシャットダウンされるので電気代の節約になります!
また、今回も機材等でメカトラックス社様のサポートをいただきました、お礼申し上げます。
最後まで読んでいただきありがとうございます!