Raspberry Pi Pico: плавное затухание светодиода с помощью ШИМ (Arduino IDE)

Узнайте, как генерировать ШИМ-сигналы (PWM) на Raspberry Pi Pico с помощью Arduino IDE. В качестве примера мы покажем, как плавно изменять яркость светодиода, меняя коэффициент заполнения (duty cycle) с течением времени.

Raspberry Pi Pico - плавное затухание светодиода с помощью ШИМ в Arduino IDE

У нас есть аналогичное руководство с использованием прошивки MicroPython: Raspberry Pi Pico: ШИМ-управление яркостью светодиода (MicroPython).

Необходимые условия

Вам необходимо установить платы Raspberry Pi Pico в Arduino IDE и знать, как загружать код на плату. Ознакомьтесь со следующим руководством, если вы ещё этого не сделали:

Введение в ШИМ (широтно-импульсную модуляцию)

ШИМ, или широтно-импульсная модуляция (Pulse Width Modulation, PWM) — это метод управления мощностью, подаваемой на устройства. Он достигает этого путём очень быстрого включения и выключения питания.

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

Затухание светодиода

По сути, именно так работает ШИМ — генерируя выходной сигнал, который переключается между HIGH и LOW с очень высокой частотой.

Коэффициент заполнения (duty cycle) — это процент времени, в течение которого питание включено, по отношению к общему времени цикла включения-выключения. Взгляните на следующую диаграмму.

Как работает ШИМ

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

Например, коэффициент заполнения 50 процентов даёт 50 процентов яркости светодиода, коэффициент заполнения 0 означает, что светодиод полностью выключен, а коэффициент заполнения 100 означает, что светодиод полностью включён. Изменение коэффициента заполнения — это то, как вы получаете различные уровни яркости.

GPIO Raspberry Pi Pico

Raspberry Pi Pico имеет 40 выводов, 26 из которых являются программируемыми GPIO, которые можно использовать для подключения периферийных устройств. Все GPIO Raspberry Pi Pico могут выводить ШИМ-сигналы — они отмечены на схемах светло-зелёным цветом.

Вы можете использовать следующие схемы распиновки в качестве справочника для определения и поиска каждого GPIO на вашей плате. Распиновка немного отличается для Pico и Pico W.

На следующем изображении показана распиновка Raspberry Pi Pico (какие функции поддерживаются каждым выводом).

Распиновка Raspberry Pi Pico Распиновка Raspberry Pi Pico W

Выводы, отмеченные красным — это выводы питания, выдающие 3.3 В. Чёрные выводы — это выводы GND. Все выводы светло-зелёного цвета могут использоваться как «обычные» GPIO (вход и выход).

Чтобы узнать больше о распиновке Pico, прочитайте следующее руководство: Raspberry Pi Pico и Pico W: руководство по распиновке и объяснение GPIO.

ШИМ-каналы Raspberry Pi Pico

Raspberry Pi Pico имеет 8 независимых ШИМ-генераторов, называемых слайсами (slices). Каждый слайс имеет два канала, что в сумме даёт 16 ШИМ-каналов.

Частота ШИМ-сигнала может варьироваться от 8 Гц до 62.5 МГц при условии, что микроконтроллер работает на частоте 125 МГц.

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

analogWrite() и другие функции

Когда речь идёт о простой генерации ШИМ-сигналов на Raspberry Pi Pico с использованием Arduino C/C++, можно использовать следующие функции:

  • analogWriteFreq(uint32_t frequency) — для установки частоты ШИМ-сигнала. Поддерживает частоту от 100 Гц до 1 МГц*.

  • analogWriteRange(uint32_t range) — для установки диапазона ШИМ-сигнала — максимального значения, которое вы будете использовать для установки 100% коэффициента заполнения. Поддерживает значения от 16 до 65535.

  • analogWriteResolution(int resolution) — для установки разрешения ШИМ-сигнала — до 16 бит.

  • analogWrite(GPIO, duty cycle) — для вывода ШИМ-сигнала на указанный вывод с заданным коэффициентом заполнения. Непрерывно выводит ШИМ-сигнал до тех пор, пока не будет выполнена функция digitalWrite() или другой цифровой вывод.

* существуют определённые ограничения на сочетание частоты и диапазонов. Согласно документации: «Тактовая частота источника ШИМ-генератора ограничивает допустимые комбинации частоты и диапазонов. Например, при 1 МГц доступно только около 6 бит диапазона. Когда вы определяете analogWriteFreq и analogWriteRange, которые не могут быть выполнены аппаратно, частота будет сохранена, но точность (диапазон) будет автоматически снижена. Ваш код по-прежнему будет отправлять значения в заданном вами диапазоне, но ядро само прозрачно преобразует его в допустимый ШИМ-диапазон».

Сборка схемы

Теперь давайте создадим пример для лучшего понимания концепций ШИМ. Мы создадим простой пример для плавного управления яркостью светодиода (плавное увеличение и уменьшение яркости).

Прежде чем продолжить, подключите светодиод к Raspberry Pi Pico. Мы подключаем его к GPIO 20, но вы можете использовать любой другой GPIO.

Необходимые компоненты

Raspberry Pi Pico со светодиодом на макетной плате

Вот список компонентов, необходимых для сборки схемы:

  • Raspberry Pi Pico

  • Светодиод 5 мм

  • Резистор 330 Ом

  • Макетная плата

  • Соединительные провода

Схема подключения — Raspberry Pi Pico

Вы можете использовать следующую схему в качестве справочника для подключения светодиода к плате Raspberry Pi Pico.

Схема подключения светодиода к GPIO 20 Raspberry Pi Pico

Скетч Arduino — плавное затухание светодиода на RPi Pico

Следующий код создаёт ШИМ-сигнал на GPIO 20, увеличивая и уменьшая коэффициент заполнения с течением времени для плавного управления яркостью светодиода.

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-pwm-analogwrite-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/

// Pin connected to the LED
const int ledPin = 20;

// Time interval between brightness steps (in milliseconds)
const int fadeInterval = 10;

// Maximum and minimum brightness values
const int maxBrightness = 255;
const int minBrightness = 0;

// Current brightness value
int brightness = minBrightness;

// Direction flag for fading (true = increasing, false = decreasing)
bool fadingDirection = true;

void setup() {
  // Initialize the LED pin as an output
  pinMode(ledPin, OUTPUT);
  // Adjust PWM properties if needed
  /*analogWriteFreq(5000);
  analogWriteRange(65535);
  analogWriteResolution(16);*/
}

void loop() {
  // Update the brightness value based on the fading direction
  if (fadingDirection) {
    for (int i = brightness; i <= maxBrightness; i++) {
      brightness = i;
      Serial.println(brightness);

      // Set the LED brightness
      analogWrite(ledPin, brightness);

      // Delay for the fade interval
      delay(fadeInterval);
    }

    fadingDirection = false;
  } else {
    for (int i = brightness; i >= minBrightness; i--) {
      brightness = i;
      Serial.println(brightness);

      // Set the LED brightness
      analogWrite(ledPin, brightness);

      // Delay for the fade interval
      delay(fadeInterval);
    }

    fadingDirection = true;
  }
}

Просмотреть исходный код

Как работает код

Вот основные шаги, которые нужно учитывать при управлении светодиодом с помощью ШИМ.

Сначала определите вывод, к которому подключён светодиод. В данном случае он подключён к GPIO 20. Если вы используете другой номер GPIO, измените его в коде.

const int ledPin = 20;

В функции setup() установите светодиод как выход с помощью функции pinMode().

pinMode(ledPin, OUTPUT);

В функции setup() вы можете настроить свойства ШИМ-сигнала с помощью функций analogWriteFreq(), analogWriteRange() и analogWriteResolution().

// Adjust PWM properties if needed
/*analogWriteFreq(5000);
analogWriteRange(65535);
analogWriteResolution(16);*/

Если вы не укажете диапазон и разрешение ШИМ-сигнала, по умолчанию будет использоваться 8-битное разрешение с максимальным диапазоном 255 (100% коэффициент заполнения).

В функции loop() вы увеличиваете и уменьшаете коэффициент заполнения для увеличения и уменьшения яркости светодиода. Следующая строка выводит ШИМ-сигнал с заданным значением коэффициента заполнения.

analogWrite(ledPin, brightness);

Загрузка кода в Raspberry Pi Pico

Чтобы загрузить код в Raspberry Pi Pico, плата должна находиться в режиме загрузчика (bootloader mode).

Если Raspberry Pi Pico в данный момент работает с прошивкой MicroPython, вам нужно вручную перевести его в режим загрузчика. Для этого подключите Raspberry Pi Pico к компьютеру, одновременно удерживая кнопку BOOTSEL.

Режим загрузчика Raspberry Pi Pico

Для последующих загрузок через Arduino IDE плата должна автоматически переходить в режим загрузчика без необходимости нажатия кнопки BOOTSEL.

Теперь выберите ваш COM-порт в Tools > Port. Возможно, COM-порт будет неактивен (серого цвета). Если это так, не переживайте — он автоматически найдёт порт, как только вы нажмёте кнопку загрузки.

Raspberry Pi Pico - COM-порт не отображается в Arduino IDE

Загрузите код.

Вы должны получить сообщение об успешной загрузке.

Успешная загрузка кода в Raspberry Pi Pico через Arduino IDE

Демонстрация

После загрузки кода светодиод должен начать «дышать». Он будет постепенно увеличивать и уменьшать яркость с течением времени.

Raspberry Pi Pico светодиод ШИМ - минимальная яркость Raspberry Pi Pico светодиод ШИМ - средняя яркость Raspberry Pi Pico светодиод ШИМ - максимальная яркость

Заключение

Подводя итог: чтобы вывести ШИМ-сигнал на указанный вывод Raspberry Pi Pico, сначала необходимо объявить этот вывод как выход. После этого просто используйте функцию analogWrite() и передайте в качестве аргументов номер GPIO и коэффициент заполнения.

Мы надеемся, что это руководство было для вас полезным. Если вы только начинаете работу с Raspberry Pi Pico, обязательно прочитайте наше руководство для начинающих: