Узнайте, как управлять яркостью светодиода, подключенного к Raspberry Pi, с помощью ШИМ.

ШИМ — это то, что мы все используем каждый день, даже если не знаем об этом. Это простой и невероятно полезный метод во многих приложениях. А еще лучше то, что ваш Raspberry Pi может сделать это, не вспотев. Как? Давайте взглянем.

Что такое ШИМ?

Если говорить по терминологии, «широтно-импульсная модуляция» звучит довольно причудливо. Но все, о чем мы здесь на самом деле говорим, — это выключение и повторное включение электрического сигнала, причем очень быстро. Почему мы можем захотеть это сделать? Просто потому, что это очень простой способ моделировать переменный аналоговый сигнал, не прибегая к Шляпы Raspberry Pi, дополнения, или дополнительная схема. В некоторых приложениях, таких как нагрев печи, привод двигателя или регулировка яркости светодиода, сигнал ШИМ буквально неотличим от «реального» аналогового напряжения.

Рабочие циклы

Итак, у нас есть серия импульсов, подаваемых в нагрузку (то, чем мы управляем). Само по себе это не так уж и полезно — пока мы не начнем изменять (или модулировать) ширину этих импульсов. Фаза «включения» данного периода включения-выключения может занимать от 0 до 100% общего цикла. Мы называем этот процент

instagram viewer
рабочий цикл.

Например, предположим, что у нас есть ШИМ-сигнал 3 В с рабочим циклом 50%. Среднее количество энергии, проходящей через светодиод, будет эквивалентно постоянно включенному сигналу 1,5 В. Увеличьте рабочий цикл, и светодиод станет ярче; наберите его вниз, и светодиод погаснет. Мы можем генерировать звук, используя тот же метод, поэтому аудиовыход на вашем Raspberry Pi может перестать работать, если вы используете ШИМ для других целей.

ШИМ на Raspberry Pi

Вы можете использовать программный ШИМ на каждом выводе GPIO Raspberry Pi. Но аппаратный ШИМ доступен только на GPIO12, GPIO13, GPIO18, и ГПИО19.

Какая разница? Что ж, если вы собираетесь использовать программное обеспечение для генерации сигнала, вы будете потреблять циклы ЦП. Однако у вашего процессора могут быть дела поважнее, чем приказывать светодиоду выключаться и включаться несколько сотен раз в секунду. Фактически, он может отвлечься и увязнуть в других задачах, что может серьезно повлиять на тайминги ШИМ.

Следовательно, зачастую лучше делегировать задачу специализированным схемам. В случае Raspberry Pi эта схема находится внутри. Система на чипе в котором находится процессор. Аппаратный ШИМ зачастую гораздо более точен и удобен, поэтому в большинстве случаев он является предпочтительным вариантом. Если вы хотите получить представление о том, что происходит под капотом чипа Broadcom BCM2711 Raspberry Pi 4, вы можете посмотреть документация BCM2711. Глава 8 посвящена ШИМ!

Затемнение светодиода

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

Определение номинала резистора

Не имеет значения, к какому концу светодиода вы подключите резистор. Главное — номинал резистора. Raspberry Pi 4 может выдавать около 16 миллиампер на контакт. Значит мы можем использовать закон Ома чтобы определить номинал необходимого резистора.

Этот закон гласит, что сопротивление должно равняться напряжению по току. Мы знаем напряжение, выходящее из контакта GPIO Pi (3,3 В), и знаем, каким должен быть ток (16 миллиампер или 0,016 ампер). Если разделить первое на второе, получим 206,25. Теперь, поскольку вам будет сложно найти резисторы такого номинала, давайте вместо этого возьмем сопротивление 220 Ом.

Подключите анод светодиода (длинную ножку) к ГПИО 18 (это физический контакт 12 на Raspberry Pi). Подключите катод (короткую ножку) к любому из заземляющих контактов Pi. Не забудьте резистор где-нибудь на пути. Теперь вы готовы к работе!

Реализация ШИМ на Raspberry Pi

Чтобы аппаратный ШИМ работал на Raspberry Pi, мы будем использовать библиотека rpi-hardware-pwm от Кэмерона Дэвидсона-Пилона, адаптирован из код Джереми Импсона. Это было использовано в Пиореактор (биореактор на основе Пи), но для наших целей он достаточно прост.

Во-первых, давайте отредактируйте файл config.txtфайл, найденный в папке /boot каталог. Нам просто нужно добавить одну строку: dtoverlay=pwm-2chan. Если бы мы хотели использовать контакты GPIO, отличные от 18 и 19, мы могли бы добавить сюда несколько дополнительных аргументов. А пока давайте будем проще.

Перезагрузите свой Pi и запустите:

lsmod | grep pwm

Эта команда перечисляет все модули, загруженные в центральную часть ОС, называемую ядром. Здесь мы фильтруем их, чтобы найти только ШИМ, используя grep (это команда «глобальная печать регулярных выражений»).

Если pwm_bcm2835 появляется среди перечисленных модулей, то мы на правильном пути. Мы почти закончили подготовку! Остаётся только установить саму библиотеку. Из терминала запустите:

sudo pip3 install rpi-hardware-pwm

Теперь мы готовы начать.

Кодирование схемы светодиода ШИМ

Пришло время немного испачкать руки кодирование на Python. Запустите Thonny и скопируйте следующий код. Затем нажмите Бегать.

from rpi_hardware_pwm import HardwarePWM
import time
pwm = HardwarePWM(pwm_channel=0, hz=60) # here's where we initialize the PWM
pwm.start(0) # start the PWM at zero – which means the LED is off
for i in range(101):
pwm.change_duty_cycle(i)
time.sleep(.1) # by introducing a small delay, we can make the effect visible.
pwm.stop()

Если все в порядке, вы увидите, что светодиод постепенно становится ярче, пока не я переменная счетчика достигает 100. Потом выключится. Что тут происходит? Давайте пройдемся по нему.

Мы импортируем соответствующий фрагмент аппаратной библиотеки ШИМ (вместе с время модуль) и объявление новой переменной. Мы можем установить pwm_channel на 0 или 1, что соответствует контактам GPIO 18 и 19 на Pi соответственно.

хз значение, которое мы можем установить на любую частоту, которая нам нравится (хотя в конечном итоге мы ограничены тактовой частотой Pi). При частоте 60 Гц мы не должны видеть мерцания ШИМ. Но, возможно, было бы неплохо начать с очень низкого значения (например, 10) и постепенно увеличивать его. Сделайте это, и вы действительно сможете увидеть происходящие импульсы. Не верьте нам на слово!

Мы работаем по своему рабочему циклу (я) от 0 до 100 использование цикла for Python. Стоит отметить, что мы можем установить время.сон аргумент до тех пор, пока нам нравится — поскольку ШИМ обрабатывается аппаратно, он будет работать «за кулисами», сколько бы мы ни сказали программе ждать.

С ШИМ есть чему поучиться

Поздравляем! Вы написали свою первую программу ШИМ. Но, как это часто бывает с Raspberry Pi, с этим устройством можно многое сделать, особенно если дополнить Raspberry Pi подходящей ШИМ-шляпой. Так что не довольствуйтесь одним маленьким светодиодом. Вы можете использовать эту новую силу для управления двигателями, кодирования сообщений и генерации синтезаторных тонов. Мир модуляции ждет!