Menganalisis bentuk gelombang getaran

Aktuator getaran yang paling umum di perangkat Android adalah aktuator resonan linear (LRA). LRA menyimulasikan perasaan klik tombol pada permukaan kaca yang tidak responsif. Sinyal masukan klik yang jelas dan tajam biasanya berlangsung antara 10 dan 20 milidetik. Sensasi ini membuat interaksi pengguna terasa lebih alami. Untuk keyboard virtual, masukan klik ini dapat meningkatkan kecepatan mengetik dan mengurangi error.

LRA memiliki beberapa frekuensi resonansi umum:

  • Beberapa LRA memiliki frekuensi resonansi dalam rentang 200 hingga 300 Hz, yang bersamaan dengan frekuensi saat kulit manusia paling sensitif terhadap getaran. Sensasi getaran pada rentang frekuensi ini biasanya digambarkan sebagai halus, tajam, dan menembus.
  • Model LRA lainnya memiliki frekuensi resonansi yang lebih rendah, sekitar 150 Hz. Sensasi 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, alas, dan perekat.
Komponen aktuator resonansi linear (LRA).

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

Efek haptic perangkat tertentu menggunakan aktuator getaran dan driver-nya. Driver haptic yang menyertakan fitur overdrive dan pengereman aktif dapat mengurangi waktu naik dan dering LRA, sehingga menghasilkan getaran yang lebih responsif dan jelas.

Akselerasi output vibrator

Pemetaan frekuensi ke akselerasi output (FOAM) menjelaskan akselerasi output maksimum yang dapat dicapai (dalam puncak G) pada frekuensi getaran tertentu (dalam Hertz). Mulai Android 16 (API level 36), platform ini 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, biasanya di dekat frekuensi resonansinya. Akselerasi umumnya menurun secara eksponensial saat frekuensi menyimpang dari rentang ini. Kurva mungkin tidak simetris dan mungkin memiliki dataran tinggi di sekitar frekuensi resonansi untuk melindungi motor dari kerusakan.

Plot yang berdekatan menunjukkan contoh FOAM untuk motor LRA.

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

Batas deteksi persepsi manusia

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

Plot yang berdekatan menunjukkan nilai minimum deteksi persepsi haptic manusia, dalam akselerasi, sebagai fungsi frekuensi temporal. Data nilai minimum dikonversi dari nilai minimum perpindahan pada Gambar 1 Bolanowski Jr., S. J., et al. tahun 1988, "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 sebesar setidaknya 10 dB.

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

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

Tingkat akselerasi getaran

Persepsi manusia tentang intensitas getaran, yaitu pengukuran persepsi, tidak tumbuh secara linear dengan amplitudo getaran, yaitu parameter fisik. Intensitas yang dirasakan ditandai oleh tingkat sensasi (SL), yang didefinisikan 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 haptic manusia (0 dB SL), sebagai fungsi frekuensi temporal. Data ini 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, akan meningkat dengan jumlah yang kira-kira 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 ternormalisasi di ruang level sensasi (dB SL) dan mengonversinya menjadi 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 piecewise.

Penghalusan bentuk gelombang default di perangkat

Sebagai ilustrasi, pertimbangkan bagaimana pola bentuk gelombang kustom berperilaku di 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 akselerasi bertambah secara bertahap, bukan tiba-tiba, setiap kali ada perubahan langkah amplitudo dalam pola—yaitu, pada 0 mdtk, 150 mdtk, 200 mdtk, 250 mdtk, dan 700 mdtk. Ada juga overshoot pada setiap perubahan langkah amplitudo, dan ada derau yang terlihat yang berlangsung setidaknya 50 md saat amplitudo input tiba-tiba turun ke 0.

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

Pola haptic yang ditingkatkan

Untuk menghindari overshoot dan mengurangi waktu dering, ubah amplitudo secara lebih bertahap. Berikut ini menunjukkan plot gelombang dan akselerasi dari 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, yang menunjukkan transisi yang lebih halus.

Membuat efek haptic yang lebih kompleks

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

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

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