Raspberry Pi: чтение цифровых входов с помощью Python (кнопки и другие периферийные устройства)

В этом руководстве вы узнаете, как настроить GPIO Raspberry Pi в качестве цифровых входов и как считывать их состояние с помощью программы на Python. В качестве примера мы будем считывать состояние тактовой кнопки (нажата или не нажата), но этот пример можно применить к любым другим периферийным устройствам, которые выдают цифровые сигналы. Мы будем использовать интерфейс gpiozero.

Raspberry Pi чтение цифровых входов с помощью Python — кнопки и другие периферийные устройства

В этом руководстве мы рассмотрим следующие основные темы:

  1. Знакомство с GPIO Raspberry Pi

  2. Подключение схемы

  3. Чтение цифровых входов Raspberry Pi с помощью gpiozero (тактовая кнопка)

  4. Чтение цифровых входов Raspberry Pi с помощью gpiozero (универсальные цифровые входы)

Предварительные требования

Перед тем как продолжить работу с этим руководством, проверьте следующие предварительные требования.

  1. Ознакомьтесь с платой Raspberry Pi — если вы не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`руководство по началу работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.

  2. Вы должны знать, как запускать и создавать файлы Python на Raspberry Pi. Мы предпочитаем программировать Raspberry Pi удалённо через SSH, используя расширение в VS Code. У нас есть подробное руководство по этой теме: :doc:`Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.

Знакомство с GPIO Raspberry Pi

GPIO означает General Purpose Input Output (входы/выходы общего назначения) — это контакты, которые позволяют подключать и управлять электронным оборудованием, таким как светодиоды, двигатели и датчики, к вашему Raspberry Pi.

Это означает, что их можно использовать как для чтения, так и для отправки информации, позволяя вашему Pi взаимодействовать с внешним миром.

Большинство моделей плат Raspberry Pi имеют двойной ряд из 40 контактов GPIO. Расположение контактов обычно одинаково для большинства моделей Raspberry Pi.

В этом руководстве мы рассмотрим, как можно настроить GPIO Raspberry Pi в качестве выходов для управления светодиодом или любым другим исполнительным устройством, которое может управляться сигналами высокого (3.3 В) и низкого (0 В) уровня.

Нумерация GPIO Raspberry Pi

Существует два разных способа обращения к контакту GPIO: по его имени (что известно как нумерация GPIO или нумерация Broadcom) или по соответствующему физическому номеру контакта (который соответствует физическому расположению контакта на разъёме).

Например, GPIO 25 соответствует контакту 22 (см. изображение ниже). В этом руководстве мы будем обращаться к контактам GPIO по их нумерации GPIO (нумерация Broadcom).

Справочное руководство по распиновке Raspberry Pi

Чтобы узнать больше о GPIO Raspberry Pi, ознакомьтесь со следующим руководством: :doc:`Руководство по распиновке Raspberry Pi: как использовать GPIO Raspberry Pi? </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_

Подключение схемы

Подключите тактовую кнопку и светодиод к GPIO Raspberry Pi. Мы подключим один светодиод к GPIO 14 (контакт 8) и тактовую кнопку к GPIO 4 (контакт 7). Вы можете использовать любые другие контакты, кроме GPIO 0 и GPIO 1.

Вот список компонентов, необходимых для этого проекта:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все детали для ваших проектов по лучшей цене!

Подключение тактовой кнопки и светодиода к Raspberry Pi

Чтение цифровых входов Raspberry Pi с помощью gpiozero (тактовая кнопка)

Библиотека gpiozero предоставляет набор интерфейсов для повседневных компонентов, таких как светодиоды, кнопки, потенциометры, датчики и многое другое.

Для чтения цифровых входов библиотека gpiozero предоставляет интерфейс Button, разработанный специально для тактовых кнопок, и DigitalInputDevice для универсальных цифровых входов. Оба интерфейса работают аналогичным образом, но используют функции с разными именами.

Библиотека gpiozero должна быть уже установлена, если вы используете Raspberry Pi OS — если нет, вы можете выполнить:

python3 -m pip gpiozero

Управление светодиодом с помощью тактовой кнопки

Чтобы показать вам, как считывать состояние тактовой кнопки и как вызывать различные события в зависимости от состояния кнопки, мы создадим скрипт на Python для управления светодиодом.

Управление светодиодом с помощью тактовой кнопки на Raspberry Pi

Создайте новый файл Python на вашем Raspberry Pi с именем pushbutton_led.py и скопируйте следующий код.

# Полная информация о проекте: https://RandomNerdTutorials.com/raspberry-pi-digital-inputs-python/

from gpiozero import Button, LED
from signal import pause

led = LED(14)
button = Button(4)

button.when_pressed = led.on
button.when_released = led.off

pause()

Просмотреть исходный код

Как работает код

Продолжайте читать, чтобы узнать, как работает код.

Импорт библиотек

Сначала вы импортируете компонент LED из библиотеки gpiozero для управления GPIO, к которому подключён светодиод, и компонент Button для взаимодействия с тактовой кнопкой. Затем вам также нужно импортировать функцию pause() из модуля signal, чтобы поддерживать работу вашей программы для обнаружения событий.

from gpiozero import Button, LED
from signal import pause

Объявление светодиода

Далее вы создаёте объект LED с именем led, который ссылается на GPIO 14 — это GPIO, к которому подключён светодиод. Измените номер, если вы используете другой GPIO.

led = LED(14)

Когда вы создаёте и используете этот объект LED, ваша программа знает, что GPIO 14 является выходом, который может быть установлен в HIGH или LOW. После этого объявления вы можете использовать led для обращения к вашему GPIO 14. Вы можете использовать этот объект LED для управления другими компонентами, помимо светодиодов, при условии, что ими можно управлять сигналами HIGH и LOW.

Объявление тактовой кнопки

Объявление тактовой кнопки также просто. Вам нужно лишь создать экземпляр класса Button. Передайте в качестве аргумента GPIO, к которому подключена тактовая кнопка — в нашем случае это GPIO 4.

button = Button(4)

Вы можете передать другие полезные аргументы в класс Button:

Button(pin, *, pull_up=True, active_state=None, bounce_time=None, hold_time=1, hold_repeat=False, pin_factory=None)

Вот что означают эти параметры:

  • pin: GPIO, к которому подключена кнопка.

  • pull_up: значение по умолчанию — True > GPIO будет подтянут к высокому уровню по умолчанию, вам нужно подключить другой контакт кнопки к GND, как мы сделали в схеме. Если вы хотите, чтобы кнопка работала наоборот, установите этот флаг в False и подключите другую сторону кнопки к 3.3 В.

  • active_state: значение по умолчанию — None (автоматически устанавливается в правильное значение в соответствии со значением pull_up). Если установлено в False, полярность входа инвертируется: кнопка посылает сигнал HIGH, но программное обеспечение передаёт LOW в вашу программу.

  • bounce_time: по умолчанию bounce_time не определён. bounce_time полезен, если вы получаете ложные нажатия кнопки. bounce_time — это продолжительность времени, в данном случае в секундах, в течение которого GPIO будет игнорировать изменения состояния для предотвращения ложных срабатываний. Если после тестирования вы чувствуете, что программа обнаруживает ложные срабатывания, установите значение для bounce_time.

  • hold_time: продолжительность времени в секундах, которое нужно подождать после нажатия кнопки, чтобы считать, что кнопка удерживается (обработчик when_held).

  • hold_repeat: если установлено в True, обработчик when_held будет выполняться повторно, пока кнопка не перестанет удерживаться. Если установлено в False, он выполнится только один раз.

  • pin_factory: это расширенная функция, которую вам, вероятно, не придётся использовать или беспокоиться о ней.

События кнопки

Вы можете использовать обработчики when_pressed и when_released для обнаружения нажатия или отпускания кнопки и связать функцию для выполнения при обнаружении каждого события.

when_pressed

В следующей строке при нажатии кнопки (when_pressed) светодиод включается.

button.when_pressed = led.on

when_released

Когда обнаруживается событие when_released, светодиод выключается.

button.when_released = led.off

Вместо включения и выключения светодиода вы можете связать любую другую функцию, которую нужно выполнить при обнаружении этих событий кнопки.

Поддержание работы программы

В конце мы вызываем функцию pause(). Она поддерживает работу программы даже после выполнения всего кода для обнаружения событий — в данном случае она непрерывно проверяет состояние кнопки.

pause()

Переключение светодиода

Вместо предыдущего примера вы можете захотеть переключать состояние светодиода при каждом нажатии кнопки. Если это так, вы можете использовать следующий пример.

# Полная информация о проекте: https://RandomNerdTutorials.com/raspberry-pi-digital-inputs-python/

from gpiozero import Button, LED
from signal import pause

led = LED(14)
button = Button (4)

button.when_pressed = led.toggle

pause()

Просмотреть исходный код

Подведём итоги…

1) Для чтения состояния тактовой кнопки вы можете использовать интерфейс Button библиотеки gpiozero. Сначала его нужно импортировать следующим образом:

from gpiozero import Button

2) Определите GPIO, к которому подключена кнопка:

button = Button(GPIO_NUMBER_OF_YOUR_CHOICE)

3) Затем используйте события when_pressed и when_released, чтобы выполнить какое-либо действие при нажатии или отпускании кнопки.

button.when_pressed = your_function
button.when_released = your_function

Демонстрация

Сохраните ваш файл Python. Затем запустите его на вашем Raspberry Pi. Выполните следующую команду в директории вашего файла проекта (используйте имя вашего файла):

python pushbutton_led.py

Светодиод, подключённый к GPIO 14, должен загореться при нажатии тактовой кнопки.

Raspberry Pi управление светодиодом с помощью тактовой кнопки — кнопка нажата

Светодиод погаснет, когда вы отпустите кнопку.

Raspberry Pi управление светодиодом с помощью тактовой кнопки — кнопка отпущена

Вы можете остановить выполнение программы, нажав CTRL + C.

Другие полезные методы

Интерфейс Button предоставляет другие полезные методы.

  • wait_for_press(timeout): приостанавливает выполнение скрипта до тех пор, пока вы не нажмёте кнопку или пока не истечёт время ожидания. По умолчанию время ожидания не установлено, поэтому программа будет ждать на этой строке кода, пока вы не нажмёте кнопку.

  • wait_for_release(timeout): приостанавливает выполнение скрипта до тех пор, пока вы не отпустите кнопку или пока не истечёт время ожидания. По умолчанию время ожидания не установлено, поэтому программа будет ждать на этой строке кода, пока вы не отпустите кнопку.

  • is_pressed: возвращает True, если кнопка нажата.

Вот аналогичный пример, но с использованием метода is_pressed.

# Полная информация о проекте: https://RandomNerdTutorials.com/raspberry-pi-digital-inputs-python/

from gpiozero import Button, LED

led = LED(14)
button = Button(4)

while True:
    if button.is_pressed:
        led.on()
    else:
        led.off()

Просмотреть исходный код


Чтение цифровых входов Raspberry Pi с помощью gpiozero (универсальные цифровые входы)

Если вы используете другой цифровой вход вместо тактовой кнопки, вы можете использовать класс DigitalInputDevice. Он работает аналогично классу Button, но имеет другие методы.

DigitalInputDevice принимает следующие параметры:

DigitalInputDevice(pin, *, pull_up=False, active_state=None, bounce_time=None, pin_factory=None)

Параметры почти такие же, как у класса Button:

  • pin: GPIO, к которому подключено периферийное устройство.

  • pull_up: значение по умолчанию — True > GPIO будет подтянут к высокому уровню по умолчанию.

  • active_state: значение по умолчанию — None (автоматически устанавливается в правильное значение в соответствии со значением pull_up). Если установлено в False, полярность входа инвертируется: кнопка посылает сигнал HIGH, но программное обеспечение передаёт LOW в вашу программу.

  • bounce_time: по умолчанию bounce_time не определён. Полезен для предотвращения ложных срабатываний.

  • pin_factory: это расширенная функция, которую вам, вероятно, не придётся использовать или беспокоиться о ней.

Вот некоторые полезные методы и свойства DigitalInputDevice:

  • when_activated: событие, которое обнаруживает, что GPIO получил сигнал HIGH. Вы должны назначить функцию обратного вызова для выполнения каждый раз, когда GPIO переходит в состояние HIGH;

  • when_deactivated: событие, которое обнаруживает, что GPIO получил сигнал LOW. Вы должны назначить функцию обратного вызова для выполнения каждый раз, когда GPIO переходит в состояние LOW;

  • value: возвращает текущее значение GPIO (0, если LOW, и 1, если HIGH);

  • wait_for_active(timeout): приостанавливает выполнение скрипта до тех пор, пока GPIO не получит сигнал HIGH или пока не истечёт время ожидания. По умолчанию время ожидания не установлено, поэтому программа будет ждать на этой строке кода, пока это условие не будет выполнено.

  • wait_for_inactive(timeout): приостанавливает выполнение скрипта до тех пор, пока GPIO не получит сигнал LOW или пока не истечёт время ожидания. По умолчанию время ожидания не установлено, поэтому программа будет ждать на этой строке кода, пока это условие не будет выполнено.

Вот пример, который включает светодиод, когда GPIO считывает сигнал HIGH:

# Полная информация о проекте: https://RandomNerdTutorials.com/raspberry-pi-digital-inputs-python/

from gpiozero import DigitalInputDevice, LED

led = LED(14)
input = DigitalInputDevice(4)

while True:
    if input.value:
        led.on()
    else:
        led.off()

Просмотреть исходный код

Если вы хотите использовать события вместо этого, взгляните на следующий код. Он работает аналогично примеру с тактовой кнопкой, который мы видели ранее.

# Полная информация о проекте: https://RandomNerdTutorials.com/raspberry-pi-digital-inputs-python/

from gpiozero import DigitalInputDevice, LED
from signal import pause

led = LED(14)
input = DigitalInputDevice (4)

print(input.value)

input.when_activated = led.on
input.when_deactivated =led.off

pause()

Просмотреть исходный код

Заключение

В этом руководстве вы узнали, как настроить GPIO Raspberry Pi в качестве цифровых входов и как считывать их состояние. Библиотека gpiozero поставляется с классом Button с полезными функциями, специально предназначенными для тактовых кнопок. Также существует класс DigitalInputDevice для использования с универсальными устройствами ввода.

Мы надеемся, что это руководство было для вас полезным. Если вы новичок в Raspberry Pi, вы можете начать со следующих руководств:

Вы можете посмотреть все наши проекты для Raspberry Pi по следующей ссылке: