02 ноября 2016
Кравченко Виктор

Подтягивающий (стягивающий) резистор — что это, и зачем он нужен

Arduino Arduino Lang
01

Для понимания сути раскрываемой темы проведем небольшой эксперимент — соберем небольшую схему с кнопкой и напишем скетч, который в Serial будет выдавать значение состояния кнопки:

02
03 Arduino (C++)
1
2
3
4
5
6
7
8
9
10
11
12
13
int buttonPin = 8; void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); // Настраиваем Serial для вывода информации } void loop() { Serial.println(digitalRead(buttonPin)); // Выводим состояние кнопки delay(1000); // Ждем одну секунду }
04

Запустив скетч и не нажимая кнопку, убеждаемся в том, что состояние пина 8 меняется даже от обычного прикосновения к проводу — совершенно непредсказуемым образом.

05
06

Стабильность появляется только при нажатии кнопки.

07

Так происходит потому, что когда кнопка находится в отжатом состоянии, схема приобретает вид:

08
09

Получается, что 8 пин находится в неопределенном «подвешенном» состоянии и при считывании его значения нельзя определенно сказать, в каком он состоянии — HIGH или LOW. Такое состояние ещё называется высокоомным состоянием или состоянием Z. А провод, соединяющий пин платы с кнопкой, выполняет роль антенны для различных электромагнитных наводок. Именно эти наводки и заставляют контакт вести себя непредсказуемым образом. Для того чтобы устранить эту ситуацию, необходимо сделать так, чтобы в любом состоянии кнопки на 8 пине было однозначное значение. Для этого скорректируем схему следующим образом — подключим пин 8 к земле через резистор номиналом 10 КОм:

10
11

Теперь, когда кнопка отжата, можно со 100%-уверенностью говорить о том, что состояние на пине 8 — LOW, так как он подключен к земле. Но если нажать на кнопку, то ток пойдет по пути наименьшего сопротивления и значение на пине 8 станет HIGH. Вот этот добавленный в схему резистор и называется стягивающим, потому что в неопределенном состоянии «стягивает» потенциал к земле, делая его определенным — LOW.

12 На заметку:
Номинал резистора рассчитывается исходя из максимально протекающего тока. Максимальный ток, который способен выдать цифровой пин Arduino — 40 мА (0,04 А). При напряжении 5В, по закону Ома, находим сопротивление участка цепи:

$ R={U \over I}={{5~В} \over {0{,}04~А}}=125~Ом $

Таким образом минимально допустимый для использования номинал резистора — 125 Ом.

В то же время, чтобы стягивающий/подтягивающий резистор, не оказывал влияния на остальные участки цепи при замыкании (эффект делителя напряжения), рекомендуется выбирать намного больший номинал 1-10 кОм.
13

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

14
15

По аналогии, подтягивающий резистор подтягивает неопределенный потенциал ко входу с напряжением 5В, делая его определенным — HIGH. При нажатии кнопки на пине 8 будет значение LOW.

16

Плата Arduino Uno на портах ввода/вывода имеет встроенные подтягивающие резисторы номиналом 20 КОм, которые можно включить программно:

17 Arduino (C++)
1
2
pinMode(pin, INPUT); // назначаем режим работы пина digitalWrite(pin, HIGH); // включаем подтягивающий резистор
18

В актуальной версии Arduino IDE включение подтяжки в коде происходит более явно:

19 Arduino (C++)
1
pinMode(pin, INPUT_PULLUP); // назначаем режим работы пина- вход с подтяжкой
20 На заметку:
Использование встроенного подтягивающего резистора на 13 пине платы Arduino Uno затруднительно, потому что на входе напряжение будет 1.7 В, а не 5 В. Так происходит из-за падения напряжения на резисторе и светодиоде-индикаторе включенном последовательно.
22

Похожие запросы:

  • Подтягивающий резистор для кнопки
comments powered by HyperComments