|
|
(не показано 57 промежуточных версий 7 участников) |
Строка 1: |
Строка 1: |
| <languages/> | | <languages/> |
| <translate> | | <translate> |
| <!--T:26-->
| | Излучатель звука подключен в Wiren Board Smart Home к выходу ШИМ и управляется через sysfs-интерфейс ядра. |
| {{DISPLAYTITLE:Зуммер (звуковой излучатель)}}
| | Номер порта PWM - 2. |
|
| |
|
| ==Описание== <!--T:22-->
| | ШИМ - это прямоугольные импульсы, интерфейс ядра позволяет регулировать частоту импульсов и коэффициент заполнения. |
| Контроллер Wiren Board имеет на борту Зуммер (звуковой излучатель). Зуммер питается от 5В и управляется ножкой gpio процессора в режиме ШИМ. Управлять зуммером можно через sysfs-интерфейс ядра и различное ПО поверх него. Также реализовано управление из веб-интерфейса, движка правил wb-rules и python.
| | Коэффециент заполнения влияет на громкость звука. |
|
| |
|
| ==Управление из веб-интерфейса== <!--T:14-->
| | Экспорт порта в sysfs: |
| | <pre> |
| | echo 2 > /sys/class/pwm/pwmchip0/export |
| | </pre> |
|
| |
|
| <!--T:23-->
| | После этого появляется директория /sys/class/pwm/pwmchip0/pwm2 |
| [[Файл:buzzer.png |300px|thumb|right| Управление зуммером]]
| |
| В веб-интерфейсе контроллера управление зуммером доступно во вкладке ''"Devices"''. Параметр ''"Frequency"'' - частота звука в Гц. ''"Volume"'' - громкость (в условных единицах, шкала линейная). Параметры сохраняются при перезагрузке контроллера.
| |
|
| |
|
| ==Управление из движка правил== <!--T:15-->
| | <br/> |
|
| |
|
| | | Установка периода в наносекундах. Пересчёт из частоты(в килогеграцах в период в наносекундах производится по формуле: |
| <!--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> | | <b> |
| T(ns) = 1 000 000 / f(kHz) | | T(ns) = 1 000 000 / f(kHz) |
| </b> | | </b> |
|
| |
|
| ===Номер pwm-порта для sysfs=== <!--T:6-->
| | <pre> |
| | | echo 250000 > /sys/class/pwm/pwmchip0/pwm2/period # устанавливаем период в 250 000 нс, т.е. в 250мкс, что соответствует частоте 4кГц |
| <!--T:7-->
| | </pre> |
| Ножка gpio настраивается, как выход PWM в dts ядра linux. Подробнее можно посмотреть [[https://github.com/wirenboard/linux/blob/ef2d87e222b365848fe7262c022ca887b6449432/arch/arm/boot/dts/imx6ul-wirenboard61.dts#L495 на нашем github]].
| |
|
| |
|
| <!--T:8-->
| | Установка duty_cycle (длительности высокого состояния) в наносекундах. Максимальная громкость достигается при duty_cycle = period / 2 |
| *Для контроллеров WB6.X.X номер порта = 0,(для всех контроллеров до WB6.X.X номер порта = 2)
| |
| *Номер порта можно узнать, выполнив команду <syntaxhighlight lang="bash">echo $WB_PWM_BUZZER</syntaxhighlight>
| |
| Во всех примерах далее будем считать, что номер pwm-порта = 0.
| |
|
| |
|
| ===Работа из sysfs=== <!--T:9-->
| | <pre> |
| | echo 125000 > /sys/class/pwm/pwmchip0/pwm2/duty_cycle # устанавливаем duty_cycle в 125 000 нс, т.е. в половину периода |
| | </pre> |
|
| |
|
| <!--T:10-->
| |
| Для работы c pwm через sysfs нужно:
| |
| #Экспортировать порт <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>
| |
| #Записать громкость (пересчитав из 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>
| |
|
| |
|
| <!--T:11-->
| | Включение выхода ШИМ: |
| Для выключения зуммера, нужно записать 0: <syntaxhighlight lang="bash">echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable</syntaxhighlight>
| | <pre> |
| | echo 1 > /sys/class/pwm/pwmchip0/pwm2/enable |
| | </pre> |
|
| |
|
| <!--T:12--> | | Выключение: |
| [https://github.com/contactless/wirenboard/tree/master/examples/beeper '''Пример bash-скрипта для работы с pwm''']
| | <pre> |
| | echo 0 > /sys/class/pwm/pwmchip0/pwm2/enable |
| | </pre> |
|
| |
|
| <!--T:13-->
| | [https://github.com/contactless/wirenboard/tree/master/examples/beeper '''Пример'''] |
| Установка периода в наносекундах. Пересчёт из частоты (в килогерцах) в период (в наносекундах) производится по формуле:
| |
| <b>
| |
| T(ns) = 1 000 000 / f(kHz)
| |
| </b>
| |
| </translate> | | </translate> |
Излучатель звука подключен в Wiren Board Smart Home к выходу ШИМ и управляется через sysfs-интерфейс ядра.
Номер порта PWM - 2.
ШИМ - это прямоугольные импульсы, интерфейс ядра позволяет регулировать частоту импульсов и коэффициент заполнения.
Коэффециент заполнения влияет на громкость звука.
Экспорт порта в sysfs:
echo 2 > /sys/class/pwm/pwmchip0/export
После этого появляется директория /sys/class/pwm/pwmchip0/pwm2
Установка периода в наносекундах. Пересчёт из частоты(в килогеграцах в период в наносекундах производится по формуле:
T(ns) = 1 000 000 / f(kHz)
echo 250000 > /sys/class/pwm/pwmchip0/pwm2/period # устанавливаем период в 250 000 нс, т.е. в 250мкс, что соответствует частоте 4кГц
Установка duty_cycle (длительности высокого состояния) в наносекундах. Максимальная громкость достигается при duty_cycle = period / 2
echo 125000 > /sys/class/pwm/pwmchip0/pwm2/duty_cycle # устанавливаем duty_cycle в 125 000 нс, т.е. в половину периода
Включение выхода ШИМ:
echo 1 > /sys/class/pwm/pwmchip0/pwm2/enable
Выключение:
echo 0 > /sys/class/pwm/pwmchip0/pwm2/enable
Пример