Какой резистор нужен для кнопки Arduino?
Обновлено Редакция GAW
Вход микроконтроллера почти не потребляет тока, поэтому, пока кнопка отпущена и вывод ни к чему не подключён, его уровень случаен. Подтягивающий резистор задаёт уровень по умолчанию, а кнопка его перебивает.
Две схемы подключения
| Схема | Кнопка соединяет вывод с | Отпущена | Нажата | Резистор |
|---|---|---|---|---|
Встроенная подтяжка, INPUT_PULLUP | GND | HIGH | LOW | внутри чипа, 20–50 кОм |
Внешняя подтяжка к земле, INPUT | 5 В | LOW | HIGH | 10 кОм между выводом и GND |
Первая схема проще всего: нужен только провод к GND. У ATmega328P подтяжка есть на каждом выводе и включается программно; во время сброса она выключена.
Расчёт: почему подходят 10 кОм
При нажатой кнопке через резистор течёт ток от питания на землю:
Пока кнопка отпущена, через резистор идёт только ток утечки входа — не больше 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 кОм.
Источники
- 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
- Arduino. How to Wire and Program a Button (docs.arduino.cc, built-in examples, docs-content commit 404d4b3) — кнопка между выводом 2 и 5 В, вывод подтянут к GND резистором 10 кОм: отпущена — LOW, нажата — HIGH; можно наоборот, с подтяжкой к питанию; вход без резистора «плавает» и читается случайно
- Arduino. InputPullupSerial (docs.arduino.cc, built-in examples, docs-content commit 404d4b3) — pinMode(2, INPUT_PULLUP) включает встроенную подтяжку к 5 В; кнопка между выводом 2 и GND: отпущена — HIGH (1), нажата — LOW (0)
Нашли ошибку?