Кнопка выключения для Raspberry Pi

Порты GPIO являются одними из главных преимуществ Raspberry Pi, недаром в более поздних версиях платы их количество было увеличено с 26 до 40. К сожалению, большинство подключаемых к ним плат (сенсорные экраны, светодиодные матрицы, платы расширения и т.д.), в целях совместимости со всеми моделями «малинки», используют только первые 26 контактов, оставляя остальные 14 «за бортом». Но мы не дадим пропасть добру! В данной статье я расскажу, как сделать кнопку выключения или перезагрузки на двух неиспользуемых портах. На самом деле функциональность кнопки может быть любой, зависит от вашей фантазии и потребностей.3cc307e9ab814eebbfa5c39086d34c77.jpg

Это мой первый опыт работы с GPIO, так что тут важно было понять логику. Почти любой контакт GPIO (есть несколько зарезервированных) можно установить в одно из двух состояний: «выход» (он же OUT или логическая 1) или «вход» (IN или логический 0). Напряжение на выходе составляет 3,3В. Работать с портами GPIO можно как непосредственно из терминала, так и из любого языка программирования. Предельно подробно это описано здесь.

4cf268470fb34ee294e8106d54fe2fbe.png

Для своей кнопки я решил использовать два самых правых контакта в верхнем ряду. Разъём #38 (GPIO20) будет установлен на «выход», а разъём #40 (GPIO21) — на «вход». Далее цикл, повторяющийся раз в секунду, будет «слушать» разъём #40 и, как только на него поступит сигнал, используемые порты «очистятся» и будет запущена консольная команда для выключения. Как уже говорилось выше, команда может быть и любой другой. Ради интереса я выполнил эту задачу двумя способами: на Python и bash-скриптом. Ниже код обоих вариантов:

shutdown.py import RPi.GPIO as GPIO from time import sleep import os

GPIO.setmode (GPIO.BOARD) GPIO.setwarnings (False) # Turn off warnings output GPIO.setup (38, GPIO.OUT) # Set pin #38 (GPIO20) to output GPIO.setup (40, GPIO.IN) # Set pin #40 (GPIO21) to input

while True: buttonIn = GPIO.input (40) if buttonIn == True: print 'System shuts down' GPIO.cleanup () os.system («sudo shutdown -h now») break sleep (1)

shutdown.sh #! /bin/bash

# Set up GPIO20 and set to output echo »20» > /sys/class/gpio/export echo «out» > /sys/class/gpio/gpio20/direction echo »1» > /sys/class/gpio/gpio20/value

# Set up GPIO21 and set to input echo »21» > /sys/class/gpio/export echo «in» > /sys/class/gpio/gpio21/direction

while (true) do # check if the pin is connected to GND and, if so, halt the system if [ $( /sys/class/gpio/unexport echo »21» > /sys/class/gpio/unexport shutdown -h now «System halted by a GPIO action» fi sleep 1 done

Повторюсь, оба скрипта выполняют одно и то же, для работы кнопки нужен один из них (любой). Их также можно скачать:

В случае со скриптом на Python есть один нюанс: для работы необходим класс RPi.GPIO, который необходимо скачать и установить отдельно. Делается это так:

wget http://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.11.tar.gz tar zxf RPi.GPIO-0.5.11.tar.gz cd RPi.GPIO-0.5.11 sudo python setup.py install Собственно, последнее, что осталось сделать — это добавить скрипт в автозагрузку. Способов сделать это тоже несколько, я выбрал cron. Для этого запускается команда sudo crontab -e и в открывшемся файле добавляется одна из следующих строк:

@reboot python /home/pi/lentyay/poweroff.py & @reboot sudo /home/pi/lentyay/shutdown.sh & 7da49b7e03b74cb185a3c95f41598ac2.jpg

На этом всё. От себя скажу, что пользоваться такой кнопкой очень удобно.

© Habrahabr.ru