КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Raspberry Pi Pico: управление ШИМ в Arduino IDE





Общие сведения

В этом уроке мы разберёмся что такое ШИМ.

Каждый вывод 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);
}

Ссылки




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями