スイッチでShutdownとReboot anchor.png

Raspberry Pi Zero Wでは,学習リモコンと温度計測,FAXサーバーなんかが動いている。

時々なぜなのか不明なのだが,無線LANで接続しているNetworkにつながらなくなることがある。

こうなってしまうとリモートでのメンテナンスも行えないので,しょうがなくUSBケーブルを引っこ抜いて電源をOFFして,またUSBケーブルを入れて電源ONする。ファイルシステムを壊しそうで,ちょっと問題ではある。

そこで少し安全になるように,RPZ-IR-Sensorについているスイッチを使って,シャットダウンとリブートが出来るようにしてみた。

もしかしたら,Watchdogを使ったほうがいいかもしれない。

Page Top

スイッチでシャットダウンとリブートを行えるようにする anchor.png

RPZ-IR-Sensorには赤と黒の2個のスイッチが実装されているので,赤のスイッチを使ってシャットダウンやリブートが出来るようにしてみた。

赤のスイッチを3秒ぐらい押しっぱなしにするとシャットダウンして,1回押すとリブートするようにしてみた。

/usr/local/bin/switch.pyファイルを作成した。

fileswitch.py
Everything is expanded.Everything is shortened.
-
!
-
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#!/usr/bin/env python3
 
# SW(red)を3秒押す:    shutdown
# SW(red)を1回押すと:  reboot
 
import RPi.GPIO as GPIO
 
import time
import os
 
GPIO.setmode(GPIO.BCM)                                      # GPIOの準備
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP)            # set SW1 input
 
GPIO.setwarnings(False)                                     # disable warning message
GPIO.setup(22, GPIO.OUT)                                    # set LED3 output
GPIO.output(22, GPIO.LOW)                                   # LED3 off
 
sw_old = 1
sw_now = 1
 
jikan = 0
flag = 0
 
try:
    GPIO.wait_for_edge(5, GPIO.FALLING)
    
    while True:
        sw_now = GPIO.input(5)
        flag = sw_old + sw_now
        
        if (not(flag)):
            jikan += 1
        else:
            jikan = 0
        
        if(sw_now and (not sw_old)):
            GPIO.output(22, GPIO.HIGH)
            os.system("shutdown -r now")                   # reboot
        if((not flag) and jikan >= 100):
            GPIO.output(22, GPIO.HIGH)
            os.system("shutdown -h now")                   # shutdown
            break
        
        sw_old = sw_now
        time.sleep(0.03)
 
except KeyboardInterrupt:
    GPIO.cleanup()
 
GPIO.cleanup()

実行パーミッションをつけておく。

# chmod 755 /user/local/bin/switch.py

自動起動するように,/etc/rc.localに以下を追加した。

# start reboot/shutdown sw
/usr/local/bin/switch.py

これで思っていたように機能している。

残念ながらシャットダウン後にスイッチを押してブートさせることは出来ない。この場合はUSBケーブルを引っこ抜いて再度入れるようにしないとダメ。

でもシャットダウンはしているのでファイルシステムを壊すと言う危険は減っている。

Page Top

dtoverlayでシャットダウン anchor.png

上記の方法ではなくスイッチでシャットダウンさせるだけの機能であれば,Device Treeのdtoverlayの利用だけで実現出来る。

この場合,/boot/config.txtファイルに以下を追加する。

# add shutdown
dtoverlay=gpio-shutdown,gpio_pin=5,debounce=3000
dtoverlay=gpio-poweroff,gpiopin=22,active_low=0

これで,赤スイッチを3秒間押し続けると,シャットダウンし青LEDが点灯するようになる。

Page Top

シャットダウン後のブート anchor.png

GPIOコネクタの3pinにスイッチを接続できれば,Raspbianのdtoverlayではブートも可能になる。しかし,この機能はGPIOコネクタの3pinにしか対応していない。
12/04/2012以降のbootcode.binに実装されていて,Raspbianがhalt状態になるとGPUがスリープ状態になるが,GPIOコネクタの3pinでスリープ解除できる。

今回はRaspberry Pi Zero WとRPZ-IR-Sensorとの接続にI2Cを使っているので,これはどうしようもないが,もしスイッチをGPIOコネクタの3pinに接続できる状況であれば,/boot/config.txtファイルに以下を追加すれば実現できる。

# add shutdown and powerup SW
dtoverlay=gpio-shutdown,gpio_pin=3,debounce=3000
dtoverlay=gpio-poweroff,gpiopin=22,active_low=0

スイッチを3秒間押し続けるとシャットダウンし青LEDが点灯する。その後,スイッチを押すとブートする。


新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 303, today: 2, yesterday: 0
最終更新: 2023-04-21 (金) 17:33:32 (JST) (342d) by yuji