バイブレーション アクチュエータ入門

Android デバイスで触覚効果を設計する前に、バイブレーション アクチュエータの仕組みの概要を理解することをおすすめします。

触覚 LRA のコンポーネントの図

最も一般的な振動アクチュエータは、リニア共振アクチュエータ(LRA)です。各 LRA は、バネに取り付けられた磁気移動質量に押し付けられたボイスコイルで構成されています。ボイスコイルに印加された AC 電圧により電磁力が発生し、質量が移動します。ばねは、質量を最初の位置に戻す復元力を提供します。この質量が前後に動くと LRA が振動します。出力が最大になる共振周波数があります。

2 つの異なる周波数で同じ入力電圧がある場合、バイブレーション出力の振幅が異なる場合があります。周波数が LRA の共振周波数から離れるほど、振動振幅は小さくなります。

デバイスにおける LRA の一般的な機能として、反応しないガラス面をボタンクリックでシミュレートするというものがあります。これにより、ユーザー操作がより自然に感じられるようになります。仮想キーボードでの入力に適用すると、クリック フィードバックによって入力速度が上がり、エラーを減らすことができます。明確で明確なクリック フィードバック シグナルは通常、継続時間が 10 ~ 20 ミリ秒未満です。うまくクリックするには、デバイスで使用されている LRA についてある程度の知識が必要です。そのため、あらかじめ用意された波形を使用することで、クリックに対する最適なフィードバックを得ることができます。クリック フィードバックが必要なときは、常にプラットフォームが提供する定数とともにこれらを使用できます。

デバイス内で実現できる触覚効果は、バイブレーション アクチュエータとそのドライバの両方によって決まります。オーバードライブ機能とアクティブ ブレーキ機能を含むハプティクス ドライバにより、LRA の立ち上がり時間と呼び出し音を低減し、振動の応答性とクリアを改善できます。説明のために、カスタム波形パターンが汎用デバイスでどのように動作するかを見てみましょう。

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

以下のグラフは、上記のコード スニペットに対応する波形を示しています。

ステップ関数の入力波形のプロット

対応する加速度は次のとおりです。

実際に測定された波形のプロット(レベル間の有機的な遷移を示す図)

加速度は、パターンで振幅のステップ変化が生じるたびに(たとえば、0 ms、150 ms、200 ms、250 ms、700 ms)に突然ではなく徐々に増加することに注意してください。また、振幅のステップ変化ごとにオーバーシュートが発生し、入力振幅が突然 0 に下がったときに少なくとも 50 ms 続く「リンギング」が目に見えています。

この触覚パターンは、振幅を徐々に増減させて、オーバーシュートを回避し、リンギング時間を短縮することで改善できます。改訂後のバージョンの波形と加速度プロットを以下に示します。

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

追加ステップを含む入力波形のプロット

滑らかな遷移を示す測定波形のプロット

そのため、Android デバイスで触覚効果を作成するには、周波数と振幅の値を指定するだけでは不十分です。バイブレーション アクチュエータとドライバのエンジニアリング仕様に完全にアクセスできなければ、触覚効果をゼロから設計するのは簡単な作業ではありません。Android API には、以下のことができる定数が用意されています。

  • 明確な効果とプリミティブを実行する。

  • それらを連結して、新しい触覚効果を作成します。

事前定義された触覚定数と触覚プリミティブを使用すると、高品質の触覚効果を確保しながら、作業を大幅に高速化できます。