Primer aktuator getaran

Sebelum merancang efek haptic di perangkat Android, ada baiknya untuk mendapatkan ringkasan tentang cara kerja aktuator getaran.

Ilustrasi komponen Haptic LRA

Aktuator getaran yang paling umum adalah Linear Resonant Actuator (LRA). Masing-masing LRA terdiri dari kumparan suara yang ditekan ke massa bergerak magnetik yang yang melekat pada sebuah pegas. Tegangan AC yang diterapkan ke kumparan suara gaya elektromagnetik yang menyebabkan massa bergerak. Mata air menyediakan gaya pemulihan yang menyebabkan massa kembali ke posisi awalnya. Tujuan gerakan massa yang bolak-balik menyebabkan LRA bergetar. Aset tersebut memiliki frekuensi resonansi di mana output maksimum.

Dengan tegangan input yang sama pada dua frekuensi yang berbeda, output getaran amplitudo dapat berbeda. Semakin jauh frekuensinya dari rentang LRA frekuensi resonansinya, semakin rendah amplitudo getarannya.

Salah satu fungsi umum LRA pada perangkat adalah untuk menyimulasikan perasaan tombol klik pada permukaan kaca yang tidak responsif. Hal ini berfungsi untuk membuat interaksi pengguna terasa lebih alami. Jika diterapkan untuk mengetik di keyboard virtual, respons klik dapat meningkatkan kecepatan pengetikan dan mengurangi kesalahan. Sinyal masukan klik yang jelas dan tajam biasanya berdurasi kurang dari 10 hingga 20 milidetik. Mencapai klik yang baik memerlukan pengetahuan tentang LRA yang digunakan di perangkat. Inilah sebabnya mengapa kita mengandalkan bentuk gelombang prafabrikasi memberikan masukan terbaik untuk satu klik. Anda dapat menggunakan dengan konstanta yang disediakan platform setiap kali masukan klik diperlukan.

Efek haptic yang dapat dicapai dalam perangkat ditentukan oleh getaran aktuator dan {i>driver-<i}nya. Pengemudi haptic yang menyertakan overdrive dan aktif fitur pengereman dapat mengurangi waktu munculnya dan dering LRA, yang menyebabkan responsif dan jernih. Sebagai ilustrasi, mari kita lihat bagaimana pola bentuk gelombang 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 // 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 terkait ditunjukkan di bawah ini:

Plot bentuk gelombang terukur yang sebenarnya, yang menunjukkan lebih banyak transisi organik antarlevel

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 {i>overshoot<i} pada setiap perubahan amplitudo langkah, dan ada terlihat 'dering' yang berlangsung setidaknya 50 md ketika amplitudo input tiba-tiba turun menjadi 0.

Pola haptic ini dapat diperbaiki dengan meningkatkan dan mengurangi amplitudo secara bertahap untuk menghindari overshoot dan mengurangi waktu dering. Yang berikut ini menunjukkan bentuk gelombang, dan plot percepatan versi revisi.

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-langkah tambahan

Peta bentuk gelombang yang diukur, menunjukkan transisi yang lebih halus

Oleh karena itu, membuat efek haptic pada perangkat Android memerlukan lebih dari yang memberikan nilai frekuensi dan amplitudo. Bukan tugas yang mudah untuk merancang efek haptic dari awal tanpa akses penuh ke spesifikasi engineering aktuator getaran dan pengemudi. Android API menyediakan konstanta yang Anda dapat melakukan hal berikut:

  • Menjalankan efek dan primitif yang jelas.

  • Gabungkan untuk menciptakan efek haptic baru.

Konstanta dan primitif haptic yang telah ditentukan ini dapat sangat mempercepat pekerjaan Anda sambil memastikan efek haptik berkualitas tinggi.