Зачем нужны pull-up и pull-down резисторы для кнопки?
Подключил кнопку к Arduino, а пин выдаёт случайные значения, пока кнопку не нажму. Все пишут про подтягивающий резистор (pull-up/pull-down). Зачем он нужен для кнопки и как работает?
2 ответа
Проблема в том, что цифровой вход не любит оставаться «висящим в воздухе». Когда кнопка не нажата, пин ни к чему не подключён, и он ловит наводки и помехи — отсюда случайные 0 и 1. Это называется «плавающий вход».
Подтягивающий резистор задаёт пину чёткое состояние, когда кнопка отпущена:
- Pull-up (подтяжка к плюсу). Резистор соединяет пин с
+5В. Пока кнопка не нажата, пин читается как HIGH (1). Кнопка соединяет пин с GND, при нажатии пин становится LOW (0). - Pull-down (подтяжка к земле). Резистор соединяет пин с
GND. Отпущена → пин LOW (0), нажата (соединяет с +5В) → HIGH (1).
Значение резистора обычно 10 кОм: достаточно большое, чтобы не было лишнего тока, но достаточно «сильное», чтобы задать уровень.
Хорошая новость: в Arduino есть встроенные подтягивающие резисторы. Не нужен внешний — просто напиши pinMode(пин, INPUT_PULLUP). Тогда отпущенная кнопка даёт HIGH, нажатая — LOW (логика инвертируется, это нормально).
Ещё момент: механические кнопки «дребезжат» — при нажатии дают несколько быстрых ложных срабатываний. Это лечат программно (задержка после нажатия) или конденсатором, но это уже отдельная тема — debounce.
Если коротко: без подтяжки вход «болтается» и ловит помехи, поэтому показания случайные. Резистор (или встроенный INPUT_PULLUP) держит чёткий уровень, когда кнопка не нажата.
Самый простой путь на Arduino: pinMode(2, INPUT_PULLUP), кнопку между пином 2 и GND. Тогда digitalRead вернёт HIGH в покое и LOW при нажатии. Никаких внешних резисторов паять не надо.