1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry Piをスイッチでシャットダウンする

Posted at

Raspberry Pi にログインすることなく外部からのボタン入力でシャットダウンさせます。実装はgo言語です
コードはGithubにも公開しています

動作環境

  • HW: Raspberry Pi 4B
  • OS: Ubuntu server 20.04 64bit

配線接続

GPIO2とGroundをメカニカルスイッチに接続する(ピンアサイン図)

コード

main.go
package main

import (
	"fmt"
	"log"
	"os/exec"
	"time"

	"periph.io/x/conn/v3/gpio"
	"periph.io/x/conn/v3/gpio/gpioreg"
	"periph.io/x/host/v3"
)

func main() {
	if _, err := host.Init(); err != nil {
		log.Fatal(err)
	}

	p := gpioreg.ByName("GPIO2")
	if p == nil {
		log.Fatal("Failed to find GPIO2")
	}

	if err := p.In(gpio.PullDown, gpio.FallingEdge); err != nil {
		log.Fatal(err)
	}

	for {
		counter := 0
		p.WaitForEdge(-1)
	countLoop:
		for {
			switch p.Read() {
			case gpio.Low:
				counter++
				if counter >= 200 {
					fmt.Printf("shutdown start...\n")
					if err := exec.Command("shutdown", "-h", "now").Run(); err != nil {
						log.Fatal(err)
					}
				}
			default:
				break countLoop
			}
			time.Sleep(10 * time.Millisecond)
		}
	}
}

プログラムを起動後、2秒以上スイッチを長押しするとシャットダウン処理が始まります

自動起動

ラズパイ起動時に自動でプログラムを起動させるため、systemdのサービスとして登録します
/etc/systemd/system/gpio-shutdown.serviceファイルを作成します

/etc/systemd/system/gpio-shutdown.service
[Unit]
Description = hardware shutdown daemon

[Service]
ExecStart=/opt/gpio-shutdown
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target

/opt/gpio-shutdownはコードをビルドして生成されたバイナリファイルです。手動でコピーして配置しておきます

ファイルが用意できたらサービスを起動します

sudo systemctl start gpio-shutdown.service
sudo systemctl enable gpio-shutdown.service

サービスが正常に起動されたかを確認します

sudo systemctl status gpio-shutdown.service

Activeの項目がactive(running)であれば準備完了です。ラズパイを起動後、2秒以上スイッチを長押しするとシャットダウン開始します

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?