Общие сведения
В этом уроке мы разберёмся что такое ШИМ.
Каждый вывод Raspberry Pi Pico в режиме OUTPUT
может
принимать значение логического нуля или логической единицы. Полного
напряжения питания (+3.3 вольта относительно GND) или отсутствие этого
напряжения (ноль вольт относительно GND). Соответственно мы можем зажечь
светодиод или выключить светодиод, если он подключён к выводу Pi Pico.
Но что если нам надо получить среднюю яркость светодиода? У данной
проблемы есть не один способ решения (источник постоянного тока, ЦАП),
но мы рассмотрим самый простой - ШИМ.
ШИМ - Широтно-Импульсная Модуляция.
Для управления яркостью светодиода мы можем включать и выключать его так быстро, что для человеческого глаза это будет выглядеть как изменение яркости. По своей сути быстрое включение и выключение (изменение логического уровня вывода) и есть ШИМ, но помимо изменения уровня у ШИМ есть ещё два важных параметра:
- Частота импульса (frequency) - как быстро мы переключаем уровни
- Широта импульса (duty) - процентное отношение уровней (в каком состоянии вывод проводит большую часть времени)
Собственно при помощи широты импульса мы и будем менять яркость светодиода. Широта импульса в Ардуино задаётся следующим образом:
analogWrite(ВЫВОД, ЧИСЛО_БЕЗ_ЗНАКА )
ЧИСЛО_БЕЗ_ЗНАКА - может быть как восьмибитное, так и
шестнадцатибитное. Битность числа задаётся функцией
alalogWriteResolution()
. По умолчанию в Arduino ШИМ
задаётся восьмибитным числом, это значит что числа должны быть в
диапазоне от 0 до 255.
Если задать широту числом 255 - это будет всё равно что отключить ШИМ и подать логическую единицу на вывод, светодиод будет гореть с максимальной яркостью. Ноль, соответственно, выключит светодиод.
Для этого урока нам понадобится:
Подключение
Подключим Trema-модуль Светодиод согласно таблице
Вывод модуля | Вывод Pi Pico |
---|---|
Vcc | 3V3(OUT) |
GND | GND |
S | GP15 |
Подключим Trema-модуль Кнопку согласно таблице
Вывод модуля | Вывод Pi Pico |
---|---|
Vcc | 3V3(OUT) |
GND | GND |
S | GP2 |
Управляем яркостью
// определяем вывод к которому подключен светодиод #define LED_PIN 15 void setup() { // устанавливаем режим работы вывода pinMode(LED_PIN, OUTPUT); } void loop() { // яркость светодиода на ноль analogWrite(LED_PIN, 0); delay(500); // яркость светодиода на 25% analogWrite(LED_PIN, 64); delay(500); // яркость светодиода на 50% analogWrite(LED_PIN, 127); delay(500); // яркость светодиода на 100% analogWrite(LED_PIN, 255); delay(500); }
Диммер
При нажатии и удержании кнопки светодиод начнёт менять свою яркость. Если отпустить кнопку и зажать снова - направление изменения яркости поменяется (нажали и удерживаем первый раз - светодиод становится ярче, отпустили и нажали снова - светодиод начинает гаснуть).
// определяем вывод к которому подключена кнопка #define BUT_PIN 2 // определяем вывод к которому подключён светодиод #define LED_PIN 15 // направление изменения яркости bool direction = false; // предыдущее состояние кнопки bool last_state = false; // широта импульса uint8_t duty = 0; // смена яркости светодиода void fadeLED() { // увеличиваем яркость (приращение широты импульса) if (direction && duty < 255) { duty++; } // уменьшаем яркость else if (duty > 0) { duty--; } // устанавливаем широту импульса на выводе светодиода analogWrite(LED_PIN, duty); } void setup() { // Устанавливаем работу вывода светодиода pinMode(LED_PIN, OUTPUT); // Устанавливаем работу вывода кнопки pinMode(BUT_PIN, INPUT); } void loop() { // сохраняем состояние кнопки bool button_state = digitalRead(BUT_PIN); // если состояние отличается от предыдущего if (button_state != last_state) { // записываем новое состояние last_state = button_state; // если состояние - кнопка была нажата if (button_state) { // меняем направление изменения яркости direction = !direction; } } // если кнопка зажата - меняем яркость if (button_state) { fadeLED(); } delay(20); }
Обсуждение