Кнопка выключения raspberry pi 2

Сегодня будем делать кнопку, которая будет отвечать за выключение raspberry pi 2 и будет подсоединена к GPIO.
Все действия, описанные в этой статье и на сайте вы выполняете на свой страх и риск, за причинённый ущерб ответственность несёте сами. Если согласны поэкспериментировать с raspberry pi, то вперёд!
Сам я в этих GPIO абсолютно не разбираюсь, поэтому начну всё с нуля. В результате мы получим первую рабочую кнопку с полезной функцией. На изображении все GPIO разъемы нашего raspberry pi 2.

команды, freebsd, настройка, установка, сервер, server, ubuntu, network, interfaces, сеть, raspberry

GPIO raspberry pi 2


Это всё те же разъемы, но уже на плате (верхних ряд 40 штырьков, по 20 в каждом ряду — это и есть GPIO):

команды, freebsd, настройка, установка, сервер, server, ubuntu, network, interfaces, сеть, raspberry

С тем, где эти разъемы на плате разобрались.

Дальше берём кнопку примерно такую как на вкл/выкл обычный стационарный ПК. Я именно такую и взял со старого корпуса обычного ПК, она раньше была reset’ом. Кнопка соединена с двумя проводами которые втыкались в материнскую плату опять же обычного компьютера.

Raspberry pi в момент подсоединения проводков и устройств должен быть выключен, так что выключаем.
sudo shutdown -h now

Один провод от кнопки подсоединяем к 38-ому разъему GPIO (см номер в кружке на первом изображении), а второй провод от кнопки подключаем к 40-ому разъему (см номер в кружке на первом изображении).
Когда подсоединили, включаем raspberry pi в розетку, потом подключаемся к нему по ssh и создаём папочку, где будем скрадывать свои скриптики:
sudo mkdir -p /script/gpio
sudo chmod -R 0777 /script
cd /script/gpio
sudo nano shdown.sh

вписываем туда (почти каждую строчку я пояснил для себя и для читателей, так как я это понимаю) :

#! /bin/bash

# 1) Говорим ядру, что мы хотим использовать GPIO20
# Cмотрим на первую картинку статьи и видим, что разъему под номером 38
# соответствует GPIO 20
# после этой команды в директории /sys/class/gpio
# появится директория gpio20, в которой в свою очередь
# появятся файлы active_low, device, direction, edge, subsystem, uevent, value
echo "20" > /sys/class/gpio/export
#
# 2) Указываем, что линия будет выходом
echo "out" > /sys/class/gpio/gpio20/direction
#
# 3) Установим логический 1 для значения исходящей (out) линии.
# Вход (in) можно читать, а на выход (out) задавать значение
echo "1" > /sys/class/gpio/gpio20/value

# 4) Говорим ядру, что мы хотим использовать GPIO21
# смотрим на первую картинку и видим, что разъему под номером 40
# соответствует GPIO21
echo "21" > /sys/class/gpio/export
#
# 5) Указываем, что линия будет входом
echo "in" > /sys/class/gpio/gpio21/direction

# Далее идёт логика:
while ( true )
do
# 6) Если контакт №40(GPIO21) получает логическое значение 1
# (а он его получит от контакта №38(gpio20), когда нажмётся физическая кнопка и цепь замкнётся)
    if [ $(</sys/class/gpio/gpio21/value) == 1 ]
    then
# тогда
# 7) освобождаем(unexport) порт GPIO20(порядковый номер 38)
        echo "20" > /sys/class/gpio/unexport
# 8) освобождаем(unexport) порт GPIO21(порядковый номер 40)
        echo "21" > /sys/class/gpio/unexport
# 9) подаём команду на выключение raspberry pi (shutdown -h now)
        shutdown -h now "The system is turned off using the GPIO"
    fi
# 10) в противном случае приостанавливаем выполнение освобождения
# портов и выключение на 0.02 секунды
    sleep 0.02
done

Сохраняем, закрываем.
Скачать готовый скрипт можно здесь, а посмотреть здесь.

Делаем его исполняемым:
sudo chmod +x /script/gpio/shdown.sh

Пробуем запустить:
sudo /script/gpio/shdown.sh

Потом жмём с небольшой задержкой в 1 секунду физическую кнопку, которую мы подключили к разъемам 38 и 40. Raspberry pi выключится.
Закинем это дело в автозапуск, чтобы не надо было каждый раз после перезагрузки запускать вручную sudo /script/gpio/shdown.sh. Для это выполняем:
sudo nano /etc/rc.local
Вписываем перед «exit 0» строчку:
sudo /script/gpio/shdown.sh &

Всё, после перезагрузки будет выполняться наш скриптик shdown.sh, который отвечает за выключение нашего raspberry pi 2 с помощью обычной физической кнопки.

Возможно, что-то, где-то я не так понял, если есть понимающие, буду рад исправлению/дополнению.

Добавить комментарий