Главная chevron_right Уроки chevron_right Микроконтроллеры chevron_right Digital Pins — цифровые пины Arduino

Digital Pins — цифровые пины Arduino

Подробно о том, как работают цифровые пины Arduino в режимах INPUT, INPUT_PULLUP и OUTPUT, и какие ошибки чаще всего допускают новички.

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

Свойства пинов в режиме INPUT

По умолчанию все пины Arduino (ATmega) работают как входы, поэтому явно вызывать pinMode() необязательно — но это хорошая практика для читаемости кода. Пины в этом состоянии называют высокоимпедансными (high-impedance). Они почти не нагружают измеряемую цепь: входное сопротивление эквивалентно примерно 100 МОм, включённым последовательно с пином.

Благодаря этому входной пин можно переключить из одного состояния в другое буквально микроамперами тока. Это открывает интересные возможности:

Типичная ошибка: «плавающий» вход

Если пин настроен как pinMode(pin, INPUT), но к нему ничего не подключено (или подключён провод, второй конец которого висит в воздухе), он будет хаотично менять состояние. Пин «ловит» электрические помехи из окружающей среды и паразитно связывается с соседними пинами через ёмкость. Именно поэтому всегда подтягивайте вход к определённому потенциалу.

Pull-up резисторы для пинов в режиме INPUT

Чтобы вход всегда имел чёткое известное состояние при отсутствии сигнала, используют подтягивающие резисторы:

  • Pull-up — резистор к +5 В (или +3.3 В);
  • Pull-down — резистор к GND.

Хорошее универсальное значение — 10 кОм. Такой резистор достаточно силён, чтобы удерживать линию в нужном состоянии, и достаточно слаб, чтобы не мешать внешнему сигналу.

Свойства пинов в режиме INPUT_PULLUP

В микроконтроллере ATmega уже встроены подтягивающие резисторы около 20 кОм, которыми можно управлять программно. Чтобы включить их, передайте в pinMode() значение INPUT_PULLUP.

Это фактически инвертирует логику INPUT: HIGH означает, что датчик или кнопка не активированы, а LOW — что активированы.

Точное значение встроенного pull-up зависит от платы:

  • Большинство AVR-плат: от 20 кОм до 50 кОм;
  • Arduino Due: от 50 кОм до 150 кОм.

Для точных данных смотрите datasheet микроконтроллера вашей платы.

При использовании INPUT_PULLUP второй конец датчика или кнопки подключают к земле. Простая кнопка будет читаться как HIGH в разомкнутом состоянии и LOW при нажатии.

Практическое замечание: тусклый LED как симптом

Встроенный pull-up даёт достаточно тока, чтобы слабо засветить LED, подключённый к пину в режиме входа. Если LEDs в проекте горят, но очень тускло — скорее всего, пин случайно остался в режиме входа с включённым pull-up.

Pull-up резисторы и переключение режима пина

На AVR-платах Arduino pull-up резисторы управляются теми же аппаратными регистрами, что и направление пина (HIGH/LOW). На уровне железа бит PORT у пина в режиме INPUT_PULLUP с включённым pull-up и у пина в режиме OUTPUT HIGH с состоянием HIGH — один и тот же.

Поэтому: если пин был в режиме INPUT_PULLUP с включённым pull-up, а потом его переключают в OUTPUT через pinMode(), он сразу окажется в состоянии HIGH — потому что бит PORT остался установленным.

Обратное, однако, не так: при вызове pinMode(pin, INPUT) Arduino API явно сбрасывает и регистр направления (DDR), и регистр PORT. Это означает, что пин, находившийся в состоянии HIGH, не сохранит pull-up при переключении в INPUT через pinMode(). Если нужен включённый pull-up, используйте INPUT_PULLUP:

pinMode(pin, INPUT_PULLUP);    // Настроить пин как вход с подтяжкой к питанию

До версии Arduino 1.0.1 внутренние pull-up включали иначе:

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

Важно: цифровой пин 13 как вход. На большинстве плат к пину 13 припаяны встроенный LED и токоограничивающий резистор. Если включить внутренний pull-up 20 кОм на этом пине, напряжение на нём установится около +1.7 В вместо ожидаемых +5 В — LED и резистор «тянут» потенциал вниз, и пин всегда будет возвращать LOW. Если пин 13 всё же нужен как вход, установите его pinMode() в INPUT и используйте внешний pull-down резистор.

Свойства пинов в режиме OUTPUT

Пины, настроенные как OUTPUT с помощью pinMode(), находятся в низкоимпедансном состоянии. Они способны отдавать или принимать значительный ток.

ATmega пины могут как «источать» (source, положительный ток), так и «поглощать» (sink, отрицательный ток) до 40 mA на пин. Этого хватает, чтобы:

  • ярко светить LED (не забудьте токоограничивающий резистор!);
  • питать многие датчики.

Но этого недостаточно для реле, соленоидов или моторов — для них нужен драйвер.

Защита выходных пинов

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

Как проверить результат

Если вы не уверены в режиме пина:

  1. Добавьте в setup() явный вызов pinMode() с нужным режимом.
  2. В loop() выведите состояние пина через Serial.println(digitalRead(pin)) и наблюдайте в мониторе порта.
  3. Для выходного пина — подключите LED с резистором и убедитесь, что он переключается ожидаемо.

См. также