slee-Pi2 plusと人感センサを用いてラズパイの自動起動と自動シャットダウンの実現と起動時間の短縮

##はじめに
以前投稿した[記事](https://qiita.com/hayashi1989/items/b0a7aa3d6caa7b9e729a)の続きとして、人感センサを用いて起動とシャットダウンを行うように改良することになりました。
自動でラズパイの起動とシャットダウンを行えるようにするために、[メカトラックス社](https://mechatrax.com/)様からお借りしたslee-Pi2 plusを使用します。
また、起動時間をどこまで短縮できるのかにも挑戦しました。

##環境
・[slee-Pi2 Plus](https://mechatrax.com/products/slee-pi/)
・業務用microSDカード (起動時間を短縮するために業務用のものを用いました)
・[人感センサ(人感 赤外線 センサー リレー スイッチ 防犯 DC12-24V)](https://www.amazon.co.jp/%E8%B5%A4%E5%A4%96%E7%B7%9A-%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC-%E3%83%AA%E3%83%AC%E3%83%BC-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81-DC12-24V/dp/B00RP3N4NK#detail_bullets_id)

##作業の流れ
1.ラズパイの準備
2.slee-Pi等の組み立て
3.slee-Piのソフトウェアの準備
4.人感センサによる起動
5.ラズパイの起動時にpythonファイルを実行する
6.自動でシャットダウンする
7.起動時間の短縮化
##システム構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277131/7e79bc69-3c46-4915-f586-9976ba8cda91.png)


##1.ラズパイの準備
Raspberry Pi Imagerを使ってSDカードにraspbian(buster)を入れます。
Imagerがインストールされていれば、約4分ほどで完了します。（簡単！便利！）
[raspberry pi 4のセットアップ](https://raspida.com/setup-raspbian4rpi4b-2020)

##2.slee-Pi等の組み立て

ここでは、slee-Pi2 Plusと人感センサとラズパイの組み立てを説明していきます。
組み立て方は、ラズパイとslee-Piの40ピンヘッダを向きを合わせて刺すだけです。(早！簡単！)
下の写真は組み立て後の写真で、手前がslee-Piで奥にラズパイがあります。
![sleepi2_plus.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277131/048972a9-8ad4-f372-8efb-3ab5e697da93.jpeg)

##3.slee-Piのソフトウェアの準備
[mechatrax/slee-pi2 ソフトウェア](https://github.com/mechatrax/slee-pi2/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)
raspbian busterの場合を参考にします。
リポジトリの追加

```console
pi@raspberrypi:~ $ curl https://mechatrax.github.io/setup.sh | sudo bash
```
パッケージのインストールをします。

```console
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install sleepi2-firmware sleepi2-utils sleepi2-monitor
```
再起動を行います。

```console
pi@raspberrypi:~ $ sudo shutdown -r now
```
##4.人感センサによる起動
人感センサとslee-Pi2 Plusをつなげます。
下の写真は今回用いた[人感センサ](https://www.amazon.co.jp/%E8%B5%A4%E5%A4%96%E7%B7%9A-%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC-%E3%83%AA%E3%83%AC%E3%83%BC-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81-DC12-24V/dp/B00RP3N4NK#detail_bullets_id)です。
![人感センサ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277131/5623521a-e312-dcfc-cd0f-6f89edb51954.jpeg)

###外部入力端子への配線
メカトラックさんに人感センサに保護用のリレー回路等をつなげた状態にしていただきました。
公式ドキュメントにハードウェアの説明が書かれています。
[mechatrax/slee-pi2 ハードウェア](https://github.com/mechatrax/slee-pi2/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2)
ドキュメントを見てつなぐ位置を確認します。
下の写真は接続後の状態です。
![配線.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277131/40aa536a-65ff-8ff8-c60c-bc1bd7c3ecd6.jpeg)



そして、起動要因を確認しておきます。

```console
pi@raspberrypi:~ $ sudo sleepi2ctl --get wakeup-flag
poweron
```
- poweron : 電源接続が起動要因です。
- watchdog : ウォッチドッグタイマのタイムアウトによる再起動が起動要因です。
- alarm : リアルタイムクロックのアラーム発生が起動要因です。
- switch : プッシュスイッチの押下が起動要因です。
- extin : 外部入力の検出が起動要因です。(slee-Pi2 Plusのみ)
- ri : RI 信号の検出が起動要因です。

外部入力をエッジ検出するため以下のコマンドを実行します。

```console
pi@raspberrypi:~ $ sudo sleepi2ctl --set extin-trigger 0 
```
レベル検出を行いたい場合は最後の数字を０ではなく1にすることで設定できます。
エッジ検出とレベル検出については、[「エッジトリガとレベルトリガ」](https://w.atwiki.jp/kumikomi-yitjc/pages/39.html)に書いてあるので参考にしてください。

そしてシャットダウンを行います。

```console
pi@raspberrypi:~ $ sudo shutdown -h now
```
人感センサに手をかざしたりすることでラズパイが起動するようになります。
起動後に起動要因を確認を行うと

```console
pi@raspberrypi:~ $ sudo sleepi2ctl --get wakeup-flag
extin
```
poweronからextinに変わります。

####参考URL
[slee-Pi 2 を操作するためのツール類の紹介](https://github.com/mechatrax/sleepi2-utils)
[slee-Piを使った間欠動作（タイマー動作）と死活監視](https://qiita.com/syasuda/items/dd1564896e75b03b2b7d#:~:text=slee%2DPi%202%E3%81%AE%E9%9B%BB%E6%BA%90%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E3%81%ABAC%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%82%92,%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
##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ファイルには

```sh
#!/bin/bash
cd /home/pi/Techblog
sudo python3 main.py
```
そして再起動をすると無事pythonファイルも同時に起動しました。

####参考URL
[RaspberryPi起動時にPythonのGUIを動かしたい](https://qiita.com/kutzoa/items/6f8721bd9c381791912d)

##6.自動でシャットダウンする
main.shに一定時間人感センサの反応が無くなったらシャットダウンするスクリプトを書きます。

下記のコマンドを実行することで、外部入力のカウント値を得ることができます。

```console
pi@raspberrypi:~ $ sudo sleepi2ctl --get extin-count
```
外部入力のカウント値が一定時間0のままの時にシャットダウンするようにします。

```sh
#!/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
```
そして、このシェルスクリプトを実行します。

```console
pi@raspberrypi:~ $ ./main.sh
```
countの値が60に達した時にシャットダウンされるようになります。
この後は、センサが人を検知するとラズパイが起動しpythonファイルを自動で実行すると共にセンサが反応していない時間を監視して設定した時間になると自動でシャットダウンするようになります。

##7.起動時間の短縮化
まず、現在の起動時間を下記のコマンドで確認します。
現状では**約13秒**かかっています。

```console
pi@raspberrypi:~ $ systemd-analyze time
Startup finished in 1.005s (kernel) + 12.401s (userspace) = 13.406s
```
理想は、人を検知して起動しその人が画面に到達するまでにプログラムを実行させられることです。
今回用いた人感センサの感知範囲が距離2mから8m程度であり、人間の歩く速度は約1m/秒[(１秒で１メートル)](https://www.komei.or.jp/km/hara-isao/2010/12/05/%EF%BC%91%E7%A7%92%E3%81%A7%EF%BC%91%E3%83%A1%E3%83%BC%E3%83%88%E3%83%AB/)なので、最低でも8秒程度で起動できるようにしたいです。
現状の13秒から**5秒以上**の短縮を目指します!
次に、時間がかかっている順にサービスの起動時間を表示します。

```console
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
```
時間のかかっている呼び出しチェーンを表示します

```console
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検知を行うため停止することができません)

```console
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
```
再起動し、時間がかかっている順にサービスの起動時間を確認してみます。

```console
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
```
いくつか停止できていることがわかると思います。
ここで起動時間がどのくらいになったかを確認します。

```console
pi@raspberrypi:~ $ systemd-analyze time
startup finished in 1.164s (kernel) + 11.981s (userspace) = 13.146s
```
あれ、、、約0.25sしか減ってない、、、
これでは目標に全然到達できていないため、
試しに``hciuart.service``を停止して起動時間を確認してみます。

```console
pi@raspberrypi:~ $ sudo systemctl disable hciuart.service
```
再起動します。そして、起動時間を確認すると

```console
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 の起動時間の高速化](https://qiita.com/peace098beat/items/c95f0ba4d9edcf89b023)
[Raspberry Pi -RASPBIAN- のswapを無効化](https://qiita.com/michimaru/items/25608100f871a2a3cf58)
[Fedora 25: plymouth-quit-waitが遅い問題](https://www.hiroom2.com/2016/12/21/fedora-25-plymouth-quit-wait%E3%81%8C%E9%81%85%E3%81%84%E5%95%8F%E9%A1%8C/)
[Raspberry Pi でパッケージをアンインストールする](https://www.out48.com/archives/1335/)
[Raspbianのデフォルトサービスの要否を調べる](https://qiita.com/yamato225/items/8b92e853198962043d25)

##最後に
今回は人感センサとメカトラックスさんからお借りしたslee-Pi2 Plusを使って自動でラズパイの起動とシャットダウンを行えるようにしました。使わない時にはシャットダウンされるので電気代の節約になります！
また、今回も機材等で[メカトラックス社](https://mechatrax.com/)様のサポートをいただきました、お礼申し上げます。

最後まで読んでいただきありがとうございます！