Как добавить кнопку питания в свой Raspberry Pi
Всегда следует безопасно выключать Pi.
Чтобы снизить цену, Raspberry Pi не поставляется с кнопкой питания, но вы легко можете самостоятельно добавить свою! В этом руководстве вы узнаете как добавить кнопку питания, которая будет включать или выключать ваш Raspberry Pi.
Мы собираемся использовать несколько сценариев, которые будут контролировать два вывода GPIO (универсальный ввод/вывод) на вашем Pi и понимает, когда нажимается кнопка для включения или выключения Pi.
Почему важна кнопка питания Raspberry Pi?
Никогда не выдергивайте шнур питания из Pi, так как это может привести к серьезному повреждению данных (а в некоторых случаях физически повредить SD-карту). Вы можете безопасно отключить свой Pi с помощью программной команды или, что еще лучше, использовать кнопку питания (см. Это руководство). :)
Примечание:
Когда мы «выключаем» Pi, он переходит в состояние остановки, которое все еще потребляет очень небольшое количество энергии. Это похоже на работу всех современных компьютеров. В этом руководстве мы рассмотрим процесс добавления кнопки питания, которая будет как останавливать, так и выводить Pi из данног состояния. Кроме того, после того, как ваш Pi отключился, можно безопасно отключить источник питания (если хотите), не беспокоясь о повреждении данных.
Что нам необходимо:
1. Собираем материалы
Прежде чем мы приступим к работе нужно подготовить все комплектующие.
Вам понадобится Raspberry Pi любой версии.
Вы можете подобрать Pi на Амазоне:
Если вы следуете этому руководству, вероятно, вам придется выбрать подходящую кнопку для вашего проекта. Я собираюсь использовать довольно большую кнопку, но важно, чтобы это была именно «нормально открытая кнопка моментального отклика».
Вы можете заказать кнопку на Amazon, где найдете множество небольших кнопок разных форм-факторов. Смотрите раздел tools/materials.
Также, читайте о Pi Cart: a Raspberry Pi Retro Gaming Rig in an NES Cartridge
2. Разбираемся, как работает пробуждение
Нам нужно понять, как вывести Pi из состояния остановки, прежде чем мы создадим функцию выключения. В общем то замыкающие контакты 5 и 6 (GPIO3 и GND) будут выводить Pi из состояния остановки.
Самый простой способ проверить это - отключить Pi с помощью sudo shutdown -h и подключить контакты 5 и 6, соединяя их с помощью кабеля гнездо в гнездо. Нужно только на короткое время замкнуть их. Тогда вы должны обнаружить, что Pi "проснулся".
3. Создаем функциональность режима сна
Решение Wake достаточно простое, но для того, чтобы безопасно отключить Pi, нам нужно использовать программное решение. Поскольку мы знаем, что будем использовать контакты 5 и 6, чтобы разбудить Pi, давайте также используем эти контакты, чтобы выключить его. Таким образом, мы можем подключить нашу кнопку к этим контактам, и она отключит и разбудит Pi.
Нам нужно написать скрипт, который реагирует на нажатие кнопки и выключает Pi. Прежде чем мы рассмотрим сценарий, давайте обсудим несколько разных подходов. Во-первых, мы могли бы написать скрипт, который запускает бесконечный цикл и ждет изменения состояния вывода GPIO. Используя псевдокод, это может выглядеть примерно так:
while True: if GPIO3 is pressed: shutdown the pi
Хотя это будет работать и, вероятно, не будет иметь реальных проблем с производительностью, на самом деле есть способ получше. Мы можем прослушивать прерывание (обнаружение крайнего состояния). Прерывание - это изменение состояния с LOW на HIGH или HIGH на LOW. Библиотека RPi.GPIO предоставляет метод с именем wait_for_edge, который блокирует выполнение нашего скрипта до тех пор, пока не будет обнаружено прерывание. Итак, мы настроим GPIO3, и как только мы обнаружим крайнее положение, мы отключим Pi.
Во-первых, нам нужно подключиться к Pi через SSH. Затем мы будем использовать скрипт с именем listen-for-shutdown.py.
Для создания скрипта мы можем использовать нано-редактор. После подключения к Pi выполните следующую команду, чтобы создать файл с именем listen-for-shutdown.py:
sudo nano listen-for-shutdown.py
Затем вставьте следующий код в этот файл и нажмите CTRL-X для выхода и Y для сохранения при появлении запроса.
#!/usr/bin/env python import RPi.GPIO as GPIO import subprocess GPIO.setmode(GPIO.BCM) GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.wait_for_edge(3, GPIO.FALLING)subprocess.call(['shutdown', '-h', 'now'], shell=False)
Далее нам нужно запустить этот скрипт при загрузке. Поэтому мы поместим скрипт в /usr/local/bin и сделаем его исполняемым:
sudo mv listen-for-shutdown.py /usr/local/bin/ sudo chmod +x /usr/local/bin/listen-for-shutdown.py
Теперь добавьте еще один скрипт с именем listen-for-shutdown.sh, который запустит/остановит наш сервис. Чтобы создать скрипт, наберите:
sudo nano listen-for-shutdown.sh
Введите следующий код в этот файл и сохраните его:
#! /bin/sh### BEGIN INIT INFO # Provides: listen-for-shutdown.py # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 ### END INIT INFO# If you want a command to always run, put it here# Carry out specific functions when asked to by the system case "$1" in start) echo "Starting listen-for-shutdown.py" /usr/local/bin/listen-for-shutdown.py & ;; stop) echo "Stopping listen-for-shutdown.py" pkill -f /usr/local/bin/listen-for-shutdown.py ;; *) echo "Usage: /etc/init.d/listen-for-shutdown.sh {start|stop}" exit 1 ;; esacexit 0
Поместите этот файл в /etc/init.d и сделайте его исполняемым.
sudo mv listen-for-shutdown.sh /etc/init.d/ sudo chmod +x /etc/init.d/listen-for-shutdown.sh
Теперь мы зарегистрируем скрипт для запуска при загрузке:
sudo update-rc.d listen-for-shutdown.sh defaults
Поскольку скрипт не будет запущен, мы продолжим и наберем
sudo /etc/init.d/listen-for-shutdown.sh start
Примечание: Эти листинги и программные сценарии были добавлены в Github repo. Не стесняйтесь отправлять пул риквесты.
Примечание: Спасибо Tero Korpela за рекомендацию включить внутренний подтягивающий резистор!
Также читайте: How to log in to a Raspberry Pi via SSH
4. Тестируем кнопку с помощью макета
Первое, что мы сделаем, это подключим кнопку и протестируем функциональность с помощью макета. Это очень простая схема, но, прежде чем мы продолжим, хорошо бы убедиться, что она работает.
Вы можете посмотреть схему с деталями ниже, но я объясню, что происходит. Я использую два соединительных кабеля мужской и женский. Я подключаю один к контакту 5 (SCL), а другой к контакту 6 (земля). Если контакт 6 уже занят чем-то другим, вы можете использовать любой другой контакт заземления. Вот отличный ресурс для определения всех ваших контактов!
Затем я подключаю их к макету с кнопкой, находящейся между ними. Поскольку кнопка нормально разомкнута, цепь будет разомкнута, пока кнопка не будет нажата. Затем, когда цепь будет завершена, нажатие либо разбудит Pi, если он находится в состоянии остановки, либо отключит его, если он проснется.
Чтобы убедиться, что это работает правильно, я войду в систему Pi через SSH.
ssh pi@raspberrypi
Затем, когда я нажимаю кнопку, я подтверждаю, что моя сессия потеряна. В более сложной реализации я могу запросить подтверждение, что сеть Pi отключена с помощью arp-scan.
sudo arp-scan --interface=en0 --localnet
В этом руководстве я не стану вдаваться в подробности того, как использовать arp-scan, но если вы используете правильный интерфейс, все должно работать.
Вы можете проверить вывод arp-scan и убедиться, что Raspberry Pi не подключен к сети.
Затем нажмите кнопку еще раз, чтобы разбудить его. Если вы подождете несколько секунд, Pi должен вернуться. Вы можете проверить снова, используя команду arp-scan. Если Pi включен, вы увидите вывод, похожий на этот:
192.168.1.254 20:3d:66:44:c6:70 (Unknown) 192.168.1.181 b8:27:eb:79:49:f2 Raspberry Pi Foundation 192.168.1.251 58:82:a8:7e:66:36 (Unknown)
Теперь вы можете снова подключиться через SSH!
Читайте также:How to log in to a Raspberry Pi via SSH
5. Финальный цикл разработки
Теперь пришло время подключить кнопку, которую мы собираемся использовать для проекта. Я собираюсь использовать перемычку, чтобы кнопку можно было легко отсоединять от Pi. Я припаяю его с другой стороны кнопки.
Замечания:
Если вы используете Pi без припаянного к нему заголовка (контактов) GPIO, например, Pi Zero, вы можете припаять непосредственно к сквозным отверстиям GPIO Pi Zero.
Далее: добавьте светодиодный индикатор питания к вашему Pi
Если вы хотите увидеть, в каком состоянии находится ваш Pi (и когда его можно безопасно отключить) после нажатия кнопки питания, вы также можете добавить простой светодиодный индикатор состояния Pi.
Также читайте: Build a simple Raspberry Pi LED power/status indicator