第30回 ボタンでラズベリーパイシャットダウン

前回の記事で製作したスイッチ回路を利用して、ラズベリーパイをスイッチでシャットダウンできるようにします。

目次

ラズベリーパイシャットダウンフローの概要

Node-REDでラズベリーパイをシャットダウンするために「shutdown」ノード(シャットダウンノード)が用意されています。このノードに、何かメッセージを送るとラズベリーパイがシャットダウンします。

shutdownノード

今回の記事では、スイッチが押されたら、このノードにメッセージを送ってラズベリーパイをシャットダウンするフローを作成します。

なお、shutdownノードはデフォルトではパレットにありませんので、最初にノードを追加する必要があります。

今回の記事では、以下の順番で説明を進めていきます。

  1. shutdownノードの追加
  2. rpi – gpio inノードの設定
  3. シャットダウンフローの作成
  4. Dashboardにシャットダウンボタン追加

シャットダウンノード追加

shutdownノードは以下の手順で追加します。

いつものように左上のNode-REDメニューから「パレットの管理」をクリックします。

shutdownノード追加1

パレット管理画面で、(1)「ノードの追加」タブを選択し、(2)検索欄に「shutdown」と入力します。検索結果が表示されますので、(3)「node-red-contrib-rpi-shutdown」ノードを探して、(4)「ノードの追加」ボタンをクリックすると追加できます。

shutdownノード追加2

shutdownノードを追加すると、「restart」ノードも一緒に追加されます。(restartノードを使うとRaspberry Pi OSを再起動できます)

なお、パレットでは「機能」グループに追加されます。「Raspberry Pi」グループではありませんので注意してください。(2022年8月時点)

shutdownノード追加3

これから新しいフローを作成しますので、新規のフロータブを作成しておきましょう。タブの名称は好きな文字列で構いません。以下のように作成してみました。

shutdownノード追加4

最後に、以下のようにshutdownノードを配置しておきましょう。

shutdownノード追加5

rpi – gpio inノード

次に、スイッチ状態を読み取る「rpi – gpio in」ノードについて、最初のこのノードの働きを確認しておきましょう。

rpi-gpio inノード1

rpi – gpio inノードの働き

「rpi – gpio in」ノードは、スイッチの状態を読み取る、と説明しましたが、具体的にどのタイミングで読み取るのかわからないですよね。

このノードは、

GPIOピンの電圧に変化があったら、変化後のGPIOピンの値を読み取ってメッセージを送る

という動作をします。「GPIOピンの値」とは、GPIOピンの状態が3.3Vであれば「1」、0Vであれば「0」を送ります。

ここで、実際の回路を確認しながら、rpi – gpio inノードがスイッチの動作によってどのようなメッセージを送るのか確認しておきましょう。

rpi-gpio inノード2

前回の記事で制作した回路では上の図のようにGPIOピン内部のプルアップ抵抗を使うことにしました。この回路では、スイッチがOFFのときGPIOピンの電圧は3.3Vになります。

この状態のままでは電圧の変化はないのでrpi – gpio inノードは何もしません。

次に、スイッチをONにしたときにどうなるか考えてみます。

rpi-gpio inノード3

スイッチをONにすると、「GPIOピンの電圧が3.3Vから0Vに変化して」、「変化後の電圧は0Vになる」という現象が発生します。

rpi – gpio inノードは、電圧の変化があったことを検知して、変化後のGPIOピンの値を読み取り、このタイミングで「0」のメッセージを送ります。(メッセージのキーは「payload」です)

rpi-gpio inノード4

ただし、スイッチは押したあと、必ず離しますよね。ということで、スイッチ離したタイミングでもrpi – gpio inノードはメッセージを送ります。スイッチを離すと電圧の変化が生じ、変化後の電圧は3.3Vですので、以下のように値が1のメッセージを送ります。

rpi-gpio inノード5

ということで、rpi – gpio inノードは、スイッチを1回押すと、押した時と離した時のタイミングで2回メッセージを送るという点に注意してください。

rpi – gpio inノードの設定

それでは、rpi – gpio inノードを以下のように配置しましょう。

rpi-gpio inノード6

配置後、ダブルクリックして設定画面を表示します。

rpi-gpio inノード7

設定項目は4個ありますので、順番に設定していきます。

端子(GPIOピン)

スイッチ回路はGPIO番号24番ピンに接続しましたので、「GPIO24」を選択します。物理ピン番号は18番です。

抵抗

この「抵抗」メニューでは、GPIOピン内蔵抵抗の設定を行います。

選択肢は「なし」「プルアップ」「プルダウン」です。スイッチ回路はプルアップで製作しましたので「プルアップ」を選択します。

デバウンス

基本的にこの設定はデフォルトの「25」で問題ありません。

この「デバウンス」とは何か、簡単に説明しておきます。

スイッチを押したときの信号は、普通は以下のようにスイッチを入れると信号はONになりそうな気がしますよね。

rpi-gpio inノード8

でも現実世界の物理的なスイッチは、このようなきれいな信号ではありません。スイッチを入れた瞬間、非常に短い時間ですが、以下のようにスイッチの接点がついたり離れたりする不安定期間が存在します。

rpi-gpio inノード9

スイッチの接点がこのようになる、というのはちょっとイメージしづらいかもしれません。

日常生活で考えると、例えば床に何か物を落としてしまった場合、何回かバウンドするのをイメージできると思います。落ちた物は1度でピタッと床に張り付くことはないですよね。

スイッチの接点も同じように、一度でピタッと張り付くことはなく、何回かバウンドします。このようにスイッチの接点がバウンドするために、上の図のように信号は何回かONとOFFを繰り返します。

このように頻繁に変化する信号をすべて律儀にON、OFFと認識してしまうと、1回スイッチを押しただけなのに、何回もスイッチを押したと認識してしまいます。

このようなことを避けるために、Node-REDに限らず、スイッチの変化を読み取る場合はスイッチを操作した瞬間のバウンドしたON/OFF信号を無視する処理を行います。

具体的には、スイッチの変化があった場合、変化直後の一定時間はスイッチの変化の読み取りをしない、という動作をします。

この動作は「デバウンス」と呼んでいます。(日本では「チャタリング」と呼ばれることが多いです。チャタリングは和製英語ですので海外では通じません)

「デバウンス」とは、「Bounce」(バウンドの名詞形)を「De」(取り除く)という意味です。

ということで、rpi – gpio inノードの「デバウンス」設定は、スイッチ状態の変化があった場合、何秒間変化を無視するか、という設定です。

デフォルトは25ms(ミリ秒)になっています。今回のタクトスイッチではこの値で特に問題ありません。

なお、デバウンスの時間は一般的に10ms〜50ms程度ですが、使用するスイッチに応じてこの値を調整することになります。

名前

ここではノード名を設定します。今回は「シャットダウンスイッチ」に設定しました。他の名前でも構いません。

rpi – gpio inノード動作確認

rpi – gpio inノードの設定ができましたので、このノードの動作確認をしてみましょう!

動作確認はdebugノードで行います。以下のようにdebugノードを配置、接続します。

rpi-gpio inノード10

debugノードのフローができたらデプロイします。

デプロイが問題なければ、デバッグウィンドウを表示して、実際にスイッチを1回押してみましょう。

デバッグウィンドウに以下のように2回メッセージが表示されたと思います。

rpi-gpio inノード11

1回目のメッセージはスイッチを押した瞬間、2回目のメッセージはスイッチを離した瞬間のものです。値が正しいかも確認してみてください。

それてでは、Raspberry Pi OSのシャットダウンフローを作成していきましょう。

シャットダウンフロー作成

スイッチを押すとrpi – gpio inノードからメッセージが送られますので、あとはこのメッセージをこのままshutdownノードに送ればシャットダウンできそうですよね。

実際、以下のようにrpi – gpio inノードとshutdownノードを接続すれば、Raspberry Pi OSのシャットダウンができます。

rpi-gpio inノード12

ただ、shutdownノードには短時間に連続して2回メッセージが送られてしまいます。

1回メッセージを送ればシャットダウン処理をしてくれますし、短時間に2回もメッセージをshutdownノードに送ると想定していない動作をする可能性もありますので、メッセージは1回だけ送るようにしたいと思います。

具体的には、最初のメッセージだけ、つまりメッセージの値が「0」のときだけ、shutdownノードにメッセージを送るようにしたいと思います。

rpi-gpio inノード13

メッセージの内容に応じて処理を切り替えたい場合は、以前使用した「switch」ノードを使用します。

ということで、rpi – gpio inノードとshutdownノードの間に、以下のようにswitchノードを入れて、

switchノードが受け取ったメッセージの値が「0」のときだけ、メッセージを送る

という設定をしましょう。

rpi-gpio inノード14

switchノードを配置、ダブルクリックして設定画面を表示します。受け取るメッセージは、キーが「payload」、値が数値の「0」ですので、以下のように設定しましょう。

rpi-gpio inノード15

これで、受け取ったメッセージが「0」のときだけ、shutdownノードにメッセージを送るようになります。

あとはノード間を接続すれば、シャットダウンフローが完成です。

デプロイして、実際にスイッチを押すとRaspberry Pi OSがシャットダウンできるか確認してみましょう。

Dashboardにシャットダウンボタン追加

最後に、Dashboardからシャットダウンできるようにしたいと思います。

Dashboardのノードとして、buttonノードが用意されています。

Dashboardボタン1

このノードを使用すると、以下のようにDashboardにスイッチ(ボタン)を表示することができます。

Dashboardボタン2

それではフローを作成していきましょう。

最初にDashboardグループのbuttonノードを配置します。

Dashboardボタン3

配置後、ダブルクリックして設定画面を開きます。

Dashboardボタン4

設定項目がたくさんありますが、必要なところだけ設定していきます。

(1) Icon

ボタン名の先頭に表示するアイコンを指定できます。

アイコンの種類は第23回の記事で説明した方法と同じです。

今回は一般的な電源アイコン「power_settings_new」を指定してみました。

(2) Label

Dashboardのボタンに表示する名称を設定します。

「シャットダウン」と設定しました。他の名称でも構いませんが、ボタン幅が狭いときは複数行で表示されていしまいますので、あまり長くしない方がよいですね。表示幅が広い場合は「ラズベリーパイシャットダウン」などとした方がわかりやすいかもしれませんね。

(3) Color

ボタンに表示するアイコンと文字の色を設定します。

色の指定方法も第23回の記事で説明した方法と同じです。

色の指定は一般的なWebカラーコード(#に16進数6桁)です。色は以下のサイトなどで確認できます。

Webカラーコード(別ウィンドウで開きます)
https://www.colordic.org/

今回は白抜き文字にしたかったため「white」に設定しました。

(4) Background

ボタンの背景色を設定します。色の指定は(3)Colorと同様です。

デフォルトは青色ですが、このボタンをクリックするとラズベリーパイがシャットダウンしてしまうので、赤系の色に設定してみました。

特にこだわりはありませんが、今回は「#dc143c」に設定しました。

(5) Payload

Dashboardでボタンが押されたときに、buttonノードが送るメッセージ内容を設定します。

shutdownノードへ送るメッセージはなんでも構いませんので、とりあえず文字型の「0」を設定しました。

(6) 名前

ノード名を設定します。単に「シャットダウン」と設定しました。他の名称でも構いません。

設定ができたら完了ボタンをクリックして、以下のようにbuttonノードとshutdownノードを接続します。

Dashboardボタン5

接続できたら、デプロイして、Dashboardを表示してみましょう。

Dashboardボタン6

シャットダウンボタンを押してRaspberry Pi OSがシャットダウンできればOKです!

次回から、最後に残っている電子部品「マイコン内蔵フルカラーLED」の制御をしていきます。

更新履歴

日付 内容
2022.8.16 新規投稿
通知の設定
通知タイミング
guest
0 コメント
本文中にフィードバック
全てのコメントを見る
目次