Коничива, уважаемый!

За время вашего отсутствия мы тут вон чего понаписали:

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

    2 Апреля

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

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

    Для своей кнопки я решил использовать два самых правых контакта в верхнем ряду. Разъём #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 &

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

    Автор: Lentyay
    
    Александр
    2016-06-16 14:59:57
    Обязательно сделаю. Спасибо!

    Оставить комментарий

    captcha
    RSS