Перейти к основному содержимому

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

Скриншот схемы Tinkercad: светодиод подключён к PWM-выводу Arduino

В предыдущем проекте светодиод имел только два заметных состояния: горит и не горит. Теперь контроллер будет по-прежнему быстро переключать цифровой выход, но изменит соотношение включенного и выключенного времени. Глаз воспримет это как изменение яркости.

Коротко

ШИМ управляет средней долей активного времени цифрового сигнала. Чем дольше выход включен внутри каждого короткого периода, тем ярче обычно кажется светодиод. Для плавного эффекта программа постепенно меняет эту долю, делает небольшую паузу между шагами, а затем проходит уровни в обратную сторону.

Зачем это нужно

Резкое включение подходит для аварийного индикатора, но не для каждого интерфейса. Плавное изменение света может показать, что устройство ожидает действие, заряжается, переходит в другой режим или продолжает работать. В роботе тем же способом можно управлять не только яркостью 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: блоки плавного изменения яркости LED

Второй скриншот показывает блочный вариант проекта: значение яркости увеличивается и уменьшается внутри повторяющихся блоков. В разных языковых настройках Tinkercad подписи блоков могут отличаться, но смысл остаётся прежним: команда меняет PWM-значение, пауза делает изменение наблюдаемым.

Платформонезависимый алгоритм удобно разделить на две фазы.

Фаза осветления:

  1. установить на PWM-выходе текущий уровень;
  2. немного подождать;
  3. увеличить уровень на один шаг;
  4. повторять, пока не достигнут максимум.

Фаза затемнения:

  1. установить текущий уровень;
  2. немного подождать;
  3. уменьшить уровень на один шаг;
  4. повторять, пока не достигнут минимум.

Обе фазы помещают в общий контейнер постоянного повторения. Визуальная среда может предложить цикл с заданным числом повторов, счетчик, условие достижения границы или готовый блок постепенного изменения. Независимо от формы проверяют один и тот же смысл: значение проходит допустимый диапазон вверх, затем вниз и не перескакивает за границы.

Если шаг не делит диапазон без остатка, последняя прибавка может попытаться пройти выше максимума. Надежный вариант — ограничить значение максимумом перед передачей на выход. То же относится к нижней границе. Особенно осторожно обращаются с беззнаковыми переменными: уменьшение ниже нуля может превратиться в большое положительное число, и LED внезапно вспыхнет вместо выключения.

Выбираем вывод и шкалу до запуска симуляции

Не каждый физический контакт каждой Arduino-совместимой платы поддерживает аппаратную ШИМ. На распространенных платах подходящие контакты часто отмечены на распиновке специальным символом, однако состав выводов различается. В блоке следует выбрать тот же физический вывод, к которому подключен резистор.

Порядок безопасной подготовки:

  1. Найдите официальную распиновку конкретной платы.
  2. Выберите поддерживаемый PWM-вывод.
  3. Соберите последовательную цепь вывод → резистор → LED → GND при отключенном питании.
  4. Проверьте полярность светодиода и номинал резистора.
  5. Узнайте допустимый диапазон блока управления выходом.
  6. Начните с умеренного максимума и заметной паузы между шагами.
  7. Только после визуальной проверки меняйте скорость или диапазон.

Встроенный LED может быть соединен с выводом, который не поддерживает нужный PWM-режим, либо управляться через дополнительную схему. Поэтому внешний LED по известной цепи лучше подходит для изучения принципа. Если используется встроенный индикатор, его вывод и способ управления берут из документации платы, а не предполагают по аналогии с другой моделью.

Почему плавность может пропасть

Контроллер формирует импульсы независимо от блоков ожидания между уровнями. Блок ожидания в алгоритме задает, как долго сохраняется очередной коэффициент заполнения. Он не создает каждый отдельный PWM-импульс: эту быструю работу выполняет периферия контроллера или программный механизм среды.

Если пауза между уровнями слишком большая, глаз видит ступени. Если она слишком мала, полный переход пролетает почти мгновенно. Если выбран неверный вывод, блок может вести себя как простое включение и выключение либо не давать ожидаемого результата. Если значение выходит за разрешенную шкалу, среда может ограничить его, отбросить часть разрядов или обработать иначе — полагаться на случайное поведение нельзя.

НаблюдениеВозможная причинаЧто проверить первым
LED только включается и выключаетсявыбран не-PWM вывод или используются цифровые блокираспиновку и тип блока
переход заметно ступенчатыйслишком крупный шаг или длинная паузасочетание шага и времени
изменение почти не виднопереход слишком быстрый либо диапазон малобщую длительность и границы
после максимума LED вспыхивает или гаснетвыход за допустимый диапазонусловие границы и тип переменной
яркость меняется в обратную сторонуактивный уровень или подключение отличаются от моделисхему платы и направление изменения
светодиод не светится ни на одном уровнеошибка цепи, полярности или выводапроверку постоянным цифровым включением

Последняя проверка особенно полезна: временно замените сложный алгоритм простым постоянным активным состоянием. Если LED не загорелся, искать ошибку в вычислении шага рано — сначала исправляют цепь и выбор вывода.

ШИМ и работа остальной программы

Учебная версия с блоками ожидания проста и наглядна, но длительное ожидание может задерживать обработку кнопки или датчика, если среда выполняет команды последовательно. Для одного светодиода это допустимый первый шаг. В проекте, где робот одновременно едет, измеряет расстояние и принимает команды, изменение уровня связывают с таймером или неблокирующим расписанием.

При этом сам аппаратный PWM после установки значения обычно продолжает формироваться без постоянного повторения команды. Алгоритму нужно лишь вовремя задать следующий уровень. Разделение полезно запомнить: таймер PWM создает быстрые импульсы, а цикл программы медленно изменяет их коэффициент заполнения.

Что запомнить о плавном мигании

ПравилоСледствие
PWM быстро переключает цифровые уровниэто не непрерывная аналоговая линия
Яркость связана с долей активного временибольший коэффициент обычно дает более яркий свет
Шкала зависит от платформынельзя переносить максимум вслепую
PWM поддерживают не все выводыконтакт выбирают по распиновке платы
Резистор остается обязательнымспособ управления не отменяет ограничения тока
Плавность задают шаг и пауза вместеодин параметр нельзя оценивать отдельно
Границы нужно контролироватьзначение не должно переполняться или уходить ниже минимума
Скриншот Tinkercad показывает структуру блоковчастоту PWM и временной масштаб определяет конкретная платформа

Пример: «дыхание» индикатора

Индикатор ожидания может медленно набирать яркость и затем гаснуть. Для спокойного эффекта выбирают много небольших шагов и одинаковую скорость в обе стороны. Короткая остановка у минимума или максимума изменяет характер сигнала, хотя диапазон остается прежним.

Пример: яркость от датчика

Позже текущий уровень можно получать не из счетчика, а из измерения освещенности или положения регулятора. Значение датчика переводят в допустимую шкалу PWM и ограничивают границами. Электрическая цепь LED и принцип коэффициента заполнения при этом не меняются.

Практика

Задание 1

Соберите симметричный цикл осветления и затемнения. Запишите минимум, максимум, шаг и паузу, а затем оцените полную длительность эффекта до запуска симуляции.

Задание 2

Создайте два варианта с одинаковой общей длительностью: один с небольшим числом крупных шагов, другой с большим числом малых. Подготовьте таблицу наблюдений, не объясняя результат заранее.

Задание 3

Добавьте короткую остановку только у максимальной яркости. Нарисуйте порядок блоков одного полного цикла и отметьте, какое ожидание отвечает за остановку.

Задание 4

Выберите другую доступную плату в документации и сравните PWM-выводы и шкалу выходного значения с используемой платой. Составьте инструкцию переноса проекта без готовой схемы подключения.

Проверьте себя

  1. Что именно меняется внутри периода ШИМ?
  2. Почему PWM-выход обычно нельзя называть настоящим аналоговым напряжением?
  3. Как коэффициент заполнения связан с активным временем и периодом?
  4. От каких двух параметров зависит заметная плавность перехода между уровнями?
  5. Почему нельзя выбирать любой цифровой вывод для PWM?
  6. Что произойдет с алгоритмом при выходе значения за границы шкалы?
  7. Как отделить неисправность электрической цепи от ошибки расчета шага?
  8. Чем быстрые PWM-импульсы отличаются от медленного цикла изменения яркости?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

ТерминОпределение
ШИМ (PWM)широтно-импульсная модуляция: управление долей активного времени цифрового сигнала
Период ШИМвремя одного полного импульсного повторения
Коэффициент заполненияотношение активного времени к полному периоду
Активная частьучасток периода, когда выход находится в состоянии включения выбранной нагрузки
Разрешениечисло доступных уровней команды между минимумом и максимумом
Шагвеличина изменения уровня за одну итерацию алгоритма
Граница диапазонаминимальное или максимальное разрешенное значение
PWM-выводконтакт платы, на котором поддерживается формирование ШИМ-сигнала
DACцифро-аналоговый преобразователь, создающий настоящий аналоговый уровень на предназначенном для этого выходе
Переполнениепереход числового значения за пределы представимого диапазона

Связанные темы

Источники