진동 웨이브폼 분석

Android 기기에서 가장 일반적인 진동 액추에이터는 선형 공진 액추에이터 (LRA)입니다. LRA는 반응이 없는 유리 표면에서 버튼을 클릭할 때의 느낌을 시뮬레이션합니다. 선명하고 깔끔한 클릭 피드백 신호는 일반적으로 10~20밀리초 동안 지속됩니다. 이러한 느낌을 통해 사용자 상호작용이 더 자연스럽게 느껴집니다. 가상 키보드의 경우 이 클릭 피드백을 통해 입력 속도를 높이고 오류를 줄일 수 있습니다.

LRA에는 몇 가지 일반적인 공진 주파수가 있습니다.

  • 일부 LRA의 공진 주파수는 200~300Hz 범위였으며, 이는 인간 피부가 진동에 가장 민감한 주파수와 일치합니다. 이 주파수 범위에서 진동의 느낌은 일반적으로 부드럽고 날카롭고 꿰뚫는 느낌으로 표현됩니다.
  • 다른 LRA 모델은 공진 주파수가 약 150Hz로 더 낮습니다. 느낌은 질적으로 더 부드럽고 꽉 차 있습니다.
구성요소는 위에서 아래로 커버, 플레이트, 중간 자석, 측면 자석 2개, 질량, 스프링 2개, 코일, 유연 회로, 베이스, 접착제입니다.
선형 공진 액추에이터 (LRA)의 구성요소

두 가지 다른 주파수에서 동일한 입력 전압을 가정할 때 진동 출력 진폭은 다를 수 있습니다. 주파수가 LRA의 공진 주파수에서 멀수록 진동 진폭이 낮아집니다.

특정 기기의 햅틱 효과는 진동 액추에이터와 해당 드라이버를 모두 사용합니다. 오버드라이브 및 능동 제동 기능이 포함된 햅틱 드라이버는 LRA의 상승 시간과 울림을 줄여 더 민감하고 선명한 진동을 제공할 수 있습니다.

기기의 기본 파형 보간

예를 들어 맞춤 웨이브폼 패턴이 일반 기기에서 어떻게 작동하는지 살펴보겠습니다.

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) 가속도가 갑자기 증가하는 것이 아니라 점진적으로 증가합니다. 진폭의 각 단계 변화에서 오버슈트가 발생하며 입력 진폭이 갑자기 0으로 떨어질 때 50ms 이상 지속되는 링잉이 눈에 띄게 보입니다.

계단 함수 입력 파형의 그래프입니다.
실제 측정된 파형의 플롯으로, 수준 간의 더 자연스러운 전환을 보여줍니다.

개선된 햅틱 패턴

오버슈트를 방지하고 울림 시간을 줄이려면 진폭을 더 점진적으로 변경하세요. 다음은 수정된 버전의 파형 및 가속도 그래프를 보여줍니다.

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

자바

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에 관한 지식이 필요합니다. 최상의 결과를 얻으려면 기기의 사전 제작된 웨이브폼과 플랫폼에서 제공하는 상수를 사용하세요. 이를 통해 다음 작업을 할 수 있습니다.

  • 선명한 효과와 원시 값을 실행합니다.
  • 이를 연결하여 새로운 햅틱 효과를 구성합니다.

이러한 사전 정의된 햅틱 상수와 프리미티브를 사용하면 고품질 햅틱 효과를 만들면서 작업 속도를 크게 높일 수 있습니다.