Добавить в избранное

Пины Arduino: цифровые, аналоговые, ШИМ и подтяжка — полный разбор

Чтение ≈ 4 мин

Всё о пинах Arduino Uno: INPUT/OUTPUT/INPUT_PULLUP, digitalRead/digitalWrite, analogRead с делителями, analogWrite и ШИМ, токовые ограничения и защита пинов при подключении периферии.

Три режима пина

Каждый пин 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 В.
Поделиться
Понравился материал?

Комментарии

Добавить комментарий