シャットダウンスイッチをつけた理由
カムプログラムロボットに組み込んだRaspberry Piでプログラムするとき、ChromeBookのLinuxターミナルや、VNCクライアントで接続して作業するので、作業終了後は shutdownコマンドやGUIのShutdownボタンで、OSをシャットダウンして Raspberry Piを終了させます。
でも、ChromeBookを終了した後に、Raspberry Piのシャットダウンを忘れていた事に気づくことが度々あり、その都度 ChromeBookを起動させるのが面倒でした。
↓こんなの作っています。
Qiita: Raspberry Pi 3 Mobel B+とカムプログラムロボットでロボット作成
あと、(どのくら先になるか分かりませんが)自立起動させた場合、シャットダウンボタンがあったほうが都合がいいかなと思い、シャットダウンボタンを追加してみました。
シャットダウンボタンの設置イメージ
ブレッドボード上に設置したタクトスイッチの端子を、GPIO.7(BCM 4)と、GND に接続します。
OS環境
Raspberry Piの OSはRaspbian 9.8になります。
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.8 (stretch)
Release: 9.8
Codename: stretch
OSの各パッケージはまめに apt-get update しているので最新だと思います。
シャットダウンプログラム
プログラムは piユーザのホームディレクトリに binディレクトを作成してそこに保存することにしました。
pi@raspberrypi:~ $ mkdir bin/
pi@raspberrypi:~ $ vi ./bin/shutdown_button.py
プログラムはpythonで記述し、python2,python3の両方で動作することを確認済みです。
プログラムは、このページを参考にシャットダウンボタンを作成しました。
クラゲのIoT: RaspberryPiにshutdownボタンを付けよう
#!/usr/bin/python
import time
import RPi.GPIO as GPIO
import os
GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.IN, pull_up_down=GPIO.PUD_UP)
try:
while True:
GPIO.wait_for_edge(4, GPIO.FALLING)
sw_counter = 0
while True:
sw_status = GPIO.input(4)
if sw_status == 0:
sw_counter = sw_counter + 1
if sw_counter >= 200:
os.system("sudo shutdown -h now")
break
else:
break
time.sleep(0.01)
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
2秒以上、押し続けた場合、shutdown コマンドを実行するようにしています。
OS起動時に自動実行するようにする
動作確認後、etcの下にあるrc.local ファイルを編集して、起動時にプログラムを実行するようにしています。
pi@raspberrypi:~ $ sudo vi /etc/rc.local
exit 0 の前の1行が追加したコードになります。
/home/pi/bin/shutdown_button.py
exit 0
追加後、Rsapberry Piを再起動すると設定が反映されます。
再起動後、タクトスイッチを長押してシャットダウンが実行されることを確認します。
最後に
シャットダウンスイッチを作っていて、Raspberry Piのハードウェアとソフトウェアの両方を比較的簡単に連動させながら扱えるの魅力を再実感しました。
コンピュータのプログラムを学ぶときに、手で触れられる部分とプログラムを連動させられると実感として判りやすいので、大切ですね。
願わくは、20年度からの小学校でのプログラム教育義務化にもこの感覚は反映させてほしいです。小学校の子がいる、おっさんプログラマからのお願いです。
でも、できる環境があるのと、それを教えることができる環境があるかは、別物ですよね。。。。、難しいです。