কম্পন তরঙ্গরূপ বিশ্লেষণ করুন

অ্যান্ড্রয়েড ডিভাইসগুলিতে সবচেয়ে প্রচলিত ভাইব্রেশন অ্যাকচুয়েটর হলো লিনিয়ার রেজোনেন্ট অ্যাকচুয়েটর (এলআরএ) । এলআরএ এমন একটি কাঁচের পৃষ্ঠে বাটন ক্লিকের অনুভূতিকে অনুকরণ করে, যা অন্যথায় কোনো সাড়া দেয় না। একটি স্পষ্ট ও তীক্ষ্ণ ক্লিক ফিডব্যাক সিগন্যাল সাধারণত ১০ থেকে ২০ মিলিসেকেন্ড পর্যন্ত স্থায়ী হয়। এই অনুভূতি ব্যবহারকারীর মিথস্ক্রিয়াকে আরও স্বাভাবিক করে তোলে। ভার্চুয়াল কীবোর্ডের ক্ষেত্রে, এই ক্লিক ফিডব্যাক টাইপিং গতি বাড়াতে এবং ভুল কমাতে পারে।

এলআরএ-গুলির কয়েকটি সাধারণ অনুরণন কম্পাঙ্ক রয়েছে:

  • কিছু এলআরএ-এর অনুরণন কম্পাঙ্ক ছিল ২০০ থেকে ৩০০ হার্টজ পরিসরে, যা সেই কম্পাঙ্কের সাথে মিলে যায় যেখানে মানুষের ত্বক কম্পনের প্রতি সবচেয়ে বেশি সংবেদনশীল। এই কম্পাঙ্ক পরিসরের কম্পনের অনুভূতিকে সাধারণত মসৃণ, তীক্ষ্ণ এবং ভেদনকারী হিসাবে বর্ণনা করা হয়।
  • এলআরএ-এর অন্যান্য মডেলগুলির অনুরণন কম্পাঙ্ক কম, প্রায় ১৫০ হার্জ। এর অনুভূতি গুণগতভাবে আরও কোমল এবং (আকারে) আরও পূর্ণাঙ্গ।
উপর থেকে নিচে এর উপাদানগুলোর মধ্যে রয়েছে, একটি ঢাকনা, প্লেট, মাঝের চুম্বক, ২টি পাশের চুম্বক, ভর, ২টি স্প্রিং, কয়েল, ফ্লেক্সিবল সার্কিট, ভিত্তি,  এবং আঠা।
লিনিয়ার রেজোনেন্ট অ্যাকচুয়েটর (LRA)-এর উপাদানসমূহ।

দুটি ভিন্ন কম্পাঙ্কে একই ইনপুট ভোল্টেজ দেওয়া হলে, কম্পনের আউটপুট বিস্তার ভিন্ন হতে পারে। কম্পাঙ্কটি LRA-এর অনুনাদ কম্পাঙ্ক থেকে যত দূরে হবে, এর কম্পনের বিস্তার তত কম হবে।

একটি নির্দিষ্ট ডিভাইসের হ্যাপটিক এফেক্টগুলো ভাইব্রেশন অ্যাকচুয়েটর এবং এর ড্রাইভার উভয়ই ব্যবহার করে। যে হ্যাপটিক ড্রাইভারগুলোতে ওভারড্রাইভ এবং অ্যাক্টিভ ব্রেকিং ফিচার অন্তর্ভুক্ত থাকে, সেগুলো এলআরএ-এর রাইজ টাইম ও রিংগিং কমাতে পারে, যার ফলে আরও বেশি রেসপন্সিভ ও স্পষ্ট ভাইব্রেশন পাওয়া যায়।

ভাইব্রেটর আউটপুট ত্বরণ

ফ্রিকোয়েন্সি-টু-আউটপুট-অ্যাক্সিলারেশন ম্যাপিং (FOAM) একটি নির্দিষ্ট ভাইব্রেশন ফ্রিকোয়েন্সিতে (হার্টজে) সর্বোচ্চ অর্জনযোগ্য আউটপুট অ্যাক্সিলারেশন (জি পিক-এ) বর্ণনা করে। অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬) থেকে, প্ল্যাটফর্মটি VibratorFrequencyProfile এর মাধ্যমে এই ম্যাপিংয়ের জন্য বিল্ট-ইন সাপোর্ট প্রদান করে। আপনি বেসিক এবং অ্যাডভান্সড এনভেলপ এপিআই-এর সাথে এই ক্লাসটি ব্যবহার করে হ্যাপটিক ইফেক্ট তৈরি করতে পারেন।

বেশিরভাগ LRA মোটরের FOAM-এ একটিমাত্র শীর্ষবিন্দু থাকে, যা সাধারণত তাদের অনুনাদ কম্পাঙ্কের কাছাকাছি অবস্থিত। কম্পাঙ্ক এই পরিসর থেকে বিচ্যুত হলে ত্বরণ সাধারণত সূচকীয়ভাবে হ্রাস পায়। বক্ররেখাটি প্রতিসম নাও হতে পারে এবং মোটরকে ক্ষতি থেকে রক্ষা করার জন্য অনুনাদ কম্পাঙ্কের আশেপাশে একটি মালভূমির মতো অংশ থাকতে পারে।

সংলগ্ন প্লটটিতে একটি LRA মোটরের জন্য FOAM-এর একটি উদাহরণ দেখানো হয়েছে।

যখন কম্পাঙ্ক প্রায় ১২০ হার্জ পর্যন্ত বৃদ্ধি পায়, ত্বরণ সূচকীয়ভাবে বৃদ্ধি পায়। তারপর ত্বরণ প্রায় ১৮০ হার্জ পর্যন্ত স্থির থাকে, যার পরে এটি ধীরে ধীরে হ্রাস পায়।
একটি LRA মোটরের জন্য ফোমের নমুনা।

মানুষের উপলব্ধি সনাক্তকরণ সীমা

মানুষের উপলব্ধি শনাক্তকরণ প্রান্তসীমা বলতে কোনো কম্পনের সেই ন্যূনতম ত্বরণকে বোঝায় যা একজন ব্যক্তি নির্ভরযোগ্যভাবে শনাক্ত করতে পারে। এই মাত্রা কম্পনের কম্পাঙ্কের উপর ভিত্তি করে পরিবর্তিত হয়।

সংলগ্ন প্লটটি টেম্পোরাল ফ্রিকোয়েন্সির ফাংশন হিসাবে, ত্বরণের এককে, মানুষের স্পর্শ সংবেদনের শনাক্তকরণ থ্রেশহোল্ড দেখায়। এই থ্রেশহোল্ড ডেটাটি বোলানোস্কি জুনিয়র, এসজে, প্রমুখের ১৯৮৮ সালের "Four channels mediate the mechanical aspects of touch" শীর্ষক প্রবন্ধের চিত্র ১-এর সরণ থ্রেশহোল্ড থেকে রূপান্তরিত করা হয়েছে।

অ্যান্ড্রয়েড স্বয়ংক্রিয়ভাবে BasicEnvelopeBuilder এ এই থ্রেশহোল্ডটি পরিচালনা করে, যা যাচাই করে যে সমস্ত ইফেক্ট এমন একটি ফ্রিকোয়েন্সি রেঞ্জ ব্যবহার করছে যা এমন কম্পন বিস্তার তৈরি করে যা মানুষের উপলব্ধি শনাক্তকরণ থ্রেশহোল্ডকে কমপক্ষে ১০ ডিবি অতিক্রম করে।

যখন কম্পাঙ্ক প্রায় 20 Hz পর্যন্ত বৃদ্ধি পায়, তখন মানুষের শনাক্তকরণ সীমা লগারিদমিকভাবে বৃদ্ধি পেয়ে প্রায় -35 dB হয়। এই সীমা প্রায় 200 Hz পর্যন্ত স্থির থাকে, যার পরে এটি মোটামুটি রৈখিকভাবে বৃদ্ধি পেয়ে -20 dB-এ পৌঁছায়।
মানুষের স্পর্শানুভূতি শনাক্তকরণের প্রান্তসীমা।

একটি অনলাইন টিউটোরিয়ালে ত্বরণ বিস্তার এবং সরণ বিস্তারের মধ্যে রূপান্তরটি আরও ব্যাখ্যা করা হয়েছে।

কম্পন ত্বরণের মাত্রা

কম্পনের তীব্রতা সম্পর্কে মানুষের উপলব্ধি, যা একটি সংবেদন পরিমাপ, তা কম্পনের বিস্তার (একটি ভৌত ​​পরামিতি)-এর সাথে রৈখিকভাবে বৃদ্ধি পায় না। অনুভূত তীব্রতাকে সংবেদন স্তর (SL) দ্বারা চিহ্নিত করা হয়, যা একই কম্পাঙ্কে শনাক্তকরণ প্রান্তসীমার উপরে একটি dB পরিমাণ হিসাবে সংজ্ঞায়িত করা হয়।

সংশ্লিষ্ট কম্পন ত্বরণের বিস্তার (জি পিক এককে) নিম্নোক্তভাবে গণনা করা যেতে পারে:

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

...যেখানে বিস্তার dB হলো একটি নির্দিষ্ট কম্পাঙ্কে SL এবং শনাক্তকরণ প্রান্তিক মানের (যা সংলগ্ন প্লটের উল্লম্ব অক্ষ বরাবর অবস্থিত) যোগফল।

সংলগ্ন প্লটটিতে টেম্পোরাল ফ্রিকোয়েন্সির ফাংশন হিসেবে ১০, ২০, ৩০, ৪০ এবং ৫০ ডিবি এসএল-এ কম্পন ত্বরণের মাত্রা এবং মানুষের স্পর্শানুভূতি শনাক্তকরণ প্রান্তসীমা (০ ডিবি এসএল) দেখানো হয়েছে। এই ডেটা ভেরিলো, আরটি, প্রমুখের ১৯৬৯ সালের "Sensation magnitude of vibrotactile stimuli" শীর্ষক প্রবন্ধের চিত্র ৮ থেকে অনুমান করা হয়েছে।

কাঙ্ক্ষিত সংবেদন স্তর বাড়ার সাথে সাথে, প্রয়োজনীয় ত্বরণ, dB-তে, প্রায় একই পরিমাণে বৃদ্ধি পায়। উদাহরণস্বরূপ, 100 Hz কম্পনের জন্য 10 dB সংবেদন স্তর প্রায় -20 dB, -30 dB-এর পরিবর্তে।
কম্পন ত্বরণের মাত্রা।

অ্যান্ড্রয়েড BasicEnvelopeBuilder এ স্বয়ংক্রিয়ভাবে এই রূপান্তরটি পরিচালনা করে, যা সেনসেশন লেভেল স্পেসে (dB SL) স্বাভাবিককৃত তীব্রতা হিসেবে মান গ্রহণ করে এবং সেগুলোকে আউটপুট ত্বরণে রূপান্তরিত করে। অন্যদিকে, WaveformEnvelopeBuilder এই রূপান্তরটি প্রয়োগ করে না এবং এর পরিবর্তে ত্বরণ স্পেসে (Gs) স্বাভাবিককৃত আউটপুট ত্বরণ বিস্তার হিসেবে মান গ্রহণ করে। এনভেলপ এপিআই ধরে নেয় যে, যখন কোনো ডিজাইনার বা ডেভেলপার কম্পনের শক্তির পরিবর্তন নিয়ে চিন্তা করেন, তখন তারা আশা করেন যে অনুভূত তীব্রতা একটি খণ্ড-রৈখিক এনভেলপ অনুসরণ করবে।

ডিভাইসগুলিতে ডিফল্ট ওয়েভফর্ম স্মুথিং

উদাহরণস্বরূপ, একটি সাধারণ ডিভাইসে একটি কাস্টম ওয়েভফর্ম প্যাটার্ন কীভাবে কাজ করে তা বিবেচনা করুন:

কোটলিন

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

নিম্নলিখিত প্লটগুলো পূর্ববর্তী কোড স্নিপেটগুলোর সাথে সম্পর্কিত ইনপুট ওয়েভফর্ম এবং আউটপুট অ্যাক্সিলারেশন দেখায়। লক্ষ্য করুন যে, যখনই প্যাটার্নে অ্যাম্প্লিটিউডের একটি স্টেপ পরিবর্তন হয়—অর্থাৎ, ০ms, ১৫০ms, ২০০ms, ২৫০ms, এবং ৭০০ms-এ—অ্যাক্সিলারেশন হঠাৎ করে নয়, বরং ধীরে ধীরে বৃদ্ধি পায়। অ্যাম্প্লিটিউডের প্রতিটি স্টেপ পরিবর্তনে একটি ওভারশুটও দেখা যায়, এবং যখন ইনপুট অ্যাম্প্লিটিউড হঠাৎ করে ০-তে নেমে আসে, তখন একটি দৃশ্যমান রিংগিং দেখা যায় যা কমপক্ষে ৫০ms স্থায়ী হয়।

স্টেপ ফাংশন ইনপুট তরঙ্গরূপের অঙ্কন।
প্রকৃত পরিমাপকৃত তরঙ্গরূপের প্লট, যা স্তরগুলির মধ্যে আরও স্বাভাবিক রূপান্তর প্রদর্শন করে।

উন্নত স্পর্শানুভূতির ধরণ

ওভারশুট এড়াতে এবং রিংগিং টাইম কমাতে, অ্যাম্প্লিটিউডগুলো আরও ধীরে ধীরে পরিবর্তন করুন। নিচে সংশোধিত সংস্করণটির ওয়েভফর্ম এবং অ্যাক্সিলারেশন প্লট দেখানো হলো:

কোটলিন

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 সম্পর্কে কিছু জ্ঞান থাকা প্রয়োজন। সর্বোত্তম ফলাফলের জন্য, ডিভাইসটির পূর্ব-নির্মিত ওয়েভফর্ম এবং প্ল্যাটফর্ম-প্রদত্ত কনস্ট্যান্ট ব্যবহার করুন, যা আপনাকে নিম্নলিখিত কাজগুলো করতে দেয়:

  • সুস্পষ্ট প্রভাব এবং আদিম উপাদানসমূহ সম্পাদন করুন।
  • নতুন স্পর্শজনিত প্রভাব তৈরি করতে এগুলোকে সংযুক্ত করুন।

এই পূর্বনির্ধারিত হ্যাপটিক কনস্ট্যান্ট এবং প্রিমিটিভগুলো উচ্চ-মানের হ্যাপটিক ইফেক্ট তৈরি করার সময় আপনার কাজের গতি ব্যাপকভাবে বাড়িয়ে দিতে পারে।