Composant d'activation des actionneurs de vibrations

Avant de concevoir des effets haptiques sur un appareil Android, il est utile de découvrir le fonctionnement des actionneurs de vibration.

Illustration des composants d'une LRA haptique

Les actionneurs de vibration les plus courants sont les actionneurs à résonance linéaires (LRA, Linear Resonant Actuators). Chaque LRA est constitué d'une bobine acoustique plaquée contre une masse mobile magnétique attachée à un ressort. Une tension alternative appliquée à la bobine acoustique crée une force électromagnétique qui entraîne le déplacement de la masse. Le ressort fournit la force de restauration qui entraîne le retour de la masse à sa position de départ. Le mouvement de va-et-vient de la masse fait vibrer la LRA. Ils ont une fréquence de résonance à laquelle la sortie est maximale.

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

Une fonction courante des LRA sur un appareil est de simuler la sensation d'un clic sur un bouton sur une surface en verre qui ne répond pas. Elle sert à rendre l’interaction utilisateur plus naturelle. Lorsqu'il est appliqué à la saisie sur un clavier virtuel, le retour sur les clics peut augmenter la vitesse de saisie et réduire les erreurs. Un signal de retour de clic clair et précis dure généralement moins de 10 à 20 millisecondes. Pour que le clic soit concluant, il est nécessaire de connaître la LRA utilisée sur l'appareil. C'est pourquoi l'utilisation de formes d'onde préfabriquées fournit le meilleur retour d'information pour un clic. Vous pouvez les utiliser avec les constantes fournies par la plate-forme chaque fois qu'un retour sur les clics est nécessaire.

Les effets haptiques réalisables dans un appareil sont déterminés à la fois par l'actionneur de vibration et par son pilote. Les pilotes haptiques qui incluent des fonctionnalités de surcharge et de freinage actif peuvent réduire le temps de montée et la sonnerie des LRA, conduisant à une vibration plus réactive et plus claire. Voyons comment se comporte un schéma de forme d'onde personnalisé 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 // Do not 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 // Do not repeat.

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

Le graphique ci-dessous montre la forme d'onde correspondant aux extraits de code présentés ci-dessus.

Trace de la forme d'onde d'entrée de la fonction de pas

L'accélération correspondante est illustrée ci-dessous:

Traçage de la forme d'onde mesurée réelle, montrant plus de transitions organiques entre les niveaux

Notez que l'accélération augmente progressivement, et non soudainement, à chaque changement d'amplitude de pas dans le modèle (par exemple, à 0 ms, 150 ms, 200 ms, 250 ms, 700 ms). Il y a également un dépassement à chaque changement d'amplitude de pas et un "sonnerie" visible dure au moins 50 ms lorsque l'amplitude d'entrée passe soudainement à 0.

Ce modèle haptique peut être amélioré en augmentant et en diminuant progressivement les amplitudes afin d'éviter les dépassements et de réduire la durée des sonneries. 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));

Traçage de la forme d'onde d'entrée avec étapes supplémentaires

Trace de la forme d'onde mesurée, montrant des transitions plus fluides

Par conséquent, pour créer un effet haptique sur un appareil Android, il ne suffit pas de fournir une valeur de fréquence et d'amplitude. Concevoir un effet haptique à partir de zéro n'est pas une tâche aisée sans un accès complet aux caractéristiques techniques de l'actionneur de vibration et du pilote. Les API Android fournissent des constantes qui vous permettent d'effectuer les opérations suivantes:

  • Appliquez des effets et des primitives clairs.

  • Concaténez-les pour créer de nouveaux effets haptiques.

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