Embedded Linux

Power button for Raspberry Pi

Wake-up

Rất đơn giản, chỉ cần nối chân GND và chân GPIO3 (pin 5 và pin 6) là RPi có thể khởi động.

rp2_pinout
Shutdown

Chúng ta sẽ viết một đoạn script để nhận tín hiệu “button pressed” và shutdown RPi. Đoạn script sẽ chạy “automatically as a Service” mỗi khi RPi reboot.

Tạo python script để nhận tín hiệu “button pressed”
$ nano /home/pi/Documents/Python/shutdown.py

#! /usr/bin/python
import RPi.GPIO as GPIO
import os
import time

GPIO.setmode(GPIO.BCM)

def shutdown_callback(channel):
	print "Would shutdown the RPi now!"
	GPIO.cleanup()
	time.sleep(3)
	os.system("sudo shutdown -h now")

GPIO.setup(3, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.add_event_detect(3, GPIO.FALLING, callback = shutdown_callback, bouncetime = 100)

while True:
	time.sleep(1)

Tiếp theo chúng ta thêm “executable” cho file shutdown.py
$ sudo chmod +x /home/pi/Documents/Python/shutdown.py

Running a Program or Script Automatically as a Service (for Raspbian Wheezy)
Bước 1: Create an init script.
Bước 2: Make the init script executable.
Bước 3: Tell the system about the new init script.

Đầu tiên, chúng ta tạo một file tên shutdownbutton trong folder /etc/init.d:
$ sudo nano /etc/init.d/shutdownbutton
Nội dung của file shutdownbutton:

#! /bin/bash
# /etc/init.d/shutdownbutton
export HOME
case "$1" in
  start)
    echo "Starting shutdown.py"
    /home/pi/Documents/Python/shutdown.py &
    ;;
  stop)
    echo "Stopping shutdown.py"
    pkill -f /home/pi/Documents/Python/shutdown.py
    ;;
  *)
    echo "Usage: /etc/init.d/shutdownbutton {start|stop}"
    exit 1
    ;;
esac
exit 0

Thêm “executable” cho file shutdownbutton:
$ sudo chmod +x /etc/init.d/shutdownbutton

Để test xem mọi thứ hoạt động thế nào, ta dùng các lệnh sau:
$ sudo /etc/init.d/shutdownbutton start hoặc
$ sudo service shutdownbutton start
$ sudo /etc/init.d/shutdownbutton stop hoặc
$ sudo service shutdownbutton stop
Cuối cùng, khi mọi thứ đã OK, ta sẽ thêm đoạn script trên vào service:
$ sudo update-rc.d shutdownbutton defaults

Running a Program or Script Automatically as a Service (for Raspbian Jessie and Stretch)
Trong bản Raspbian Jessie và Stretch, systemd trở thành hệ thống quản lý Service chuẩn, do đó cách cài đặt cũ (sử dụng init.d) sẽ không có tác dụng nữa.

Chúng ta sẽ tạo một service có tên shutdownbutton.service:
$ sudo nano /lib/systemd/system shutdownbutton.service

[Unit]
Description=ShutdownButton
After=multi-user.target

[Service]
Type=simple
ExecStart=/home/pi/pythonScripts/shutdown.py
Restart=on-abort

[Install]
WantedBy=multi-user.target

Đây là một service đơn giản để chạy đoạn python script shutdown.py, service sẽ tự động restart nếu nó bị hủy vì một lý do nào đó.
Tiếp theo chúng ta sẽ kích hoạt service này:
$ sudo chmod +x /lib/systemd/system shutdownbutton.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable shutdownbutton.service
$ sudo systemctl start shutdownbutton.service

Kiểm tra trạng thái của shutdownbutton service:
$ sudo systemctl status shutdownbutton.service
Dừng shutdownbutton service:
$ sudo systemctl stop shutdownbutton.service
Vô hiệu hóa service:
$ sudo systemctl disable shutdownbutton.service

Sau khi đã hoàn thành tất cả các bước trên, reboot RPi và hưởng thụ thành quả nào các bạn.

Cảm ơn các bạn đã theo dõi bài viết. Thân ái và quyết thắng.

Reference:
[1] Raspberry Pi Cookbook 2nd.
[2] Raspberry Pi Shutdown/Reset/Start Button

One thought on “Power button for Raspberry Pi

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s