Menganalisis bentuk gelombang getaran

Aktuator getaran yang paling umum di perangkat Android adalah linear resonant actuator (LRA). LRA mensimulasikan nuansa klik tombol pada permukaan kaca yang tidak responsif. Sinyal umpan balik klik yang jelas dan tajam biasanya berdurasi antara 10 dan 20 milidetik. Sensasi ini membuat interaksi pengguna terasa lebih alami. Untuk keyboard virtual, respons klik ini dapat meningkatkan kecepatan mengetik dan mengurangi kesalahan.

LRA memiliki beberapa frekuensi resonansi umum:

  • Beberapa LRA memiliki frekuensi resonansi dalam rentang 200 hingga 300 Hz, yang bertepatan dengan frekuensi saat kulit manusia paling sensitif terhadap getaran. Sensasi getaran pada rentang frekuensi ini biasanya dideskripsikan sebagai halus, tajam, dan menembus.
  • Model LRA lainnya memiliki frekuensi resonansi yang lebih rendah, sekitar 150 Hz. Sensasinya secara kualitatif lebih lembut dan lebih penuh (dalam dimensi).
Komponen mencakup, dari atas ke bawah, penutup, pelat, magnet
       tengah, 2 magnet samping, massa, 2 pegas, kumparan, sirkuit fleksibel, dasar,
       dan perekat.
Komponen aktuator resonansi linear (LRA).

Dengan voltase input yang sama pada dua frekuensi yang berbeda, amplitudo output getaran dapat berbeda. Makin jauh frekuensi dari frekuensi resonansi LRA, makin rendah amplitudo getarannya.

Efek haptik perangkat tertentu menggunakan aktuator getaran dan drivernya. Driver haptik yang mencakup fitur overdrive dan pengereman aktif dapat mengurangi waktu naik dan dering LRA, sehingga menghasilkan getaran yang lebih responsif dan jelas.

Akselerasi output vibrator

Pemetaan akselerasi output ke frekuensi (FOAM) menjelaskan akselerasi output maksimum yang dapat dicapai (dalam puncak G) pada frekuensi getaran tertentu (dalam Hertz). Mulai Android 16 (level API 36), platform menyediakan dukungan bawaan untuk pemetaan ini melalui VibratorFrequencyProfile. Anda dapat menggunakan class ini, bersama dengan API amplop dasar dan lanjutan, untuk membuat efek haptik.

Sebagian besar motor LRA memiliki satu puncak dalam FOAM-nya, biasanya di dekat frekuensi resonansinya. Percepatan umumnya menurun secara eksponensial saat frekuensi menyimpang dari rentang ini. Kurva mungkin tidak simetris dan mungkin menampilkan dataran tinggi di sekitar frekuensi resonansi untuk melindungi motor dari kerusakan.

Plot yang berdekatan menunjukkan contoh FOAM untuk motor LRA.

Saat frekuensi meningkat hingga sekitar 120 Hz, akselerasi meningkat
       secara eksponensial. Kemudian, akselerasi tetap stabil hingga sekitar 180 Hz,
       setelah itu akan berkurang.
Contoh FOAM untuk motor LRA.

Nilai minimum deteksi persepsi manusia

Ambang batas deteksi persepsi manusia mengacu pada akselerasi minimum getaran yang dapat dideteksi secara andal oleh seseorang. Tingkat ini bervariasi berdasarkan frekuensi getaran.

Plot yang berdekatan menunjukkan batas deteksi persepsi haptik manusia, dalam akselerasi, sebagai fungsi frekuensi temporal. Data nilai minimum dikonversi dari nilai minimum perpindahan pada Gambar 1 Bolanowski Jr., S. Artikel J., et al. tahun 1988, "Four channels mediate the mechanical aspects of touch" (Empat saluran memediasi aspek mekanis sentuhan)..

Android secara otomatis menangani nilai minimum ini di BasicEnvelopeBuilder, yang memverifikasi bahwa semua efek menggunakan rentang frekuensi yang menghasilkan amplitudo getaran yang melebihi nilai minimum deteksi persepsi manusia setidaknya sebesar 10 dB.

Saat frekuensi meningkat hingga sekitar 20 Hz, nilai minimum deteksi manusia
       meningkat secara logaritmik hingga sekitar -35 dB. Ambang batas tetap stabil
       hingga sekitar 200 Hz, setelah itu meningkat secara linear hingga
       -20 dB.
Batas deteksi persepsi haptik manusia.

Tutorial online lebih lanjut menjelaskan konversi antara amplitudo percepatan dan amplitudo perpindahan.

Tingkat percepatan getaran

Persepsi manusia terhadap intensitas getaran, yaitu ukuran persepsi, tidak meningkat secara linear dengan amplitudo getaran, yaitu parameter fisik. Intensitas yang dirasakan dicirikan oleh tingkat sensasi (SL), yang ditentukan sebagai jumlah dB di atas nilai minimum deteksi pada frekuensi yang sama.

Amplitudo akselerasi getaran yang sesuai (dalam puncak G) dapat dihitung sebagai berikut:

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

...dengan dB amplitudo adalah jumlah SL dan nilai minimum deteksi—nilai di sepanjang sumbu vertikal dalam plot yang berdekatan—pada frekuensi tertentu.

Plot yang berdekatan menunjukkan tingkat akselerasi getaran pada 10, 20, 30, 40, dan 50 dB SL, beserta nilai minimum deteksi persepsi haptik manusia (0 dB SL), sebagai fungsi frekuensi temporal. Data diperkirakan dari Gambar 8 dalam Verrillo, R. T., et al. tahun 1969, "Sensation magnitude of vibrotactile stimuli.".

Seiring meningkatnya tingkat sensasi yang diinginkan, akselerasi yang diperlukan, dalam dB, meningkat dengan jumlah yang hampir sama. Misalnya, tingkat sensasi 10 dB untuk getaran 100 Hz adalah sekitar -20 dB, bukan -30 dB.
Tingkat akselerasi getaran.

Android otomatis menangani konversi ini di BasicEnvelopeBuilder, yang mengambil nilai sebagai intensitas yang dinormalisasi dalam ruang tingkat sensasi (dB SL) dan mengonversinya ke akselerasi output. Di sisi lain, WaveformEnvelopeBuilder tidak menerapkan konversi ini dan mengambil nilai sebagai amplitudo akselerasi output yang dinormalisasi dalam ruang akselerasi (Gs). Envelope API mengasumsikan bahwa, saat desainer atau developer memikirkan perubahan kekuatan getaran, mereka mengharapkan intensitas yang dirasakan mengikuti envelope linear sepotong-sepotong.

Perataan bentuk gelombang default di perangkat

Sebagai ilustrasi, pertimbangkan perilaku pola bentuk gelombang kustom pada perangkat generik:

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

Plot berikut menunjukkan bentuk gelombang input dan akselerasi output yang sesuai dengan cuplikan kode sebelumnya. Perhatikan bahwa percepatan meningkat secara bertahap, bukan tiba-tiba, setiap kali ada perubahan langkah amplitudo dalam pola—yaitu, pada 0 md, 150 md, 200 md, 250 md, dan 700 md. Terdapat juga overshoot pada setiap perubahan amplitudo langkah, dan terdapat dering yang terlihat yang berlangsung setidaknya 50 md saat amplitudo input tiba-tiba turun menjadi 0.

Plot bentuk gelombang input fungsi langkah.
Plot bentuk gelombang yang diukur sebenarnya, yang menunjukkan transisi yang lebih organik antar-level.

Pola haptik yang ditingkatkan

Untuk menghindari overshoot dan mengurangi waktu dering, ubah amplitudo secara lebih bertahap. Berikut adalah plot bentuk gelombang dan akselerasi versi yang direvisi:

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

Plot bentuk gelombang input dengan langkah tambahan.
Plot bentuk gelombang yang diukur, menunjukkan transisi yang lebih lancar.

Membuat efek haptic yang lebih kompleks

Elemen lain dalam respons klik yang memuaskan lebih rumit, sehingga memerlukan pengetahuan tentang LRA yang digunakan dalam perangkat. Untuk mendapatkan hasil terbaik, gunakan bentuk gelombang buatan perangkat dan konstanta yang disediakan platform, yang memungkinkan Anda melakukan hal berikut:

  • Lakukan efek dan primitive yang jelas.
  • Gabungkan untuk membuat efek haptik baru.

Konstanta dan primitif haptik yang telah ditentukan ini dapat mempercepat pekerjaan Anda secara signifikan saat membuat efek haptik berkualitas tinggi.