ניתוח צורות הגל של הרטט

רכיבי האקטואטור הנפוצים ביותר ליצירת רטט במכשירי Android הם רכיבי אקטואטור לינאריים בתהודה (LRA). רכיבי LRA מדמים את התחושה של לחיצה על לחצן במשטח זכוכית שלא מגיב. בדרך כלל, אות משוב ברור ותקיף של קליקים נמשך בין 10 ל-20 אלפיות השנייה. כך האינטראקציות של המשתמשים נראות טבעיות יותר. במקלדות וירטואליות, משוב הקליקים יכול להגביר את מהירות ההקלדה ולצמצם את מספר השגיאות.

ל-LRA יש כמה תדרי תהודה נפוצים:

  • לחלק מה-LRA היו תדרי תהודה בטווח של 200 עד 300 Hz, שתואמים לתדר שבו העור האנושי רגיש ביותר לתנודות. בדרך כלל, התחושה של הרטט בטווח התדרים הזה מתוארת כחלקה, חדה וחודרת.
  • לדגמים אחרים של רמקול נייד יש תדרי תהודה נמוכים יותר, בסביבות 150 Hz. התחושה איכותית יותר, רכה יותר ומלאה יותר (במימד).
הרכיבים כוללים, מלמעלה למטה, כיסוי, צלחת, מגנט מרכזי, 2 מגנטים צדדיים, מסה, 2 קפיצים, סליל, מעגל גמיש, בסיס ודבק.
רכיבים של מפעיל רטט לינארי (LRA).

אם מתקבל אותו מתח קלט בשתי תדרים שונים, יכול להיות שהאמפליטודות של תפוקת הרטט יהיו שונות. ככל שהתדר רחוק יותר מתדר התהודה של ה-LRA, כך אמפליטודת הרטט שלו נמוכה יותר.

האפקטים ההדדיים של מכשיר נתון משתמשים גם במפעיל הרטט וגם בדרייבר שלו. מנהלי התקנים של משוב מגע שכוללים תכונות של מצב אוברדרייב ותכונות של בלימה פעילה יכולים לצמצם את זמן העלייה ואת הצלצול של רכיבי LRA, וכך לאפשר תגובה מהירה יותר ורטט ברור יותר.

החלקת צורת הגל שמוגדרת כברירת מחדל במכשירים

כדי להמחיש את העניין, נבחן את האופן שבו תבנית גל מותאמת אישית מתנהגת במכשיר כללי:

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

בתרשים הבא מוצגים צורת הגל של הקלט והתאוצה של הפלט בהתאם לקטע הקוד הקודם. שימו לב שהתאוצה עולה בהדרגה, ולא באופן פתאומי, בכל פעם שיש שינוי פתאומי באמפליטודה של התבנית – כלומר, ב-0ms,‏ 150ms,‏ 200ms,‏ 250ms ו-700ms. יש גם חריגה מעל הערך הרצוי בכל שינוי שלב של האמפליטודה, ויש צלצול גלוי שנמשך לפחות 50 אלפיות השנייה כשאמפליטודת הקלט יורדת באופן פתאומי ל-0.

תרשים של צורת הגל של הקלט של פונקציית הצעד.
תרשים של צורת הגל שנמדדה בפועל, שבו מוצגים יותר מעברים אורגניים בין רמות.

דפוס רטט משופר

כדי להימנע מחריגה מעבר לטווח הרצוי ולקצר את זמן הצלצול, צריך לשנות את האמפליטודות באופן הדרגתי יותר. בתרשים הבא מוצגים תרשים הגל והתאוצה של הגרסה המתוקנת:

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

תרשים של צורת הגל של הקלט עם שלבים נוספים.
תרשים של צורת הגל שנמדדה, שבו מוצגים מעברים חלקים יותר.

יצירת אפקטים של משוב מישוש (haptic) מורכבים יותר

רכיבים אחרים בתגובה הולמת ללחיצה מורכבים יותר, ודורשים ידע מסוים ב-LRA שנעשה בו שימוש במכשיר. כדי לקבל את התוצאות הטובות ביותר, מומלץ להשתמש בצורות הגל המוכנות מראש ובקבועים שסופקו על ידי הפלטפורמה של המכשיר. כך תוכלו:

  • ביצוע אפקטים ופרימיטיבים ברורים.
  • משלבים אותם כדי ליצור אפקטים חדשים של משוב מישוש.

בעזרת הקבועים והפרימיטיבים החזותיים המוגדרים מראש, תוכלו לעבוד מהר יותר וליצור אפקטים חזותיים באיכות גבוהה.