Микроконтроллеры ATmega, установленные на плату Arduino имеют внутренние подтягивающие резисторы 20 кОм (резисторы, которые подключаются к питанию). Их можно использовать вместо внешних подтягивающих резисторов, но для этого необходимо в функции pinMode () задать аргумент INPUT_PULLUP.
Таким образом на уровне программы или, так называемого скетча, можно добавить в вашу схему внутренний подтягивающий резистор или pull-up resistor микроконтроллера и не прибегать к установке внешнего. Это дает вам возможность не перегружать вашу схему или макет лишними деталями. Наиболее часто это используется для добавления туда функциональных кнопок.
Что такое подтягивающий резистор или PULL-UP resistor?
PULL-UP означает подтягивающий вверх, а именно к уровню логической единицы или питания схемы. Как правило это 3.3В или 5.0В и на схемах обозначается как VCC. Таким образом — это просто резистор, соединяющий логический вывод микроконтроллера с плюсом питания.
Зачем вообще нужен подтягивающий резистор или PULL-UP resistor?
Все очень просто. Давайте рассмотрим это на примере когда к цифровому входу микроконтроллера подключена тактовая кнопка. В этом случае цифровой вход соединен с кнопкой, а та в свою очередь разомкнута. На входе микроконтроллера может быть как 0 так и 1. Образно выражаясь, нога микроконтроллера болтается в воздухе и логический уровень на ней неизвестен. Нам же нужно, чтобы в разомкнутом состоянии там был четко уровень логической единицы. В этом случае на помощь приходит подтягивающий резистор, через который наш цифровой вход подключается к VCC. Таким образом цепь замыкается, между входным контактом и VCC течет небольшой ток (сопротивление большое, обычно 20 kOm) и на контакте устанавливается высокий уровень напряжения близкий к VCC — уровень логической единицы. Затем, когда кнопка замыкается, входной контакт подключается прямо на землю (GND). Ток потечет через резистор на землю и на входе таким образом установится низкий уровень — уровень логического 0. Опять же стоит иметь в виду, что отсутствие резистора при нажатой кнопке приводит к короткому замыканию, когда питание соединяется с землей, что крайне нежелательно делать.
Выводы, сконфигурированные как входы INPUT или INPUT_PULLUP, могут быть повреждены, если в какой-то момент коммутируются на землю прямо, без использования резистора.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
const int button_pin = 2; // вывод 2 Arduino, к нему подключена кнопка volatile boolean button_state = false; // переменная для считывания состояния кнопки void setup() { pinMode(LED_BUILTIN, OUTPUT); // инициализация цифрового вывода LED_BUILTIN как выход pinMode(button_pin, INPUT_PULLUP); // вывод 2 (кнопка) конфигуриуем как вход и задействуем внутренний подтягивающие резистор attachInterrupt(0, interrupt, CHANGE); // прерывание по вектору interrupt } void loop() { digitalWrite(led_pin, button_state); // зажигаем/гасим светодиод по состоянию переменной button_state } void interrupt() { button_state = !button_state; // меняем значение переменной при нажатии на кнопку } // Использование подтягивающего резистора означает, что логика кнопки инвертирована. Это значит, что будет HIGH, когда кнопка НЕ нажата, и LOW, когда она нажата |
В данном примере в функции setup() задаётся режим работы цифрового вывода № 13 Arduino — как выход (светодиод) и вывода № 2 — как вход (кнопка + используется внутренний подтягивающий резистор). Также устанавливается прерывание, при нажатии на кнопку. Функция loop() — пустая. Вся логика программы сосредоточена в обработчике прерывания — функции interrupt. При нажатии на кнопку срабатывает прерывание, в котором считывается состояние кнопки (нажата или нет). Далее, в соответствии с состоянием кнопки, зажигается/гасится светодиод, установленный на плате Arduino.
Объявление: Замечания по тексту присылайте на адрес info@robohobby.by