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.
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)
- Structure: A voice coil (similar to a speaker) attached to a mass suspended on springs.
- Drive Signal: AC signal at resonant frequency (f₀ typically 150–235 Hz) energizes the coil.
- Resonance: The mass oscillates with maximum amplitude at f₀. Quality factor Q=10–40 means amplitude drops sharply off-resonance.
- Braking: Driving an opposite-phase signal actively brakes the mass, enabling sharp stop (5–15 ms).
Haptic Effects Library
| Effect | Duration | Waveform | Perception |
|---|---|---|---|
| Sharp Click | 5–15 ms | Single pulse | Button press confirmation |
| Soft Bump | 20–50 ms | Sine ramp up/down | Gentle notification |
| Double Click | 30+30 ms | Two pulses, 50ms gap | Confirmation/select |
| Buzz | 100–500 ms | Continuous sine | Alert/notification |
| Ramp Up | 200 ms | Increasing amplitude | Approach boundary |
| Texture | Continuous | Modulated frequency | Virtual surface roughness |
Electrical & Mechanical Specifications
| Parameter | ERM | LRA | Piezo Haptic | Voice Coil |
|---|---|---|---|---|
| Voltage | 1.5–5 V DC | 1–3 V AC (at f₀) | 60–200 V | 1–24 V |
| Current | 50–150 mA | 50–120 mA RMS | ~0 (capacitive) | 0.1–5 A |
| Frequency | 50–250 Hz | 150–235 Hz (resonant) | DC–1 kHz | DC–500 Hz |
| Rise Time | 50–250 ms | 5–20 ms | <1 ms | 2–10 ms |
| Braking Time | 50–200 ms | 5–15 ms (active) | <1 ms | 2–10 ms |
| Acceleration | 0.5–2 G | 1–3 G | Up to 10 G | 0.5–5 G |
| Size | 8–15 mm ⌀ | 8–12 mm ⌀, 3 mm H | Thin film | 10–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
| Comparison | Advantage | Limitation |
|---|---|---|
| LRA vs ERM | LRA: faster response, crisper feel, lower power | LRA: narrow frequency band, needs driver IC |
| Piezo vs LRA | Piezo: widest bandwidth, sub-ms response, thin | Piezo: needs HV driver, more expensive |
| Voice Coil vs LRA | VCA: longer stroke, true force output | VCA: much larger, heavier, higher power |
| Software (audio) vs Haptic | Haptic: works without sound, direct physical feedback | Haptic: 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.