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

เอกสารนี้อธิบาย Linear Resonant Actuators (LRA) ซึ่งเป็นตัวกระตุ้นการสั่นทั่วไปในอุปกรณ์ Android โดยให้รายละเอียดลักษณะของ LRA วิธีสร้างการตอบสนองแบบรู้สึกได้ และวิธีสร้างรูปแบบการสัมผัสที่มีประสิทธิภาพโดยใช้ Android API keywords_public: > การโต้ตอบการสัมผัสใน Android, ตัวกระตุ้นการสัมผัส, Linear Resonant Actuators, LRA, การสั่น, การตอบสนองแบบรู้สึกได้, VibratorFrequencyProfile, VibrationEffect, UI ของ Android

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

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

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

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

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

การเร่งความเร็วเอาต์พุตของไวเบรเตอร์

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Android จะจัดการการแปลงนี้โดยอัตโนมัติใน BasicEnvelopeBuilder ซึ่งรับค่าเป็นความเข้มที่ปรับให้เป็นมาตรฐานในพื้นที่ระดับความรู้สึก (dB SL) และแปลงเป็นความเร่งเอาต์พุต ในทางกลับกัน WaveformEnvelopeBuilder จะไม่ใช้ Conversion นี้และใช้ค่าเป็นแอมพลิจูดความเร่งเอาต์พุตที่ปรับให้เป็นมาตรฐานในพื้นที่ความเร่ง (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 // Don't 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; // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

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

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

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

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