تجزیه و تحلیل شکل موج ارتعاش

رایج ترین محرک های ارتعاشی در دستگاه های اندرویدی ، محرک های تشدید خطی (LRAs) هستند. LRAها احساس کلیک روی یک دکمه را شبیه سازی می کنند که در غیر این صورت یک سطح شیشه ای بی پاسخ است. یک سیگنال بازخورد کلیک واضح و واضح معمولا بین 10 تا 20 میلی ثانیه طول می کشد. این حس باعث می شود که تعامل با کاربر طبیعی تر شود. برای صفحه کلیدهای مجازی، این بازخورد کلیک می تواند سرعت تایپ را افزایش داده و خطاها را کاهش دهد.

LRA ها دارای چند فرکانس تشدید مشترک هستند:

  • برخی از LRAها دارای فرکانس تشدید در محدوده 200 تا 300 هرتز بودند که با فرکانسی که پوست انسان در آن بیشترین حساسیت را به ارتعاش دارد همزمان است. احساس ارتعاشات در این محدوده فرکانس معمولاً به صورت صاف، تیز و نافذ توصیف می شود.
  • مدل‌های دیگر LRA فرکانس‌های تشدید پایین‌تری دارند، در حدود 150 هرتز. احساس از نظر کیفی نرمتر و پرتر (از نظر ابعاد) است.
اجزاء شامل، از بالا به پایین، یک پوشش، صفحه، وسط است        آهنربا، 2 آهنربای جانبی، جرم، 2 فنر، سیم پیچ، مدار انعطاف پذیر، پایه،        و چسب.
اجزای یک محرک رزونانس خطی (LRA).

با توجه به ولتاژ ورودی یکسان در دو فرکانس مختلف، دامنه خروجی ارتعاش می تواند متفاوت باشد. هر چه فرکانس از فرکانس تشدید LRA دورتر باشد، دامنه ارتعاش آن کمتر است.

جلوه های لمسی یک دستگاه خاص از محرک لرزش و درایور آن استفاده می کند. درایورهای هپتیک که شامل ویژگی‌های ترمز بیش از حد و فعال هستند، می‌توانند زمان خیز و زنگ LRA را کاهش دهند و منجر به لرزش واضح‌تر و واکنش‌پذیرتر شوند.

شتاب خروجی ویبراتور

نگاشت شتاب فرکانس به خروجی (FOAM) حداکثر شتاب خروجی قابل دستیابی (در پیک G) را در یک فرکانس ارتعاش معین (به هرتز) توصیف می کند. با شروع Android 16 (سطح API 36)، این پلتفرم از طریق VibratorFrequencyProfile پشتیبانی داخلی برای این نقشه برداری ارائه می دهد. می توانید از این کلاس به همراه API های اولیه و پیشرفته envelope برای ایجاد جلوه های لمسی استفاده کنید.

اکثر موتورهای LRA دارای یک پیک واحد در فوم خود هستند که معمولاً نزدیک به فرکانس تشدیدشان است. به طور کلی با انحراف فرکانس از این محدوده، شتاب به طور تصاعدی کاهش می یابد. منحنی ممکن است متقارن نباشد و ممکن است دارای یک فلات در اطراف فرکانس تشدید برای محافظت از موتور در برابر آسیب باشد.

نمودار مجاور یک نمونه FOAM را برای یک موتور LRA نشان می دهد.

با افزایش فرکانس به حدود 120 هرتز، شتاب افزایش می یابد        به صورت تصاعدی سپس شتاب تا حدود 180 هرتز ثابت می ماند،        پس از آن باریک می شود.
نمونه فوم برای یک موتور LRA.

آستانه تشخیص ادراک انسانی

آستانه تشخیص ادراک انسانی به حداقل شتاب یک ارتعاش اشاره دارد که یک فرد می تواند به طور قابل اعتماد تشخیص دهد. این سطح بر اساس فرکانس ارتعاش متفاوت است.

نمودار مجاور آستانه تشخیص ادراک لمسی انسان را در شتاب به عنوان تابعی از فرکانس زمانی نشان می دهد. داده های آستانه از آستانه جابجایی در شکل 1 از مقاله Bolanowski Jr., SJ, et al. در سال 1988، "چهار کانال واسطه جنبه های مکانیکی لمس" است. .

Android به‌طور خودکار این آستانه را در BasicEnvelopeBuilder کنترل می‌کند، که تأیید می‌کند که همه افکت‌ها از محدوده فرکانسی استفاده می‌کنند که دامنه‌های ارتعاشی را ایجاد می‌کند که حداقل ۱۰ دسی‌بل از آستانه تشخیص درک انسان فراتر می‌رود.

با افزایش فرکانس به حدود 20 هرتز، آستانه تشخیص انسان        به صورت لگاریتمی تا حدود -35 دسی بل افزایش می یابد. آستانه ثابت می ماند        از طریق حدود 200 هرتز، پس از آن تقریباً خطی از طریق افزایش می یابد        -20 دسی بل
آستانه تشخیص ادراک لمسی انسان

یک آموزش آنلاین تبدیل بین دامنه شتاب و دامنه جابجایی را بیشتر توضیح می دهد.

سطوح شتاب ارتعاش

درک انسان از شدت ارتعاش، یک معیار ادراک ، با دامنه ارتعاش، یک پارامتر فیزیکی ، به صورت خطی رشد نمی کند. شدت درک شده با سطح حس (SL) مشخص می شود که به عنوان مقدار دسی بل بالاتر از آستانه تشخیص در همان فرکانس تعریف می شود.

دامنه شتاب ارتعاش مربوطه (در پیک G) را می توان به صورت زیر محاسبه کرد:

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

... که در آن دامنه dB مجموع SL و آستانه تشخیص - مقدار در امتداد محور عمودی در نمودار مجاور - در یک فرکانس خاص است.

نمودار مجاور سطوح شتاب ارتعاش را در 10، 20، 30، 40 و 50 dB SL، همراه با آستانه تشخیص ادراک لمسی انسان (0dB SL)، به عنوان تابعی از فرکانس زمانی نشان می دهد. داده ها از شکل 8 در مقاله Verrillo، RT و همکاران در سال 1969، "قدرت حس محرک های ارتعاشی" برآورد شده است. .

با افزایش سطح حس مورد نظر، شتاب مورد نیاز،        در دسی بل، تقریباً به همان مقدار افزایش می یابد. به عنوان مثال، 10 دسی بل        سطح احساس برای ارتعاش 100 هرتز به جای 20- دسی بل است        -30 دسی بل
سطوح شتاب ارتعاش

Android به‌طور خودکار این تبدیل را در BasicEnvelopeBuilder انجام می‌دهد، که مقادیر را به صورت شدت‌های عادی در فضای سطح حس (dB SL) می‌گیرد و آنها را به شتاب خروجی تبدیل می‌کند. از طرف دیگر، WaveformEnvelopeBuilder این تبدیل را اعمال نمی کند و به جای آن مقادیر را به عنوان دامنه شتاب خروجی نرمال شده در فضای شتاب (Gs) می گیرد. Envelope API فرض می‌کند که وقتی یک طراح یا توسعه‌دهنده به تغییرات در قدرت ارتعاش فکر می‌کند، انتظار دارند که شدت درک شده از یک پوشش خطی تکه‌ای پیروی کند.

هموارسازی شکل موج پیش فرض در دستگاه ها

برای مثال، نحوه رفتار یک الگوی شکل موج سفارشی در یک دستگاه عمومی را در نظر بگیرید:

کاتلین

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

جاوا

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. همچنین در هر مرحله تغییر دامنه، یک افزایش بیش از حد وجود دارد و زمانی که دامنه ورودی ناگهان به 0 می رسد، زنگ قابل مشاهده ای وجود دارد که حداقل 50 میلی ثانیه طول می کشد.

نمودار شکل موج ورودی تابع پله.
نمودار شکل موج اندازه‌گیری شده واقعی، انتقال ارگانیک بیشتری را بین سطوح نشان می‌دهد.

الگوی لمسی بهبود یافته

برای جلوگیری از بیش از حد و کاهش زمان زنگ، دامنه ها را به تدریج تغییر دهید. شکل زیر نمودارهای شکل موج و شتاب نسخه اصلاح شده را نشان می دهد:

کاتلین

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

جاوا

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

نمودار شکل موج ورودی با مراحل اضافی.
نمودار شکل موج اندازه‌گیری شده، انتقال نرم‌تر را نشان می‌دهد.

جلوه های لمسی پیچیده تری ایجاد کنید

عناصر دیگر در یک پاسخ کلیک رضایت‌بخش پیچیده‌تر هستند و به دانش LRA مورد استفاده در دستگاه نیاز دارند. برای بهترین نتیجه، از شکل موج های از پیش ساخته شده دستگاه و ثابت های ارائه شده توسط پلت فرم استفاده کنید که به شما امکان می دهد کارهای زیر را انجام دهید:

  • جلوه های واضح و ابتدایی را اجرا کنید.
  • آنها را به هم متصل کنید تا جلوه های لمسی جدید بسازید.

این ثابت های لمسی و اولیه از پیش تعریف شده می توانند در عین ایجاد جلوه های لمسی با کیفیت بالا، سرعت کار شما را تا حد زیادی افزایش دهند.