The Mini Matrix FSR

$95.00

The Mini Matrix Force Sensitive Resistor (FSR) has 9 sensor cells in a 3×3 array. Each sensor cell is 8.9mm, and the overall component size is approximately 46mm x 53mm.

The Mini Matrix FSR gives you an analog read that maps the force on the sensor. The more you press, the lower the resistance goes. This component:

  • Can integrate with a PSA for quick and easy integration

  • Easily customizable for a range of forces and pixel points. 

  • Unique non-printed sensor has a large dynamic range and good sensitivity  

Loomia FSR matrices and single sensors are best for flat or slightly curved surfaces, but will work up to a bend radius of 8mm. These sensors can pack multiple points into a small area and can be customized to detect a range of forces by using masks.

Loomia has sample scripts available to help you evaluate sensors. All scripts can be found later on this page.

Resources:

The Mini Matrix Force Sensitive Resistor (FSR) has 9 sensor cells in a 3×3 array. Each sensor cell is 8.9mm, and the overall component size is approximately 46mm x 53mm.

The Mini Matrix FSR gives you an analog read that maps the force on the sensor. The more you press, the lower the resistance goes. This component:

  • Can integrate with a PSA for quick and easy integration

  • Easily customizable for a range of forces and pixel points. 

  • Unique non-printed sensor has a large dynamic range and good sensitivity  

Loomia FSR matrices and single sensors are best for flat or slightly curved surfaces, but will work up to a bend radius of 8mm. These sensors can pack multiple points into a small area and can be customized to detect a range of forces by using masks.

Loomia has sample scripts available to help you evaluate sensors. All scripts can be found later on this page.

Resources:

Loomia Force Sensitive Resistor (FSR) Features Overview

The table below provides data on standard Loomia FSR performance:

Resistive Sensor Specifications

Minimum Force
<0.5 N
Recommended Max Operational Force
65 N
Bend Radius
8 mm
Breaking Force
>100 N
Minimum Feature Size
2.5 mm
Thickness
0.5 mm
Drift
0.9% over 1 hour at 1 N
13.3% over 1 hour at 50 N
Durability
1,000,000+ cycles at 1 N
10,000+ cycles at 50 N
Hysteresis
Avg 5% per cycle (10 cycles at 1 N)
Avg 1% per cycle (10 cycles at 50 N)
Software Support
Visualization
Arduino + Python Scripts
IP Rating
Internal tests show minimal ingress
Dataspeed
10 Hz
Performance Temperature Range
Coming Soon
Sensor to Sensor Variability
103%
Scalability
Up to 20,000 units per week
8-week lead time required

Arduino Code (serial monitor)

int colPins[3] = {6, 7, 8};     // Columns: GPIO outputs
int rowPins[3] = {A0, A1, A2};  // Rows: Analog inputs

const unsigned long samplingInterval = 100;  // Sampling every 30 s
unsigned long lastSampleTime = 0;
unsigned long startTime;

void setup() {
  Serial.begin(115200);

  for (int i = 0; i < 3; i++) {
    pinMode(colPins[i], OUTPUT);
    digitalWrite(colPins[i], LOW);
  }

  startTime = millis();
  lastSampleTime = 0;

  // CSV Header
  Serial.print("t");
  for (int r = 1; r <= 3; r++) {
    for (int c = 1; c <= 3; c++) {
      Serial.print(",R");
      Serial.print(r);
      Serial.print("C");
      Serial.print(c);
    }
  }
  Serial.println();

  // First sample at time = 0
  logSample(0);
}

void loop() {
  unsigned long currentTime = millis();

  if (currentTime - startTime >= lastSampleTime + samplingInterval) {
    lastSampleTime = currentTime - startTime;
    logSample(lastSampleTime);
  }
}

void logSample(unsigned long elapsedTime) {
  Serial.print("t_");
  Serial.print(elapsedTime);

  for (int row = 0; row < 3; row++) {
    for (int col = 0; col < 3; col++) {
      digitalWrite(colPins[col], HIGH);
      delayMicroseconds(50); // settle time
      int val = analogRead(rowPins[row]);
      digitalWrite(colPins[col], LOW);

      Serial.print(",R");
      Serial.print(row + 1);
      Serial.print("C");
      Serial.print(col + 1);
      Serial.print("_");
      Serial.print(val);
    }
  }

  Serial.println();
}

Arduino Pinout

Arduino Pinout for FSR testing

Pressure Matrix Visualizer for testing FSRs

Arduino Code for Visualizer

/* Loomia - 3x3 Mini Pressure Matrix v1.0.2

   Written for Loomia Technologies
   By David Choi, Copyright 2025
   Created: 6/17/2025
   Modified: 11/24/2025

   Description:
    - For use with resistive matrices (3x3) with data output formatted for the Loomia Pressure Matrix Visualizer.
    - Note: This code doesn't swap X-Y inputs for symmetrical outputs since touch point crosstalk is inherent to the resistive matrix design and no other electronics are used.

   Hardware:
    - Arduino Uno or compatible MCU with 10 bit ADC inputs
    - Loomia 3x3 Pressure Matrix (V2 prototype)
    - 4.7k external pull ups on column pins

   Matrix Layout: X = Column; Y = Row; Origin = (1,1)

            (Top: Pad Location)
    Y3 |_ (1,3) _|_ (2,3) _|_ (3,3) _|
    Y2 |_ (1,2) _|_ (2,2) _|_ (3,2) _|
    Y1 |_ (1,1) _|_ (2,1) _|_ (3,1) _|
            X1        X2        X3

  Data Output Order: (1,1), (2,1), (3,1), (1,2), (2,2), (3,2), (1,3), (2,3), (3,3)
  Data Output Format (all values uint16_t): val11,val21,val31,val12,val22,val32,val13,val23,val33\n

  Change Log:
  v1.0.2:
    - High-Z for rows not being scanned. Improves intercell crosstalk somewhat.
    - Add 4.7kΩ external pullups on columns
    - Changed pins to match straight wiring fixture
*/

#define X1 A1
#define X2 A2
#define X3 A3
#define Y1 A0
#define Y2 A5
#define Y3 A4

const int16_t MAX_VALUE = 1023;  // Due to 10 bit ADC
const uint8_t MAX_ROWS = 3;
const uint8_t MAX_COLS = 3;
uint8_t cols[MAX_COLS] = { X1, X2, X3 };
uint8_t rows[MAX_ROWS] = { Y1, Y2, Y3 };
uint16_t dataMatrix[MAX_ROWS][MAX_COLS] = {};

void setup() {
  // Initialize pins
  for (int i = 0; i < MAX_COLS; i++) {
    pinMode(cols[i], INPUT);  // Use external pull ups on columns (4.7k)
  }
  for (int i = 0; i < MAX_ROWS; i++) {
    pinMode(rows[i], INPUT);  // Set to high-Z
  }

  Serial.begin(9600);
}

void loop() {
  readCells();
  printData();
  delay(50);
}

void readCells() {
  // Read all column values for each row
  for (int i = 0; i < MAX_ROWS; i++) {
    pinMode(rows[i], OUTPUT);
    digitalWrite(rows[i], LOW);
    //delayMicroseconds(50);  // Settling time
    for (int j = 0; j < MAX_COLS; j++) {
      dataMatrix[i][j] = MAX_VALUE - analogRead(cols[j]);  // Invert value output for better viewing with visualizer
    }
    pinMode(rows[i], INPUT);
  }
}

void printData() {
  // Print all column data for each row
  for (int i = 0; i < MAX_ROWS; i++) {
    for (int j = 0; j < MAX_COLS; j++) {
      Serial.print(dataMatrix[i][j]);
      Serial.print((i == MAX_ROWS - 1 && j == MAX_COLS - 1) ? '\n' : ',');
    }
  }
}

Visualizer Schematic

Visualizer Schematic

FSR Bend Radius and Integration

FSRs tested in a lab

Validated Through Independent Lab Testing

Loomia FSRs have been evaluated in a university laboratory environment. The images above shown reflect bend radius testing.

Our sensors have a broad sensing range and reliable performance on both flat and gently curved surfaces.

Flexible FSR sensor image

Integration Instructions:

Our components are designed for easy integration onto surfaces. To attach our LEL to a surface (textile or plastic) Follow the instructions below: 

  1. Using the peel-and-stick backing, gently peel off the brown paper.  

  2. With adhesive exposed, apply the sticky component to your surface and ensure there are no bubbles.  

  3. Press down firmly  

  4. Do not lift or re-apply