Android ডিভাইসে সবচেয়ে সাধারণ ভাইব্রেশন অ্যাকচুয়েটর হল লিনিয়ার রেসোন্যান্ট অ্যাকচুয়েটর (LRA)। LRA, অন্যথায় কাজ না করা কাঁচের সারফেসে বোতামে ক্লিক করার অনুভূতি তৈরি করে। পরিষ্কার ও ঝকঝকে ক্লিক ফিডব্যাক সিগন্যালের সময়সীমা সাধারণত ১০ থেকে ২০ মিলিসেকেন্ড হয়। এই অনুভূতি ব্যবহারকারীর ইন্টার্যাকশনকে আরও স্বাভাবিক করে তোলে। ভার্চুয়াল কীবোর্ডের ক্ষেত্রে, এই ক্লিক ফিডব্যাক টাইপিং স্পিড বাড়াতে এবং ভুল কমাতে পারে।
LRA-এর কিছু সাধারণ রেজোন্যান্ট ফ্রিকোয়েন্সি থাকে:
- কিছু LRA-এর রেসোন্যান্ট ফ্রিকোয়েন্সি ২০০ থেকে ৩০০ Hz রেঞ্জে ছিল, যা সেই ফ্রিকোয়েন্সির সাথে মিলে যায় যেখানে মানুষের ত্বক কম্পনের প্রতি সবচেয়ে বেশি সংবেদনশীল। এই ফ্রিকোয়েন্সি রেঞ্জে কম্পনের অনুভূতিকে সাধারণত মসৃণ, তীক্ষ্ণ ও গভীর বলে বর্ণনা করা হয়।
- LRA-এর অন্যান্য মডেলে রেসোন্যান্স ফ্রিকোয়েন্সি কম থাকে, প্রায় ১৫০ Hz. এর ফলে যে অনুভূতি হয় তা তুলনামূলকভাবে অনেক বেশি নরম ও পূর্ণ (ডাইমেনশন অনুযায়ী)।
দুটি আলাদা ফ্রিকোয়েন্সিতে একই ইনপুট ভোল্টেজ দেওয়া হলে, ভাইব্রেশন আউটপুট অ্যামপ্লিটিউড আলাদা হতে পারে। LRA-এর রেজোন্যান্ট ফ্রিকোয়েন্সি থেকে ফ্রিকোয়েন্সি যত দূরে থাকবে, এর কম্পনের অ্যামপ্লিটিউড তত কম হবে।
কোনও ডিভাইসের হ্যাপ্টিক এফেক্ট ভাইব্রেশন অ্যাকচুয়েটর ও এর ড্রাইভার, দুটিই ব্যবহার করে। ওভারড্রাইভ ও অ্যাক্টিভ ব্রেকিং ফিচার সহ হ্যাপটিক ড্রাইভার LRA-এর রাইজ টাইম ও রিং করা কমাতে পারে, এর ফলে আরও বেশি রেসপন্সিভ ও স্পষ্ট ভাইব্রেশন পাওয়া যায়।
ভাইব্রেটর আউটপুট অ্যাক্সিলারেশন
ফ্রিকোয়েন্সি-টু-আউটপুট-অ্যাক্সিলারেশন ম্যাপিং (FOAM) কোনও নির্দিষ্ট ভাইব্রেশন ফ্রিকোয়েন্সিতে (হার্ৎজ
এককে) অর্জনযোগ্য সর্বোচ্চ আউটপুট অ্যাক্সিলারেশন (G পিক
এককে) বর্ণনা করে। Android 16 (API লেভেল 36) থেকে শুরু করে, প্ল্যাটফর্ম VibratorFrequencyProfile-এর মাধ্যমে এই ম্যাপিংয়ের জন্য বিল্ট-ইন
সাপোর্ট প্রদান করে। হ্যাপ্টিক এফেক্ট তৈরি করতে, প্রাথমিক ও উন্নত এনভেলপ API-এর সাথে
এই ক্লাস ব্যবহার করতে পারবেন।
বেশিরভাগ LRA মোটরের FOAM-এ একটি করে পিক থাকে, সাধারণত সেটি রেসোন্যান্ট ফ্রিকোয়েন্সির কাছাকাছি থাকে। এই রেঞ্জ থেকে ফ্রিকোয়েন্সি সরে গেলে অ্যাক্সিলারেশন সাধারণত এক্সপোনেনশিয়ালি কমে যায়। কার্ভটি সিমেট্রিক্যাল নাও হতে পারে এবং মোটরকে ক্ষতি থেকে রক্ষা করার জন্য রেসোন্যান্ট ফ্রিকোয়েন্সির আশেপাশে একটি প্লাটো থাকতে পারে।
পাশের প্লটে LRA মোটরের জন্য FOAM-এর একটি উদাহরণ দেখানো হয়েছে।
মানুষের পারসেপশন শনাক্তকরণের থ্রেশহোল্ড
মানুষের পারসেপশন শনাক্তকরণ থ্রেশহোল্ড বলতে ভাইব্রেশনের ন্যূনতম অ্যাক্সিলারেশনকে বোঝায় যা কোনও ব্যক্তি নির্ভরযোগ্যভাবে শনাক্ত করতে পারেন। কম্পনের ফ্রিকোয়েন্সির উপর নির্ভর করে এই লেভেল পরিবর্তিত হয়।
পাশের প্লটে, টেম্পোরাল ফ্রিকোয়েন্সির ফাংশন হিসেবে অ্যাক্সিলারেশনে, হিউম্যান হ্যাপটিক পারসেপশন ডিটেকশন থ্রেশহোল্ড দেখানো হয়েছে। থ্রেশহোল্ড ডেটা হল Bolanowski Jr.-এর ১ নম্বর ছবিতে দেখানো ডিসপ্লেসমেন্ট থ্রেশহোল্ড থেকে কনভার্ট করা ডেটা, S. J., et al.-এর ১৯৮৮ সালের নিবন্ধ, "স্পর্শের মেকানিক্যাল দিকগুলি চারটি চ্যানেল দ্বারা মধ্যস্থতা করা হয়।"।
Android অটোমেটিক এই থ্রেশহোল্ড BasicEnvelopeBuilder-এ ম্যানেজ করে,
যা যাচাই করে যে সমস্ত এফেক্ট এমন ফ্রিকোয়েন্সি রেঞ্জ ব্যবহার করে যা অন্তত
১০ dB-এর বেশি ভাইব্রেশন অ্যামপ্লিটিউড তৈরি করে।
ত্বরণ, অ্যামপ্লিটিউড ও ডিসপ্লেসমেন্ট অ্যামপ্লিটিউডের মধ্যে কনভার্সন সম্পর্কে অনলাইন টিউটোরিয়ালে আরও ব্যাখ্যা করা হয়েছে।
ভাইব্রেশন অ্যাক্সিলারেশন লেভেল
কম্পনের তীব্রতা সম্পর্কে মানুষের ধারণা, যা একটি ধারণা পরিমাপ, কম্পনের অ্যামপ্লিটিউডের সাথে রৈখিকভাবে বৃদ্ধি পায় না, এটি একটি ফিজিক্যাল প্যারামিটার। অনুভূত তীব্রতা সংবেদন লেভেল (SL) দ্বারা চিহ্নিত করা হয়, যা একই ফ্রিকোয়েন্সিতে শনাক্তকরণ থ্রেশহোল্ডের উপরে dB পরিমাণ হিসেবে সংজ্ঞায়িত করা হয়।
সংশ্লিষ্ট কম্পন ত্বরণের প্রশস্ততা (G পিক-এ) নিম্নলিখিত উপায়ে গণনা করা যেতে পারে:
...যেখানে অ্যামপ্লিটিউড dB হল SL এবং শনাক্তকরণ থ্রেশহোল্ডের যোগফল— পাশাপাশি প্লটে উল্লম্ব অক্ষ বরাবর ভ্যালু—একটি নির্দিষ্ট ফ্রিকোয়েন্সিতে।
পাশের প্লটে ১০, ২০, ৩০, ৪০ এবং ৫০ dB SL-এ কম্পন অ্যাক্সিলারেশন লেভেল দেখানো হয়েছে। এর সাথে, হিউম্যান হ্যাপটিক পারসেপশন ডিটেকশন থ্রেশহোল্ড (০ dB SL)-ও দেখানো হয়েছে। এগুলি টেম্পোরাল ফ্রিকোয়েন্সির ফাংশন হিসেবে দেখানো হয়েছে। এই ডেটা Verrillo, R.-এর Figure 8 থেকে অনুমান করা হয়েছে। T., et al.'s 1969 article, "Sensation magnitude of vibrotactile stimuli.".
Android অটোমেটিক এই কনভার্সনটি BasicEnvelopeBuilder-এ হ্যান্ডেল করে,
যা সেনসেশন লেভেল স্পেসে (dB
SL) স্বাভাবিক করা ইনটেনসিটি হিসেবে ভ্যালু নেয় এবং সেগুলিকে আউটপুট অ্যাক্সিলারেশনে কনভার্ট করে। অন্যদিকে, WaveformEnvelopeBuilder
এই কনভার্সন প্রয়োগ করে না এবং পরিবর্তে অ্যাক্সিলারেশন স্পেসে (Gs) স্বাভাবিক করা
আউটপুট অ্যাক্সিলারেশন অ্যামপ্লিটিউড হিসেবে ভ্যালু নেয়। এনভেলপ API ধরে নেয় যে, কোনও ডিজাইনার বা ডেভেলপার যখন
ভাইব্রেশনের তীব্রতা পরিবর্তনের কথা ভাবেন, তখন তারা আশা করেন যে অনুভূত তীব্রতা একটি খণ্ড খণ্ড
লিনিয়ার এনভেলপ অনুসরণ করবে।
ডিভাইসে ডিফল্ট ওয়েভফর্ম স্মুথিং
উদাহরণস্বরূপ, কোনও সাধারণ ডিভাইসে কাস্টম ওয়েভফর্ম প্যাটার্ন কীভাবে আচরণ করে তা বিবেচনা করুন:
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))
জাভা
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-এ—অ্যাক্সিলারেশন হঠাৎ করে নয়, ধীরে ধীরে বাড়ে। এছাড়াও, অ্যামপ্লিটিউডের প্রতিটি ধাপ পরিবর্তনের সময় ওভারশুট হয় এবং ইনপুট অ্যামপ্লিটিউড হঠাৎ করে ০-এ নেমে গেলে অন্তত ৫০ms ধরে রিং হতে দেখা যায়।
উন্নত হ্যাপ্টিক প্যাটার্ন
ওভারশুট এড়াতে এবং রিং করার সময় কমাতে, অ্যামপ্লিটিউডগুলি আরও ধীরে ধীরে পরিবর্তন করুন। নিচে সংশোধিত ভার্সনের ওয়েভফর্ম ও অ্যাক্সিলারেশন প্লট দেখানো হল:
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 // Don't 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; // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
আরও জটিল হ্যাপ্টিক এফেক্ট তৈরি করা
সন্তুষ্টজনক ক্লিক উত্তরের অন্যান্য এলিমেন্ট আরও জটিল, এর জন্য ডিভাইসে ব্যবহৃত LRA-এর কিছু জ্ঞান থাকা প্রয়োজন। সবচেয়ে ভালো ফলাফল পেতে, ডিভাইসের আগে থেকে তৈরি ওয়েভফর্ম ও প্ল্যাটফর্মের দেওয়া কনস্ট্যান্ট ব্যবহার করুন, যা আপনাকে এগুলি করতে দেয়:
- পরিষ্কার এফেক্ট ও প্রিমিটিভ পারফর্ম করুন।
- নতুন হ্যাপ্টিক এফেক্ট কম্পোজ করতে সেগুলি কনক্যাটেনেট করুন।
উচ্চ-কোয়ালিটির হ্যাপ্টিক এফেক্ট তৈরি করার সময় এইসব আগে থেকে সংজ্ঞায়িত হ্যাপ্টিক ধ্রুবক ও আদিম উপাদান আপনার কাজকে অনেক দ্রুত করে তুলতে পারে।