Использование тактильного переключателя с Raspberry Pi
Кнопки и переключатели являются фундаментальной частью «физических» вычислений. Это руководство для начинающих предназначено для обучения основам физического взаимодействия с Raspberry Pi с использованием простой схемы на основе кнопки мгновенного действия. Для этого потребуется несколько простых компонентов, доступных в ModMyPi (прокрутите вниз, чтобы увидеть список):
Средняя макетная плата
Перемычки «папа-мама» (Male to Female Jumper Wires)
Переключатель для монтажа на плату (PCB Mount Switch)
Набор резисторов ModMyPi’s Ridiculous Resistor Kit:
Резистор 10 кОм: коричневый, чёрный, чёрный, красный, коричневый
Резистор 1 кОм: коричневый, чёрный, чёрный, коричневый, коричневый
Набор перемычек для макетной платы (Breadboard Jumper Wire Kit)
Шаг 1 — Сборка схемы
Схема позволяет Raspberry Pi обнаруживать изменение напряжения при нажатии кнопки (Switch 1) и требует три вывода GPIO. Первый обеспечивает сигнальное напряжение 3,3 В (Vcc), следующий заземляет схему (GND), а третий будет настроен как вход (GPIO IN) для обнаружения изменения напряжения.
Когда вывод GPIO настроен как вход, он не подаёт питание и, следовательно, не имеет определённого уровня напряжения; такое состояние называется «плавающим» (floating). Нам нужно, чтобы вывод мог различать высокое и низкое напряжение, однако в плавающем состоянии он может некорректно определять состояния из-за электрических помех. Чтобы вывод мог различать высокий и низкий сигнал, мы должны «привязать» (tie) этот вывод, калибруя его к определённому значению; в данном случае — 3,3 В!
Для привязки входного вывода мы подключаем его к выводу Vcc 3,3 В, поэтому когда Switch 1 разомкнут, ток протекает через GPIO IN и считывается как высокий уровень. Когда Switch 1 замкнут, мы замыкаем цепь и ток утекает на GND; вход получает 0 В и считывается как низкий уровень! Поскольку мы подключаем Vcc напрямую к GND, что может привести к протеканию опасного тока, большой резистор R1 (10 кОм) обеспечивает протекание лишь небольшого тока. Чтобы сделать схему ещё безопаснее, мы добавляем резистор R2 (1 кОм) для ограничения тока к и от GPIO IN.
Переключатель
Четырёхконтактные переключатели подключаются очень похожим образом на двухконтактные. Они просто более универсальны, так как позволяют иметь несколько изолированных входов в одну точку переключения. Посмотрев на схемы, можно увидеть, что контакты 1 и 2 всегда соединены, как и контакты 3 и 4. Однако контакты 1 и 2 изолированы от контактов 3 и 4. При нажатии кнопки две стороны соединяются и контакты 1, 2, 3 и 4 оказываются все подключены!
В переключателях «мгновенного действия» (momentary) цепь размыкается при снятии давления с кнопки, в отличие от переключателей «фиксации» (toggle), где одно нажатие замыкает, а следующее размыкает внутреннюю цепь переключателя.
Куда всё подключать?
ВНИМАНИЕ. При подключении к выводам GPIO на Raspberry Pi необходимо соблюдать осторожность, так как подключение неправильных точек может навсегда повредить ваш Pi. Пожалуйста, используйте шпаргалку по GPIO и дважды проверьте всё перед включением. Каждый вывод GPIO будет обозначен по имени и физическому расположению. Например, GPIO P17 фактически расположен на Pin 11, обозначается: GPIO P17 [Pin 11]. Несоответствия являются результатом того, что имена выводов ссылаются на встроенный чип, а не на их физическое расположение.
1. Подключите Pi к шине заземления. Используйте чёрный провод-перемычку, чтобы соединить GPIO GND [Pin 6] на Pi с отрицательной (-) шиной на макетной плате.
2. Подключите Pi 3.3V к положительной шине. Используйте красный провод-перемычку, чтобы соединить GPIO 3.3V [Pin 1] на Pi с положительной (+) шиной на макетной плате.
3. Вставьте переключатель. При работе с макетной платой убедитесь, что все ножки находятся в разных рядах. Для этого расположите переключатель по обе стороны центрального канала на макетной плате.
4. Добавьте резистор 10 кОм. Подключите от Switch Pin 1 к положительной (+) шине. Ориентация стандартных плёночных резисторов не имеет значения.
5. Подключите переключатель к заземлению. Используйте перемычку для макетной платы, чтобы соединить Switch Pin 3 с отрицательной (-) шиной.
6. Подключите переключатель к резистору 1 кОм. Добавьте этот резистор между Switch Pin 1 и резистором 10 кОм, и выведите его на свободный ряд.
7. Подключите переключатель к сигнальному порту. Мы будем использовать GPIO P17 для обнаружения сигнала 3,3 В при нажатии переключателя. Просто подключите перемычку между GPIO P17 [Pin 11] на Pi и рядом резистора 1 кОм.
Наша схема собрана! Далее мы напишем простую программу на Python, которая будет запускаться при нажатии переключателя!
Шаг 2 — Создание программы на Python
В этой части мы рассмотрим шаги по программированию и взаимодействию между Pi и нашими компонентами. Кодирование в этом руководстве будет выполняться на Python — широко используемом языке общего назначения. Он также очень удобен для чтения, поэтому мы можем разобрать и объяснить функцию каждой строки кода. Цель нашего кода — считывать состояние вывода ввода/вывода при нажатии переключателя!
Установка библиотеки GPIO для Python
Прежде чем начать, нам нужно установить библиотеку RPi.GPIO для Python. Перейдите по ссылке сюда для получения руководства по установке, а затем вернитесь сюда, когда закончите!
Создание программы на Python
С установленной библиотекой GPIO мы готовы начать наш проект на Python! Загрузите графический интерфейс Raspbian с помощью startx и откройте программу IDLE 3, в которой мы будем набирать наш код. Поскольку мы начинаем новый проект, откройте новое окно File>>New Window. Помните, что Python чувствителен к регистру, а отступы имеют фундаментальное значение. Отступы, которые используются для группировки операторов, будут появляться автоматически при вводе команд, поэтому убедитесь, что вы придерживаетесь предложенной компоновки.
Первая строка нашего кода импортирует библиотеку Python, которую мы только что установили, в наш проект.
import RPi.GPIO as GPIO
Далее нам нужно установить нумерацию выводов GPIO — либо нумерацию BOARD, либо нумерацию BCM. Нумерация BOARD соответствует физической нумерации контактов на разъёме. Нумерация BCM соответствует номерам каналов на чипе Broadcom. Подойдёт любой вариант, но лично я предпочитаю нумерацию BCM. Если вы запутались, используйте шпаргалку по GPIO, чтобы разобраться, какой вывод какой!
GPIO.setmode(GPIO.BCM)
Теперь вам нужно определить выводы GPIO как входы или выходы. В шаге 1 мы установили BCM Pin 17 : BOARD Pin 11 (GPIO P17 [Pin 11]) в качестве нашего входного вывода. Поэтому следующая строка кода сообщает библиотеке GPIO, что этот вывод является входом.
GPIO.setup(17, GPIO.IN)
В шаге 1 руководства входной вывод был привязан к высокому уровню путём подключения к выводу 3,3 В, и цель нашей программы на Python — проверить, был ли входной вывод переведён в низкий уровень, т.е. когда кнопка была нажата. Для проверки состояния высокого/низкого уровня вывода мы будем использовать оператор True или False, работающий в бесконечном цикле.
Нам нужно привязать наш оператор true к высокому значению входного вывода. Для этого мы создаём новую переменную input_value и устанавливаем её равной текущему значению GPIO P17 [Pin 11].
while True:
input_value = GPIO.input(17)
Далее мы добавим код, чтобы программа выводила сообщение при нажатии кнопки. Для этого мы используем оператор False — т.е. когда input_value (которая привязана к высокому уровню) больше не равна input_value, что происходит при нажатии кнопки и переводе в низкий уровень, — выполняем команду.
if input_value == False:
print("Who pressed my button!")
Когда кнопка нажата, программа теперь будет отображать текст: «Who pressed my button!» — не стесняйтесь менять это на что угодно.
while input_value == False:
input_value = GPIO.input(17)
Последние две строки в приведённом выше коде очень важны — они создают цикл, который говорит Python продолжать проверять состояние GPIO P17 [Pin 11], пока он не перестанет быть низким (кнопка отпущена). Без этого программа будет циклиться, пока кнопка всё ещё нажата, что означает, что сообщение будет напечатано несколько раз на экране до того, как вы отпустите кнопку.
Итоговая программа должна выглядеть так в Python:
Сохраните файл как button.py. Чтобы запустить программу, откройте новое окно терминала на Pi и введите следующую команду:
sudo python button.py
Сначала ничего не произойдёт, но если вы нажмёте кнопку, программа выведет заданное сообщение.
Чтобы завершить работающий скрипт Python, просто нажмите CTRL+C на клавиатуре для прекращения работы.
Если не заработало — не переживайте. Сначала проверьте, что схема правильно подключена на макетной плате, как описано в шаге 1, затем что провода-перемычки подключены к правильным контактам на порте GPIO. Если всё равно не работает, дважды проверьте каждую строку программы, помня, что Python чувствителен к регистру и что отступы должны быть правильными. Я нахожу, что набор кода вручную даёт лучшие результаты, чем простое копирование/вставка.
Это обманчиво простая программа, которая может быть использована для множества целей. Тот же код можно использовать для считывания состояния выводов отдельных устройств, таких как датчик или внешний микроконтроллер, когда они переведены в высокий или низкий уровень. В следующий раз мы добавим светодиод в нашу схему и заставим его мигать по команде от кнопки!