Три режима пина
Каждый пин Arduino может быть в одном из трёх состояний, настраиваемых pinMode:
pinMode(2, OUTPUT); // управляем: 0 В или 5 В
pinMode(3, INPUT); // читаем: высокоимпедансный вход, "плавает" без подтяжки
pinMode(4, INPUT_PULLUP); // читаем: внутренняя подтяжка к +5 В (~30-50 кОм)
INPUT_PULLUP — спасение для кнопок: не нужен внешний резистор, но логика инвертирована — нажатая кнопка даёт LOW.
Цифровые пины
digitalWrite(13, HIGH); // +5 В на пине 13
digitalWrite(13, LOW); // 0 В
int state = digitalRead(2); // HIGH или LOW
Логические уровни на Uno: LOW < 1.5 В, HIGH > 3 В. Порог не ровно посередине — важно для совместимости с 3.3 В логикой (например, ESP8266 TX в Arduino RX).
Токовые ограничения — важно
Максимум на пин ATmega328P: 20 мА постоянно, 40 мА абсолютный предел. Суммарно по всем пинам — 200 мА. Это мало:
- Светодиод — да, через резистор 220–330 Ом.
- Мотор, реле, светодиодная лента — только через транзистор/драйвер.
- Питание периферии берите с пина 5V, а не с логических.
Аналоговые входы A0–A5
АЦП 10-битный: analogRead возвращает 0–1023 при опорном 5 В:
int raw = analogRead(A0); // 0..1023
float volts = raw * 5.0 / 1023.0;
Для измерения сопротивления датчиков (фоторезистор, термистор) делают делитель напряжения:
5V ──┬── Rfixed ──┬── A0
│ │
датчик GND
Напряжение на A0 = 5 × Rдатчик / (Rfixed + Rдатчик). Стандартная схема для LDR, NTC, потенциометра.
Опорное напряжение
По умолчанию Vref = 5 В. Можно переключить:
analogReference(INTERNAL); // внутренний 1.1 В — для точных измерений
// analogReference(EXTERNAL); // со своего Vref на пин AREF
ШИМ (PWM): пины ~3, 5, 6, 9, 10, 11
ШИМ — быстрое переключение между 0 и 5 В: среднее напряжение задаётся скважностью. analogWrite принимает 0–255 (0 %–100 %):
analogWrite(9, 128); // ~50% — светодиод вполнакала, мотор медленно
analogWrite(9, 255); // полная мощность
analogWrite(9, 64); // 25%
На Uno шИМ базовая частота ~490 Гц (пины 5, 6 — ~980 Гц). Для тишины в аудио или точного управления моторами частоту меняют через таймеры — но это уже продвинутая тема.
Серво и ШИМ
Сервоприводу нужна частота 50 Гц с импульсом 1–2 мс — не тот ШИМ, что делает analogWrite. Для серво используют библиотеку Servo, которая сама генерирует правильный сигнал на любом пине:
#include <Servo.h>
Servo myservo;
myservo.attach(9); // любой пин
myservo.write(90); // угол 0–180
Плавающий вход — классическая ловушка
Пин в режиме INPUT без подтяжки «плавает»: читается шум из эфира, случайные 0/1. Признаки — датчик срабатывает без причины, значения прыгают.
Решение:
INPUT_PULLUP— подтяжка к +5 В (кнопки, концевики).- Внешний резистор pull-down 10 кОм к GND — если датчик выдаёт HIGH.
pinMode(7, INPUT); // без резистора — плавает!
pinMode(7, INPUT_PULLUP); // с подтяжкой — стабилен
Переходные процессы и защита
- Кнопка: программный антидребезг — ждать 20–50 мс и перечитать, или RC-цепочка.
- Индуктивные нагрузки (реле, моторы): обратный диод обязательно — обратный выброс ЭДС спалит пин.
- Вход выше Vcc или ниже GND — спалит вход; ограничительные резисторы и стабилитроны для надёжности.
- Емкостные нагрузки (длинные провода): последовательный резистор 220 Ом–1 кОм.
Карта пинов Uno — краткая шпаргалка
- 0, 1 — RX/TX Serial: не используйте для периферии, иначе не загрузится скетч.
- 2, 3 — внешние прерывания (
attachInterrupt) — единственные пины для них. - 3, 5, 6, 9, 10, 11 — аппаратный ШИМ.
- 10–13 — SPI (SS, MOSI, MISO, SCK).
- A4, A5 — I2C (SDA, SCL).
- 13 — встроенный светодиод.
Итог
Пины — интерфейс между кодом и физикой. Запомните: OUTPUT для управления, INPUT_PULLUP для кнопок, analogRead для датчиков, analogWrite для плавного управления, лимит 20 мА на пин и обратный диод для индуктивной нагрузки. С этим вы подключите что угодно — от светодиода до реле.
Полный пример: кнопка + светодиод + потенциометр
const int BTN = 2, LED = 9, POT = A0;
void setup() {
pinMode(BTN, INPUT_PULLUP); // кнопка на землю
pinMode(LED, OUTPUT);
pinMode(POT, INPUT);
Serial.begin(9600);
}
void loop() {
int pot = analogRead(POT); // 0..1023
int brightness = map(pot, 0, 1023, 0, 255);
bool pressed = digitalRead(BTN) == LOW;
analogWrite(LED, pressed ? 255 : brightness);
Serial.printf("pot=%d pressed=%d\n", pot, pressed);
delay(50);
}
Пины с особыми функциями на Uno
- D0, D1 — Serial (RX/TX): заняты USB, лучше не использовать.
- D2, D3 — внешние прерывания.
- D3, 5, 6, 9, 10, 11 — аппаратный ШИМ (analogWrite).
- D10–D13 — аппаратный SPI.
- A4, A5 — I2C (SDA/SCL).
- D13 — встроенный светодиод.
INPUT_PULLUP: без внешних резисторов
Внутренний подтягивающий резистор ~30 кОм активируется INPUT_PULLUP: кнопка замыкается на GND — читаем LOW при нажатии, HIGH при отпускании. Два провода вместо трёх — стандарт для кнопок и концевиков.
Сколько тока можно вытащить
- Пин GPIO: до 20 мА постоянно, 40 мА в пике — только светодиоды и сигналы.
- Пин 5V: до ~500 мА от USB, ~1 А от хорошего БП.
- Суммарно все GPIO: до 200 мА — считайте бюджет.
Реле, моторы, ленты — только через транзисторный ключ или драйвер.
Мини-проект: регулятор громкости с потенциометром
Потенциометр на A0, пассивная пищалка на D9 (или светодиод). analogRead → частота tone() (для пищалки) или яркость analogWrite (для LED). Введение в аналоговый ввод и ШИМ одним проектом.
Типичные ошибки новичков с пинами
- Забыли
pinMode— пин в неизвестном состоянии. - Читают выходной пин
digitalRead— работает, но не то что хотели. - Замкнули пин на GND в OUTPUT+HIGH — сожгли порт.
- Подали > 5 В на аналоговый пин — сожгли АЦП.
- Использовали D0/D1 для периферии — конфликт с USB-Serial.
Полный чек-лист для новичка
pinModeвsetupдля каждого пина — OUTPUT, INPUT, INPUT_PULLUP.digitalWrite/digitalReadдля цифровых,analogWrite/analogReadдля аналоговых.- ШИМ только на пинах с
~(3,5,6,9,10,11 на Uno). - Ток до 20 мА на пин, 200 мА суммарно — периферию через транзистор.
- Общий GND для всех источников — без него сигналы не доходят.
Что можно подключить напрямую
- Светодиод через резистор 220 Ом — 10–20 мА.
- Кнопка на INPUT_PULLUP — два провода.
- Потенциометр на A0 — аналоговый ввод.
- Фоторезистор в делителе — датчик освещённости.
Что нельзя
- Реле, мотор, соленоид — токи > 20 мА, нужен транзистор.
- LED-лента — отдельный БП + MOSFET.
- Серво — отдельное питание, не с пина.
- ESP8266/ESP32 — 3.3 В логика, level shifter для 5 В.