ラズパイ用電源管理/死活監視モジュール「slee-Pi3」の基本機能の使い方

本記事では**ラズベリーパイ用電源管理/死活監視モジュール「slee-Pi」シリーズ**の最新機種**「slee-Pi3」**の基本的な使い方を紹介します。
組み立てやセットアップの方法は以下記事を参照ください
> [ラズベリーパイ用電源管理/死活監視モジュール「slee-Pi3」のセットアップ](https://qiita.com/vascodagama/items/6fae12853e861614635a)

# slee-Pi3は待機(スリープ)時の消費電流が極めて低い

slee-Pi3のメリットの1つに、スリープ状態時であれば**消費電流が10μA**で運用できるという点があります。スリープ状態時とは、ラズパイは電源OFFでslee-Pi3は待機準備中の状態です。起動するには、「タイマー動作・外部入力・slee-Pi3付属の物理スイッチ」の多種の方法でslee-Pi3からラズパイの電源をONすることができます。タイマー動作で、処理が必要な時だけ起動し、処理後シャットダウンを繰り返す（間欠動作）によって、消費電力の大幅な削減も可能となります。




# タイマー動作
**機能説明：好きな時間にラズパイを起動させることができます。**
**使いどころ：定時実行の運用時(1日1回のログ集計)に、待機時間が長いほど低消費電力の優れた効果が期待できます。**

slee-Pi3は、リアルタイムクロック（RTC）を搭載していますので、slee-Pi3から任意のタイミングで電源停止状態のラズパイを起動することができます。

それでは、スリープ状態時から5分後に自動起動する方法を紹介します。

```bash
sudo sleepi3alarm set "+5min"
sudo shutdown -h now
```

また、時刻からでも自動起動の設定できます。

```bash
sudo sleepi3alarm set "2020/11/08 10:00:00"
sudo shutdown -h now
```

> sleepi3alarm 　　： RTC のアラームを操作するスクリプト
set 　　　　　　 ： パラメータを設定
shutdown -h now ： raspbian(linux)をシャットダウンさせるコマンド

sleepi3ctlのその他コマンド一覧は以下URLを参照ください。
https://github.com/mechatrax/sleepi3-utils#usrsbinsleepi3ctl

時刻の文字のフォーマットは以下URLを参照ください。
https://www.gnu.org/software/coreutils/manual/html_node/Date-input-formats.html

# 電源電圧値（2系統）のモニタリング
**機能説明：slee-Pi3に入力された電源電圧を計測することができます。**
**使いどころ：入力電圧値の異常チェック**

slee-Pi3から電源電圧値の2系統のどちらも取得できるようになりました。
※slee-Pi3以前は2系統のうち高い方のみ可能

2系統の入力電圧差を明確にするためCN1に12V(アダプタ)、CN2は9V(角電池)の電源を接続します。

![IMG_3842.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146895/2e31c9f6-9152-5928-2bd3-7c5692c929a8.jpeg)


まずはCNを指定して入力電圧値を確認します。

```bash
sleepi3ctl get voltage 1
sleepi3ctl get voltage 2
sleepi3ctl get voltage
```
```bash:出力結果
11952 #CN1
9173  #CN2
11952 #CN1,CN2のうち電圧が高い方
```
> sleepi3ctl ： slee-Pi3を操作するための実行ファイル
get　　　： パラメータを取得

上記確認で電圧がそれぞれ取得できることがわかりました。
更に電圧値を一定条件でモニタリングすることも可能です。

今回の検証では、以下設定の方法を紹介します。
・CN1の電圧が100[mV]を超える場合、CN1.logに電圧値を書き込む
・CN2の電圧が100[mV]を超える場合、CN2.logに電圧値を書き込む

まずは、設定ファイルを修正します。

```bash
sudo vi /etc/sleepi3-monitor/monitor.yml
```

```YAML:/etc/sleepi3-monitor/monitor.yml
#監視の間隔
common:
  interval: 1

#外部入力の設定
extin:
  history_size: 1
  commands:    
    - exec: /etc/sleepi3-monitor/extin.d/
      condition: over
      threshold: 0
      oneshot: false

#物理スイッチの設定
pushsw:
  history_size: 1
  commands:    
    - exec: /etc/sleepi3-monitor/pushsw.d/
      condition: over
      threshold: 0
      oneshot: false

#電圧の設定
voltage:
  history_size: 10
  commands:
    #CN1,CN2の電圧値が高い方の設定
    - exec: /etc/sleepi3-monitor/voltage.d/ 
      condition: none
      threshold: 0
      oneshot: true
    #CN1の設定
    - exec: /etc/sleepi3-monitor/voltage-1.d/ 
      channel: 1
      condition: over
      threshold: 100
      oneshot: false
    #CN2の設定
    - exec: /etc/sleepi3-monitor/voltage-2.d/
      channel: 2
      condition: over
      threshold: 100
      oneshot: false
```
> interval　　： 秒単位の監視間隔
history_size ： 履歴に保持する値の数
exec 　　　： 条件を満たした場合に実行されるコマンド
　　　　　　 ディレクトリ指定の場合はディレクトリ内のファイルを実行
condition　： コマンドを実行する条件(閾値以下を監視⇒「under」, 閾値以上を監視⇒[over])
threshold　： 電圧[mV]の閾値
oneshot　 ： 条件が満たされた際の「exec」の実行コマンドの繰り返し(一度のみ実行⇒「true」、繰り返し実行⇒「false」)

※「/etc/sleepi3-monitor/voltage.d/」の設定は動作しないように「condition: none」と設定しています。

CN1のデータを保存する実行ファイルを作成します。

```bash
sudo vi /etc/sleepi3-monitor/voltage-1.d/CN1.sh
```

```bash:/etc/sleepi3-monitor/voltage-1.d/CN1.sh
#!/bin/bash
source /usr/lib/sleepi3-monitor/parse_env.sh
echo ${VOLTAGE1[0]} >> /home/pi/CN1.log
```

ファイルに実行権限を与えます。

```bash
sudo chmod +x /etc/sleepi3-monitor/voltage-1.d/CN1.sh
```

同様に、CN2のデータを保存する実行ファイルを作成します。

```bash
sudo vi /etc/sleepi3-monitor/voltage-2.d/CN2.sh
```

```bash:/etc/sleepi3-monitor/voltage-2.d/CN2.sh
#!/bin/bash
source /usr/lib/sleepi3-monitor/parse_env.sh
echo ${VOLTAGE2[0]} >> /home/pi/CN2.log
```
ファイルに実行権限を与えます。

```bash
sudo chmod +x /etc/sleepi3-monitor/voltage-2.d/CN2.sh
```

最後に設定ファイルを反映させるためにプログラムを再起動します。

```bash
sudo systemctl restart sleepi3-monitor
```

CN1,CN2にそれぞれ電圧の入力があった場合に「/home/pi/CN1.log」、「/home/pi/CN2.log」のファイルには1秒間隔(interval)でデータが追記されます。

また実用的な方法として、メカトラックス株式会社のサンプルプログラムに
「**3秒以上電圧低下を検知した場合にシャットダウンするスクリプト**」もありますのでこちらも参照ください。
URL: https://github.com/mechatrax/sleepi3-monitor/blob/master/examples/99-shutdown_by_continuous_voltage_drop.sh

# 電源電圧の監視と処理
**機能説明：電源電圧を監視し、ラズパイの起動やシャットダウンができます。**
**使いどころ：簡易UPSとしての機能を構築できます。**

電源電圧が閾値を下回った際にシャットダウンする方法を紹介します。

voltage項目内の「threshold」を10000[mv]に設定します。

```YAML
voltage:
  history_size: 10
  commands:
    - exec: /etc/sleepi3-monitor/voltage.d/
      condition: under
      threshold: 10000
      oneshot: true
```

次にシャットダウンするコマンドのファイルを「/etc/sleepi3-monitor/voltage.d/」内に作成します。

```bash
sudo vi /etc/sleepi3-monitor/voltage.d/shutdown.sh
sudo systemctl restart sleepi3-monitor
```

```bash:/etc/sleepi3-monitor/voltage.d/shutdown.sh
sudo shutdown -h now
```

ファイルに実行権限を与えます。

```bash
sudo chmod +x /etc/sleepi3-monitor/voltage.d/shutdown.sh
```

設定ファイルを反映させるためにプログラムを再起動します。

```bash
sudo systemctl restart sleepi3-monitor
```

尚、slee-Pi3は2系統の電源を接続できますが、別系統の電源（補助電源）が無い場合は、電源異常自体が原因で上記のような正常な処理ができないのでご注意ください。

# 死活監視(ウォッチドッグ)
**機能説明：ラズパイのハートビートの信号が途絶えると、OSをシャットダウンや再起動することができます。**
**使いどころ：システム異常時に自動的に復旧するプログラムを構築できます。**

ウォッチドッグとは、システムが正常に動作しているかどうかを監視することです。slee-Pi3の死活監視(ウォッチドッグ)によりシステムエラー発生時に自動でラズパイを再起動できます。

```bash
sleepi3ctl get restart
sleepi3ctl get watchdog-timeout
```

```bash:出力
1 #1はシステムが無応答と判定された場合に再起動
60 #システムの応答を検知するタイムアウト値が60秒
```
カーネルパニックを意図的に発生させます。

```bash
cat /proc/sys/kernel/panic
sudo bash
root@raspberrypi:/home/pi# cat /proc/sys/kernel/panic
root@raspberrypi:/home/pi# echo c > /proc/sysrq-trigger
```

上記コマンドでラズパイはカーネルパニックとなり、60秒後に再起動します。

# 外部入力によるラズパイ起動
**機能説明：外部信号を入力してラズパイを起動させることができます。**
**使いどころ：別デバイスからラズパイを起動など処理の連携が可能となります。**

今回は、人感センサが反応した際にラズパイを起動する方法を紹介します。

用例としては、『「出退勤管理システム」、「防犯カメラ」、「空調システム」等との連携』が考えられます。


## 必要なもの
- [ハウジング(EHR-2)](https://jp.rs-online.com/web/p/wire-housings-plugs/3116209/)
- [コンタクト(BEH-001T-P0.6)](https://jp.rs-online.com/web/p/crimp-contacts/3116439/)
- [電線(0.3mm程度)](https://amzn.to/3nqD7EZ)
- [リレー(SRD-05VDC-SL-C)](https://amzn.to/36A7tyd)
- [人感センサ](https://akizukidenshi.com/catalog/g/gM-14064/)
- 圧着工具
 - メーカ推奨品([YC-260R](https://www.monotaro.com/p/4902/0133/))
 - IWISS販売品([IWS-3220M](https://amzn.to/36DyTmH))
- [ワイヤーストリッパ](https://amzn.to/3nrbYlr)

## 回路作成
圧着する部品の準備します。
![IMG_3827.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146895/9883f616-e6a4-7b71-9e0f-a5dc97a4441b.jpeg)

コネクタケーブルの完成形です。
![IMG_3828.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146895/b6fccd18-c14f-d096-8465-325628b18eb6.jpeg)


回路の完成図です。
![IMG_3829.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146895/52535df1-5780-6286-5c1a-47db94eb5b63.jpeg)


## slee-Pi3の設定

外部入力は常時有効のため、特に設定する内容はありません。

人感センサが動体を検知するとslee-Pi3はスリープ状態から起動状態となります。

動画はこちら ⇒ https://youtu.be/-M1w7g4-g2A

# 外部出力で他の機器を起動

**機能説明：slee-Pi3から外部信号を出力することができます。**
**使いどころ：GPIOを使うことなく、ラズパイと別デバイスの連携が可能となります。**

slee-Pi3の外部出力の電気的な仕様は、別途[こちら](https://github.com/mechatrax/slee-pi3/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2)を参照ください。

今回は、slee-Pi3の起動に合わせてLEDの点灯させる方法を紹介します。

用例として、一般的なGPIOを使ったLチカでは無く、slee-Pi3の外部出力を使って『ラズパイの起動状態の表示灯』等を実現してみます。

## 必要なもの
- [ハウジング(EHR-2)](https://jp.rs-online.com/web/p/wire-housings-plugs/3116209/)
- [コンタクト(BEH-001T-P0.6)](https://jp.rs-online.com/web/p/crimp-contacts/3116439/)
- [電線(0.3mm程度)](https://amzn.to/3nqD7EZ)
- LED
- 抵抗
- 圧着工具
  - メーカ推奨品([YC-260R](https://www.monotaro.com/p/4902/0133/))
  - IWISS販売品([IWS-3220M](https://amzn.to/36DyTmH))
- [ワイヤーストリッパ](https://amzn.to/3nrbYlr)

## 回路作成
[前章](#回路作成)と同じコネクタケーブルを使用します。

回路の完成図です。
![IMG_3837.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146895/4cdc42c3-4bd7-0528-7402-a8cdfce1fe70.jpeg)


## slee-Pi3の設定

外部出力を有効化するコマンドを入力します。

```bash
sleepi3ctl set extout 1
```

この設定だけでOKです。

ラズパイのON/OFFに合わせてslee-Pi3の外部出力もON/OFFします。 

動画はこちら ⇒ https://youtu.be/Ray8hzy7Yz8

もちろん起動状態で、下記を実行すれば通常のLチカっぽいことも可能です。

```bash
while true;
do
  sleepi3ctl set extout 1;
  sleep 1;
  sleepi3ctl set extout 0;
  sleep 1;
done
```

#まとめ
　slee-Pi3は、「間欠動作」・「電圧モニタリング」・「死活管理」の基本的な動作は
　**数行～数十行のプログラミングで実現できます**。