Phân tích dạng sóng rung

Các bộ truyền động rung phổ biến nhất trên thiết bị Android là bộ truyền động cộng hưởng tuyến tính (LRA). LRA mô phỏng cảm giác nhấp vào nút trên một bề mặt kính không phản hồi. Tín hiệu phản hồi lượt nhấp rõ ràng và sắc nét thường kéo dài từ 10 đến 20 mili giây. Cảm giác này giúp người dùng tương tác một cách tự nhiên hơn. Đối với bàn phím ảo, phản hồi lượt nhấp này có thể tăng tốc độ nhập và giảm lỗi.

LRA có một vài tần số cộng hưởng phổ biến:

  • Một số LRA có tần số cộng hưởng trong khoảng từ 200 đến 300 Hz, trùng khớp với tần số mà da người nhạy cảm nhất với độ rung. Cảm giác rung ở dải tần số này thường được mô tả là mượt mà, sắc nét và xuyên thấu.
  • Các mẫu LRA khác có tần số cộng hưởng thấp hơn, khoảng 150 Hz. Cảm giác về chất lượng mềm hơn và đầy đặn hơn (theo chiều).
Các thành phần bao gồm, từ trên xuống dưới, một nắp, tấm, nam châm giữa, 2 nam châm bên, khối lượng, 2 lò xo, cuộn dây, mạch linh hoạt, đế và chất kết dính.
Các thành phần của một bộ truyền động cộng hưởng tuyến tính (LRA).

Với cùng một điện áp đầu vào ở hai tần số khác nhau, biên độ đầu ra của độ rung có thể khác nhau. Tần số càng xa tần số cộng hưởng của LRA, biên độ dao động càng thấp.

Hiệu ứng xúc giác của một thiết bị cụ thể sử dụng cả bộ truyền động rung và trình điều khiển của bộ truyền động đó. Trình điều khiển haptics có các tính năng tăng tốc và phanh chủ động có thể giảm thời gian tăng và độ rung của LRA, giúp độ rung rõ ràng và nhạy hơn.

Gia tốc đầu ra của bộ rung

Bản đồ tần số-tốc độ tăng tốc đầu ra (FOAM) mô tả tốc độ tăng tốc đầu ra tối đa có thể đạt được (tính bằng G đỉnh) ở một tần số rung nhất định (tính bằng Hertz). Kể từ Android 16 (API cấp 36), nền tảng này sẽ tích hợp tính năng hỗ trợ cho việc liên kết này thông qua VibratorFrequencyProfile. Bạn có thể sử dụng lớp này cùng với các API phong bì cơ bảnnâng cao để tạo hiệu ứng xúc giác.

Hầu hết động cơ LRA đều có một đỉnh duy nhất trong FOAM, thường là gần tần số cộng hưởng. Gia tốc thường giảm theo hàm mũ khi tần số sai lệch khỏi phạm vi này. Đường cong có thể không đối xứng và có thể có một vùng phẳng quanh tần số cộng hưởng để bảo vệ động cơ khỏi bị hư hỏng.

Biểu đồ bên cạnh cho thấy một ví dụ về FOAM cho động cơ LRA.

Khi tần số tăng lên khoảng 120 Hz, gia tốc sẽ tăng theo cấp số nhân. Sau đó, tốc độ tăng tốc vẫn ổn định ở khoảng 180 Hz, sau đó giảm dần.
Ví dụ về FOAM cho động cơ LRA.

Ngưỡng phát hiện nhận thức của con người

Ngưỡng phát hiện cảm nhận của con người đề cập đến gia tốc tối thiểu của một dao động mà một người có thể phát hiện một cách đáng tin cậy. Mức này thay đổi tuỳ theo tần suất rung.

Biểu đồ bên cạnh cho thấy ngưỡng phát hiện cảm nhận xúc giác của con người, tính theo gia tốc, dưới dạng hàm tần số thời gian. Dữ liệu ngưỡng được chuyển đổi từ ngưỡng dịch chuyển trong Hình 1 của Bolanowski Jr., S. Bài viết năm 1988 của J., et al., "Bốn kênh điều tiết các khía cạnh cơ học của cảm ứng".

Android tự động xử lý ngưỡng này trong BasicEnvelopeBuilder, xác minh rằng tất cả các hiệu ứng đều sử dụng phạm vi tần số tạo ra biên độ rung vượt quá ngưỡng phát hiện nhận thức của con người ít nhất là 10 dB.

Khi tần số tăng lên khoảng 20 Hz, ngưỡng phát hiện của con người sẽ tăng theo hàm logarit lên khoảng -35 dB. Ngưỡng này vẫn ổn định trong khoảng 200 Hz, sau đó tăng gần như tuyến tính trong khoảng -20 dB.
Ngưỡng phát hiện cảm nhận xúc giác của con người.

Một hướng dẫn trực tuyến giải thích thêm về quy trình chuyển đổi giữa biên độ gia tốc và biên độ dịch chuyển.

Mức độ tăng tốc rung

Nhận thức của con người về cường độ rung, một phép đo nhận thức, không tăng lên một cách tuyến tính với biên độ rung, một tham số vật lý. Cường độ cảm nhận được đặc trưng bằng mức độ cảm giác (SL), được xác định là một lượng dB cao hơn ngưỡng phát hiện ở cùng tần số.

Bạn có thể tính toán biên độ gia tốc rung tương ứng (tính bằng G đỉnh) như sau:

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

...trong đó dB biên độ là tổng của SL và ngưỡng phát hiện – giá trị dọc theo trục dọc trong biểu đồ liền kề – ở một tần số cụ thể.

Biểu đồ bên cạnh cho thấy các mức gia tốc rung ở 10, 20, 30, 40 và 50 dB SL, cùng với ngưỡng phát hiện cảm nhận xúc giác của con người (0 dB SL), dưới dạng hàm của tần số thời gian. Dữ liệu được ước tính từ Hình 8 trong bài viết của Verrillo, R. Bài viết năm 1969 của T., et al., "Mức độ cảm giác của các kích thích rung xúc giác.".

Khi mức độ cảm giác mong muốn tăng lên, gia tốc cần thiết, tính bằng dB, sẽ tăng lên gần như cùng một mức. Ví dụ: mức độ cảm nhận 10 dB cho độ rung 100 Hz là khoảng -20 dB thay vì -30 dB.
Các cấp độ gia tốc rung.

Android tự động xử lý việc chuyển đổi này trong BasicEnvelopeBuilder, lấy các giá trị dưới dạng cường độ chuẩn hoá trong không gian mức độ cảm giác (dB SL) và chuyển đổi các giá trị đó thành gia tốc đầu ra. Mặt khác, WaveformEnvelopeBuilder không áp dụng phép chuyển đổi này và lấy các giá trị dưới dạng biên độ gia tốc đầu ra đã chuẩn hoá trong không gian gia tốc (G). API bao bì giả định rằng khi nhà thiết kế hoặc nhà phát triển nghĩ về những thay đổi về cường độ rung, họ mong đợi cường độ cảm nhận được sẽ tuân theo một bao bì tuyến tính theo từng phần.

Làm mượt dạng sóng mặc định trên thiết bị

Để minh hoạ, hãy xem xét cách hoạt động của mẫu dạng sóng tuỳ chỉnh trên một thiết bị chung:

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

Các biểu đồ sau đây cho thấy dạng sóng đầu vào và gia tốc đầu ra tương ứng với các đoạn mã trước đó. Lưu ý rằng gia tốc tăng dần, chứ không đột ngột, bất cứ khi nào có sự thay đổi bước của biên độ trong mẫu, tức là tại 0 mili giây, 150 mili giây, 200 mili giây, 250 mili giây và 700 mili giây. Ngoài ra, còn có hiện tượng vượt quá ở mỗi bước thay đổi biên độ và có hiện tượng rung rõ ràng kéo dài ít nhất 50 mili giây khi biên độ đầu vào đột ngột giảm xuống 0.

Biểu đồ dạng sóng đầu vào của hàm bước.
Biểu đồ dạng sóng đo lường thực tế, cho thấy các chuyển đổi tự nhiên hơn giữa các cấp.

Cải thiện mẫu haptics

Để tránh vượt quá và giảm thời gian đổ chuông, hãy thay đổi biên độ một cách từ từ hơn. Sau đây là đồ thị dạng sóng và gia tốc của phiên bản sửa đổi:

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

Biểu đồ dạng sóng đầu vào với các bước bổ sung.
Biểu đồ dạng sóng được đo lường, cho thấy các chuyển đổi mượt mà hơn.

Tạo hiệu ứng xúc giác phức tạp hơn

Các thành phần khác trong phản hồi nhấp chuột thoả đáng phức tạp hơn, đòi hỏi một số kiến thức về LRA được sử dụng trong thiết bị. Để có kết quả tốt nhất, hãy sử dụng sóng được tạo sẵn và hằng số do nền tảng cung cấp của thiết bị. Điều này cho phép bạn làm những việc sau:

  • Thực hiện các hiệu ứng rõ ràng và mẫu gốc.
  • Kết hợp các hiệu ứng này để tạo hiệu ứng xúc giác mới.

Các hằng số và nguyên hàm xúc giác được xác định trước này có thể giúp bạn tăng tốc đáng kể trong khi tạo hiệu ứng xúc giác chất lượng cao.