Primer attuatori vibrazioni

Prima di progettare effetti aptici su un dispositivo Android, è utile avere una panoramica del funzionamento degli attuatori con vibrazione.

Illustrazione dei componenti di un LRA aptico

Gli attuatori con vibrazione più comuni sono gli attuatori a risonanza lineare (LDA). Ogni LRA è costituito da una bobina mobile premuta contro una massa magnetica mobile fissata a una molla. Una tensione CA applicata alla bobina mobile crea una forza elettromagnetica che causa il movimento della massa. La molla fornisce la forza di recupero che fa tornare la massa alla sua posizione iniziale. Il movimento avanti e indietro della massa fa vibrare l'LRA. Hanno una frequenza di risonanza alla quale l'output è massimo.

Data la stessa tensione di ingresso a due frequenze diverse, le ampiezze di uscita della vibrazione possono essere diverse. Più la frequenza è lontana dalla frequenza di risonanza dell'LRA, più bassa è l'ampiezza della vibrazione.

Una funzione comune degli LRA in un dispositivo è simulare la sensazione di un clic su un pulsante su una superficie di vetro che non risponde. Serve a rendere l'interazione utente più naturale. Se applicato alla digitazione su una tastiera virtuale, il feedback dei clic può aumentare la velocità di digitazione e ridurre gli errori. Un segnale di feedback dei clic chiaro e nitido in genere dura meno di 10-20 millisecondi. Per ottenere un buon clic è necessaria una conoscenza dell'LRA utilizzata in un dispositivo. Ecco perché l'utilizzo di forme d'onda prefabbricate fornisce il miglior feedback per un clic. Puoi utilizzarle con le costanti fornite dalla piattaforma ogni volta che è necessario un feedback sui clic.

Gli effetti aptici realizzabili in un dispositivo sono determinati sia dall'attuatore della vibrazione sia dal suo driver. I driver aptici che includono funzionalità di overdrive e frenata attiva possono ridurre il tempo di salita e il ronzio degli LRA, generando una vibrazione più reattiva e chiara. Vediamo come si comporta un pattern di forma d'onda personalizzata su un dispositivo generico.

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

Il grafico riportato di seguito mostra la forma d'onda corrispondente agli snippet di codice mostrati sopra.

Grafico della forma d'onda di input della funzione di passo

L'accelerazione corrispondente è mostrata di seguito:

Grafico della forma d'onda misurata effettiva, che mostra più transizioni organiche tra i livelli

Tieni presente che l'accelerazione aumenta gradualmente, non improvvisamente, ogni volta che si verifica un cambiamento di ampiezza nel pattern (ad es. a 0 ms, 150 ms, 200 ms, 250 ms, 700 ms). Si verifica anche un superamento a ogni passo di variazione dell'ampiezza ed è presente uno "squillo" visibile che dura almeno 50 ms quando l'ampiezza dell'input improvvisamente scende a 0.

Questo andamento aptico può essere migliorato aumentando e diminuendo le ampiezze gradualmente per evitare sovraelongazione e ridurre il tempo di squillo. Di seguito sono riportati i grafici della forma d'onda e dell'accelerazione della versione rivista.

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

Traccia la forma d'onda di input con passaggi aggiuntivi

Grafico della forma d'onda misurata, che mostra transizioni più fluide

Ne consegue che per creare un effetto aptico su un dispositivo Android non è sufficiente fornire un valore di frequenza e ampiezza. Non è un compito banale progettare un effetto aptico da zero senza accesso completo alle specifiche tecniche dell'attuatore con vibrazione e del conducente. Le API Android forniscono costanti che consentono di eseguire le seguenti operazioni:

  • Crea effetti chiari e primitivi.

  • Concatenali per comporre nuovi effetti aptici.

Queste costanti aptiche predefinite e primitive possono accelerare notevolmente il tuo lavoro garantendo al contempo effetti aptici di alta qualità.