Анализировать формы колебаний

Наиболее распространенными виброактуаторами на устройствах Android являются линейные резонансные актуаторы (ЛРА) . ЛРА имитируют ощущение нажатия кнопки на обычно неподвижной стеклянной поверхности. Четкий и ясный сигнал обратной связи при нажатии обычно длится от 10 до 20 миллисекунд. Это ощущение делает взаимодействие с пользователем более естественным. Для виртуальных клавиатур такая обратная связь при нажатии может увеличить скорость набора текста и уменьшить количество ошибок.

Резонансные резисторы имеют несколько распространенных резонансных частот :

  • У некоторых лазерных резонансных излучателей резонансные частоты находились в диапазоне от 200 до 300 Гц, что совпадает с частотой, при которой кожа человека наиболее чувствительна к вибрации. Ощущение вибраций в этом частотном диапазоне обычно описывается как плавное, резкое и проникающее.
  • Другие модели LRA имеют более низкие резонансные частоты, около 150 Гц. Ощущения при этом качественно мягче и насыщеннее (в плане объёма).
В состав устройства входят, сверху вниз, крышка, пластина, средний магнит, 2 боковых магнита, груз, 2 пружины, катушка, гибкая схема, основание и клей.
Компоненты линейного резонансного актуатора (ЛРА).

При одинаковом входном напряжении на двух разных частотах амплитуды колебаний могут быть разными. Чем дальше частота от резонансной частоты LRA, тем ниже амплитуда колебаний.

Тактильные эффекты в данном устройстве используют как вибропривод, так и его драйвер. Тактильные драйверы, включающие функции перегрузки и активного торможения, могут уменьшить время нарастания и колебания LRA, что приводит к более отзывчивой и четкой вибрации.

Ускорение выходного сигнала вибратора

Сопоставление частоты и выходного ускорения (FOAM) описывает максимально достижимое выходное ускорение (в пиковых значениях G) при заданной частоте вибрации (в герцах). Начиная с Android 16 (уровень API 36), платформа предоставляет встроенную поддержку этого сопоставления через класс VibratorFrequencyProfile . Вы можете использовать этот класс, наряду с базовым и расширенным API огибающей, для создания тактильных эффектов.

У большинства двигателей с линейным сопротивлением (LRA) наблюдается один пик в кривой FOAM, обычно вблизи резонансной частоты. Ускорение, как правило, экспоненциально уменьшается по мере отклонения частоты от этого диапазона. Кривая может быть несимметричной и может иметь плато вблизи резонансной частоты для защиты двигателя от повреждений.

На приведённом графике показан пример пенопласта для двигателя LRA.

При увеличении частоты примерно до 120 Гц ускорение возрастает экспоненциально. Затем ускорение остается стабильным примерно до 180 Гц, после чего оно постепенно уменьшается.
Пример пенопласта для двигателя LRA.

Порог обнаружения человеческого восприятия

Порог обнаружения человеческого восприятия — это минимальное ускорение вибрации, которое человек может достоверно обнаружить. Этот уровень варьируется в зависимости от частоты вибрации.

На прилагаемом графике показан порог обнаружения тактильного восприятия человеком в зависимости от ускорения и временной частоты. Данные о пороге преобразованы из данных о пороге смещения, представленных на рисунке 1 статьи Болановски-младшего, С.Дж. и др. 1988 года «Четыре канала опосредуют механические аспекты прикосновения» .

Android автоматически обрабатывает этот порог в BasicEnvelopeBuilder , который проверяет, что все эффекты используют диапазон частот, обеспечивающий амплитуду вибрации, превышающую порог восприятия человеком как минимум на 10 дБ.

При увеличении частоты примерно до 20 Гц порог обнаружения человеком возрастает логарифмически примерно до -35 дБ. Порог остается стабильным до примерно 200 Гц, после чего он увеличивается приблизительно линейно до -20 дБ.
Порог обнаружения тактильного восприятия человеком.

В онлайн-уроке более подробно объясняется преобразование между амплитудой ускорения и амплитудой смещения .

Уровни ускорения вибрации

Восприятие человеком интенсивности вибрации, являющееся мерой восприятия , не возрастает линейно с амплитудой вибрации, физическим параметром. Воспринимаемая интенсивность характеризуется уровнем ощущения (УО), который определяется как величина в дБ выше порога обнаружения на той же частоте.

Соответствующую амплитуду ускорения вибрации (в пиковом значении G) можно рассчитать следующим образом:

$$ Amplitude(G) = 10^{Amplitude(db)/20} $$

...где амплитуда в дБ представляет собой сумму SL и порога обнаружения — значения по вертикальной оси на соседнем графике — на определенной частоте.

На приведённом графике показаны уровни ускорения вибрации при 10, 20, 30, 40 и 50 дБ SL, а также порог обнаружения тактильного восприятия человеком (0 дБ SL) в зависимости от временной частоты. Данные получены из рисунка 8 статьи Веррилло, Р.Т. и др. 1969 года «Величина ощущения вибротактильных стимулов» .

По мере увеличения желаемого уровня ощущения требуемое ускорение, в дБ, увеличивается примерно на ту же величину. Например, уровень ощущения 10 дБ для вибрации с частотой 100 Гц составляет около -20 дБ, вместо -30 дБ.
Уровни ускорения вибрации.

Android автоматически обрабатывает это преобразование в BasicEnvelopeBuilder , который принимает значения в виде нормализованной интенсивности в пространстве уровней ощущений (дБ SL) и преобразует их в выходное ускорение. WaveformEnvelopeBuilder , с другой стороны, не применяет это преобразование и принимает значения в виде нормализованной амплитуды выходного ускорения в пространстве ускорений (Gs). API огибающей предполагает, что, когда дизайнер или разработчик думает об изменениях силы вибрации, они ожидают, что воспринимаемая интенсивность будет следовать кусочно-линейной огибающей.

Сглаживание формы сигнала по умолчанию на устройствах

Для наглядности рассмотрим, как ведет себя пользовательский шаблон сигнала на обычном устройстве:

Котлин

val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)
val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)
val repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))

Java

long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };
int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };
int repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

На следующих графиках показаны входной сигнал и ускорение на выходе, соответствующие приведенным выше фрагментам кода. Обратите внимание, что ускорение увеличивается постепенно, а не резко, при каждом ступенчатом изменении амплитуды в сигнале — то есть в моменты времени 0 мс, 150 мс, 200 мс, 250 мс и 700 мс. Также наблюдается перерегулирование при каждом ступенчатом изменении амплитуды, и видны колебания, длящиеся не менее 50 мс, когда амплитуда входного сигнала внезапно падает до 0.

График входного сигнала ступенчатой ​​функции.
График фактически измеренной формы волны, демонстрирующий более органичные переходы между уровнями.

Улучшенная тактильная отдача

Чтобы избежать перерегулирования и сократить время колебаний, изменяйте амплитуды более плавно. Ниже показаны форма сигнала и графики ускорения для пересмотренной версии:

Котлин

val timings: LongArray = longArrayOf(
    25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
    300, 25, 25, 150, 25, 25, 25
)
val amplitudes: IntArray = intArrayOf(
    38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
    0, 85, 170, 255, 170, 85, 0
)
val repeatIndex = -1 // Do not repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))

Java

long[] timings = new long[] {
        25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
        300, 25, 25, 150, 25, 25, 25
    };
int[] amplitudes = new int[] {
        38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
        0, 85, 170, 255, 170, 85, 0
    };
int repeatIndex = -1; // Do not repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

График входного сигнала с дополнительными шагами.
График измеренной формы волны, демонстрирующий более плавные переходы.

Создавайте более сложные тактильные эффекты.

Другие элементы, обеспечивающие удовлетворительную реакцию на щелчок, более сложны и требуют знания характеристик LRA, используемых в устройстве. Для достижения наилучших результатов используйте предварительно подготовленные формы сигналов устройства и константы, предоставляемые платформой, которые позволяют выполнять следующие действия:

Эти предопределенные тактильные константы и примитивы могут значительно ускорить вашу работу при создании высококачественных тактильных эффектов.