Перейти к содержанию

Какой резистор нужен для кнопки Arduino?

Обновлено Редакция GAW

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

Две схемы подключения

СхемаКнопка соединяет вывод сОтпущенаНажатаРезистор
Встроенная подтяжка, INPUT_PULLUPGNDHIGHLOWвнутри чипа, 20–50 кОм
Внешняя подтяжка к земле, INPUT5 ВLOWHIGH10 кОм между выводом и GND

Первая схема проще всего: нужен только провод к GND. У ATmega328P подтяжка есть на каждом выводе и включается программно; во время сброса она выключена.

Расчёт: почему подходят 10 кОм

При нажатой кнопке через резистор течёт ток от питания на землю:

I=VCCR=5 В10 кОм=0,5 мА.I = \frac{V_{CC}}{R} = \frac{5\ \text{В}}{10\ \text{кОм}} = 0{,}5\ \text{мА}.

Пока кнопка отпущена, через резистор идёт только ток утечки входа — не больше 1 мкА по даташиту. На 10 кОм он даёт 0,01 В, а для уверенной единицы при питании 5 В достаточно 0,6 · 5 = 3 В.

РезисторТок при нажатии, 5 ВПадение от утечки 1 мкА
1 кОм5 мА0,001 В
10 кОм0,5 мА0,01 В
20–50 кОм (встроенный)0,1–0,25 мА0,02–0,05 В

Резистор в 1 кОм тоже работает, но зря тратит ток — это заметно при питании от батареи. Номиналы выше 50 кОм обычно не нужны: встроенная подтяжка уже даёт этот диапазон.

Дребезг

Контакты кнопки при нажатии размыкаются и замыкаются несколько раз, и программа видит серию нажатий. Резистор от этого не спасает — нужна задержка в программе или RC-фильтр; подробнее — в термине «Дребезг контактов». Какому выводу ATmega328P соответствует номер пина на плате, показывает таблица выводов Arduino.

Похожие вопросы

Почему кнопка без резистора срабатывает сама?

Пока кнопка не нажата, вход ни к чему не подключён и «плавает»: его уровень задают наводки, и digitalRead() возвращает то HIGH, то LOW. Документация Arduino объясняет так же, почему светодиод в примере мигает беспорядочно, если вход отключить. Подтяжка задаёт уровень, пока кнопка отпущена.

Почему с INPUT_PULLUP нажатая кнопка читается как LOW?

Встроенный резистор тянет вывод к 5 В, поэтому отпущенная кнопка даёт HIGH. Нажатая кнопка соединяет вывод с GND, и читается LOW. Логику просто инвертируют в программе: нажатием считается digitalRead(pin) == LOW.

Есть ли у Arduino Uno встроенная подтяжка к земле?

Нет: по даташиту у выводов ATmega328P можно включить только подтяжку к питанию. Если кнопка должна подавать на вход 5 В, к GND ставят внешний резистор — в примере Arduino это 10 кОм.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet Complete (DS40002061B) — разд. 14.1 — у каждого вывода порта отдельно включаемая подтяжка к питанию; разд. 14.2.6 — во время сброса подтяжка выключена; табл. 30-1 — подтяжка вывода RPU 20–50 кОм, ток утечки входа не больше 1 мкА при VCC = 5,5 В, при VCC = 2,4–5,5 В VIL не выше 0,3·VCC, VIH не ниже 0,6·VCC
  2. Arduino. How to Wire and Program a Button (docs.arduino.cc, built-in examples, docs-content commit 404d4b3) — кнопка между выводом 2 и 5 В, вывод подтянут к GND резистором 10 кОм: отпущена — LOW, нажата — HIGH; можно наоборот, с подтяжкой к питанию; вход без резистора «плавает» и читается случайно
  3. Arduino. InputPullupSerial (docs.arduino.cc, built-in examples, docs-content commit 404d4b3) — pinMode(2, INPUT_PULLUP) включает встроенную подтяжку к 5 В; кнопка между выводом 2 и GND: отпущена — HIGH (1), нажата — LOW (0)

Нашли ошибку?