Яркость и ШИМ: плавное затухание светодиода

Цифровой пин умеет только «вкл» и «выкл». Так откуда же берётся плавная яркость? Хитрость называется ШИМ — и она повсюду вокруг тебя.

ШИМ (широтно-импульсная модуляция, PWM) — это обман глаза: светодиод мигает так быстро, что мы видим не мигание, а приглушённый свет. Чем дольше он «включён» в каждом цикле, тем ярче кажется.

Сейчас заставим светодиод плавно разгораться и гаснуть, как «дыхание» на ноутбуке. Цифровой пин при этом по-прежнему только щёлкает 5 В / 0 В — просто очень быстро.

Что такое скважность

  Яркость 25%:  __----__________----______   (мало "вкл")
  Яркость 50%:  ____----____----____----__
  Яркость 100%: --------------------------   (всегда "вкл")
                |<-- один период (очень короткий) -->|

Доля времени, когда сигнал «включён», называется скважностью (duty cycle). 0% — всегда выключен, 100% — всегда включён, 50% — половину времени. На Arduino мы задаём её числом от 0 до 255.

Код: дыхание светодиода

ШИМ работает не на всех пинах — только на тех, что помечены значком ~ (на Uno это 3, 5, 6, 9, 10, 11). Возьмём пин 9.

const int LED = 9;

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  for (int v = 0; v <= 255; v++) {   // разгораемся
    analogWrite(LED, v);
    delay(5);
  }
  for (int v = 255; v >= 0; v--) {   // гаснем
    analogWrite(LED, v);
    delay(5);
  }
}

Как работает под капотом

analogWrite(пин, 0..255) не выдаёт настоящее «среднее» напряжение. Он быстро (около 490 раз в секунду на Uno) переключает пин между 5 В и 0 В, меняя долю «включённого» времени. Светодиод физически мигает сотни раз в секунду, но глаз усредняет это в ровную яркость. Значение 128 ≈ 50% яркости, 64 ≈ 25%.

Преобразуем число 0..255 в проценты яркости той же логикой, что внутри analogWrite:

# Та же логика на Python: значение ШИМ -> процент яркости (скважность)
def duty_to_percent(value):
    value = max(0, min(255, value))   # держим в диапазоне 0..255
    return round(value / 255 * 100)

for v in (0, 64, 128, 191, 255):
    print("analogWrite(", v, ") ->", duty_to_percent(v), "% яркости")

Запусти — увидишь, что 128 это примерно половина, а 255 это максимум. Та же таблица, что чувствует светодиод.

Частые ошибки

  • analogWrite на пине без ~. ШИМ не работает — светодиод просто горит или не горит. Используй пины 3, 5, 6, 9, 10, 11.
  • Передают число больше 255. Диапазон строго 0–255. Большие значения «обрезаются».
  • Путают analogWrite и analogRead. Write — выдать ШИМ, Read — измерить напряжение. Об этом — в следующем разделе.

Best practices

  • Для плавности подбирай небольшой delay (3–10 мс) в цикле — иначе «дыхание» будет рваным или слишком быстрым.
  • Если светодиод даже на 255 тусклый — возможно, слишком большой резистор. Попробуй 220 Ом.
  • ШИМ управляет не только яркостью, но и громкостью пищалок, и скоростью моторов — запомни этот приём.

ШИМ повсюду вокруг

Стоит понять ШИМ один раз — и ты начнёшь узнавать его везде. Регулятор яркости в LED-лампе, скорость кулера в компьютере, громкость простой пищалки, мощность паяльной станции, скорость моторов в твоей будущей машинке — всё это один и тот же приём: быстро щёлкать питанием вкл/выкл и менять долю «включённого» времени. Это куда эффективнее, чем «гасить лишнее» сопротивлением: при ШИМ деталь либо полностью открыта, либо закрыта, поэтому почти не греется и не тратит энергию впустую.

Полезно прочувствовать частоту. На Uno ШИМ переключается около 490 раз в секунду — настолько быстро, что глаз не успевает увидеть отдельные мигания и усредняет их в ровную яркость. Если бы частота была низкой (скажем, 5 раз в секунду), ты бы увидел именно мерцание, а не приглушённый свет. Тот же принцип «глаз усредняет быстрое мигание» лежит в основе работы экранов и киноплёнки. ШИМ — это инженерный способ обмануть инерцию восприятия с пользой.

Итоги

ШИМ — это быстрое мигание с разной скважностью, которое глаз видит как яркость. analogWrite принимает 0–255 и работает только на ~-пинах. Тот же приём дальше пригодится для моторов. А пока пора научиться не выдавать сигнал, а читать мир.

Проверьте себя
1. Как analogWrite создаёт промежуточную яркость на цифровом пине?
AВыдаёт точное среднее напряжение
BБыстро переключает пин между 5В и 0В с разной скважностью
CИспользует аналоговый пин
DМеняет частоту процессора
2. На каких пинах Uno работает analogWrite (ШИМ)?
AНа всех цифровых
BТолько помеченных ~ (3,5,6,9,10,11)
CТолько на аналоговых A0&ndash;A5
DТолько на пине 13