Управление яркостью светодиода. Функция analogWrite()

Пины Arduino могут выдавать напряжение ровно 5 вольт. Что делать, если нужно меньше? На выручку приходит широтно-импульсная модуляция (ШИМ), управление которой производится через функцию analogWrite().

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

Посмотрим подробнее, что такое ШИМ и как это работает.

Фокус с лампочкой

Представим, что к Arduino подключена пьезопищалка, которая каждый раз во время исполнения программы издает прерывистый, щелкающий звук.

Схема подключения пьезопищалки к плате Arduino
Рис. 1. Схема подключения пьезопищалки к плате Arduino

Мы отчетливо слышим, как она включается и выключается. Что с ней происходит?

В плату был загружен вот такой код:

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

void loop() {
  digitalWrite(6, HIGH);
  delay(5);
  digitalWrite(6, LOW);
  delay(5);
}

Как видите, мы подаем напряжение, ждем 5 миллисекунд и на следующие 5 миллисекунд отключаем его.

График напряжения на ножке (PIN) от времени
Рис. 2. График напряжения на ножке (PIN) от времени

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

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

Схема подключения светодиода к плате Arduino
Рис. 3. Схема подключения светодиода к плате Arduino

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

Эксперименты со скважностью

Здесь стоит поговорить о такой характеристике переменного сигнала как скважность. Этим термином обозначается отношение длительности включения и отключения напряжения (T) к отрезку времени, когда напряжение подается (t1).

График прямоугольного импульса и аргументы для расчета скважности
Рис. 4. Аргументы для расчета скважности

Другими словами, скважность показывает соотношение времени, когда напряжение подается и когда оно нулевое.

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

График напряжения на пине Arduino, при котором светодиод горит тусклее
Рис. 5. График напряжения на пине, при котором светодиод горит тусклее

Пример таких значений можно увидеть в приведенном ниже коде (лампочка здесь горит с меньшей яркостью, чем до этого):

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

void loop () {
 digitalWrite(6, HIGH);
 delay(1);    // Всего одна миллисекунда!
 digitalWrite(6, LOW);
 delay(19);
}

Верно и обратное. Если подавать напряжение дольше, а выключать пин на меньшее время, то светодиод станет ярче.

График напряжения на пине Arduino, при котором светодиод горит ярче
Рис. 6. График напряжения на пине, при котором светодиод горит ярче

Если бы сигнал не прерывался, то все 100% времени подключенный к плате элемент получал бы максимальное напряжение.

График непрерывной подачи напряжения на пин Arduino
Рис. 7. График непрерывной подачи напряжения на пин

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

Функции генерации переменного сигнала

Для получения различных уровней напряжения совсем не обязательно подбирать и прописывать паузы самостоятельно — можно воспользоваться специальными функциями.

Одна из них — tone(). С ее помощью получают звук заданной частоты.

Подробнее об этой функции можно почитать в посвященной ей статье. Сейчас нас интересует только то, что она генерирует сигнал с одинаковыми промежутками подачи и отключения напряжения (см. Рис. 2).

Для широтно-импульсной модуляции используется функция analogWrite(). Она позволяет подавать нужное напряжение на указанный пин.

В отличие от tone(), функция analogWrite() работает на постоянной частоте 490Hz.

Запись функции выглядит следующим образом:

analogWrite(X, Y);

В скобках указаны два параметра, которые принимает функция. Х означает номер пина, на который необходимо подавать напряжение, Y — уровень напряжения.

Функция будет генерировать равномерный сигнал с заданными параметрами рабочего цикла, пока не последует новый вызов analogWrite() на тот же пин, но с другим значением Y.

Уровень напряжения функция понимает в «зашифрованном» виде. Принимаются значения от 0 до 255.

0 вольт — это просто 0, а 5 вольт, то есть максимум, соответствует цифре 255.

Таблица 1. Соответствие значений Y и результирующего напряжения

Пример использования функции analogWrite():

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

void loop() {
  analogWrite(10, 255); // Подаем напряжение 5 В на 10-й пин
  delay(500);
  analogWrite(10, 0); // Подаем напряжение 0 В на 10-й пин
  delay(500);
  analogWrite(10, 128); // Подаем напряжение 2,5 В на 10-й пин
  delay(1000);
  analogWrite(10, 50); // Подаем напряжение 1 В на 10-й пин
  delay(1500);
}

Эта команда очень похожа на digitalWrite() при установленном режиме OUTPUT для выбранного пина. Отличие в том, что вместо HIGH, что означало просто включение пина на 5 вольт, здесь указывается уровень напряжения.

Курсы Робикс, в которых изучается этот материал

  1. Робикс: 1-й уровень 
  2. Робикс: 2-й уровень. «Робот линии»

Дополнительные материалы к статье

  1. Описание функции analogWrite()
  2. Описание функции tone()
  3. Описание функции digitalWrite()
Поделитесь или сохраните статью
Метки:

Поделитесь или сохраните статью

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

Ваш адрес email не будет опубликован.