วิเคราะห์รูปแบบคลื่นการสั่น

ตัวกระตุ้นการสั่นที่พบมากที่สุดในอุปกรณ์ Android คือ ตัวกระตุ้นการสั่นแบบเรโซแนนซ์เชิงเส้น (LRA) LRA จำลองความรู้สึกของการคลิกปุ่มบนพื้นผิวกระจกที่ไม่ตอบสนอง สัญญาณการตอบสนองของการคลิกที่ชัดเจนและคมชัดมักจะใช้เวลา 10-20 มิลลิวินาที ความรู้สึกนี้ทำให้การโต้ตอบของผู้ใช้รู้สึกเป็นธรรมชาติมากขึ้น สำหรับคีย์บอร์ดเสมือน การตอบสนองของการคลิกนี้สามารถเพิ่มความเร็วในการพิมพ์และลดข้อผิดพลาดได้

LRA มีความถี่เรโซแนนซ์ที่พบบ่อย 2-3 ความถี่ ดังนี้

  • LRA บางรุ่นมีความถี่เรโซแนนซ์อยู่ในช่วง 200-300 Hz ซึ่งตรงกับความถี่ที่ผิวหนังของมนุษย์มีความไวต่อการสั่นมากที่สุด ความรู้สึกของการสั่นในช่วงความถี่นี้มักจะอธิบายได้ว่าราบรื่น คมชัด และแทรกซึม
  • LRA รุ่นอื่นๆ มีความถี่เรโซแนนซ์ต่ำกว่าที่ประมาณ 150 Hz ความรู้สึกจะนุ่มนวลและเต็มกว่า (ในมิติ)
ส่วนประกอบต่างๆ ได้แก่ ฝาครอบ เพลต แม่เหล็กตรงกลาง แม่เหล็กด้านข้าง 2 อัน มวล สปริง 2 อัน ขดลวด วงจรแบบยืดหยุ่น ฐาน และกาว
ส่วนประกอบของตัวกระตุ้นการสั่นแบบเรโซแนนซ์เชิงเส้น (LRA)

เมื่อใช้แรงดันไฟฟ้าอินพุตเท่ากันที่ความถี่ 2 ความถี่ที่แตกต่างกัน แอมพลิจูดเอาต์พุตของการสั่นอาจแตกต่างกัน ยิ่งความถี่อยู่ห่างจากความถี่เรโซแนนซ์ของ LRA มากเท่าใด แอมพลิจูดของการสั่นก็จะยิ่งต่ำลง

เอฟเฟกต์การสัมผัสของอุปกรณ์หนึ่งๆ ใช้ทั้งตัวกระตุ้นการสั่นและไดรเวอร์ ไดรเวอร์การสัมผัสที่มีฟีเจอร์โอเวอร์ไดรฟ์และการเบรกแบบแอ็กทีฟสามารถลดเวลาที่ใช้ในการเพิ่มขึ้นและเสียงก้องของ LRA ซึ่งนำไปสู่การสั่นที่ตอบสนองได้ดีขึ้นและชัดเจนขึ้น

การเร่งความเร็วเอาต์พุตของตัวสั่น

การแมปความถี่กับการเร่งความเร็วเอาต์พุต (FOAM) อธิบายการเร่งความเร็วเอาต์พุตสูงสุดที่ทำได้ (ใน G peak) ที่ความถี่การสั่นหนึ่งๆ (ใน Hertz) ตั้งแต่ Android 16 (ระดับ API 36) เป็นต้นไป แพลตฟอร์มจะให้การรองรับการแมปนี้ในตัวผ่าน VibratorFrequencyProfile คุณสามารถใช้ คลาสนี้ร่วมกับ API เอนเวโลปพื้นฐานและขั้นสูงเพื่อสร้าง เอฟเฟกต์การโต้ตอบการสัมผัส

มอเตอร์ LRA ส่วนใหญ่มีจุดสูงสุดเพียงจุดเดียวใน FOAM ซึ่งมักจะอยู่ใกล้กับความถี่เรโซแนนซ์ โดยทั่วไปแล้ว การเร่งความเร็วจะลดลงแบบเอ็กซ์โพเนนเชียลเมื่อความถี่เบี่ยงเบนไปจากช่วงนี้ เส้นโค้งอาจไม่สมมาตรและอาจมีช่วงคงที่รอบๆ ความถี่เรโซแนนซ์เพื่อป้องกันไม่ให้มอเตอร์เสียหาย

พล็อตที่อยู่ติดกันแสดง FOAM ตัวอย่างสำหรับมอเตอร์ LRA

เมื่อความถี่เพิ่มขึ้นเป็นประมาณ 120 Hz ความเร่งจะเพิ่มขึ้น
       แบบทวีคูณ จากนั้นความเร่งจะคงที่จนถึงประมาณ 180 Hz
       หลังจากนั้นความเร่งจะลดลง
FOAM ตัวอย่างสำหรับมอเตอร์ LRA

เกณฑ์การตรวจจับการรับรู้ของมนุษย์

เกณฑ์การตรวจจับการรับรู้ของมนุษย์ หมายถึงการเร่งความเร็วขั้นต่ำของการสั่นที่บุคคลสามารถตรวจจับได้อย่างน่าเชื่อถือ ระดับนี้จะแตกต่างกันไปตามความถี่ของการสั่น

พล็อตที่อยู่ติดกันแสดงเกณฑ์การตรวจจับการรับรู้การสัมผัสของมนุษย์ในการเร่งความเร็วเป็นฟังก์ชันของความถี่ชั่วคราว ข้อมูลเกณฑ์จะแปลงจากเกณฑ์การกระจัดในรูปที่ 1 ของบทความ "Four channels mediate the mechanical aspects of touch" ปี 1988 ของ Bolanowski Jr., S. J. และคณะ

Android จะจัดการเกณฑ์นี้โดยอัตโนมัติใน BasicEnvelopeBuilder ซึ่งจะตรวจสอบว่าเอฟเฟกต์ทั้งหมดใช้ช่วงความถี่ที่สร้างแอมพลิจูดของการสั่นที่เกินเกณฑ์การตรวจจับการรับรู้ของมนุษย์อย่างน้อย 10 dB

เมื่อความถี่เพิ่มขึ้นเป็นประมาณ 20 Hz เกณฑ์การตรวจจับของมนุษย์
       จะเพิ่มขึ้นแบบลอการิทึมเป็นประมาณ -35 dB เกณฑ์ยังคงที่
       จนถึงประมาณ 200 Hz หลังจากนั้นจะเพิ่มขึ้นในเชิงเส้นโดยประมาณจนถึง
       -20 dB
เกณฑ์การตรวจจับการรับรู้การสัมผัสของมนุษย์

บทแนะนำออนไลน์จะอธิบายเพิ่มเติมเกี่ยวกับการแปลงระหว่างแอมพลิจูดของการเร่งความเร็วและแอมพลิจูดของการกระจัด

ระดับการเร่งความเร็วของการสั่น

การรับรู้ความเข้มของการสั่นของมนุษย์ ซึ่งเป็นการวัด การรับรู้ ไม่ได้เพิ่มขึ้นแบบเชิงเส้นตามแอมพลิจูดของการสั่น ซึ่งเป็นพารามิเตอร์ ทางกายภาพ ความเข้มที่รับรู้ได้จะแสดงด้วยระดับความรู้สึก (SL) ซึ่งกำหนดเป็นจำนวน dB ที่สูงกว่าเกณฑ์การตรวจจับที่ความถี่เดียวกัน

แอมพลิจูดของการเร่งความเร็วของการสั่นที่เกี่ยวข้อง (ใน G peak) สามารถคำนวณได้ดังนี้

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

...โดยที่แอมพลิจูด dB คือผลรวมของ SL และเกณฑ์การตรวจจับ ซึ่งเป็นค่าตามแกนแนวตั้งในพล็อตที่อยู่ติดกันที่ความถี่หนึ่งๆ

พล็อตที่อยู่ติดกันแสดงระดับการเร่งความเร็วของการสั่นที่ 10, 20, 30, 40 และ 50 dB SL พร้อมกับเกณฑ์การตรวจจับการรับรู้การสัมผัสของมนุษย์ (0 dB SL) เป็นฟังก์ชันของความถี่ชั่วคราว ข้อมูลนี้ประมาณจากรูปที่ 8 ในบทความ "Sensation magnitude of vibrotactile stimuli" ปี 1969 ของ Verrillo, R. T. และคณะ

เมื่อระดับความรู้สึกที่ต้องการเพิ่มขึ้น ความเร่งที่จำเป็น
       ในหน่วย dB จะเพิ่มขึ้นโดยประมาณในปริมาณเดียวกัน ตัวอย่างเช่น ระดับความรู้สึก 10 dB สำหรับการสั่นที่ 100 Hz จะอยู่ที่ประมาณ -20 dB แทนที่จะเป็น -30 dB
ระดับการเร่งความเร็วของการสั่น

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

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

พล็อตต่อไปนี้แสดงรูปคลื่นอินพุตและการเร่งความเร็วเอาต์พุตที่สอดคล้องกับข้อมูลโค้ดก่อนหน้า โปรดทราบว่าการเร่งความเร็วจะเพิ่มขึ้นทีละน้อย ไม่ใช่ทันที เมื่อใดก็ตามที่มีการเปลี่ยนแปลงแอมพลิจูดแบบขั้นบันไดในรูปแบบ นั่นคือที่ 0 มิลลิวินาที, 150 มิลลิวินาที, 200 มิลลิวินาที, 250 มิลลิวินาที และ 700 มิลลิวินาที นอกจากนี้ยังมีการยิงเกินที่การเปลี่ยนแปลงแอมพลิจูดแบบขั้นบันไดแต่ละครั้ง และมีการก้องที่มองเห็นได้ซึ่งใช้เวลาอย่างน้อย 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));

พล็อตของรูปคลื่นอินพุตที่มีขั้นบันไดเพิ่มเติม
พล็อตของรูปคลื่นที่วัด ซึ่งแสดงการเปลี่ยนผ่านที่ราบรื่นขึ้น

สร้างเอฟเฟกต์การสัมผัสที่ซับซ้อนมากขึ้น

องค์ประกอบอื่นๆ ในการตอบสนองของการคลิกที่น่าพึงพอใจมีความซับซ้อนมากขึ้น ซึ่งต้องมีความรู้เกี่ยวกับ LRA ที่ใช้ในอุปกรณ์ ใช้รูปคลื่นที่สร้างไว้ล่วงหน้าของอุปกรณ์และค่าคงที่ที่แพลตฟอร์มมีให้เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด ซึ่งจะช่วยให้คุณทำสิ่งต่อไปนี้ได้

  • สร้างเอฟเฟกต์และองค์ประกอบพื้นฐานที่ชัดเจน
  • นำเอฟเฟกต์และองค์ประกอบพื้นฐานเหล่านั้นมาต่อกันเพื่อสร้างเอฟเฟกต์การสัมผัสใหม่

ค่าคงที่และองค์ประกอบพื้นฐานของการสัมผัสที่กำหนดไว้ล่วงหน้าเหล่านี้สามารถเร่งความเร็วในการทำงานของคุณได้อย่างมากขณะสร้างเอฟเฟกต์การสัมผัสคุณภาพสูง