Сегодня будем делать кнопку, которая будет отвечать за выключение raspberry pi 2 и будет подсоединена к GPIO.
Все действия, описанные в этой статье и на сайте вы выполняете на свой страх и риск, за причинённый ущерб ответственность несёте сами. Если согласны поэкспериментировать с raspberry pi, то вперёд!
Сам я в этих GPIO абсолютно не разбираюсь, поэтому начну всё с нуля. В результате мы получим первую рабочую кнопку с полезной функцией. На изображении все GPIO разъемы нашего raspberry pi 2.
Это всё те же разъемы, но уже на плате (верхних ряд 40 штырьков, по 20 в каждом ряду — это и есть GPIO):
С тем, где эти разъемы на плате разобрались.
Дальше берём кнопку примерно такую как на вкл/выкл обычный стационарный ПК. Я именно такую и взял со старого корпуса обычного ПК, она раньше была 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 с помощью обычной физической кнопки.
Возможно, что-то, где-то я не так понял, если есть понимающие, буду рад исправлению/дополнению.