진동 웨이브폼 분석

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

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

  • 일부 LRA의 공진 주파수는 200~300Hz 범위에 있으며, 이는 사람의 피부가 진동에 가장 민감한 주파수와 일치합니다. 이 주파수 범위의 진동 느낌은 일반적으로 부드럽고 날카로우며 침투하는 것으로 설명됩니다.
  • 다른 LRA 모델의 공진 주파수는 약 150Hz로 더 낮습니다. 느낌은 질적으로 더 부드럽고 더 큽니다 (차원).
구성요소에는 위에서 아래로 커버, 플레이트, 중간 자석, 측면 자석 2개, 질량, 스프링 2개, 코일, 플렉시블 회로, 베이스, 접착제가 포함됩니다.
선형 공진 액추에이터 (LRA)의 구성요소

두 개의 서로 다른 주파수에서 동일한 입력 전압이 주어지면 진동 출력 진폭이 다를 수 있습니다. 주파수가 LRA의 공진 주파수에서 멀어질수록 진동 진폭이 낮아집니다.

지정된 기기의 햅틱 효과는 진동 액추에이터와 드라이버를 모두 사용합니다. 오버드라이브 및 활성 제동 기능이 포함된 햅틱 드라이버는 LRA의 상승 시간과 울림을 줄여 더 반응성이 빠르고 명확한 진동을 제공할 수 있습니다.

진동기 출력 가속

주파수-출력-가속 매핑 (FOAM)은 지정된 진동 주파수 (헤르츠)에서 달성 가능한 최대 출력 가속 (G 피크)을 설명합니다. Android 16 (API 수준 36)부터 플랫폼은 VibratorFrequencyProfile을 통해 이 매핑에 대한 기본 지원을 제공합니다. 이 클래스를 기본고급 봉투 API와 함께 사용하여 햅틱 효과를 만들 수 있습니다.

대부분의 LRA 모터에는 FOAM에 단일 피크가 있으며 일반적으로 공진 주파수 근처에 있습니다. 가속은 일반적으로 주파수가 이 범위를 벗어남에 따라 기하급수적으로 감소합니다. 곡선은 대칭이 아닐 수 있으며 모터 손상을 방지하기 위해 공진 주파수 주변에 플래토가 있을 수 있습니다.

인접한 그림은 LRA 모터의 FOAM 예를 보여줍니다.

주파수가 약 120Hz로 증가하면 가속도가 기하급수적으로 증가합니다. 그런 다음 가속은 약 180Hz까지 일정하게 유지되며 그 후에는 감소합니다.
LRA 모터의 FOAM 예

인간 지각 감지 기준

인간 지각 감지 기준 은 사람이 안정적으로 감지할 수 있는 진동의 최소 가속도를 나타냅니다. 이 수준은 진동 주파수에 따라 다릅니다.

인접한 그림은 시간 주파수의 함수로 가속도에서 인간 햅틱 지각 감지 기준을 보여줍니다. 기준 데이터는 Bolanowski Jr.의 그림 1에 있는 변위 기준에서 변환됩니다. S. J. 등의 1988년 논문 'Four channels mediate the mechanical aspects of touch'.

Android는 모든 효과가 인간 지각 감지 기준을 10dB 이상 초과하는 진동 진폭을 생성하는 주파수 범위를 사용하도록 확인하는 BasicEnvelopeBuilder에서 이 기준을 자동으로 처리합니다.

주파수가 약 20Hz로 증가하면 사람 감지 기준점이 대수적으로 약 -35dB까지 상승합니다. 기준점은 약 200Hz까지 일정하게 유지되다가 그 후 -20dB까지 대략 선형으로 증가합니다.
인간 햅틱 지각 감지 기준

온라인 튜토리얼에서는 가속도 진폭과 변위 진폭 간의 변환을 자세히 설명합니다.

진동 가속 수준

진동 강도에 대한 인간의 지각(지각 측정)은 물리적 매개변수인 진동 진폭에 따라 선형으로 증가하지 않습니다. 지각된 강도는 동일한 주파수에서 감지 기준 위의 dB 양으로 정의되는 감각 수준 (SL)으로 특징지어집니다.

해당 진동 가속 진폭 (G 피크)은 다음과 같이 계산할 수 있습니다.

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

...여기서 진폭 dB는 특정 주파수에서 인접한 그림의 세로축을 따라 있는 값인 SL과 감지 기준점의 합입니다.

인접한 그림은 시간 주파수의 함수로 인간 햅틱 지각 감지 기준 (0dB SL)과 함께 10, 20, 30, 40, 50dB SL의 진동 가속 수준을 보여줍니다. 데이터는 Verrillo, R. T. 등의 1969년 논문 "Sensation magnitude of vibrotactile stimuli."에서 추정됩니다.

원하는 감각 수준이 증가하면 필요한 가속도(dB)가 거의 동일한 양만큼 증가합니다. 예를 들어 100Hz 진동의 10dB 감각 수준은 -30dB가 아닌 약 -20dB입니다.
진동 가속 수준

Android는 감각 수준 공간 (dB SL)에서 값을 정규화된 강도로 가져와 출력 가속으로 변환하는 BasicEnvelopeBuilder에서 이 변환을 자동으로 처리합니다. 반면 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) 가속이 갑자기 증가하는 것이 아니라 점진적으로 증가합니다. 각 진폭 단계 변경 시 오버슈트도 있으며 입력 진폭이 갑자기 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에 관한 지식이 필요합니다. 최상의 결과를 얻으려면 기기의 사전 제작된 파형과 플랫폼에서 제공하는 상수를 사용하여 다음 작업을 실행하세요.

  • 명확한 효과와 기본 요소를 실행합니다.
  • 이를 연결하여 새로운 햅틱 효과를 구성합니다.

이러한 사전 정의된 햅틱 상수와 기본 요소는 고품질 햅틱 효과를 만드는 동안 작업을 크게 가속화할 수 있습니다.