01 |
Для понимания сути раскрываемой темы проведем небольшой эксперимент — соберем небольшую схему с кнопкой и напишем скетч, который в Serial будет выдавать значение состояния кнопки: |
|
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 меняется даже от обычного прикосновения к проводу — совершенно непредсказуемым образом. |
|
06 |
Стабильность появляется только при нажатии кнопки. |
|
07 |
Так происходит потому, что когда кнопка находится в отжатом состоянии, схема приобретает вид: |
|
09 |
Получается, что 8 пин находится в неопределенном «подвешенном» состоянии и при считывании его значения нельзя определенно сказать, в каком он состоянии — HIGH или LOW. Такое состояние ещё называется высокоомным состоянием или состоянием Z. А провод, соединяющий пин платы с кнопкой, выполняет роль антенны для различных электромагнитных наводок. Именно эти наводки и заставляют контакт вести себя непредсказуемым образом. Для того чтобы устранить эту ситуацию, необходимо сделать так, чтобы в любом состоянии кнопки на 8 пине было однозначное значение. Для этого скорректируем схему следующим образом — подключим пин 8 к земле через резистор номиналом 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 |
Если поменять местами резистор и кнопку получится схема с подтягивающим резистором. |
|
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 |
Похожие запросы:
|
|