Buzzer: различия между версиями

Материал из Wiren Board
Строка 2: Строка 2:
<translate>
<translate>
<!--T:1-->
<!--T:1-->
''Страница находится в процессе редактирования!!!!!''
Все контроллеры Wiren Board имеют на борту звуковой излучатель (далее - Buzzer). Buzzer питается от 5В и управляется ножкой gpio процессора в режиме ШИМ. Управлять Buzzer'ом можно через sysfs-интерфейс ядра и различное ПО поверх него. Сейчас реализовано управление из web-интерфейса, движка правил wb-rules и python.
Все контроллеры Wiren Board имеют на борту звуковой излучатель (далее - Buzzer). Buzzer питается от 5В и управляется ножкой gpio процессора в режиме ШИМ. Управлять Buzzer'ом можно через sysfs-интерфейс ядра и различное ПО поверх него. Сейчас реализовано управление из web-интерфейса, движка правил wb-rules и python.


Строка 10: Строка 8:
ШИМ (PWM) - это распространённый способ управления мощностью, подаваемой к нагрузке.
ШИМ (PWM) - это распространённый способ управления мощностью, подаваемой к нагрузке.


<!--T:2-->
<!--T:3-->
В контексте управления Buzzer'ом, нас интересуют 2 параметра PWM:
В контексте управления Buzzer'ом, нас интересуют 2 параметра PWM:
*Коэффициент заполнения (duty cycle) - влияет на громкость звука. Обычно, считается в процентном соотношении от периода сигнала.
*Коэффициент заполнения (duty cycle) - влияет на громкость звука. Обычно, считается в процентном соотношении от периода сигнала.
*Частота PWM (frequency) - влияет на высоту звука (чем выше частота, тем выше и звук). Единица, обратная периоду сигнала.
*Частота PWM (frequency) - влияет на высоту звука (чем выше частота, тем выше и звук). Единица, обратная периоду сигнала.


<!--T:2-->
<!--T:4-->
Ядро Linux предоставляет интерфейс sysfs для pwm, который принимает частоту pwm и duty cycle в '''наносекундах (10<sup>-9</sup>С)'''! Поэтому, для низкоуровневого управления Buzzer'ом нужно производить пересчёт желаемой частоты из kHz в период в наносекундах по формуле:
Ядро Linux предоставляет интерфейс sysfs для pwm, который принимает частоту pwm и duty cycle в '''наносекундах (10<sup>-9</sup>С)'''! Поэтому, для низкоуровневого управления Buzzer'ом нужно производить пересчёт желаемой частоты из kHz в период в наносекундах по формуле:
<b>
<b>
Строка 21: Строка 19:
</b>
</b>


==Низкоуровневая работа==<!--T:3-->
==Низкоуровневая работа==<!--T:5-->


===Номер pwm-порта для sysfs===<!--T:12-->
===Номер 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:4-->
<!--T:8-->
В зависимости от ревизии контроллера и версии его ПО, узнать номер порта PWM для Buzzer можно разными способами:
В зависимости от ревизии контроллера и версии его ПО, узнать номер порта PWM для Buzzer можно разными способами:
*По умолчанию (для всех контроллеров до WB6.X.X), номер порта = 2
*По умолчанию (для всех контроллеров до WB6.X.X), номер порта = 2
Строка 33: Строка 33:
Во всех примерах далее будем считать, что номер pwm-порта = 0.
Во всех примерах далее будем считать, что номер pwm-порта = 0.


===Работа из sysfs===<!--T:12-->
===Работа из 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
Строка 40: Строка 42:
#Включить выход 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:12-->
<!--T:11-->
Для того, чтобы выключить Buzzer, нужно записать 0: <syntaxhighlight lang="bash">echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable</syntaxhighlight>
Для того, чтобы выключить Buzzer, нужно записать 0: <syntaxhighlight lang="bash">echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable</syntaxhighlight>


Строка 46: Строка 48:
[https://github.com/contactless/wirenboard/tree/master/examples/beeper '''Пример bash-скрипта для работы с pwm''']
[https://github.com/contactless/wirenboard/tree/master/examples/beeper '''Пример bash-скрипта для работы с pwm''']


<!--T:6-->
<!--T:13-->
Установка периода в наносекундах. Пересчёт из частоты (в килогерцах) в период (в наносекундах) производится по формуле:
Установка периода в наносекундах. Пересчёт из частоты (в килогерцах) в период (в наносекундах) производится по формуле:
<b>
<b>
Строка 52: Строка 54:
</b>
</b>


==Управление из web-интерфейса==<!--T:13-->
==Управление из web-интерфейса==<!--T:14-->


[[Файл:buzzer.png |250px|thumb|right| Управление Buzzer'ом]]
[[Файл:buzzer.png |250px|thumb|right| Управление Buzzer'ом]]
В web-интрефейсе контроллера управление Buzzer'ом доступно во вкладке ''"Devices"''. От параметра ''"frequency"'' зависит тональность звука. Начиная с 2019 года, параметры Buzzer сохраняются при перезагрузке контроллера.
В web-интрефейсе контроллера управление Buzzer'ом доступно во вкладке ''"Devices"''. От параметра ''"frequency"'' зависит тональность звука. Начиная с 2019 года, параметры Buzzer сохраняются при перезагрузке контроллера.


==Управление из движка правил==<!--T:14-->
==Управление из движка правил==<!--T:15-->


<!--T:14-->
<!--T:15-->
Управление Buzzer'ом, выведенное в web-интерфейс, внутри представляет собой виртуальное устройство, созданное системным правилом wb-rules при старте контроллера. Исходный код правила доступен [https://github.com/wirenboard/wb-rules-system/blob/master/rules/buzzer.js на нашем github].
Управление Buzzer'ом, выведенное в web-интерфейс, внутри представляет собой виртуальное устройство, созданное системным правилом wb-rules при старте контроллера. Исходный код правила доступен [https://github.com/wirenboard/wb-rules-system/blob/master/rules/buzzer.js на нашем github].


<!--T:14-->
<!--T:16-->
О том, для чего нужны виртуальные устройства можно узнать подробнее в [[#Движок_правил_wb-rules:Первое правило с виртуальным устройством|описании движка правил]].
О том, для чего нужны виртуальные устройства можно узнать подробнее в [[#Движок_правил_wb-rules:Первое правило с виртуальным устройством|описании движка правил]].


<!--T:14-->
<!--T:17-->
Системное правило внутри реализует пересчёт тональности и громкости (см [[#О ШИМ и пересчёт параметров|раздел о пересчёте]]) и работу с pwm через sysfs (см [[#Работа из sysfs|соответствующий раздел]]). Наружу пользователю доступно устройство ''"buzzer"'', имеющее несколько mqtt-контролов:
Системное правило внутри реализует пересчёт тональности и громкости (см [[#О ШИМ и пересчёт параметров|раздел о пересчёте]]) и работу с pwm через sysfs (см [[#Работа из sysfs|соответствующий раздел]]). Наружу пользователю доступно устройство ''"buzzer"'', имеющее несколько mqtt-контролов:
{| class="wikitable"
{| class="wikitable"
Строка 87: Строка 89:
|}
|}


<!--T:14-->
<!--T:18-->
Контролы устройста можно использовать в собственных правилах. Подробнее о структуре mqtt-топиков виртуальных и физических устройств можно узнать из нашей [https://github.com/wirenboard/homeui/blob/master/conventions.md mqtt-конвенции].
Контролы устройста можно использовать в собственных правилах. Подробнее о структуре mqtt-топиков виртуальных и физических устройств можно узнать из нашей [https://github.com/wirenboard/homeui/blob/master/conventions.md mqtt-конвенции].


==Управление из python==<!--T:15-->
==Управление из python==<!--T:19-->


<!--T:15-->
<!--T:20-->
На контроллерах 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].
На контроллерах 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:15-->
<!--T:21-->
Пример работы с Buzzer из python:
Пример работы с Buzzer из python:
<syntaxhighlight lang="python">
<syntaxhighlight lang="python">

Версия 16:40, 20 августа 2020

Другие языки:

Все контроллеры Wiren Board имеют на борту звуковой излучатель (далее - Buzzer). Buzzer питается от 5В и управляется ножкой gpio процессора в режиме ШИМ. Управлять Buzzer'ом можно через sysfs-интерфейс ядра и различное ПО поверх него. Сейчас реализовано управление из web-интерфейса, движка правил wb-rules и python.

О ШИМ и пересчёт параметров

Duty cycle управляет яркостью светодиодов / громкостью buzzer'a

ШИМ (PWM) - это распространённый способ управления мощностью, подаваемой к нагрузке.

В контексте управления Buzzer'ом, нас интересуют 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].

В зависимости от ревизии контроллера и версии его ПО, узнать номер порта PWM для Buzzer можно разными способами:

  • По умолчанию (для всех контроллеров до WB6.X.X), номер порта = 2
  • Для контроллеров WB6.X.X, номер порта = 0
  • Номер порта можно узнать, выполнив команду
    echo $WB_PWM_BUZZER
    

Во всех примерах далее будем считать, что номер pwm-порта = 0.

Работа из sysfs

Для работы c pwm через sysfs нужно:

  1. Экспортировать порт
    echo 0 > /sys/class/pwm/pwmchip0/export
    
    После этого появляется директория /sys/class/pwm/pwmchip0/pwm0
  2. Записать период pwm в наносекундах
    echo 250000 > /sys/class/pwm/pwmchip0/pwm0/period # устанавливаем период в 250 000 нс, т.е. в 250мкс, что соответствует частоте 4кГц
    
  3. Записать громкость (пересчитав из duty-cycle)
    echo 125000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle # максимальная громкость достигается при duty_cycle = period / 2 => устанавливаем duty_cycle в 125 000 нс
    
  4. Включить выход 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)

Управление из web-интерфейса

Управление Buzzer'ом

В 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-интерфейса (пересчёт нужно проводить вручную; см раздел о пересчёте).