Buzzer: различия между версиями
Vdromanov (обсуждение | вклад) |
Matveevrj (обсуждение | вклад) |
||
(не показано 46 промежуточных версий 6 участников) | |||
Строка 1: | Строка 1: | ||
<languages/> | <languages/> | ||
<translate> | <translate> | ||
<!--T: | <!--T:26--> | ||
{{DISPLAYTITLE:Зуммер (звуковой излучатель)}} | |||
==Описание== <!--T:22--> | |||
Контроллер Wiren Board имеет на борту Зуммер (звуковой излучатель). Зуммер питается от 5В и управляется ножкой gpio процессора в режиме ШИМ. Управлять зуммером можно через sysfs-интерфейс ядра и различное ПО поверх него. Также реализовано управление из веб-интерфейса, движка правил wb-rules и python. | |||
== | ==Управление из веб-интерфейса== <!--T:14--> | ||
<!--T:23--> | |||
[[Файл:buzzer.png |300px|thumb|right| Управление зуммером]] | |||
В веб-интерфейсе контроллера управление зуммером доступно во вкладке ''"Devices"''. Параметр ''"Frequency"'' - частота звука в Гц. ''"Volume"'' - громкость (в условных единицах, шкала линейная). Параметры сохраняются при перезагрузке контроллера. | |||
===Номер pwm-порта для sysfs===<!--T: | ==Управление из движка правил== <!--T:15--> | ||
<!--T:24--> | |||
Управление зуммером, выведенное в веб-интерфейс - это виртуальное устройство, созданное системным правилом wb-rules при старте контроллера. Исходный код правила доступен [https://github.com/wirenboard/wb-rules-system/blob/master/rules/buzzer.js на нашем github]. | |||
<!--T:16--> | |||
О том, для чего нужны виртуальные устройства, можно узнать подробнее в [[wb-rules|описании движка правил]]. | |||
<!--T:17--> | |||
Системное правило внутри реализует пересчёт тональности и громкости (см [[#О ШИМ и пересчёт параметров|раздел о пересчёте]]) и работу с pwm через sysfs (см [[#Работа из sysfs|соответствующий раздел]]). Наружу пользователю доступно устройство ''"buzzer"'', имеющее несколько mqtt-контролов: | |||
{| class="wikitable" | |||
!Device||Control||Тип||Максимальное значение||Описание | |||
|- | |||
|rowspan="3"|Buzzer | |||
|Frequency | |||
|Range | |||
|7000 | |||
|Частота звука | |||
|- | |||
|Volume | |||
|Range | |||
|100 | |||
|Громкость, % | |||
|- | |||
|Enabled | |||
|Switch | |||
| | |||
|Включение/отключение | |||
|} | |||
<!--T:18--> | |||
Контролы устройства можно использовать в собственных правилах. Подробнее о структуре mqtt-топиков виртуальных и физических устройств можно узнать из нашей [https://github.com/wirenboard/conventions/blob/main/README.md mqtt-конвенции]. | |||
==Управление из python== <!--T:19--> | |||
<!--T:20--> | |||
На контроллерах Wiren Board работать с зуммером можно из python с помощью модуля ''beeper'' из пакета ''wb_common''. Это обёртка вокруг интерфейса sysfs. Модуль предустановлен на все контроллеры в составе deb-пакета ''python-wb-common''. Исходный код доступен [https://github.com/wirenboard/wb-common/blob/master/wb_common/beeper.py на нашем github]. | |||
<!--T:21--> | |||
Пример работы из python: | |||
<syntaxhighlight lang="python"> | |||
from wb_common import beeper | |||
<!--T:25--> | |||
beeper.beep(0.5, 2) | |||
</syntaxhighlight> | |||
Поддерживаются все настройки sysfs-интерфейса (пересчёт нужно проводить вручную; см [[#О ШИМ и пересчёт параметров|раздел о пересчёте]]). | |||
==Низкоуровневая работа== <!--T:5--> | |||
===О ШИМ и пересчёт параметров=== <!--T:2--> | |||
[[Файл:Duty_cycle.gif|440px|thumb|right|Duty cycle управляет яркостью светодиодов / громкостью Зуммерa]] | |||
ШИМ (PWM) - это распространённый способ управления мощностью, подаваемой к нагрузке. | |||
<!--T:3--> | |||
В контексте управления зуммером, нас интересуют 2 параметра PWM: | |||
*Коэффициент заполнения (duty cycle) - влияет на громкость звука. Обычно, считается в процентном соотношении от периода сигнала. | |||
*Частота PWM (frequency) - влияет на высоту звука (чем выше частота, тем выше и звук). Единица, обратная периоду сигнала. | |||
<!--T:4--> | |||
Ядро Linux предоставляет интерфейс sysfs для pwm, который принимает частоту pwm и duty cycle в '''наносекундах (10<sup>-9</sup>С)'''! Поэтому, для низкоуровневого управления Buzzer'ом нужно производить пересчёт желаемой частоты из kHz в период в наносекундах по формуле: | |||
<b> | |||
T(ns) = 1 000 000 / f(kHz) | |||
</b> | |||
===Номер pwm-порта для sysfs=== <!--T:6--> | |||
<!--T:7--> | |||
Ножка gpio настраивается, как выход PWM в dts ядра linux. Подробнее можно посмотреть [[https://github.com/wirenboard/linux/blob/ef2d87e222b365848fe7262c022ca887b6449432/arch/arm/boot/dts/imx6ul-wirenboard61.dts#L495 на нашем github]]. | Ножка gpio настраивается, как выход PWM в dts ядра linux. Подробнее можно посмотреть [[https://github.com/wirenboard/linux/blob/ef2d87e222b365848fe7262c022ca887b6449432/arch/arm/boot/dts/imx6ul-wirenboard61.dts#L495 на нашем github]]. | ||
<!--T: | <!--T:8--> | ||
*Для контроллеров WB6.X.X номер порта = 0,(для всех контроллеров до WB6.X.X номер порта = 2) | |||
* | |||
*Номер порта можно узнать, выполнив команду <syntaxhighlight lang="bash">echo $WB_PWM_BUZZER</syntaxhighlight> | *Номер порта можно узнать, выполнив команду <syntaxhighlight lang="bash">echo $WB_PWM_BUZZER</syntaxhighlight> | ||
Во всех примерах далее будем считать, что номер pwm-порта = 0. | Во всех примерах далее будем считать, что номер pwm-порта = 0. | ||
===Работа из sysfs===<!--T: | ===Работа из sysfs=== <!--T:9--> | ||
<!--T:10--> | |||
Для работы c pwm через sysfs нужно: | Для работы c pwm через sysfs нужно: | ||
#Экспортировать порт <syntaxhighlight lang="bash">echo 0 > /sys/class/pwm/pwmchip0/export</syntaxhighlight>После этого появляется директория /sys/class/pwm/pwmchip0/pwm0 | #Экспортировать порт <syntaxhighlight lang="bash">echo 0 > /sys/class/pwm/pwmchip0/export</syntaxhighlight>После этого появляется директория /sys/class/pwm/pwmchip0/pwm0 | ||
#Записать период pwm в наносекундах <syntaxhighlight lang="bash">echo 250000 > /sys/class/pwm/pwmchip0/pwm0/period # устанавливаем период в 250 000 нс, т.е. в 250мкс, что соответствует частоте 4кГц</syntaxhighlight> | #Записать период pwm в наносекундах <syntaxhighlight lang="bash">echo 250000 > /sys/class/pwm/pwmchip0/pwm0/period # устанавливаем период в 250 000 нс, т.е. в 250мкс, что соответствует частоте 4кГц</syntaxhighlight> | ||
#Записать громкость (пересчитав из duty-cycle) <syntaxhighlight lang="bash">echo 125000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle # устанавливаем duty_cycle в 125 000 нс | #Записать громкость (пересчитав из duty-cycle) <syntaxhighlight lang="bash">echo 125000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle # максимальная громкость достигается при duty_cycle = period / 2 => устанавливаем duty_cycle в 125 000 нс</syntaxhighlight> | ||
#Включить выход PWM <syntaxhighlight lang="bash">echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable</syntaxhighlight> | #Включить выход PWM <syntaxhighlight lang="bash">echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable</syntaxhighlight> | ||
<!--T: | <!--T:11--> | ||
Для | Для выключения зуммера, нужно записать 0: <syntaxhighlight lang="bash">echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable</syntaxhighlight> | ||
<!--T:12--> | <!--T:12--> | ||
[https://github.com/contactless/wirenboard/tree/master/examples/beeper '''Пример bash-скрипта для работы с pwm'''] | [https://github.com/contactless/wirenboard/tree/master/examples/beeper '''Пример bash-скрипта для работы с pwm'''] | ||
<!--T: | <!--T:13--> | ||
Установка периода в наносекундах. Пересчёт из частоты (в килогерцах) в период (в наносекундах) производится по формуле: | Установка периода в наносекундах. Пересчёт из частоты (в килогерцах) в период (в наносекундах) производится по формуле: | ||
<b> | <b> | ||
T(ns) = 1 000 000 / f(kHz) | T(ns) = 1 000 000 / f(kHz) | ||
</b> | </b> | ||
</translate> | </translate> |
Текущая версия на 11:39, 23 сентября 2022
Описание
Контроллер Wiren Board имеет на борту Зуммер (звуковой излучатель). Зуммер питается от 5В и управляется ножкой gpio процессора в режиме ШИМ. Управлять зуммером можно через sysfs-интерфейс ядра и различное ПО поверх него. Также реализовано управление из веб-интерфейса, движка правил wb-rules и python.
Управление из веб-интерфейса
В веб-интерфейсе контроллера управление зуммером доступно во вкладке "Devices". Параметр "Frequency" - частота звука в Гц. "Volume" - громкость (в условных единицах, шкала линейная). Параметры сохраняются при перезагрузке контроллера.
Управление из движка правил
Управление зуммером, выведенное в веб-интерфейс - это виртуальное устройство, созданное системным правилом wb-rules при старте контроллера. Исходный код правила доступен на нашем github.
О том, для чего нужны виртуальные устройства, можно узнать подробнее в описании движка правил.
Системное правило внутри реализует пересчёт тональности и громкости (см раздел о пересчёте) и работу с pwm через sysfs (см соответствующий раздел). Наружу пользователю доступно устройство "buzzer", имеющее несколько mqtt-контролов:
Device | Control | Тип | Максимальное значение | Описание |
---|---|---|---|---|
Buzzer | Frequency | Range | 7000 | Частота звука |
Volume | Range | 100 | Громкость, % | |
Enabled | Switch | Включение/отключение |
Контролы устройства можно использовать в собственных правилах. Подробнее о структуре mqtt-топиков виртуальных и физических устройств можно узнать из нашей mqtt-конвенции.
Управление из python
На контроллерах Wiren Board работать с зуммером можно из python с помощью модуля beeper из пакета wb_common. Это обёртка вокруг интерфейса sysfs. Модуль предустановлен на все контроллеры в составе deb-пакета python-wb-common. Исходный код доступен на нашем github.
Пример работы из python:
from wb_common import beeper
beeper.beep(0.5, 2)
Поддерживаются все настройки sysfs-интерфейса (пересчёт нужно проводить вручную; см раздел о пересчёте).
Низкоуровневая работа
О ШИМ и пересчёт параметров
ШИМ (PWM) - это распространённый способ управления мощностью, подаваемой к нагрузке.
В контексте управления зуммером, нас интересуют 2 параметра PWM:
- Коэффициент заполнения (duty cycle) - влияет на громкость звука. Обычно, считается в процентном соотношении от периода сигнала.
- Частота PWM (frequency) - влияет на высоту звука (чем выше частота, тем выше и звук). Единица, обратная периоду сигнала.
Ядро Linux предоставляет интерфейс sysfs для pwm, который принимает частоту pwm и duty cycle в наносекундах (10-9С)! Поэтому, для низкоуровневого управления Buzzer'ом нужно производить пересчёт желаемой частоты из kHz в период в наносекундах по формуле: T(ns) = 1 000 000 / f(kHz)
Номер pwm-порта для sysfs
Ножка gpio настраивается, как выход PWM в dts ядра linux. Подробнее можно посмотреть [на нашем github].
- Для контроллеров WB6.X.X номер порта = 0,(для всех контроллеров до WB6.X.X номер порта = 2)
- Номер порта можно узнать, выполнив команду
echo $WB_PWM_BUZZER
Во всех примерах далее будем считать, что номер pwm-порта = 0.
Работа из sysfs
Для работы c pwm через sysfs нужно:
- Экспортировать порт После этого появляется директория /sys/class/pwm/pwmchip0/pwm0
echo 0 > /sys/class/pwm/pwmchip0/export
- Записать период pwm в наносекундах
echo 250000 > /sys/class/pwm/pwmchip0/pwm0/period # устанавливаем период в 250 000 нс, т.е. в 250мкс, что соответствует частоте 4кГц
- Записать громкость (пересчитав из duty-cycle)
echo 125000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle # максимальная громкость достигается при duty_cycle = period / 2 => устанавливаем duty_cycle в 125 000 нс
- Включить выход PWM
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
Для выключения зуммера, нужно записать 0:
echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
Пример bash-скрипта для работы с pwm
Установка периода в наносекундах. Пересчёт из частоты (в килогерцах) в период (в наносекундах) производится по формуле: T(ns) = 1 000 000 / f(kHz)