●ボタンスイッチ ( シャットダウン… )を使う
Lチカの実験ボード環境下で、ラズパイ内の実行プログラム からのコマンドにより、LED点滅の制御ができました。 ■今度は ……… ボタンスイッチを使用しての  プログラム制御に興味がありますので  Lチカの実験ボード環境下で試すことにしました。
・ ・ ・ ・ ・
●概要 アイコンのクリック操作で、再起動とシャットダウンの実行が できる環境下なのですが、ボタンスイッチ操作からも同様な 機能の実行ができるようにします。 更に、再スタート機能(プログラム不要)も付け加えます。     【 Raspberry Pi3 Model B 】
(種類)  ■赤ボタン(GPIO14)…… @ 【 シャットダウン 】スイッチ  ■黄ボタン(GPIO15)…… A 【 再 起 動 】スイッチ  ■緑ボタン(GPIO3 )…… B 【 再 ス タ ー ト 】スイッチ
 −−−−− ボタンスイッチを使う −−−−−  ■赤ボタン(GPIO14)…… @ 【 シャットダウン 】スイッチ
●ボタンを押下すると ……… シャットダウンするプログラムを作ります。
#!/usr/bin/env python # -*- coding: utf-8 -*- #*************************************************************** # 【 シャットダウン 】 ボタン スイッチ プログラム # # ■ボタン スイッチ : GPIOピン(14) # # BSW-SHUTDOWN.py ( T.EJIRI ) #*************************************************************** #**各種設定****************************************************** print("●●● START ●●● 【シャットダウン】ボタン スイッチ プログラム") import os # オペレーティングシステム ライブラリ インポート import RPi.GPIO as GPIO # GPIO制御 ライブラリ インポート 別名GPIO import time # 時刻取得 ライブラリ インポート GPIO.setmode(GPIO.BCM) # ピン番号 (GPIO番号で設定する) SW_PIN= 14 # SWピンNO ← ボタンスイッチのGPIO14ピン # 入力ピンで使用する(プルアップ抵抗を有効にする) : SWピンNO(SW_PIN) GPIO.setup(SW_PIN,GPIO.IN,pull_up_down=GPIO.PUD_UP) #*************************************************************** # # ボタンスイッチ【 シャットダウン 】処理 # #*************************************************************** # 無限ループ【1】 START ------------------------------------- while True: #** ボタンスイッチ < SWピンNO(SW_PIN)> の入力判断 #** エッジ入力(立ち下がり(High→Low))があるまで待つ ……… GPIO.wait_for_edge(SW_PIN, GPIO.FALLING) # 立ち下がり検知 設定 #** ボタンスイッチ入力を、検出した LOOP_CNT = 0 # LOOP_CNT ゼロクリア # 無限ループ【2】 START --------------------------------- while True: W_GPIO = GPIO.input(SW_PIN) # W_GPIO ← GPIOピン(SW_PIN) # 約1秒(LOOP_CNT 10 以上)になれば、再起動コマンドを実行する if W_GPIO == 0: # W_GPIO 入力あり(0)の時 LOOP_CNT = LOOP_CNT + 1 # LOOP_CNT +1 加算 if LOOP_CNT >= 10: # LOOP_CNT 10 以上の時 # ボタン押し( OK )処理 print(W_GPIO) print("●●● シャットダウンの実行です ●●●") GPIO.cleanup() #GPIOをクリーンアップ # シャットダウンの実行 os.system("sudo shutdown -h now") break # 無限ループ【2】を中断する else: # ボタン押しが短い時は、読み飛ばす print("●●● ボタン押し NGです ●●●") break # 無限ループ【1】を中断する # 無限ループ【2】 END ------------------------------------ time.sleep(0.1) # 一時停止する (0.1) 秒 # 無限ループ【1】 END ---------------------------------------- GPIO.cleanup() #GPIOをクリーンアップする sys.exit() #プログラムを終了する #**************************************************************
 −−−−− ボタンスイッチを使う −−−−−  ■黄ボタン(GPIO15)…… A 【 再 起 動 】スイッチ
●ボタンを押下すると ……… 再起動するプログラムを作ります。
#!/usr/bin/env python # -*- coding: utf-8 -*- #*************************************************************** # 【 再起動 】 ボタン スイッチ プログラム # # ■ボタン スイッチ : GPIOピン(15) # # BSW-REBOOT.py ( T.EJIRI ) #*************************************************************** #**各種設定****************************************************** print("●●● START ●●● 【再起動】ボタン スイッチ プログラム") import os # オペレーティングシステム ライブラリ インポート import RPi.GPIO as GPIO # GPIO制御 ライブラリ インポート 別名GPIO import time # 時刻取得 ライブラリ インポート GPIO.setmode(GPIO.BCM) # ピン番号 (GPIO番号で設定する) SW_PIN= 15 # SWピンNO ← ボタンスイッチのGPIO15ピン # 入力ピンで使用する(プルアップ抵抗を有効にする) : SWピンNO(SW_PIN) GPIO.setup(SW_PIN,GPIO.IN,pull_up_down=GPIO.PUD_UP) #*************************************************************** # # ボタンスイッチ【 再起動 】処理 # #*************************************************************** # 無限ループ【1】 START ------------------------------------- while True: #** ボタンスイッチ < SWピンNO(SW_PIN)> の入力判断 #** エッジ入力(立ち下がり(High→Low))があるまで待つ ……… GPIO.wait_for_edge(SW_PIN, GPIO.FALLING) # 立ち下がり検知 設定 #** ボタンスイッチ入力を、検出した LOOP_CNT = 0 # LOOP_CNT ゼロクリア # 無限ループ【2】 START --------------------------------- while True: W_GPIO = GPIO.input(SW_PIN) # W_GPIO ← GPIOピン(SW_PIN) # 約1秒(LOOP_CNT 10 以上)になれば、再起動コマンドを実行する if W_GPIO == 0: # W_GPIO 入力あり(0)の時 LOOP_CNT = LOOP_CNT + 1 # LOOP_CNT +1 加算 if LOOP_CNT >= 10: # LOOP_CNT 10 以上の時 # ボタン押し( OK )処理 print(W_GPIO) print("●●● 再起動の実行です ●●●") GPIO.cleanup() #GPIOをクリーンアップ os.system("sudo reboot") # 再起動の実行 break # 無限ループ【2】を中断する else: # ボタン押しが短い時は、読み飛ばす print("●●● ボタン押し NGです ●●●") break # 無限ループ【1】を中断する # 無限ループ【2】 END ------------------------------------ time.sleep(0.1) # 一時停止する (0.1) 秒 # 無限ループ【1】 END ---------------------------------------- GPIO.cleanup() #GPIOをクリーンアップする sys.exit() #プログラムを終了する #***************************************************************
 −−−−− ボタンスイッチを使う −−−−−  ■緑ボタン(GPIO3)…… B 【 再 ス タ ー ト 】スイッチ
●ボタンを押下すると ……… 復帰(再スタート)させる設定をします。 ・(GPIO3)ピンとGND(−)間を、スイッチ通電できる配線をします。 ・通電状態になると、シャットダウン後の状態に限り  復帰(再スタート)が実行されます。
・ ・ ・ ・ ・
●自動起動させたいので ……… ボタンスイッチからのプログラム制御で動いてくれましたが 手動起動は面倒なので、ラズパイが立ち上がる時に スタートアップ的な自動起動ができるように設定します。 常時実行のプログラムは、ボタン入力待ちの状態になります。 ■スケジュール管理ツール ……… crontab( クロンタブ )を使います。 *【 再 ス タ ー ト 】分の設定は不要です。
●Cronの設定 ……… crontab -e 自動起動させたいプログラムを、最後尾に追加登録しました。
@reboot /home/pi/自動起動/BSW-REBOOT.py @reboot /home/pi/自動起動/BSW-SHUTDOWN.py
・ ・ ・ ■設定完了後、再起動しました。 ・ ・
●ラズパイ起動後の通常状態から ………
 → 【 再起動 】ボタンを押下しました。
●再起動中の状態です。
 → シャットダウン、再起動、再スタートの動作は ……… すべてOKです。
・ ・ ・ ・ ・