Как использовать кнопки с GPIO-пинами Raspberry Pi

Если вы когда-либо использовали светодиод с Raspberry Pi, то, вероятно, знаете, как работают выходы GPIO. Код заставляет электричество течь через пины общего назначения (GPIO), проходит через светодиоды и освещает их. Но пробовали ли вы когда-нибудь сделать обратное? С помощью кнопок вы можете сделать ровно противоположное. Этот учебник покажет вам, как превратить GPIO-пин в входной, слушая каждое нажатие кнопки!
Содержание
- Как работают кнопки
- 4-пиновые кнопки
- Использование кнопок с GPIO-пинами Raspberry Pi
- Как использовать кнопки
- Аппаратное обеспечение кнопок
- Импорт команд
- Команды настройки
- Циклические команды
- Часто задаваемые вопросы
Также читайте: Как сделать мигающие светодиоды с помощью Raspberry Pi
Как работают кнопки
Кнопка — это тип переключателя. У нее есть два отдельных проводящих пина, которые предотвращают замыкание цепи, будучи разделенными друг от друга. Когда вы нажимаете на кнопку, вы фактически соединяете два пина, замыкая цепь. Но если вы отпустите, механизм, похожий на пружину, снова разделяет пины.

Также читайте: Как превратить ваш Raspberry Pi в станцию для видеоконференций
4-пиновые кнопки
Типичная кнопка в сенсорных наборах имеет четыре пина, каждый из которых отделен от других. Под кнопкой находится движущаяся металлическая пластина, которая опускается и соединяет все остальные пины, когда кнопка нажата вниз.

Вы найдете две пластины внутри 4-пиновой кнопки. Каждая из них соединена с двумя внешними пинами. Обе пластины отделены друг от друга и могут быть соединены только нажатием на третью пластину – металлическую пластину под кнопкой.

Таким образом, в кнопке всегда соединены два пина. Когда вы нажимаете 4-пиновую кнопку, вы соединяете все четыре пина вместе.
Также читайте: Как программировать Arduino с помощью Raspberry Pi
Использование кнопок с GPIO-пинами Raspberry Pi
На этот раз мы заставим GPIO-пины Raspberry Pi обнаруживать нажатие кнопки от кнопки. Когда электричество проходит через нее, Raspberry Pi выведет сообщение, сообщающее вам, что она работает.
Что вам понадобится
- Кнопка (4-пиновая)
- Резистор (один между 100Ω и 1000Ω должен подойти)
- Соединительные провода
- Вольтметр (по желанию)
- Raspberry Pi
- Монитор и клавиатура (или SSH)
Также читайте: Как установить Windows 11 на Raspberry Pi 4
Как использовать кнопки
- Откройте выбранный вами редактор кода и вставьте следующий код:
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while True:
if GPIO.input(7) == GPIO.HIGH:
print("Pin 7 is HIGH!")
elif GPIO.input(7) == GPIO.LOW:
print("Pin 7 is LOW...")
sleep(0.15)Сохраните как “rpi-pushbutton.py” (или любое имя, которое вы хотите, если расширение файла остается тем же).
Соберите схему. На одном пине кнопки подключите его к пину 7 и резистору параллельно. Подключите соединительный провод к пину GND (пины 6, 7, 14, 20, 25, 30, 34 или 39) с другой стороны этого резистора, затем подключите еще один соединительный провод к пину 3.3V (пины 1 или 17) на отдельном пине кнопки.

Совет: чтобы найти правильный номер пина, держите ваш Raspberry Pi так, чтобы GPIO-пины находились в верхнем правом углу. Верхний левый пин — это пин 1, а справа от него — пин 2. Под пином 1 находится пин 3, справа — пин 4 и так далее.

- Включите ваш Raspberry Pi и откройте терминал. Используйте
cd, чтобы перейти в директорию скрипта Python, затем введитеpython3 rpi-pushbutton.py. Если вы использовали другое имя файла, используйте его вместо “rpi-pushbutton.”

- Вы должны увидеть новую строку текста, говорящую
Pin 7 is LOW...каждые 0.15 секунд в терминале. Если вы нажмете кнопку, новая строка будетPin 7 is HIGH!.
Если вы поменяете местами пины GND и 3.3V, с 3.3V на резисторе и GND на другой стороне кнопки, вы измените логику кнопки. Она будет выводить Pin 7 is HIGH! все время и станет Pin 7 is LOW, когда вы нажмете кнопку.

Также читайте: Лучшие альтернативы Raspberry Pi 2024, которые стоит проверить сейчас
Аппаратное обеспечение кнопок
Кнопки используют два типа резисторов: подтягивающие и оттягивающие. Резистор с 3.3V, подключенным к нему, является подтягивающим резистором. Он поднимает напряжение вверх. Между тем, оттягивающие резисторы опускают напряжение вниз, имея подключенный к ним пин GND.
Вы все равно можете использовать кнопку без резистора, но это оставляет ваш GPIO-пин в плавающем состоянии. Плавающий GPIO-пин не получает прямого электрического заряда, поэтому он ищет заряды в своем окружении. Если рядом с ним есть сильное электромагнитное поле, например, он просто будет измерять его вместо этого.

Вот почему вам нужна опорная точка. Если вы подключите GPIO-пин к 0V (GND) по умолчанию, тогда он будет измерять 0V, пока кнопка не нажата. Но если вы этого не сделаете, значение GPIO-пина может быть любым – даже отрицательным вольтам!
Плавающие пины могут делать некоторые интересные вещи, однако. Если вы оставите пин плавающим, он может чувствовать разницу напряжения в воздухе, измеряя даже эффект от движения вашего пальца рядом с самим пином. Это похоже на датчик электромагнитного присутствия или что-то в этом роде.
Жаль, что вы не можете просто сделать это на Raspberry Pi. Для того, чтобы это было полезно, вам понадобятся аналоговые пины, а у Raspberry Pi их нет.
Код для кнопок
Зная это, вы должны понимать, что пин 7 определяет, проходит ли через него 3.3V или 0V. Если он определяет 3.3V, то он сообщает о себе как о HIGH. Но если он определяет 0V, то он LOW.
Давайте разделим код на три части: команды импорта, команды настройки и циклические команды.
Команды импорта
Мы используем две команды импорта:
import RPi.GPIO as GPIO
from time import sleepimport RPi.GPIO as GPIO импортирует модуль RPi.GPIO, который позволяет вам работать с GPIO-пинами вашего Raspberry Pi. Добавляя as GPIO в конце, вы говорите Python, что вводить GPIO эквивалентно вводу RPi.GPIO. Вы даже можете заменить это на другие строки, и код все равно будет работать, если вы правильно его отформатируете.
С другой стороны, from time import sleep импортирует только часть модуля времени Python. Это позволяет вам использовать функцию sleep().
Команды настройки
Мы работаем с тремя командами из модуля RPi.GPIO в командах настройки, чтобы исправить некоторые настройки.
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)Модуль RPi.GPIO обычно показывает сообщение, предупреждающее вас о использовании GPIO-пинов, как только вы запускаете скрипт Python. GPIO.setwarnings(False) предотвращает это.
GPIO.setmode(GPIO.BOARD) — это еще одна команда из модуля RPi.GPIO. Она говорит Python, что вы используете распиновку “BOARD”. Существует два типа распиновки в RPi.GPIO: BOARD и BCM. BOARD позволяет вам выбирать пины, используя номера пинов. BCM (сокращение от “Broadcom”) позволяет вам выбирать пины по их индивидуальному каналу Broadcom SOC. BOARD гораздо проще в использовании, так как он всегда одинаковый, независимо от того, какой тип платы Raspberry Pi вы используете. Распиновка BCM может изменяться в зависимости от того, какую модель вы используете.
Наконец, GPIO.setup(7, GPIO.IN) позволяет вам установить пин 7 как входной пин. Он использует функцию .setup() и читает 7 как пин, который вы пытаетесь выбрать. GPIO.IN означает, что вы пытаетесь установить это как входной пин.
Также читайте: Руководство для начинающих по Arduino
Циклические команды
Встраиваемые системы обычно используют всего несколько строк кода и бесконечно их повторяют. Разные языки программирования используют разные способы для этого. Но концепция остается той же: они используют какой-то вид цикла. Для Python это while True:.
while True:
if GPIO.input(7) == GPIO.HIGH:
print("Pin 7 is HIGH!")
elif GPIO.input(7) == GPIO.LOW:
print("Pin 7 is LOW...")
sleep(0.15)while True: позволяет вам бесконечно повторять код. Все, что вы помещаете в него, будет выполняться вечно, пока на плате есть электричество.
if GPIO.input(7) == GPIO.HIGH: — это условное выражение. Оно говорит, что если пин 7, который является входным пином, считывается как HIGH, то он должен выполнить все внутри него.
print("Pin 7 is HIGH!") находится внутри условного выражения. Все, что он делает, это выводит Pin 7 is HIGH! в консоль. Вы можете заменить это на любую строку, число или переменную, содержащую их.
Следующее — это elif GPIO.input(7) == GPIO.LOW:. Это в основном то же самое, что и if GPIO.input(7) == GPIO.HIGH:, за исключением первой части: здесь используется elif вместо if. Код elif означает “иначе если”. Он говорит, что если весь другой код выше возвращает ложь, то Python должен выполнить это условное выражение “иначе если”.
Наконец, sleep(0.15) приостанавливает код на 0.15 секунд. Зачем вообще приостанавливать код? Это в основном для проблем с производительностью. Raspberry Pi будет отправлять выходной код так быстро, что это может вызвать задержку в вашем графическом интерфейсе. Это еще более заметно, если вы используете Raspberry Pi через SSH. Будет заметная задержка, которая со временем только ухудшится. Приостановка кода замедляет его, чтобы избежать проблем с производительностью.
Также читайте: Как программировать Arduino через Visual Studio Code с использованием PlatformIO
Часто задаваемые вопросы
Безопасно ли горячее переключение пинов на Raspberry Pi?
Горячее переключение, или замена пинов Raspberry Pi при включенном питании, обычно является плохой идеей. Всегда безопаснее отключить его от источника питания перед переключением.
Чем 4-пиновые кнопки лучше 3-пиных?
С точки зрения полезности они в основном одинаковы. Но наличие четырех пинов позволяет вам подключить 4-пиновую кнопку к другой кнопке в последовательной цепи.
Могу ли я превратить любой пин на Raspberry Pi в входной пин?
У Raspberry Pi может быть 40 пинов, но только 27 из них являются GPIO. Вы можете программировать только GPIO-пины в входные и выходные пины. Большинство IDE не позволят вам перепрограммировать непин GPIO в входной пин.
Все фотографии и скриншоты принадлежат Терензу Джомару Дела Крузу