Статья: Цифровые входы Arduino, подтяжка- Pull Up и Pull Down

Цифровые входы Arduino

Контакты Arduino по умолчанию используются как входные контакты. Поэтому нет необходимости определять их как входы в настройках. Также в большинстве случаев аналоговые выводы Arduino можно настроить для использования в качестве цифровых входов/выходов. Входные контакты Arduino имеют очень высокий входной импеданс, поэтому для изменения состояния вывода требуется очень небольшое количество тока. Также важно отметить, что выходные контакты Arduino имеют более низкий импеданс по сравнению с входными контактами. Иногда эти знания о входном и выходном импедансе пригодятся при разработке схем для особых условий. (пример: при работе с нагрузками с более высоким импедансом цепи предназначены для областей с более высоким уровнем шума)

Связанные команды Arduino pinMode()

pinMode()

Устанавливает соответствующий вывод Arduino в качестве входа или выхода.

Синтаксис:

  • pinMode(pin, mode)

Пример кода:

  • pinMode(11, OUTPUT); //включаем цифровой пин 11, на вывод

digitalWrite()

Устанавливает выходной контакт в состояние High или Low (единица или ноль).

Синтаксис:

  • digitalWrite(pin, value)

Пример кода:

  • digitalWrite(11, HIGH); //установим цифровой пин 11High (единица)

digitalRead()
Синтаксис:

  • digitalRead(pin)

Пример кода:

  • state = digitalRead(10);   //считываем значение с цифрового пина 10 и заносим значение в переменную state

Почему нужны подтягивающие/стягивающие резисторы

Контакты Arduino имеют очень высокий входной импеданс. Следовательно, для изменения состояния вывода требуется очень минимальный ток. 

Но он также может отображать случайные значения из-за внешних шумов или емкостной связи соседних контактов. Этой проблемы можно избежать, переведя вывод в известное состояние, когда состояние ввода недоступно. 

Для этого мы можем использовать подтягивающие или подтягивающие резисторы на входе. 

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

Резисторы сопротивлением 10 кОм считаются идеальными значениями для подтягивающих или подтягивающих резисторов в большинстве сценариев.

Что такое подтягивающий (стягивающий) резистор

Чтобы ответить на этот вопрос давайте посмотрим на следующую схему:

Мы бы хотели отслеживать нажатие кнопки для выполнения каких-то действий. Для этого мы подключили линию +5В через резистор и кнопку к цифровому выводу Ардуино, полагая, что при нажатии на кнопку ток потечет через нее и Ардуино считает на цифровом входе 2 сигнал высокого уровня. Соответственно, при размыкании контакта мы рассчитываем получить на входе сигнал низкого уровня. Так ли это? Проверим.
Подключим кнопку по приведенной схеме и загрузим в Ардуино следующий скетч. Результат его работы посмотрим в мониторе порта.

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);
}

void loop() {
  Serial.println(digitalRead(2));
  delay(1000);
}

При нажатии на кнопку Ардуино, действительно, зафиксирует на входе сигнал высокого уровня, при этом в монитор порта будет выводиться значение “1”. Но при отпускании кнопки в мониторе порта будут выводиться как “0”, так и “1”. Я даже больше скажу: можно исключить из схемы кнопку (все равно она разомкнута), у нас останется только провод, подключенный к порту 2 Ардуино, результат опроса порта будет таким же непредсказуемым. Особенно это хорошо заметно с длинным куском провода. Почему так происходит? Дело в том, что вход Ардуино не подключен ни к линии питания, ни к земле – он находится “ни в каком” состоянии. Такое состояние называется высокоимпедансным или Z-состоянием. Провод в данном случае выполняет роль антенны, на которую оказывают воздействие окружающие ее электромагнитные поля. В результате Ардуино непредсказуемо фиксирует то высокий, то низкий уровень сигнала на данном входе.

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

Такой резистор называют подтягивающим: он обеспечивает подтяжку сигнала к земле (как в данном случае) или же к питанию, если устанавливается между логическим входом устройства и линией питания. Соответственно при подтяжке к питанию на логическом входе будет гарантирован высокий уровень сигнала.

Иногда подтягивающим называют резистор, который подтягивает именно к питанию, также используют англоязычный термин pull-up (pull-up резистор). А для обозначения резистора, подтягивающего к земле, можно использовать термин стягивающий или pull-down резистор. Ниже приведены схемы подключения кнопки к логическому входу (не обязательно Ардуино) с использованием подтягивающего и стягивающего резисторов.

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

Как вы понимаете, подтягивающие резисторы весьма востребованы в электронике. Они нужны не только для подключения кнопок, но также при подключении выводов устройств с Z-состоянием или открытым коллектором. Поэтому многие контроллеры имеют встроенные подтягивающие резисторы, в том числе и Ардуино (а точнее используемые в них микроконтроллеры). 

Чтобы подтянуть порт Ардуино к питанию необходимо функцией pinMode установить для данного порта режим INPUT_PULLUP.

Давайте немного изменим схему и скетч из начала этой статьи. Из схемы уберем резистор и установим кнопку между вторым портом и землей:

А в скетче изменим режим работы порта на INPUT_PULLUP, чтобы задействовать внутренний подтягивающий резистор:

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
}

void loop() {
  Serial.println(digitalRead(2));
  delay(1000);
}

Загрузите этот код в Ардуино и убедитесь, что схема работает как нам нужно без дополнительных (внешних) резисторов. В тот момент когда кнопка разомкнута порт Ардуино не остается подвешенным в воздухе: он подтянут к питанию внутренним резистором. Поэтому на нем гарантирован сигнал высокого уровня. А при нажатии кнопки будет считываться сигнал низкого уровня.

Не забывайте о встроенных подтягивающих резисторах Ардуино. Я довольно часто замечаю, что люди, пишущие статьи про Ардуино, не знают об их наличии и вешают для тех же кнопок внешние подтягивающие резисторы.

Что такое сильный (strong pull-up) и слабый (weak pull-up) подтягивающий резистор? 

Чем ниже сопротивление подтягивающего резистора, тем больший ток протекает через него и тем сильнее он подтягивает сигнал к питанию (или земле, если речь о pull-down резисторе). Отсюда и название сильный подтягивающий резистор. Соответственно, чем выше сопротивление, тем слабже резистор подтягивает сигнал, поэтому его называют слабым.

Как выбрать номинал для подтягивающего резистора? 

Общая рекомендация – это, как правило, 10кОм. Где-то от 5кОм и ниже считается сильной подтяжкой, 20..100кОм – слабая. Подтягивающие резисторы Ардуино имеют номинал 20..50кОм (конкретное значение подбирается и устанавливается на заводе изготовителе), т.е. являются слабыми. Поэтому в документации к различным устройствам можно увидеть рекомендации использовать более сильные подтягивающие резисторы. Особенно это актуально для устройств, работающих в неблагоприятных условиях или при значительной длине проводников, когда увеличивается вероятность возникновения электромагнитных помех.

Есть ли в Ардуино подтяжка к земле (внутренние pull-down резисторы)? – Нет.

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

Важно:

  • Никогда не подтягивайте микроконтроллеры выше их высокого логического напряжения (например, Arduino Uno 5V).
  • Учитывайте потери мощности резисторов подтягивания/подтягивания, когда энергопотребление является критическим фактором. (пример: схемы с очень низким энергопотреблением)
  • Используйте внешние подтягивающие устройства с более низкими значениями сопротивления (например, 4,7 кОм), если они чувствительны к шуму.
  • Подтягивающие резисторы очень важны для связи I2C . (Значения резисторов зависят от количества подключенных устройств)

Ссылка на статью https://tsibrov.blogspot.com/2018/02/pullupresistors.html