Если вам понравилось создавать Светодиоды мигают на Raspberry Pi , подождите, пока вы не услышите об управлении его яркостью! В этом руководстве мы работаем с парой кнопок для регулировки яркости светодиода на Raspberry Pi.
Начинаете свой первый проект на Raspberry Pi? Вот как можно быстро установите ОС Raspberry Pi на свое устройство .
Что делает ШИМ со светодиодом
ШИМ, или широтно-импульсная модуляция, — это метод, который искусственно снижает выходное напряжение на контактах GPIO (вход/выход общего назначения) Raspberry Pi. Это искусственно, поскольку вы на самом деле не снижаете напряжение, а прост
Contents
Что делает ШИМ со светодиодом
о, что общее напряжение становится ниже реального напряжения, которое вы к нему прикладываете.Для светодиода или светоизлучающего диода увеличение общего напряжения делает его свет ярче, а уменьшение — тусклее. Но поскольку у Raspberry Pi нет аналогового выхода, мы используем ШИМ для управления яркостью светодиода.
Что вам понадобится
- 2 кнопки
- 3 резистора (250–550 Ом подойдут. Используйте меньший номинал, если светодиод слишком темный.)
- 1 светодиод (любого цвета)
- Макет
- Перемычки
- Raspberry Pi (любая модель, кроме Pi Pico)
Как использовать ШИМ для управления яркостью светодиодов на Raspberry Pi
В этом руководстве мы используем две кнопки, чтобы сделать свет светодиода ярче или тусклее с помощью ШИМ. Нажатие кнопки «ярче» увеличивает выходную мощность ШИМ, а нажатие кнопки «тусклее» уменьшает ее.
Подготовка схемы
- Начнем со светодиода. На макетной плате разместите светодиод и подключите резистор с одной стороны. Сторона, на которой установлен резистор, не имеет значения.
- Подключите перемычку к катодной стороне. Э
Что вам понадобится
кт 11 на Raspberry Pi. Добавьте еще одну перемычку, ведущую к синей направляющей на макетной плате, затем добавьте еще одну перемычку от этой синей направляющей к контакту 9 на Raspberry Pi, который является GND.
Примечание. чтобы найти правильный номер контакта на Raspberry Pi, держите плату так, чтобы лоток для контактов GPIO находился справа. Левый верхний контакт должен быть контактом 1, правый — контактом 2, а нижний — контактом 3.
- Вам нужно будет создать кнопки. Поместите кнопки на макетную плату и добавьте резистор к одной ножке каждой кнопки. Другая сторона резистора должна вести к синей шине макетной платы.
Совет. хотите узнать больше о кнопках? У нас есть полное руководство, которое покажет вам, как используйте кнопки с контактами Raspberry Pi GPIO .
- Добавьте перемычки параллельно резистору и кнопке. Подключите другую сторону этих контактов к контактам 13 (кнопка «Ярче») и 15 (кнопка «Диммер»).
- Используйте перемычку, чтобы соединить кнопки сбоку с красной направляющей макетной платы.
- Подключите красную шину к источнику 3,3 В на Raspberry Pi, например контакту 1.
Если вы предпочитаете Python, научитесь устанавливать и управлять несколькими версиями Python в Linux .
Подготовка кода
Создайте новый файл в своем любимом инструменте редактирования кода и сохраните его как «rpi-lcdpwm.py».
- Начните с приведенного ниже кода, который дает вам два способа импорта модулей в Python: первый импортирует модуль
RPi.GPIO
и позволяет вызывать его с помощью всего лишьGPIO
, и второй импортирует только функциюsleep()
из всего модуляtime
.
import RPi.GPIO as GPIO from time import sleep
- Определите номера контактов, чтобы их было легче менять на случай, если вы передумаете позже.
ledPin = 11 brightenButton = 13 dimButton = 15
- Необязательно : добавьте строку
GPIO.setwarnings(False)
, чтобы избежать появления предупреждающего сообщения GPIO при последующем запуске сценария.
- Установите метод выбора булавки.
BOARD
— хороший выбор для новичков, так как облегчает поиск контактов без необходимости сверяться с распиновкой. Другой метод —BCM
, что означает «Broadcom». При этом используются номера Broadcom, присвоенные каждому контакту, которые могут отличаться в зависимости от марки вашего Raspberry Pi.
GPIO.setmode(GPIO.BOARD)
- Назначьте контакты GPIO в качестве входов или выходов. Мы назначаем
ledPin
в качестве выходного контакта, и его состояние всегда будет начинаться сLOW
. Следующие две строки устанавливаютbrightenButton
иdimButton
в качестве входных контактов, которые слушают нажатия кнопок. Им также следует установить значениеGPIO.PUD_DOWN
, чтобы обозначить, что они используют резисторы понижения напряжения.
GPIO.setup(ledPin, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(brightenButton, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(dimButton, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
- Давайте объявим ШИМ.
pwmLEDPin
— это переменная, которая упрощает последующий вводGPIO.PWM(ledPin, 100)
, а команда.start(0)
запускает процесс ШИМ. Теперь мы можем изменить выходной сигналledPin
Подготовка кодаl>pwmLEDPin = GPIO.PWM(ledPin, 100) pwmLEDPin.start(0)
- Рабочий цикл — это процент времени, в течение которого вывод активен во время пульсовой волны. Здесь мы сначала устанавливаем рабочий цикл на 100%. У нас было довольно продолжительное обсуждение этой темы в руководство по использованию серводвигателей с Raspberry Pi, , если вам интересно.
dutyCycle = 100 GPIO.output(ledPin, GPIO.HIGH)
- Что касается цикла, мы устанавливаем цикл
while
, который работает практически вечно.
while True:
<старый старт="9">
- В начале этого цикла цикла мы обновляем рабочий цикл.
pwmLEDPin.ChangeDutyCycle(dutyCycle)
- Давайте запрограммируем, что делает
brightenButton
. Когда Raspberry обнаруживает, что через контактbrightenButton
проходит электричество, он отображает сообщение «BrightenButton имеет ВЫСОКИЙ уровень», что добавляет 5 к текущему значению рабочего цикла, пока оно не достигнет 100.
if GPIO.input(brightenButton) == GPIO.HIGH: print("brightenButton is HIGH") if dutyCycle < 100: dutyCycle += 5 sleep(0.25) else: dutyCycle = 100
- При программировании функции
dimButton
она делает обратное, уменьшая значение на 5, пока оно не достигнет 0.
elif GPIO.input(dimButton) == GPIO.HIGH: print("dimButton is HIGH") if dutyCycle > 0: dutyCycle -= 5 sleep(0.25) else: dutyCycle = 0
Окончательный код:
import RPi.GPIO as GPIO from time import sleep ledPin = 11 brightenButton = 13 dimButton = 15 GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) GPIO.setup(ledPin, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(brightenButton, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(dimButton, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) pwmLEDPin = GPIO.PWM(ledPin, 100) pwmLEDPin.start(0) dutyCycle = 100 GPIO.output(ledPin, GPIO.HIGH) while True: pwmLEDPin.ChangeDutyCycle(dutyCycle) if GPIO.input(brightenButton) == GPIO.HIGH: print("brightenButton is HIGH") if dutyCycle < 100: dutyCycle += 5 sleep(0.25) else: dutyCycle = 100 elif GPIO.input(dimButton) == GPIO.HIGH: print("dimButton is HIGH") if dutyCycle > 0: dutyCycle -= 5 sleep(0.25) else: dutyCycle = 0
Как это работает
Во-первых, вам понадобится терминал. Вы можете использовать встроенный терминал Raspberry Pi или управлять Raspberry Pi через SSH на отдельном компьютере. Через терминал вам следует перейти в каталог сценария Python и ввести python3 rpi-ledpwm.py
или имя файла, которое вы использовали.
Иногда светодиодный индикатор может выглядеть так, будто он мигает. В этом случае частота ШИМ, вероятно, слишком низкая. Вы можете увеличить частоту, увеличивая число в pwmLEDPin = GPIO.PWM(ledPin, 100)
, пока мигание не перестанет быть заметным.
Если переходы кажутся вам зернистыми, уменьшите время на sleep(0.25)
внутри цикла while. Однако при его опускании он становится быстрее, поэтому не опускайте его слишком сильно.
Совет : предпочитаете Arduino? Вот полный руководство по началу работы с проектами Arduino .
Часто задаваемые вопросы
Какую минимальную частоту я могу генерировать с помощью Raspberry Pi?
Самая низкая частота, которую можно установить на Raspberry Pi, — 10 Гц. Аппаратное обеспечение не может поддерживать что-либо ниже этого.
Какую максимальную частоту я могу генерировать с помощью Raspberry Pi?
Максимальная частота, которую можно установить на Raspberry Pi, составляет 8000 Гц.
Можно ли превратить пульсовые волны в звуковые волны?
Да. С помощью пьезоэлектрического элемента вполне возможно превратить пульсовые волны в звуковые волны, которые вы сможете услышать. В этом случае изменение частоты меняет высоту тона, а изменение рабочего цикла регулирует громкость.
Все изображения Теренца Йомара Дела Круза.