진동 액추에이터 기본 지침서

Android 기기에서 햅틱 효과를 설계하기 전에 진동 액추에이터의 작동 방식에 관한 개요를 확인하는 것이 좋습니다.

햅틱 LRA의 구성요소 이미지

가장 일반적인 진동 액추에이터는 선형 공진 액추에이터 (LRA)입니다. 각 LRA는 스프링에 부착된 자석 이동 질량에 부착되는 음성 코일로 구성됩니다. 음성 코일에 적용되는 AC 전압은 전자기력을 발생시켜 질량을 움직입니다. 스프링은 질량을 시작 위치로 되돌리는 복원력을 제공합니다. 질량의 앞뒤로 움직이면 LRA가 진동합니다. 출력이 최대인 공진 주파수를 갖습니다.

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

기기에서 LRA의 일반적인 기능 중 하나는 응답하지 않는 유리 표면에서 버튼이 눌리는 느낌을 시뮬레이션하는 것입니다. 사용자 상호작용을 더 자연스럽게 만드는 역할을 합니다. 가상 키보드 입력에 적용할 경우 클릭 피드백을 입력 속도를 높이고 오류를 줄일 수 있습니다. 명확하고 선명한 클릭 피드백 신호는 일반적으로 10~20밀리초 미만입니다. 높은 클릭수를 달성하려면 기기에서 사용되는 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 // Do not 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 // Do not 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))

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

추가 단계가 있는 입력 파형 도표

더 부드러운 전환을 보여주는 측정된 파형 도표

따라서 Android 기기에서 햅틱 효과를 만들려면 주파수 및 진폭 값을 제공하는 것 이상이 필요합니다. 진동 액추에이터와 드라이버의 엔지니어링 사양에 온전히 액세스하지 않고 처음부터 햅틱 효과를 설계하는 것은 간단한 작업이 아닙니다. Android API는 다음 작업을 할 수 있는 상수를 제공합니다.

  • 명확한 효과와 프리미티브를 실행합니다.

  • 이를 연결하여 새로운 햅틱 효과를 구성합니다.

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