Primer aktuator getaran

Sebelum mendesain efek haptik di perangkat Android, sebaiknya dapatkan ringkasan tentang cara kerja aktuator getaran.

Ilustrasi komponen LRA Haptic

Aktuator getaran yang paling umum adalah Linear Resonant Actuator (LRA). Setiap LRA terdiri dari koil suara yang ditekan pada massa bergerak magnet yang terpasang pada pegas. Tegangan AC yang diterapkan pada koil suara menciptakan gaya elektromagnetik yang menyebabkan massa bergerak. Pegas memberikan gaya pemulihan yang menyebabkan massa kembali ke posisi awalnya. Pergerakan massa bolak-balik menyebabkan LRA bergetar. Jenis ini memiliki frekuensi resonansi yang menghasilkan output maksimum.

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 getarannya.

Salah satu fungsi umum LRA di perangkat adalah untuk menyimulasikan perasaan klik tombol pada permukaan kaca yang tidak responsif. Hal ini berfungsi untuk membuat interaksi pengguna terasa lebih alami. Saat diterapkan pada pengetikan di keyboard virtual, masukan klik dapat meningkatkan kecepatan pengetikan dan mengurangi error. Sinyal masukan klik yang jelas dan tajam biasanya berdurasi kurang dari 10 hingga 20 milidetik. Untuk mencapai klik yang baik, dibutuhkan pengetahuan tentang LRA yang digunakan di perangkat. Oleh karena itu, mengandalkan bentuk gelombang prafabrikasi akan memberikan masukan terbaik untuk klik. Anda dapat menggunakannya dengan konstanta yang disediakan oleh platform setiap kali masukan klik diperlukan.

Efek haptik yang dapat dicapai pada perangkat ditentukan oleh aktuator getaran dan drivernya. Penggerak haptic yang menyertakan fitur overdrive dan pengereman aktif dapat mengurangi rise time dan dering LRA, sehingga menghasilkan getaran yang lebih responsif dan jelas. Untuk ilustrasi, mari kita lihat bagaimana pola bentuk gelombang kustom berperilaku 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 // 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));

Plot di bawah ini menunjukkan bentuk gelombang yang sesuai dengan cuplikan kode yang ditampilkan di atas.

Plot bentuk gelombang input fungsi langkah

Akselerasi yang sesuai ditunjukkan di bawah ini:

Peta bentuk gelombang terukur aktual, yang menunjukkan lebih banyak transisi organik di antara level

Perhatikan bahwa akselerasi meningkat secara bertahap, bukan tiba-tiba, setiap kali ada perubahan langkah amplitudo dalam pola (misalnya, pada 0 md, 150 md, 200 md, 250 md, 700 md). Ada juga overshoot pada setiap perubahan amplitudo langkah, dan ada 'dering' yang terlihat yang berlangsung setidaknya 50 md saat amplitudo input tiba-tiba turun ke 0.

Pola haptic ini dapat ditingkatkan dengan meningkatkan dan mengurangi amplitudo secara bertahap untuk menghindari kelebihan beban dan mengurangi waktu berdering. Gambar berikut menunjukkan bentuk gelombang dan plot 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 terukur, yang menampilkan transisi yang lebih halus

Oleh karena itu, menciptakan efek haptik di perangkat Android tidak hanya memerlukan penyediaan frekuensi dan nilai amplitudo. Mendesain efek haptik dari awal tanpa akses penuh ke spesifikasi engineering aktuator getaran dan pengemudi bukan merupakan tugas yang mudah. API Android menyediakan konstanta yang memungkinkan Anda melakukan hal-hal berikut:

  • Menjalankan efek dan primitif yang jelas.

  • Gabungkan keduanya untuk menyusun efek haptic baru.

Primitif dan konstanta haptic yang telah ditetapkan ini dapat mempercepat pekerjaan Anda sekaligus memastikan efek haptik berkualitas tinggi.