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

Материал из Wiren Board
 
(не показано 13 промежуточных версий 4 участников)
Строка 1: Строка 1:
<languages/>
<translate>
<!--T:26-->
{{DISPLAYTITLE:Зуммер (звуковой излучатель)}}
{{DISPLAYTITLE:Зуммер (звуковой излучатель)}}
Контроллер Wiren Board имеет на борту Зуммер (звуковой излучатель). Зуммер питается от 5В и управляется ножкой gpio процессора в режиме ШИМ. Управлять зуммером можно через sysfs-интерфейс ядра и различное ПО поверх него. Сейчас реализовано управление из веб-интерфейса, движка правил wb-rules и python.


==Управление из веб-интерфейса==<!--T:14-->
==Описание== <!--T:22-->
Контроллер Wiren Board имеет на борту Зуммер (звуковой излучатель). Зуммер питается от 5В и управляется ножкой gpio процессора в режиме ШИМ. Управлять зуммером можно через sysfs-интерфейс ядра и различное ПО поверх него. Также реализовано управление из веб-интерфейса, движка правил wb-rules и python.


==Управление из веб-интерфейса== <!--T:14-->
<!--T:23-->
[[Файл:buzzer.png |300px|thumb|right| Управление зуммером]]
[[Файл:buzzer.png |300px|thumb|right| Управление зуммером]]
В веб-интерфейсе контроллера управление зуммером доступно во вкладке ''"Devices"''. Параметр ''"Frequency"'' - высота звука в Гц. ''"Volume"'' - громкость (в условных единицах, шкала линейная). Параметры сохраняются при перезагрузке контроллера.
В веб-интерфейсе контроллера управление зуммером доступно во вкладке ''"Devices"''. Параметр ''"Frequency"'' - частота звука в Гц. ''"Volume"'' - громкость (в условных единицах, шкала линейная). Параметры сохраняются при перезагрузке контроллера.
 
==Управление из движка правил== <!--T:15-->


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


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


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


<!--T:17-->
<!--T:17-->
Строка 24: Строка 31:
|Range
|Range
|7000
|7000
|высота звука
|Частота звука
|-
|-
|Volume
|Volume
Строка 38: Строка 45:


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


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


<!--T:20-->
<!--T:20-->
Строка 50: Строка 57:
from wb_common import beeper
from wb_common import beeper


<!--T:25-->
beeper.beep(0.5, 2)
beeper.beep(0.5, 2)
</syntaxhighlight>
</syntaxhighlight>
Поддерживаются все настройки sysfs-интерфейса (пересчёт нужно проводить вручную; см [[#О ШИМ и пересчёт параметров|раздел о пересчёте]]).
Поддерживаются все настройки sysfs-интерфейса (пересчёт нужно проводить вручную; см [[#О ШИМ и пересчёт параметров|раздел о пересчёте]]).


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


===О ШИМ и пересчёт параметров===<!--T:2-->
===О ШИМ и пересчёт параметров=== <!--T:2-->
[[Файл:Duty_cycle.gif|440px|thumb|right|Duty cycle управляет яркостью светодиодов / громкостью Зуммерa]]
[[Файл:Duty_cycle.gif|440px|thumb|right|Duty cycle управляет яркостью светодиодов / громкостью Зуммерa]]
ШИМ (PWM) - это распространённый способ управления мощностью, подаваемой к нагрузке.
ШИМ (PWM) - это распространённый способ управления мощностью, подаваемой к нагрузке.
Строка 71: Строка 79:
</b>
</b>


===Номер pwm-порта для sysfs===<!--T:6-->
===Номер pwm-порта для sysfs=== <!--T:6-->


<!--T:7-->
<!--T:7-->
Строка 81: Строка 89:
Во всех примерах далее будем считать, что номер pwm-порта = 0.
Во всех примерах далее будем считать, что номер pwm-порта = 0.


===Работа из sysfs===<!--T:9-->
===Работа из sysfs=== <!--T:9-->


<!--T:10-->
<!--T:10-->
Строка 101: Строка 109:
T(ns) = 1 000 000 / f(kHz)
T(ns) = 1 000 000 / f(kHz)
</b>
</b>
</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-интерфейса (пересчёт нужно проводить вручную; см раздел о пересчёте).

Низкоуровневая работа

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

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

ШИМ (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 нужно:

  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
    

Для выключения зуммера, нужно записать 0:

echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable

Пример bash-скрипта для работы с pwm

Установка периода в наносекундах. Пересчёт из частоты (в килогерцах) в период (в наносекундах) производится по формуле: T(ns) = 1 000 000 / f(kHz)