Analyser les formes d'ondes de vibration

Les actionneurs de vibration les plus courants sur les appareils Android sont les actionneurs linéaires résonants (LRA). Les LRA simulent la sensation d'un clic sur un bouton sur une surface en verre qui ne répondrait autrement pas. Un signal de retour de clic clair et net dure généralement entre 10 et 20 millisecondes. Cette sensation rend les interactions des utilisateurs plus naturelles. Pour les claviers virtuels, ce retour peut augmenter la vitesse de frappe et réduire les erreurs.

Les fréquences de résonance des antennes à large bande sont généralement les suivantes:

  • Certaines LRA présentaient des fréquences de résonance comprises entre 200 et 300 Hz, ce qui coïncide avec la fréquence à laquelle la peau humaine est la plus sensible aux vibrations. La sensation de vibrations dans cette plage de fréquences est généralement décrite comme douce, nette et pénétrante.
  • D'autres modèles de haut-parleurs à large bande ont des fréquences de résonance plus basses, autour de 150 Hz. La sensation est qualitativement plus douce et plus complète (en dimension).
Les composants comprennent, de haut en bas, un couvercle, une plaque, un aimant central, deux aimants latéraux, une masse, deux ressorts, une bobine, un circuit flexible, une base et un adhésif.
Composants d'un actionneur linéaire à résonance (LRA).

Pour une même tension d'entrée à deux fréquences différentes, les amplitudes de sortie de vibration peuvent être différentes. Plus la fréquence est éloignée de la fréquence de résonance du LRA, plus son amplitude de vibration est faible.

Les effets haptiques d'un appareil donné utilisent à la fois l'actionneur de vibration et son pilote. Les pilotes haptiques qui incluent des fonctionnalités d'overdrive et de freinage actif peuvent réduire le temps de montée et le sifflement des LRA, ce qui permet d'obtenir une vibration plus réactive et plus claire.

Lissage de la forme d'onde par défaut sur les appareils

Pour illustration, considérons le comportement d'un modèle de forme d'onde personnalisée sur un appareil générique:

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

Les graphiques suivants montrent la forme d'onde d'entrée et l'accélération de sortie correspondant aux extraits de code précédents. Notez que l'accélération augmente progressivement, et non brusquement, chaque fois qu'il y a un changement d'amplitude par palier dans le modèle, c'est-à-dire à 0 ms, 150 ms, 200 ms, 250 ms et 700 ms. Il y a également un dépassement à chaque changement d'amplitude par étape, et un sifflement visible qui dure au moins 50 ms lorsque l'amplitude d'entrée passe soudainement à 0.

Graphique de la forme d'onde d'entrée de la fonction échelon.
Graphique de la forme d'onde mesurée réelle, montrant des transitions plus naturelles entre les niveaux.

Amélioration du modèle haptique

Pour éviter les dépassements et réduire la durée de sonnerie, modifiez les amplitudes de manière plus progressive. Vous trouverez ci-dessous les graphiques de forme d'onde et d'accélération de la version révisée:

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

Graphique de la forme d'onde d'entrée avec étapes supplémentaires.
Graphique de la forme d'onde mesurée, montrant des transitions plus fluides.

Créer des effets haptiques plus complexes

D'autres éléments d'une réponse satisfaisante au clic sont plus complexes et nécessitent une certaine connaissance de la LRA utilisée dans un appareil. Pour de meilleurs résultats, utilisez les formes d'onde préfabriquées de l'appareil et les constantes fournies par la plate-forme, qui vous permettent de faire ce qui suit:

  • Effectuez des effets clairs et des primitives.
  • Concaténez-les pour composer de nouveaux effets haptiques.

Ces constantes et primitives haptiques prédéfinies peuvent considérablement accélérer votre travail tout en créant des effets haptiques de haute qualité.