Arduino:Основы/Цифровые контакты

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Цифровые контакты[1]

Контакты Arduino можно сделать и входными, и выходными. В этой статье объясняется, как контакты функционируют в двух этих режимах. Хотя в заголовке статьи указаны цифровые контакты, стоит отметить, что многие аналоговые контакты Arduino (ATmega) можно настроить, а затем использовать также, как и цифровые.

Свойства контактов, настроенных в режим INPUT

По умолчанию контакты Arduino (ATmega) настроены на ввод данных, поэтому вам не нужно специально объявлять их входными при помощи функции pinMode(). Про контакты, настроенные таким образом, говорят, что они находятся в «высоко-импедансном состоянии». Входные контакты крайне нетребовательны к цепи, данные которой они считывают – это равнозначно добавочному резистору на 100 МОм, поставленному перед контактом. Это значит, что контакту нужно очень мало тока, чтобы переключиться из одного состояния в другое. Благодаря этому контакты можно использовать для емкостных сенсорных датчиков, считывать данные со светодиода как с фотодиода или считывать данные с аналогового датчика со схемой вроде RCTime.

Впрочем, это также значит, что если контакт настроен как pinMode(pin, INPUT), но к нему ничего не подключено или провода, присоединенные к нему, никуда не подключены, то этот контакт будет сообщать, возможно, случайные изменения – из-за того, что будет считывать электрический шум окружающего пространства, или из-за емкостной связи с близлежащим контактом.

Подтягивающие резисторы, подключенные к контактам, настроенным как INPUT

Если на входной контакт не идет никаких данных, то его будет не лишним «подтянуть» к нужному состоянию. Это можно сделать подключением к входному контакту подтягивающего (к линии +5V) или стягивающего (к «земле») резистора. Для этих целей неплохо подойдет резистор на 10 кОм.

Свойства контактов, настроенных в режим INPUT_PULLUP

В чип ATmega встроены подтягивающие резисторы на 20 кОм, и доступ к ним можно получить при помощи специального кода. Для этого в функции pinMode() нужно указать параметр INPUT_PULLUP. Это инвертирует поведение режима INPUT: если датчик выключен, контакт будет возвращать значение HIGH, а если включен – LOW.

Номинал подтягивающего резистора зависит от используемого микроконтроллера. На большинстве AVR-плат это значение составляет от 20 до 50 кОм. На Arduino Due оно составляет от 50 до 150 кОм. Чтобы узнать точное значение, загляните в даташит, соответствующий вашей плате.

Если вы подключаете датчик к контакту, настроенному как INPUT_PULLUP, то другой конец этого датчика должен быть подключен к «земле». Если в качестве примера взять простой переключатель, то контакт будет возвращать HIGH, если кнопка будет отпущена, и LOW, если она будет нажата.

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

Подтягивающие резисторы управляются теми же регистрами (т.е. участками памяти на внутреннем чипе), которые управляют состоянием контакта – HIGH или LOW. Следовательно, если контакт находится в режиме INPUT и у него включен подтягивающий резистор, то при переключении в режим OUTPUT при помощи функции pinMode() получит значение HIGH. Верно и обратное – если контакт, настроенный в режим OUTPUT и оставленный в состоянии HIGH, будет переключен в режим INPUT, то у него включится подтягивающий резистор.

До выхода IDE Arduino версии 1.0.1 встроенные подтягивающие резисторы можно было настроить следующим образом:

pinMode(pin, INPUT);           // выставляем контакт в режим INPUT
digitalWrite(pin, HIGH);       // включаем подтягивающие резисторы

Примечание: Цифровой контакт 13 сложнее использовать в качестве входного цифрового контакта, чем остальные цифровые контакты, потому что на большинстве плат Arduino к нему подключены светодиод и резистор. Если включить этот подтягивающий резистор на 20 кОм, то напряжение на этом контакте будет 1,7 вольта вместо ожидаемых 5 вольт, потому что светодиод и добавочный резистор притягивают напряжение к нижней границе вольтового диапазона, из-за чего этот контакт будет всегда возвращать LOW. Если вам все же нужно воспользоваться цифровым контактом 13, выставьте его в режим INPUT при помощи функции pinMode() и подключите к внешнему стягивающему резистору.

Свойства контактов, настроенных в режим OUTPUT

Про контакты, которые настроены в режим OUTPUT при помощи функции pinMode(), говорят, что они находятся в «низко-импедансном состоянии». Это значит, что они могут обеспечить цепи, к которым подключены, большим количеством тока. Контакты ATmega могут быть и источниками (движение тока в положительном направлении), и потребителями тока (движение в отрицательном направлении) до 40 мА (миллиампер) для других девайсов/цепей. Этого тока достаточно, к примеру, чтобы светодиод горел с максимальной яркостью (не забудьте про добавочный резистор), а также для работы множества датчиков, но недостаточно для работы большинства реле, электромагнитов и моторов.

Короткие замыкания на Arduino (или, другими словами, попытки использовать Arduino для управления сильноточными устройствами) могут повредить или разрушить выходные транзисторы на контакте или даже повредить чип ATmega. Зачастую такие попытки заканчиваются «смертью» контакта на микроконтроллере, но оставшаяся часть чипа продолжает работать в нормальном режиме. По этой причине контакты в режиме OUTPUT есть смысл подключать к другим девайсам, имеющим резисторы на 470 Ом или 1 кОм, разве что ваш проект не требует, чтобы от этих контактов шел максимальный ток.

См.также

Внешние ссылки