Analisar formas de onda de vibração

Os atuadores de vibração mais comuns em dispositivos Android são os atuadores ressonantes lineares (LRAs). Os LRAs simulam a sensação de um clique de botão em uma superfície de vidro que, de outra forma, não responderia. Um sinal de feedback de clique claro e nítido geralmente dura entre 10 e 20 milissegundos. Essa sensação deixa as interações do usuário mais naturais. Para teclados virtuais, esse feedback de clique pode aumentar a velocidade de digitação e reduzir erros.

Os LRAs têm algumas frequências de ressonância comuns:

  • Alguns LRAs tinham frequências de ressonância na faixa de 200 a 300 Hz, que coincide com a frequência em que a pele humana é mais sensível à vibração. A sensação de vibrações nessa faixa de frequência geralmente é descrita como suave, nítida e penetrante.
  • Outros modelos de LRAs têm frequências de ressonância mais baixas, em torno de 150 Hz. A sensação é qualitativamente mais suave e completa (em dimensão).
Os componentes incluem, de cima para baixo, uma capa, uma placa, um ímã central, dois ímãs laterais, uma massa, duas molas, uma bobina, um circuito flexível, uma base e um adesivo.
Componentes de um atuador ressonante linear (LRA).

Com a mesma tensão de entrada em duas frequências diferentes, as amplitudes de saída de vibração podem ser diferentes. Quanto mais distante a frequência estiver da frequência de ressonância do LRA, menor será a amplitude da vibração.

Os efeitos táteis de um determinado dispositivo usam o atuador de vibração e o driver dele. Drivers hápticos que incluem recursos de overdrive e frenagem ativa podem reduzir o tempo de subida e o toque dos LRAs, resultando em uma vibração mais responsiva e clara.

Aceleração da saída do vibrador

O mapeamento de aceleração de frequência para saída (FOAM, na sigla em inglês) descreve a aceleração máxima de saída (em G de pico) que pode ser alcançada em uma determinada frequência de vibração (em Hertz). A partir do Android 16 (nível 36 da API), a plataforma oferece suporte integrado para esse mapeamento usando o VibratorFrequencyProfile. É possível usar essa classe, junto com as APIs de envelope básicas e avançadas, para criar efeitos hápticos.

A maioria dos motores LRA tem um único pico no FOAM, geralmente perto da frequência de ressonância. A aceleração geralmente diminui exponencialmente à medida que a frequência se desvia desse intervalo. A curva pode não ser simétrica e apresentar um platô em torno da frequência de ressonância para proteger o motor contra danos.

O gráfico ao lado mostra um exemplo de FOAM para um motor LRA.

À medida que a frequência aumenta para cerca de 120 Hz, a aceleração aumenta exponencialmente. A aceleração permanece constante até cerca de 180 Hz, depois diminui.
Exemplo de FOAM para um motor LRA.

Limite de detecção de percepção humana

O limiar de detecção de percepção humana se refere à aceleração mínima de uma vibração que uma pessoa pode detectar de forma confiável. Esse nível varia de acordo com a frequência da vibração.

O gráfico ao lado mostra o limite de detecção da percepção háptica humana, em aceleração, como uma função da frequência temporal. Os dados de limite são convertidos do limite de deslocamento na Figura 1 de Bolanowski Jr., S. Artigo de J., et al., de 1988, "Four channels mediate the mechanical aspects of touch" (Quatro canais mediam os aspectos mecânicos do toque).

O Android processa automaticamente esse limite no BasicEnvelopeBuilder, que verifica se todos os efeitos usam um intervalo de frequência que produz amplitudes de vibração que excedem o limite de detecção da percepção humana em pelo menos 10 dB.

À medida que a frequência aumenta para cerca de 20 Hz, o limite de detecção realizada por pessoas aumenta logaritmicamente para cerca de -35 dB. O limite permanece constante até cerca de 200 Hz, depois aumenta aproximadamente de forma linear até -20 dB.
Limite de detecção da percepção háptica humana.

Um tutorial on-line explica melhor a conversão entre a amplitude de aceleração e a amplitude de deslocamento.

Níveis de aceleração da vibração

A percepção humana da intensidade da vibração, uma medida de percepção, não cresce linearmente com a amplitude da vibração, um parâmetro físico. A intensidade percebida é caracterizada pelo nível de sensação (SL, na sigla em inglês), que é definido como uma quantidade de dB acima do limite de detecção na mesma frequência.

A amplitude de aceleração de vibração correspondente (em G de pico) pode ser calculada da seguinte forma:

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

...em que o dB de amplitude é a soma do SL e do limite de detecção (o valor ao longo do eixo vertical no gráfico adjacente) em uma determinada frequência.

O gráfico ao lado mostra os níveis de aceleração de vibração em 10, 20, 30, 40 e 50 dB SL, além do limite de detecção da percepção háptica humana (0 dB SL), como uma função da frequência temporal. Os dados são estimados com base na Figura 8 em Verrillo, R. Artigo de T., et al. de 1969, "Magnitude da sensação de estímulos vibrotáteis".

À medida que o nível de sensação desejado aumenta, a aceleração necessária, em dB, aumenta aproximadamente na mesma quantidade. Por exemplo, o nível de sensação de 10 dB para uma vibração de 100 Hz é de cerca de -20 dB, em vez de -30 dB.
Níveis de aceleração da vibração.

O Android processa automaticamente essa conversão no BasicEnvelopeBuilder, que usa valores como intensidades normalizadas no espaço de nível de sensação (dB SL) e os converte em aceleração de saída. O WaveformEnvelopeBuilder, por outro lado, não aplica essa conversão e usa valores como amplitudes de aceleração de saída normalizadas no espaço de aceleração (Gs). A API envelope pressupõe que, quando um designer ou desenvolvedor pensa em mudanças na intensidade da vibração, ele espera que a intensidade percebida siga um envelope linear por partes.

Suavização de forma de onda padrão em dispositivos

Para fins de ilustração, considere como um padrão de forma de onda personalizada se comporta em um dispositivo genérico:

Kotlin

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

Os gráficos a seguir mostram a forma de onda de entrada e a aceleração de saída correspondentes aos snippets de código anteriores. Observe que a aceleração aumenta gradualmente, não de repente, sempre que há uma mudança de amplitude no padrão, ou seja, em 0 ms, 150 ms, 200 ms, 250 ms e 700 ms. Há também um overshoot em cada mudança de amplitude, e há um ringing visível que dura pelo menos 50 ms quando a amplitude de entrada cai repentinamente para 0.

Gráfico da forma de onda de entrada da função de etapa.
Gráfico da forma de onda medida real, mostrando transições mais orgânicas entre os níveis.

Padrão tátil aprimorado

Para evitar o overshoot e reduzir o tempo de ringing, mude as amplitudes de forma mais gradual. A seguir, mostramos os gráficos de forma de onda e aceleração da versão revisada:

Kotlin

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

Gráfico da forma de onda de entrada com etapas adicionais.
Gráfico da forma de onda medida, mostrando transições mais suaves.

Criar efeitos táteis mais complexos

Outros elementos em uma resposta de clique satisfatória são mais complexos e exigem algum conhecimento da LRA usada em um dispositivo. Para ter os melhores resultados, use as formas de onda pré-fabricadas e as constantes fornecidas pela plataforma do dispositivo, que permitem fazer o seguinte:

  • Faça efeitos claros e primitivos.
  • Faça a concatenação para criar novos efeitos hápticos.

Essas constantes e primitivas hápticas predefinidas podem acelerar muito seu trabalho ao criar efeitos hápticos de alta qualidade.