SoftPot Membrane Potentiometer - 500mm

Last updated: 8 October 2012
Prepared by Marco De Mutiis []
Cost per unit: $25.95 USD (approx. 200 HKD)

General Information
About Membrane Potentiometers

softpotbent.pngA membrane potentiometer uses a conductive membrane that is deformed by a sliding element to contact a resistor voltage divider. Linearity can range from 0.5% to 5% depending on the material, design and manufacturing process. The repeat accuracy is typically between 0.1mm and 1.0mm with a theoretically infinite resolution. The service life of these types of potentiometers is typically 1 million to 20 million cycles depending on the materials used during manufacturing and the actuation method; contact and contactless (magnetic) methods are available. Many different material variations are available such as PET(foil), FR4, and Kapton. Membrane potentiometer manufacturers offer linear, rotary, and application-specific variations. The linear versions can range from 9mm to 1000mm in length and the rotary versions range from 0° to multiple full turns, with each having a height of 0.5mm. Membrane potentiometers can be used for position sensing. (excerpted from wiki article on membrane potentiometer, accessed 8 October 2012).

These are very thin variable potentiometers. By pressing down on various parts of the strip, the resistance linearly changes from 100Ohms to 10,000Ohms allowing the user to very accurately calculate the relative position on the strip. Can be used as an accurate positional indicator for CNC head positioning, variable user input (volume level input for example), straight user input (multiple button areas translate to given resistance levels), and many other applications. (excerpted from sparkfun documentation, accessed 8 October 2012)

Features & Specifications

Electrical Specifications

- Resistance, standard 10kΩ (lenght >300mm 20kΩ)
- Resistance Range, customized 1kΩ to 100kΩ
- Resistance Tolerance ± 20%
- Effective Electrical Travel 8 to 2400 mm
- Linearity, independent ± 3% for rectilinear, ± 5% for rotary
- Power Rating (varies with length and temperature)1 Watt max. @ 25°C
- Resolution Theoretical-Infinite; resolution dependant on contact wiper thickness and construction
- Dielectric Value No affect @ 500 VAC, 1 minute

Mechanical Specifications
- Live Cycle (depending on wiper) >1 million
- Height typ. 0,51 mm / 0,020”


Getting it to work!


PIN1 of the SoftPot Membrane connected to 5V pin on Arduino
PIN3 of the SoftPot Membrane connected to GND pin on Arduino
PIN2 of the SoftPot Membrane connected to Any digital input pin (example uses 5)

Example Code

The following example sends data coming through the AnalogIn from the SoftPot Membrane Potentiometer to the Serial Port. In Processing the values sent by the Arduino are transformed in sinewaves and waveforms are visualized.

Arduino Code
see comments for explanation

the SoftPot Membrane is connected to analog pin 5
const int SoftPotPin = A5;
variable to store the value read from the sensor pin
int sensorReading = 0;

void setup() {
Serial.begin(9600); use the serial port

void loop() {
read the sensor and store it in the variable sensorReading:
sensorReading = analogRead(SoftPotPin);
write the sensor's data to the Serial Port (AnalogIn data range is 0-1023, so we divide it by 4 to have a closer range for digital data range 0-255)
delay to avoid overloading the serial port buffer

Processing Code
import ddf.minim.*;
import ddf.minim.signals.*;
import processing.serial.*;

Serial myPort; Create object from Serial class
Minim minim;
AudioOutput out;
SineWave sine1;

int val; Data received from the serial port
float amp1 = 0.8;
float sr = 44100;

void setup()
size(512, 200, P2D);
I know that the first port in the serial list on my mac
is always my FTDI adaptor, so I open Serial.list()[0].
On Windows machines, this generally opens COM1.
Open whatever port is the one you're using.
String portName = Serial.list()[0];
myPort = new Serial(this, portName, 9600);
minim library settings to create a line out and a sine wave
minim = new Minim(this);
out = minim.getLineOut(Minim.STEREO, 2048);
sine1 = new SineWave(val, amp1, sr);

void draw()

if ( myPort.available() > 0) { If data is available,
val =; read it and store it in val
println(val); prints the sensor data to the console

create visualization of waveforms
for (int i = 0; i < out.bufferSize()-1; i++)
float x1 = map(i, 0, out.bufferSize(), 0, width);
float x2 = map(i+1, 0, out.bufferSize(), 0, width);
line(x1, 50 + out.left.get(i)*50, x2, 50 + out.left.get(i+1)*50);
line(x1, 150 + out.right.get(i)*50, x2, 150 + out.right.get(i+1)*50);
sine1.setFreq(val*2); //set the frequency to the sensor data times 2 (so we get higher frequency)