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

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

LRA มีความถี่ในการสั่นทั่วไป 2-3 รายการดังนี้

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

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

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

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

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

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

ผังข้างๆ แสดงตัวอย่าง FOAM สำหรับมอเตอร์ LRA

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

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

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

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

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

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

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

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

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

คำนวณความกว้างของคลื่นความเร่งของแรงสั่นสะเทือนที่เกี่ยวข้อง (ใน G สูงสุด) ได้ดังนี้

$$ 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 จะไม่ใช้การแปลงนี้และจะใช้ค่าเป็นแอมพลิจูดการเร่งความเร็วที่แปลงเป็นมาตรฐานในเชิงพื้นที่การเร่งความเร็ว (Gs) แทน Envelope 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 ที่ใช้ในอุปกรณ์ ใช้รูปแบบคลื่นที่สร้างไว้ล่วงหน้าของอุปกรณ์และค่าคงที่ที่แพลตฟอร์มให้ไว้เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด ซึ่งจะช่วยให้คุณทำสิ่งต่อไปนี้ได้

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