Buzzer

Материал из Wiren Board
Другие языки:

Страница находится в процессе редактирования!!!!!

Все контроллеры 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 нужно:

  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 в 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)

Установка duty_cycle (длительности высокого состояния) в наносекундах. Максимальная громкость достигается при duty_cycle = period / 2

Управление из 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 включение/отключение

Управление из python