Яркость и ШИМ: плавное затухание светодиода
Цифровой пин умеет только «вкл» и «выкл». Так откуда же берётся плавная яркость? Хитрость называется ШИМ — и она повсюду вокруг тебя.
ШИМ (широтно-импульсная модуляция, 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 и работает только на ~-пинах. Тот же приём дальше пригодится для моторов. А пока пора научиться не выдавать сигнал, а читать мир.