Table of Contents
Key Takeaways
- A bare FlexiForce reading scatters ±15–20 % between runs — the 9.5 mm sensing dot picks up where the load lands as much as how much.
- A rubber pad between the sensor and a rigid backing plate is the single fix that takes scatter down to a few percent. Plate → sensor → rubber → plate.
- All rubber durometers we tested outperformed no rubber; Shore A 50–70 is a sane starting range.
- Two FlexiForce units of the same part number do not share a calibration — every sensor needs its own polynomial.
- LM358 non-inverting amp + 2.2 kΩ feedback on a single 5 V supply gives 0–3 V output for 0–330 N — clean Arduino ADC range. (Tekscan recommends an inverting transimpedance amp for perfect linearity; its op-amp runs single-supply too, but the reference V_REF must be of opposite polarity to V_DD — i.e. a charge pump or an AC reference. Non-inverting skips that requirement at the cost of mild non-linearity.)
- A 3rd-order polynomial fit nails the calibration curve (R² > 0.999). A linear fit is acceptable above ~10 N.

FlexiForce sensors are everywhere in embedded prototyping — they are thin, cheap, and easy to interface with a 5 V microcontroller. They are also famously inconsistent. In an early build for a force-measurement project, I burned a week chasing readings that drifted between runs by 20 % on identical loads. This post is the calibration write-up from that work: what makes FlexiForce sensors flaky, the mechanical mount that fixes it, the conditioning circuit, the calibration rig, and real data showing the difference.
How the FlexiForce sensor works
The FlexiForce A201 from Tekscan is a piezoresistive force sensor printed on a thin polyester film. Two conductive layers sandwich a layer of pressure-sensitive ink. As you press on the round sensing area near the tip — the “dot” — the ink layer conducts more, and the resistance between the two leads drops. At zero load, the sensor is essentially open circuit; at full load it sits at a few kilo-ohms.

Three things follow from this construction:
- You cannot read it with a voltage divider straight to an ADC without a buffer — the high source impedance at low loads will be dominated by the ADC input.
- Only the round dot is sensitive. The plastic outside the dot reads nothing. If your load shifts toward the cable side of the sensor, you measure zero.
- The response is non-linear. A first-order voltage-to-force relationship works well in the middle of the range; near the top and bottom, you need a polynomial fit.
The conditioning circuit
The Tekscan A201 datasheet recommends an inverting transimpedance amplifier — sensor on the inverting input driven by a reference voltage of opposite polarity to the supply (VREF negative when VDD is positive), feedback resistor from output to inverting input, + input tied to ground. It gives a clean VOUT = −VREF × RF / RSENSOR relationship — linear in conductance, easy to calibrate. The op-amp itself runs single-supply (VSS = GND on the MCP6004 they show), but VREF must be opposite in polarity to VDD. On a board powered only from a positive rail, that means either a charge pump to generate the negative reference, or an AC reference scheme (Tekscan also lists a 50 % square wave as a valid VREF).
This build chose simpler single-supply hardware over a perfectly linear response. The circuit is a non-inverting configuration: the FlexiForce sits in a voltage divider with a 10 kΩ pulldown to ground, the divider node feeds the non-inverting input of an LM358N, and a feedback network sets the gain:
V+ = VSUPPLY × RPULL / (RPULL + RSENSOR) ; VOUT = V+ × (1 + RF / RG)
With RPULL = 10 kΩ, RG = 330 Ω, RF = 2.2 kΩ on a 5 V single-supply LM358N — gain is roughly 7.7×. At zero force the FlexiForce is essentially open and V+ ≈ 0; as force rises, RSENSOR falls, V+ rises, and the output climbs toward ~3 V at 330 N — comfortable headroom on a 5 V Arduino-style ADC. The trade-off: the divider is non-linear in RSENSOR, so VOUT vs force is mildly curved. That non-linearity is exactly what the calibration polynomial later in this post absorbs.

Why a bare sensor does not repeat
If you press a rigid object directly on the FlexiForce dot, two runs at the same applied force can read up to 20 % apart. The reason is that the sensor does not measure force — it measures the integral of pressure across its active area. With a hard, narrow contact, every test puts the load on a slightly different region of the dot, and a slightly different fraction of the active area carries the load each time.
What you need is a mechanical setup that guarantees the same pressure distribution across the dot every time, regardless of how the load is applied.
The mount that fixes it: a rubber-pad sandwich
The fix is a four-layer sandwich. From top to bottom:
- Rigid plate (load side). Aluminium or steel, flat-ground, larger than the sensing dot. The plate accepts the load from whatever you are measuring.
- Thin rubber pad. Shore A 50–70 is a good starting durometer. The pad is the key element — it deforms slightly under load and distributes pressure uniformly across the sensing area below.
- FlexiForce sensor. Centred so the rubber pad sits directly over the sensing dot.
- Rigid plate (base side). Flat-ground, larger than the sensor. Provides the reaction force.
The plates make sure the sandwich does not flex; the rubber makes sure the sensor sees a uniform pressure field instead of a point load. The combination is what produces repeatable readings.
The calibration rig
To calibrate the sensor against known force, the sandwich was mounted on the lower platen of an Instron 3366 universal testing machine. The Instron applies a controlled, gradually increasing load through its upper crosshead while a load cell measures the actual applied force to ±0.5 % accuracy.

The procedure for every run:
- Place the sandwich, centred, on the lower platen.
- Zero the conditioning circuit output.
- Apply load smoothly from 0 to ~330 N at a slow constant rate (5 mm/min crosshead speed).
- Log Instron force and conditioning-circuit voltage at every 10 N increment.
- Release the load and rest 30 s before the next run (FlexiForce sensors drift; rest avoids carry-over).
Data 1: bare sensor baseline
Four consecutive runs of the bare sensor — same hardware, same operator, runs separated by 30 s rest:

The curves clearly do not overlap. At an output voltage of about 0.6 V, one run reports 200 N while another reports 240 N — a 20 % difference for what should be the same calibration point. Using one of these curves to calibrate the sensor would give errors of that order on every subsequent measurement.
Data 2: with the rubber-pad sandwich
Same sensor, same Instron procedure, same operator — only difference is the rubber-pad sandwich mount described above:

The four traces overlap to within the line width of the plot. At a given voltage the spread is ~2 % of the mean — an order of magnitude tighter than the bare-sensor case. The non-linearity in the bottom 10 % is also visibly cleaner, which matters if you want to measure small forces.
Data 3: sensor-to-sensor variability
Two FlexiForce sensors of the same part number, both A201-100, both measured with the same rubber-pad sandwich and the same conditioning circuit. Two runs per sensor:

Within a single sensor the runs overlap perfectly. Between the two sensors there is a consistent offset of about 10 %. This is the FlexiForce family’s headline limitation: you cannot calibrate one sensor and reuse the curve across units.
Key insight: Whatever calibration polynomial you save, save it per individual sensor and key it by a unique identifier you mark on the cable.
Fitting a calibration curve
The voltage-to-force relationship is gently non-linear. A linear fit through the mid-range gives reasonable accuracy above about 10 N, but a 3rd-order polynomial fits the full range almost perfectly:

The coefficients above are for this specific sensor only. Every new sensor needs to be re-fit. The standard procedure is: run the Instron from 0 to whatever your maximum expected load will be, take ~30 voltage/force pairs, and fit a cubic. If you do not have access to an Instron, a hanging weight stack on a level platform works for static calibration; you just need known forces at five or six points across the range.
Using the calibration in code
Once you have polynomial coefficients for a sensor, putting them into firmware is straightforward. For an Arduino-style microcontroller with a 10-bit ADC:
// Calibration constants for sensor #001 — re-fit per sensor.
const float P3 = 0.86f; // cubic
const float P2 = 19.92f; // quadratic
const float P1 = 181.04f; // linear
const float P0 = -1.25f; // offset
const int SENSOR_PIN = A0;
const float V_REF = 5.0f;
const int ADC_MAX = 1023;
float read_force_newtons(void) {
int adc = analogRead(SENSOR_PIN);
float v = (adc * V_REF) / (float)ADC_MAX;
return ((P3 * v + P2) * v + P1) * v + P0; // Horner form
}Two implementation notes:
- Use Horner’s form for the polynomial — three multiplies and three additions instead of computing v², v³ separately.
- Discard the first reading after power-up. The conditioning circuit takes 100–200 ms to settle, and the sensor itself takes about a second to come out of its drifted state.
Build photos


Conclusion — how to get repeatable FlexiForce readings
The FlexiForce is cheap, thin, and surprisingly accurate — but only if you respect its constraints. Three things govern whether your readings are trustworthy: the mechanical mount, the conditioning circuit, and the calibration. Skip any one and you will see bare-sensor scatter.
A repeatable build, in priority order
- Sandwich the sensor between rigid flat plates (aluminium or steel, ground flat, both larger than the sensing dot).
- Add a thin rubber pad on the load side between the plate and the sensor. Shore A 50–70 is a good starting durometer. The rubber distributes pressure across the active dot and removes point-load sensitivity.
- Align the rubber and plates with the sensing dot, not the sensor body. The active area is a small circle a few millimetres from the cable end.
- Use an op-amp conditioner, not a voltage divider straight to ADC. Tekscan’s recommended inverting transimpedance amplifier gives perfect linearity but requires a V_REF of polarity opposite to V_DD — i.e. a charge pump or an AC reference scheme on a board with only a positive rail. A simpler non-inverting configuration — FlexiForce in a divider feeding the + input, with feedback for gain — needs no negative reference and works fine if you absorb the resulting mild non-linearity with a polynomial fit at calibration time.
- Pick a feedback resistor that puts your max expected force near 2.5–3 V at a 5 V supply, leaving headroom. 2.2 kΩ worked for 0–330 N; drop to ~1 kΩ for 0–100 N.
- Calibrate every sensor individually with 8–10 known force points. A 3rd-order polynomial is plenty; linear is acceptable above ~10 N.
- Re-calibrate after any mechanical change — swapping rubber pads, swapping sensors, or even removing and remounting a sensor can shift the curve.
When NOT to use a FlexiForce
- Need ±1 % absolute accuracy → use a load cell.
- Highly off-axis load → use a strain-gauge Wheatstone bridge.
- Fast dynamic measurements (>200 Hz) → switch to a piezoelectric sensor; FlexiForce has a slow time constant.
- Intermittent small forces (<1 N) → a capacitive force sensor will be cleaner.
Limitations to remember
- Hysteresis — the down-stroke curve differs from the up-stroke. Calibrate in the direction you will measure.
- Drift — under constant load, the reading creeps. Measure at a fixed time-after-load if accuracy matters.
- Temperature sensitivity — a few percent per 10 °C. Compensate or hold the ambient steady.
- Edge effects — outside the dot, the sensor reads zero. If the load shifts toward the cable side, you measure nothing.
Get those right and a FlexiForce will give you ±2–3 % accuracy across the full range, which is plenty for almost any embedded force-sensing application short of laboratory metrology.
Going further: For the ADC fundamentals behind these voltage readings — resolution, sampling, reference voltage — see our ADC in Microcontrollers guide.
Going further: The averaging-of-16 pattern used in the calibration code above is just one filter — see Filtering Noisy ADC Readings for the full set (moving average, median, EMA, oversampling, hysteresis).
Related Reading
- Sensor Calibration Techniques for Embedded Systems — the broader theory behind what we did here
- Signal Conditioning for Sensors — amplifier topologies, filtering, and level-shifting
- How to Choose the Right Sensor for Your Embedded System — when FlexiForce is and is not the answer
- Pressure Sensors for Embedded Systems — when you should reach for a load cell instead
- Operational Amplifier Introduction — LM358 basics if the op-amp section was new
Frequently Asked Questions
What is a FlexiForce sensor and how does it work?
FlexiForce is a thin-film piezoresistive force sensor from Tekscan. Its electrical resistance falls as the applied force increases — from essentially open-circuit at zero load to a few kΩ near full scale. The sensor is read through a conditioning op-amp circuit that converts the resistance change into a voltage you can sample with an ADC.
Why are my FlexiForce readings inconsistent?
The active sensing area is a small circle about 9.5 mm across. When force is applied directly through a rigid object, where the load lands on that dot matters as much as how much force is applied. Adding a rubber pad between the sensor and a rigid backing plate distributes the load across the whole active area and removes most of this point-load sensitivity.
What circuit should I use with a FlexiForce sensor?
Tekscan’s A201 datasheet recommends an inverting transimpedance amplifier — it gives a clean linear-in-conductance response (V_OUT = −V_REF × R_F / R_S). The op-amp itself runs single-supply, but V_REF must be opposite in polarity to V_DD, which means a charge pump or an AC reference scheme on a board that only has a positive rail. This build chose a simpler non-inverting configuration that needs no negative reference: a voltage divider (FlexiForce + 10 kΩ to ground) feeds the + input of an LM358N op-amp with R_F/R_G = 2.2 kΩ / 330 Ω feedback for ~7.7× gain. The response is mildly non-linear because the divider itself is non-linear, but a 3rd-order polynomial fit captures it cleanly (R² > 0.999). The values above gave 0–3 V output for 0–330 N — a clean match for a 5 V Arduino ADC.
Do I need to calibrate each FlexiForce sensor individually?
Yes. Two FlexiForce sensors of the same part number do not share a calibration curve — base resistance and sensitivity vary enough unit-to-unit that you can see ~10 % spread at the same applied force. Save a polynomial per sensor and key it by a unique ID burned into your firmware.
What is the maximum force a FlexiForce A201 can measure?
The A201 family ships in three standard ranges: A201-25 reads 0–110 N, A201-100 reads 0–440 N, and the high-force A201-1 reads up to 4448 N. The upper limit is set both by the sensor part number and by the feedback resistor you choose; with a smaller feedback resistor you can extend the linear range of a given sensor at the cost of resolution.
Can I use a FlexiForce sensor with Arduino?
Yes. Feed the conditioner output into any analogue input pin (A0–A5 on an UNO), read the ADC, convert to volts, and apply your calibrated polynomial to get newtons. Keep the analogue ground well separated from any switching loads to avoid noise on the low-end readings.

Vivek Bhageria — Lead Firmware R&D Engineer, 12+ years. Ex-Bosch (automotive powertrain), MusicTribe (real-time audio), medical devices. M.Tech BITS Pilani. I write at NerdyElectronics — practical, register-level embedded systems for engineers who want to understand what’s actually happening under the hood.



