Плавное мигание светодиодом

В предыдущем проекте светодиод имел только два заметных состояния: горит и не горит. Теперь контроллер будет по-прежнему быстро переключать цифровой выход, но изменит соотношение включенного и выключенного времени. Глаз воспримет это как изменение яркости.
ШИМ управляет средней долей активного времени цифрового сигнала. Чем дольше выход включен внутри каждого короткого периода, тем ярче обычно кажется светодиод. Для плавного эффекта программа постепенно меняет эту долю, делает небольшую паузу между шагами, а затем проходит уровни в обратную сторону.
Зачем это нужно
Резкое включение подходит для аварийного индикатора, но не для каждого интерфейса. Плавное изменение света может показать, что устройство ожидает действие, заряжается, переходит в другой режим или продолжает работать. В роботе тем же способом можно управлять не только яркостью LED: ШИМ-сигнал часто подают на вход драйвера, который регулирует среднюю мощность нагрузки, например двигателя.
Этот урок добавляет к последовательности блоков еще три идеи:
- выходное значение может иметь несколько уровней команды;
- текущий уровень удобно хранить и изменять шагами;
- границы диапазона нужно проверять, чтобы значение не ушло ниже минимума или выше максимума.
При этом электрическая безопасность остается прежней. Светодиод соединен с выходом только через последовательный резистор, а выбранный вывод должен поддерживать нужный режим на конкретной плате.
Главная идея
Контроллер не обязан создавать промежуточное постоянное напряжение, чтобы изменить воспринимаемую яркость LED. Обычный ШИМ-выход много раз за секунду принимает только два цифровых состояния. Меняется доля времени, в течение которой состояние активно.
Для одного периода:
D = tактивно / T × 100 %
Здесь T — длительность полного периода ШИМ, tактивно — часть периода с активным уровнем, а D — коэффициент заполнения. При малом коэффициенте короткие импульсы разделены длинными выключенными участками. При большом коэффициенте выход активен почти весь период.
На типичном PWM-выводе напряжение быстро переключается между цифровыми уровнями. Это не то же самое, что постоянное промежуточное напряжение от цифро-аналогового преобразователя. Некоторые платы имеют отдельные настоящие DAC-выходы, поэтому назначение конкретного вывода проверяют по документации платы.
Что показывают три импульсных ряда
На первом скриншоте показана реальная виртуальная сборка в Tinkercad: LED подключён через резистор к PWM-выводу Arduino, а общий провод возвращается к GND. Перед программой проверяют именно эту связь: номер вывода в блоке должен совпадать с проводом на схеме.
| Доля активной части | Что происходит на выходе | Как обычно воспринимается LED |
|---|---|---|
| около 0 % | активных импульсов почти нет | выключен или едва заметен |
| небольшая | короткие активные импульсы | тусклый свет |
| около половины | активная и неактивная части сравнимы | средняя яркость |
| большая | активная часть занимает почти весь период | яркий свет |
| около 100 % | выход почти постоянно активен | максимальный заданный режим |
Слова «обычно воспринимается» здесь существенны. Яркость зависит от светодиода, тока, частоты, схемы и особенностей зрения. Удвоение числового значения блока не гарантирует ощущение ровно в два раза более яркого света. Для первого проекта достаточно увидеть устойчивое возрастание и убывание без заметных отдельных вспышек.
Один LED, много уровней команды
В Tinkercad для Arduino Uno используется синий блок set pin ... to ... с числовым значением. Для PWM значение задают в диапазоне от 0 до 255: 0 означает нулевую долю активного уровня, 255 — максимальную, а промежуточные числа задают промежуточную долю. Название analogWrite() в созданном коде историческое: на отмеченных ~ выводах Uno формируется импульсный цифровой сигнал, а не отдельное постоянное аналоговое напряжение.
| Параметр алгоритма | Что означает | Как влияет на эффект |
|---|---|---|
| Минимум | нижнее разрешенное значение команды | начальная и конечная яркость |
| Максимум | верхнее разрешенное значение | пиковая яркость |
| Шаг | изменение между соседними уровнями | число ступеней перехода |
| Пауза шага | время до следующего изменения | видимая скорость перехода |
| Направление | увеличение или уменьшение | осветление либо затемнение |
Маленький шаг создает больше промежуточных состояний, но сам по себе не делает переход медленнее: скорость определяется сочетанием числа шагов и паузы. Большой шаг при длинной паузе дает заметную лестницу. Маленький шаг при слишком короткой паузе может пройти весь диапазон так быстро, что изменение будет трудно рассмотреть.
Как собрать цикл осветления и затемнения

Второй скриншот показывает блочный вариант проекта: значение яркости увеличивается и уменьшается внутри повторяющихся блоков. В разных языковых настройках Tinkercad подписи блоков могут отличаться, но смысл остаётся прежним: команда меняет PWM-значение, пауза делает изменение наблюдаемым.
Платформонезависимый алгоритм удобно разделить на две фазы.
Фаза осветления:
- установить на PWM-выходе текущий уровень;
- немного подождать;
- увеличить уровень на один шаг;
- повторять, пока не достигнут максимум.
Фаза затемнения:
- установить текущий уровень;
- немного подождать;
- уменьшить уровень на один шаг;
- повторять, пока не достигнут минимум.
Обе фазы помещают в общий контейнер постоянного повторения. Визуальная среда может предложить цикл с заданным числом повторов, счетчик, условие достижения границы или готовый блок постепенного изменения. Независимо от формы проверяют один и тот же смысл: значение проходит допустимый диапазон вверх, затем вниз и не перескакивает за границы.
Если шаг не делит диапазон без остатка, последняя прибавка может попытаться пройти выше максимума. Надежный вариант — ограничить значение максимумом перед передачей на выход. То же относится к нижней границе. Особенно осторожно обращаются с беззнаковыми переменными: уменьшение ниже нуля может превратиться в большое положительное число, и LED внезапно вспыхнет вместо выключения.
Выбираем вывод и шкалу до запуска симуляции
Не каждый физический контакт каждой Arduino-совместимой платы поддерживает аппаратную ШИМ. На распространенных платах подходящие контакты часто отмечены на распиновке специальным символом, однако состав выводов различается. В блоке следует выбрать тот же физический вывод, к которому подключен резистор.
Порядок безопасной подготовки:
- Найдите официальную распиновку конкретной платы.
- Выберите поддерживаемый PWM-вывод.
- Соберите последовательную цепь
вывод → резистор → LED → GNDпри отключенном питании. - Проверьте полярность светодиода и номинал резистора.
- Узнайте допустимый диапазон блока управления выходом.
- Начните с умеренного максимума и заметной паузы между шагами.
- Только после визуальной проверки меняйте скорость или диапазон.
Встроенный LED может быть соединен с выводом, который не поддерживает нужный PWM-режим, либо управляться через дополнительную схему. Поэтому внешний LED по известной цепи лучше подходит для изучения принципа. Если используется встроенный индикатор, его вывод и способ управления берут из документации платы, а не предполагают по аналогии с другой моделью.
Почему плавность может пропасть
Контроллер формирует импульсы независимо от блоков ожидания между уровнями. Блок ожидания в алгоритме задает, как долго сохраняется очередной коэффициент заполнения. Он не создает каждый отдельный PWM-импульс: эту быструю работу выполняет периферия контроллера или программный механизм среды.
Если пауза между уровнями слишком большая, глаз видит ступени. Если она слишком мала, полный переход пролетает почти мгновенно. Если выбран неверный вывод, блок может вести себя как простое включение и выключение либо не давать ожидаемого результата. Если значение выходит за разрешенную шкалу, среда может ограничить его, отбросить часть разрядов или обработать иначе — полагаться на случайное поведение нельзя.
| Наблюдение | Возможная причина | Что проверить первым |
|---|---|---|
| LED только включается и выключается | выбран не-PWM вывод или используются цифровые блоки | распиновку и тип блока |
| переход заметно ступенчатый | слишком крупный шаг или длинная пауза | сочетание шага и времени |
| изменение почти не видно | переход слишком быстрый либо диапазон мал | общую длительность и границы |
| после максимума LED вспыхивает или гаснет | выход за допустимый диапазон | условие границы и тип переменной |
| яркость меняется в обратную сторону | активный уровень или подключение отличаются от модели | схему платы и направление изменения |
| светодиод не светится ни на одном уровне | ошибка цепи, полярности или вывода | проверку постоянным цифровым включением |
Последняя проверка особенно полезна: временно замените сложный алгоритм простым постоянным активным состоянием. Если LED не загорелся, искать ошибку в вычислении шага рано — сначала исправляют цепь и выбор вывода.
ШИМ и работа остальной программы
Учебная версия с блоками ожидания проста и наглядна, но длительное ожидание может задерживать обработку кнопки или датчика, если среда выполняет команды последовательно. Для одного светодиода это допустимый первый шаг. В проекте, где робот одновременно едет, измеряет расстояние и принимает команды, изменение уровня связывают с таймером или неблокирующим расписанием.
При этом сам аппаратный PWM после установки значения обычно продолжает формироваться без постоянного повторения команды. Алгоритму нужно лишь вовремя задать следующий уровень. Разделение полезно запомнить: таймер PWM создает быстрые импульсы, а цикл программы медленно изменяет их коэффициент заполнения.
Что запомнить о плавном мигании
| Правило | Следствие |
|---|---|
| PWM быстро переключает цифровые уровни | это не непрерывная аналоговая линия |
| Яркость связана с долей активного времени | больший коэффициент обычно дает более яркий свет |
| Шкала зависит от платформы | нельзя переносить максимум вслепую |
| PWM поддерживают не все выводы | контакт выбирают по распиновке платы |
| Резистор остается обязательным | способ управления не отменяет ограничения тока |
| Плавность задают шаг и пауза вместе | один параметр нельзя оценивать отдельно |
| Границы нужно контролировать | значение не должно переполняться или уходить ниже минимума |
| Скриншот Tinkercad показывает структуру блоков | частоту PWM и временной масштаб определяет конкретная платформа |
Пример: «дыхание» индикатора
Индикатор ожидания может медленно набирать яркость и затем гаснуть. Для спокойного эффекта выбирают много небольших шагов и одинаковую скорость в обе стороны. Короткая остановка у минимума или максимума изменяет характер сигнала, хотя диапазон остается прежним.
Пример: яркость от датчика
Позже текущий уровень можно получать не из счетчика, а из измерения освещенности или положения регулятора. Значение датчика переводят в допустимую шкалу PWM и ограничивают границами. Электрическая цепь LED и принцип коэффициента заполнения при этом не меняются.
Практика
Задание 1
Соберите симметричный цикл осветления и затемнения. Запишите минимум, максимум, шаг и паузу, а затем оцените полную длительность эффекта до запуска симуляции.
Задание 2
Создайте два варианта с одинаковой общей длительностью: один с небольшим числом крупных шагов, другой с большим числом малых. Подготовьте таблицу наблюдений, не объясняя результат заранее.
Задание 3
Добавьте короткую остановку только у максимальной яркости. Нарисуйте порядок блоков одного полного цикла и отметьте, какое ожидание отвечает за остановку.
Задание 4
Выберите другую доступную плату в документации и сравните PWM-выводы и шкалу выходного значения с используемой платой. Составьте инструкцию переноса проекта без готовой схемы подключения.
Проверьте себя
- Что именно меняется внутри периода ШИМ?
- Почему PWM-выход обычно нельзя называть настоящим аналоговым напряжением?
- Как коэффициент заполнения связан с активным временем и периодом?
- От каких двух параметров зависит заметная плавность перехода между уровнями?
- Почему нельзя выбирать любой цифровой вывод для PWM?
- Что произойдет с алгоритмом при выходе значения за границы шкалы?
- Как отделить неисправность электрической цепи от ошибки расчета шага?
- Чем быстрые PWM-импульсы отличаются от медленного цикла изменения яркости?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
| Термин | Определение |
|---|---|
| ШИМ (PWM) | широтно-импульсная модуляция: управление долей активного времени цифрового сигнала |
| Период ШИМ | время одного полного импульсного повторения |
| Коэффициент заполнения | отношение активного времени к полному периоду |
| Активная часть | участок периода, когда выход находится в состоянии включения выбранной нагрузки |
| Разрешение | число доступных уровней команды между минимумом и максимумом |
| Шаг | величина изменения уровня за одну итерацию алгоритма |
| Граница диапазона | минимальное или максимальное разрешенное значение |
| PWM-вывод | контакт платы, на котором поддерживается формирование ШИМ-сигнала |
| DAC | цифро-аналоговый преобразователь, создающий настоящий аналоговый уровень на предназначенном для этого выходе |
| Переполнение | переход числового значения за пределы представимого диапазона |
Связанные темы
- Мигание светодиодом — базовый цифровой цикл включения и выключения.
- Обработка датчика — как связать измеренное значение с выходным действием.
- Драйвер моторов — как использовать управляющий сигнал для изменения движения через силовой каскад.
Источники
- Arduino Built-in Example: Fade
- Arduino Learn: Basics of PWM
- Arduino Language Reference: analogWrite()
- Arduino Language Reference: analogWriteResolution()
- Arduino Built-in Examples
- SparkFun: Light-Emitting Diodes (LEDs)
- Adafruit: LED Tricks — Gamma Correction
- Ni3nayka/microcontroller_learn_1523 — скриншот схемы Tinkercad для
analogWrite. - 博客园: 用Tinkercad学arduino之板载AnalogWrite控制LED渐亮渐暗 — скриншот блочной программы Tinkercad для плавного изменения яркости.