Digital Pins — цифровые пины Arduino
Подробно о том, как работают цифровые пины Arduino в режимах INPUT, INPUT_PULLUP и OUTPUT, и какие ошибки чаще всего допускают новички.
Пины Arduino можно настраивать как входы или как выходы. В этом уроке разберём, как они ведут себя в каждом из режимов. Хотя речь идёт о цифровых пинах, важно помнить: почти все аналоговые пины Arduino (ATmega) тоже можно настроить и использовать точно так же, как цифровые.
Свойства пинов в режиме INPUT
По умолчанию все пины Arduino (ATmega) работают как входы, поэтому явно вызывать pinMode() необязательно — но это хорошая практика для читаемости кода. Пины в этом состоянии называют высокоимпедансными (high-impedance). Они почти не нагружают измеряемую цепь: входное сопротивление эквивалентно примерно 100 МОм, включённым последовательно с пином.
Благодаря этому входной пин можно переключить из одного состояния в другое буквально микроамперами тока. Это открывает интересные возможности:
- реализация a capacitive touch sensor;
- использование LED как photodiode;
- считывание аналогового сигнала методом RCTime.
Типичная ошибка: «плавающий» вход
Если пин настроен как 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 кОм — если только максимальный ток действительно необходим.
Как проверить результат
Если вы не уверены в режиме пина:
- Добавьте в
setup()явный вызовpinMode()с нужным режимом. - В
loop()выведите состояние пина черезSerial.println(digitalRead(pin))и наблюдайте в мониторе порта. - Для выходного пина — подключите LED с резистором и убедитесь, что он переключается ожидаемо.