Buzzer: различия между версиями
Matveevrj (обсуждение | вклад) |
Vdromanov (обсуждение | вклад) |
||
(не показано 40 промежуточных версий 6 участников) | |||
Строка 1: | Строка 1: | ||
<languages/> | <languages/> | ||
<translate> | <translate> | ||
<!--T: | <!--T:1--> | ||
''Страница находится в процессе редактирования!!!!!'' | |||
Все контроллеры Wiren Board имеют на борту звуковой излучатель (далее - Buzzer). Buzzer питается от 5В и управляется ножкой gpio процессора в режиме ШИМ. Управлять Buzzer'ом можно через sysfs-интерфейс ядра и различное ПО поверх него. Сейчас реализовано управление из web-интерфейса, движка правил wb-rules и python. | |||
== | ==О ШИМ и пересчёт параметров==<!--T:2--> | ||
ШИМ - это прямоугольные импульсы, интерфейс ядра позволяет регулировать частоту импульсов и коэффициент заполнения. | |||
Коэффециент заполнения влияет на громкость звука. | |||
<!--T: | ==Низкоуровневая работа==<!--T:3--> | ||
== | ===Номер pwm-порта для sysfs===<!--T:12--> | ||
Ножка gpio настраивается, как выход PWM в dts ядра linux. Подробнее можно посмотреть [[https://github.com/wirenboard/linux/blob/ef2d87e222b365848fe7262c022ca887b6449432/arch/arm/boot/dts/imx6ul-wirenboard61.dts#L495 на нашем github]]. | |||
<!--T:4--> | |||
В зависимости от ревизии контроллера и версии его ПО, узнать номер порта PWM для Buzzer можно разными способами: | |||
*По умолчанию (для всех контроллеров до WB6.X.X), номер порта = 2 | |||
*Для контроллеров WB6.X.X, номер порта = 0 | |||
*Номер порта можно узнать, выполнив команду <syntaxhighlight lang="bash">echo $WB_PWM_BUZZER</syntaxhighlight> | |||
Во всех примерах далее будем считать, что номер pwm-порта = 0. | |||
===Работа из sysfs===<!--T:12--> | |||
Для работы 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 в 125 000 нс, т.е. в половину периода</syntaxhighlight> | |||
#Включить выход PWM <syntaxhighlight lang="bash">echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable</syntaxhighlight> | |||
<!--T: | <!--T:12--> | ||
Для того, чтобы выключить Buzzer, нужно записать 0: <syntaxhighlight lang="bash">echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable</syntaxhighlight> | |||
<!--T: | <!--T:12--> | ||
[https://github.com/contactless/wirenboard/tree/master/examples/beeper '''Пример bash-скрипта для работы с pwm'''] | |||
<!--T: | <!--T:6--> | ||
Установка периода в наносекундах. Пересчёт из частоты (в килогерцах) в период (в наносекундах) производится по формуле: | |||
<b> | |||
T(ns) = 1 000 000 / f(kHz) | |||
</b> | |||
<!--T:8--> | |||
Установка duty_cycle (длительности высокого состояния) в наносекундах. Максимальная громкость достигается при duty_cycle = period / 2 | |||
==Управление из web-интерфейса==<!--T:13--> | |||
[[Файл:buzzer.png |250px|thumb|right| Управление Buzzer'ом]] | |||
В web-интрефейсе контроллера управление Buzzer'ом доступно во вкладке ''"Devices"''. От параметра ''"frequency"'' зависит тональность звука. Начиная с 2019 года, параметры Buzzer сохраняются при перезагрузке контроллера. | |||
==Управление из движка правил==<!--T:14--> | |||
<!--T:14--> | |||
Управление Buzzer'ом, выведенное в web-интерфейс, внутри представляет собой виртуальное устройство, созданное системным правилом wb-rules при старте контроллера. Исходный код правила доступен [https://github.com/wirenboard/wb-rules-system/blob/master/rules/buzzer.js на нашем github]. | |||
<!--T:14--> | |||
Системное правило внутри реализует пересчёт тональности и громкости (см [[#О ШИМ и пересчёт параметров|раздел о пересчёте]]) и работу с pwm через sysfs (см [[#Работа из sysfs|соответствующий раздел]]). Наружу пользователю доступно устройство ''"buzzer"'', имеющее несколько mqtt-контролов: | Системное правило внутри реализует пересчёт тональности и громкости (см [[#О ШИМ и пересчёт параметров|раздел о пересчёте]]) и работу с pwm через sysfs (см [[#Работа из sysfs|соответствующий раздел]]). Наружу пользователю доступно устройство ''"buzzer"'', имеющее несколько mqtt-контролов: | ||
{| class="wikitable" | {| class="wikitable" | ||
!Device||Control||Тип||Максимальное значение||Описание | !Device||Control||Тип||Максимальное значение||Описание | ||
|- | |- | ||
|rowspan="3"| | |rowspan="3"|buzzer | ||
| | |frequency | ||
| | |range | ||
|7000 | |7000 | ||
| | |тональность звука | ||
|- | |- | ||
| | |volume | ||
| | |range | ||
|100 | |100 | ||
| | |громкость, % | ||
|- | |- | ||
| | |enabled | ||
| | |switch | ||
| | | | ||
| | |включение/отключение | ||
|} | |} | ||
<!--T: | <!--T:14--> | ||
Контролы | Контролы устройста можно использовать в собственных правилах. Подробнее о структуре mqtt-топиков виртуальных и физических устройств можно узнать из нашей [https://github.com/wirenboard/homeui/blob/master/conventions.md mqtt-конвенции]. | ||
==Управление из python== <!--T: | ==Управление из python==<!--T:15--> | ||
<!--T: | <!--T:15--> | ||
На контроллерах Wiren Board работать с | На контроллерах Wiren Board работать с Buzzer можно из python с помощью модуля ''beeper'' из пакета ''wb_common''. Модуль представляет собой обёртку вокруг интерфейса sysfs. Модуль предустановлен на все контроллеры в составе deb-пакета ''python-wb-common''. Исходный код доступен [https://github.com/wirenboard/wb-common/blob/master/wb_common/beeper.py на нашем github]. | ||
<!--T: | <!--T:15--> | ||
Пример работы из python: | Пример работы с Buzzer из python: | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
from wb_common import beeper | from wb_common import beeper | ||
beeper.beep(0.5, 2) | beeper.beep(0.5, 2) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Поддерживаются все настройки sysfs-интерфейса (пересчёт нужно проводить вручную; см [[#О ШИМ и пересчёт параметров|раздел о пересчёте]]). | Поддерживаются все настройки sysfs-интерфейса (пересчёт нужно проводить вручную; см [[#О ШИМ и пересчёт параметров|раздел о пересчёте]]). | ||
</translate> | </translate> |
Версия 17:46, 19 августа 2020
Страница находится в процессе редактирования!!!!!
Все контроллеры Wiren Board имеют на борту звуковой излучатель (далее - Buzzer). Buzzer питается от 5В и управляется ножкой gpio процессора в режиме ШИМ. Управлять Buzzer'ом можно через sysfs-интерфейс ядра и различное ПО поверх него. Сейчас реализовано управление из web-интерфейса, движка правил wb-rules и python.
О ШИМ и пересчёт параметров
ШИМ - это прямоугольные импульсы, интерфейс ядра позволяет регулировать частоту импульсов и коэффициент заполнения. Коэффециент заполнения влияет на громкость звука.
Низкоуровневая работа
Номер pwm-порта для sysfs
Ножка gpio настраивается, как выход PWM в dts ядра linux. Подробнее можно посмотреть [на нашем github].
В зависимости от ревизии контроллера и версии его ПО, узнать номер порта PWM для Buzzer можно разными способами:
- По умолчанию (для всех контроллеров до WB6.X.X), номер порта = 2
- Для контроллеров WB6.X.X, номер порта = 0
- Номер порта можно узнать, выполнив команду
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 в 125 000 нс, т.е. в половину периода
- Включить выход PWM
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
Для того, чтобы выключить Buzzer, нужно записать 0:
echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
Пример bash-скрипта для работы с pwm
Установка периода в наносекундах. Пересчёт из частоты (в килогерцах) в период (в наносекундах) производится по формуле: T(ns) = 1 000 000 / f(kHz)
Установка duty_cycle (длительности высокого состояния) в наносекундах. Максимальная громкость достигается при duty_cycle = period / 2
Управление из web-интерфейса
В web-интрефейсе контроллера управление Buzzer'ом доступно во вкладке "Devices". От параметра "frequency" зависит тональность звука. Начиная с 2019 года, параметры Buzzer сохраняются при перезагрузке контроллера.
Управление из движка правил
Управление Buzzer'ом, выведенное в web-интерфейс, внутри представляет собой виртуальное устройство, созданное системным правилом wb-rules при старте контроллера. Исходный код правила доступен на нашем github.
Системное правило внутри реализует пересчёт тональности и громкости (см раздел о пересчёте) и работу с pwm через sysfs (см соответствующий раздел). Наружу пользователю доступно устройство "buzzer", имеющее несколько mqtt-контролов:
Device | Control | Тип | Максимальное значение | Описание |
---|---|---|---|---|
buzzer | frequency | range | 7000 | тональность звука |
volume | range | 100 | громкость, % | |
enabled | switch | включение/отключение |
Контролы устройста можно использовать в собственных правилах. Подробнее о структуре mqtt-топиков виртуальных и физических устройств можно узнать из нашей mqtt-конвенции.
Управление из python
На контроллерах Wiren Board работать с Buzzer можно из python с помощью модуля beeper из пакета wb_common. Модуль представляет собой обёртку вокруг интерфейса sysfs. Модуль предустановлен на все контроллеры в составе deb-пакета python-wb-common. Исходный код доступен на нашем github.
Пример работы с Buzzer из python:
from wb_common import beeper
beeper.beep(0.5, 2)
Поддерживаются все настройки sysfs-интерфейса (пересчёт нужно проводить вручную; см раздел о пересчёте).