Back to Sensors & Actuators Series

Haptic Actuators: ERM, LRA, Piezo & Force Feedback

April 10, 2026 Wasil Zafar 18 min read

Creating the sense of touch — haptic actuators deliver clicks, buzzes, textures, and forces that make digital interfaces feel physical. Master ERM, LRA, piezo types, driver ICs, and practical embedded code.

Contents

  1. Overview & Types
  2. Working Principle
  3. Electrical & Mechanical Specs
  4. Driver Circuits
  5. Control Methods
  6. Code Example — Arduino & ESP32
  7. Real-World Applications
  8. Advantages vs. Alternatives
  9. Limitations & Considerations

Overview & Types

Haptic actuators generate tactile feedback — vibrations, textures, forces, and resistance — that the user can feel. From the simple buzz of a phone notification to force-feedback surgical simulators, haptic actuators create the sense of touch in digital devices. They bridge the gap between virtual and physical, making interfaces intuitive and immersive.

Key Insight: The human fingertip can detect vibrations as small as 10 nm amplitude at 200 Hz. Modern LRA haptic actuators exploit this sensitivity to create distinct tactile “textures” — button clicks, rough surfaces, edges — purely through programmed vibration patterns.

Types

  • Eccentric Rotating Mass (ERM): A DC motor with an off-center weight. Rotation creates vibration. Simple, cheap, but slow to start/stop (50–250 ms) and one vibration frequency. Found in older phones and game controllers.
  • Linear Resonant Actuator (LRA): A voice coil drives a mass on a spring at its resonant frequency (typically 150–235 Hz). Crisp, fast response (5–20 ms rise time), narrow frequency band. Standard in modern smartphones (Apple Taptic Engine).
  • Piezoelectric Haptic: Piezo benders or stacks produce ultra-fast, precise vibrations. Bandwidth up to 1 kHz, sub-ms response. Used in high-fidelity touch screens and automotive controls.
  • Voice Coil Actuator (VCA): Linear motor with permanent magnet and coil. Produces controlled force/displacement over longer travel (1–10 mm). Used in force feedback joysticks and surgical simulators.
  • Electrostatic Surface Haptic: Variable electrostatic friction on touch surfaces. No moving parts — voltage modulates the friction between finger and screen. Used in experimental touchpads.
  • Ultrasonic Surface Haptic: Piezo transducers vibrate a surface at ultrasonic frequencies (30–40 kHz), creating an air gap that reduces friction. Combined with position tracking, simulates textures on flat surfaces.
  • Pneumatic/Hydraulic Haptic: Air bladders or fluid chambers provide distributed pressure feedback. Used in haptic gloves (e.g., HaptX) for VR force feedback.

Working Principle

ERM (Eccentric Rotating Mass)

An unbalanced mass on a DC motor shaft creates centrifugal force during rotation: F = m×r×ω². Vibration amplitude depends on speed (voltage-controlled). Cannot change frequency independent of amplitude — both increase together.

LRA (Linear Resonant Actuator)

  1. Structure: A voice coil (similar to a speaker) attached to a mass suspended on springs.
  2. Drive Signal: AC signal at resonant frequency (f₀ typically 150–235 Hz) energizes the coil.
  3. Resonance: The mass oscillates with maximum amplitude at f₀. Quality factor Q=10–40 means amplitude drops sharply off-resonance.
  4. Braking: Driving an opposite-phase signal actively brakes the mass, enabling sharp stop (5–15 ms).

Haptic Effects Library

EffectDurationWaveformPerception
Sharp Click5–15 msSingle pulseButton press confirmation
Soft Bump20–50 msSine ramp up/downGentle notification
Double Click30+30 msTwo pulses, 50ms gapConfirmation/select
Buzz100–500 msContinuous sineAlert/notification
Ramp Up200 msIncreasing amplitudeApproach boundary
TextureContinuousModulated frequencyVirtual surface roughness

Electrical & Mechanical Specifications

ParameterERMLRAPiezo HapticVoice Coil
Voltage1.5–5 V DC1–3 V AC (at f₀)60–200 V1–24 V
Current50–150 mA50–120 mA RMS~0 (capacitive)0.1–5 A
Frequency50–250 Hz150–235 Hz (resonant)DC–1 kHzDC–500 Hz
Rise Time50–250 ms5–20 ms<1 ms2–10 ms
Braking Time50–200 ms5–15 ms (active)<1 ms2–10 ms
Acceleration0.5–2 G1–3 GUp to 10 G0.5–5 G
Size8–15 mm ⌀8–12 mm ⌀, 3 mm HThin film10–50 mm ⌀
Cost$0.30–1$1–3$5–20$5–50

Driver Circuits

DRV2605L Haptic Driver (LRA/ERM)

The TI DRV2605L is the industry standard: I²C interface, auto-resonance tracking for LRA, 123 built-in haptic effects, and audio-to-haptic mode. Works with both ERM and LRA.

  • Operating voltage: 2.0–5.2 V
  • Full-scale output: ±1.8 V peak
  • I²C address: 0x5A
  • Library: 123 ROM-based effects (clicks, buzzes, ramps)

Direct Drive (ERM)

For simple ERM vibration, drive directly via MOSFET or motor driver. PWM controls intensity. No specialized IC needed.

High-Voltage Driver (Piezo Haptic)

Piezo haptic elements need 60–200 V AC drive. Dedicated ICs (Boreas BOS1211, TI DRV8662) provide boost conversion and waveform generation.

Control Methods

ROM Playback

Trigger pre-programmed effects from a haptic driver IC library (e.g., DRV2605L’s 123 effects). Simplest approach — send effect ID via I²C, driver handles the waveform.

Real-Time Playback (RTP)

Stream amplitude values to the driver at 1–10 kHz rate for custom waveforms. Used for audio-coupled haptics and dynamic texture rendering.

Auto-Resonance Tracking

LRAs must be driven at their resonant frequency (±5%) for maximum efficiency. Advanced drivers (DRV2605L) use back-EMF detection to track the actuator’s resonance automatically.

Closed-Loop Acceleration Control

An accelerometer on the device body measures the actual vibration output. Feedback loop adjusts drive amplitude to maintain consistent haptic intensity regardless of grip force, device position, or actuator aging.

Code Example — Arduino & ESP32

Arduino: DRV2605L Haptic Driver (I²C)

// DRV2605L haptic driver with ROM effects
// Wiring: SDA→A4, SCL→A5 (Uno), VCC→3.3V or 5V
// LRA or ERM motor connected to DRV2605L outputs

#include <Wire.h>

#define DRV2605_ADDR 0x5A

void writeReg(uint8_t reg, uint8_t val) {
    Wire.beginTransmission(DRV2605_ADDR);
    Wire.write(reg);
    Wire.write(val);
    Wire.endTransmission();
}

void setup() {
    Serial.begin(9600);
    Wire.begin();

    // Reset
    writeReg(0x01, 0x00); // Mode: internal trigger
    writeReg(0x1A, 0xB6); // Feedback control (LRA mode)
    writeReg(0x1B, 0x93); // Control 1
    writeReg(0x1C, 0xF5); // Control 2
    writeReg(0x1D, 0x80); // Control 3 (LRA mode)

    Serial.println("DRV2605L Haptic Ready");
    Serial.println("Send 1-123 for ROM effects");
}

void playEffect(uint8_t effect) {
    writeReg(0x04, effect);  // Set waveform
    writeReg(0x05, 0x00);    // End sequence
    writeReg(0x0C, 0x01);    // GO
    Serial.print("Playing effect #");
    Serial.println(effect);
}

void loop() {
    if (Serial.available()) {
        int effect = Serial.parseInt();
        if (effect >= 1 && effect <= 123) {
            playEffect(effect);
        }
    }
}

ESP32: Custom Haptic Waveform via PWM

// ESP32 generating custom haptic waveforms for LRA/ERM
// Direct PWM drive via H-bridge (L293D or DRV8833)
// GPIO25→IN1, GPIO26→IN2, EN→3.3V

#include <Arduino.h>
#include <math.h>

#define HAPTIC_A  25  // H-bridge input A
#define HAPTIC_B  26  // H-bridge input B

const int PWM_CH_A = 0, PWM_CH_B = 1;
const int PWM_RES = 8;
const int PWM_FREQ = 20000;

void setup() {
    Serial.begin(115200);
    ledcSetup(PWM_CH_A, PWM_FREQ, PWM_RES);
    ledcSetup(PWM_CH_B, PWM_FREQ, PWM_RES);
    ledcAttachPin(HAPTIC_A, PWM_CH_A);
    ledcAttachPin(HAPTIC_B, PWM_CH_B);
    Serial.println("Haptic Waveform Generator");
    Serial.println("C=click, B=buzz, R=ramp, T=texture");
}

void sharpClick() {
    ledcWrite(PWM_CH_A, 255); ledcWrite(PWM_CH_B, 0);
    delay(10);
    ledcWrite(PWM_CH_A, 0); ledcWrite(PWM_CH_B, 255); // Brake
    delay(5);
    ledcWrite(PWM_CH_A, 0); ledcWrite(PWM_CH_B, 0);
}

void buzz(int durationMs) {
    unsigned long start = millis();
    while (millis() - start < (unsigned long)durationMs) {
        float t = (millis() - start) / 1000.0;
        float val = sin(2.0 * PI * 175.0 * t); // 175 Hz
        if (val > 0) {
            ledcWrite(PWM_CH_A, (int)(val * 200));
            ledcWrite(PWM_CH_B, 0);
        } else {
            ledcWrite(PWM_CH_A, 0);
            ledcWrite(PWM_CH_B, (int)(-val * 200));
        }
        delayMicroseconds(100);
    }
    ledcWrite(PWM_CH_A, 0); ledcWrite(PWM_CH_B, 0);
}

void rampUp() {
    for (int i = 0; i < 200; i++) {
        int amp = map(i, 0, 199, 50, 255);
        ledcWrite(PWM_CH_A, amp); ledcWrite(PWM_CH_B, 0);
        delay(1);
    }
    ledcWrite(PWM_CH_A, 0); ledcWrite(PWM_CH_B, 0);
}

void loop() {
    if (Serial.available()) {
        char cmd = Serial.read();
        switch (cmd) {
            case 'C': case 'c': sharpClick(); Serial.println("Click"); break;
            case 'B': case 'b': buzz(300); Serial.println("Buzz 300ms"); break;
            case 'R': case 'r': rampUp(); Serial.println("Ramp"); break;
        }
    }
}

Real-World Applications

Consumer Electronics

  • Smartphone virtual keyboard feedback
  • Gaming controller vibration motors
  • Smartwatch notification alerts
  • Automotive touchscreen buttons

VR/AR & Medical

  • VR gloves with force feedback
  • Surgical training simulators
  • Accessibility devices for visually impaired
  • Drone remote control tactile feedback

Advantages vs. Alternatives

ComparisonAdvantageLimitation
LRA vs ERMLRA: faster response, crisper feel, lower powerLRA: narrow frequency band, needs driver IC
Piezo vs LRAPiezo: widest bandwidth, sub-ms response, thinPiezo: needs HV driver, more expensive
Voice Coil vs LRAVCA: longer stroke, true force outputVCA: much larger, heavier, higher power
Software (audio) vs HapticHaptic: works without sound, direct physical feedbackHaptic: added hardware cost, power draw

Limitations & Considerations

  • Perception Variability: Haptic sensitivity varies dramatically between users (age, callous thickness, grip force). Effects must be tested with diverse users.
  • Frequency Sensitivity: Human skin is most sensitive around 200–250 Hz (Pacinian corpuscles). Effects outside this range feel weaker despite same energy.
  • LRA Bandwidth: LRAs work well only at their resonant frequency (±5%). Off-resonance, amplitude drops sharply. For broad-frequency effects, piezo or VCA is better.
  • Power Budget: Continuous vibration drains batteries. Smartphone LRAs consume 50–120 mA during actuation. Design duty cycles carefully for battery-powered devices.
  • Audio Noise: ERMs and LRAs produce audible hum/buzz. In quiet environments (meetings, theaters), haptic alerts may be intrusive.
  • Mounting Matters: Haptic actuator performance depends critically on mounting. Loose mounting dampens vibration; overly rigid mounting couples vibration to the whole device chassis.