Working Principle
A Force Sensitive Resistor (FSR) is a polymer thick-film device that exhibits a decrease in resistance as force applied to its active surface increases. It consists of two layers: a conductive polymer layer with microscopic particles dispersed in a flexible substrate, and an interdigitated electrode pattern. When pressed, the conductive particles make more contact points, reducing resistance from >1 MΩ (no force) to as low as ~200 Ω (maximum force).
Analogy: Imagine a sponge filled with tiny metal balls. With no squeeze, the balls barely touch and electricity struggles to flow. As you squeeze harder, more balls press together, creating more paths for current — resistance drops.
Electrical Characteristics
| Parameter | FSR 402 (Interlink) |
|---|---|
| Force Range | 0.2 N – 20 N (~20 g – 2 kg) |
| Resistance (no force) | >1 MΩ |
| Resistance (max force) | ~200 Ω |
| Force vs. Resistance | Approximately inverse — logarithmic |
| Repeatability | ±2% (single part) |
| Accuracy | ±5–25% (part-to-part variation) |
| Response Time | <5 ms (mechanical) |
| Thickness | ~0.5 mm (flexible) |
| Operating Temperature | −30 to +70 °C |
Interfacing with an MCU
FSRs are analogue resistive devices — read them with a simple voltage divider connected to an ADC input. Use a fixed reference resistor in series with the FSR:
- 10 kΩ: Best sensitivity in the light-to-medium force range (0.2–5 N)
- 47 kΩ: Better sensitivity for very light touch (<1 N)
Calibration
FSRs are not precision instruments — they detect force presence and approximate magnitude:
- Threshold-based: Define ADC thresholds for "no press", "light", "medium", "firm" touch zones
- Known-weight mapping: Place known weights (50 g, 100 g, 500 g, 1 kg) and record ADC values to build a lookup table
- Logarithmic curve fit: Fit your measured data to find R0 and n in R = R0/Fn
- Break-in: New FSRs may drift for the first 10–20 cycles; actuate several times before calibrating
Code Example
/*
* FSR 402 Force Sensitive Resistor — Arduino
* Wiring: FSR between 5V and A0, 10k from A0 to GND
*/
#define FSR_PIN A0
#define R_REF 10000.0 /* 10k reference resistor */
#define VCC 5.0
void setup() {
Serial.begin(9600);
}
void loop() {
int raw = analogRead(FSR_PIN);
if (raw == 0) {
Serial.println("No pressure detected");
} else {
/* Calculate FSR resistance from voltage divider */
float voltage = raw * (VCC / 1023.0);
float fsrR = R_REF * (VCC / voltage - 1.0);
/* Approximate force (rough inverse relationship) */
float conductance = 1000000.0 / fsrR; /* uMho */
float forceN;
if (conductance <= 1000)
forceN = conductance / 80.0;
else
forceN = (conductance - 1000) / 30.0;
Serial.print("FSR R: ");
Serial.print((long)fsrR);
Serial.print(" Ohm | ~Force: ");
Serial.print(forceN, 2);
Serial.println(" N");
}
delay(200);
}
Real-World Applications
Human Interface & Wearable Devices
FSRs are ubiquitous in touch-sensitive interfaces: musical instrument pressure pads (electronic drums, MIDI controllers), prosthetic limb grip-force feedback, shoe insoles for gait analysis, robotic gripper grasp detection, and automotive seat-occupancy sensors. Their thin, flexible form factor makes them ideal for embedding in surfaces where buttons are impractical.
Limitations
- Low accuracy: ±5–25% part-to-part variation. Not suitable for precise weight measurement (use HX711 + load cell).
- Drift and hysteresis: Resistance shifts under sustained pressure and differs on press vs. release.
- Non-linear response: Resistance vs. force is logarithmic, complicating absolute force calculation.
- Wear: Repeated flexing or point loads can damage the conductive polymer over time.
- Temperature sensitivity: Resistance drifts with temperature changes, ±1%/°C typical.