12. Skin Electronics¶
Research¶
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
weekly assignment
Check out the weekly assignment here or login to your NuEval progress and evaluation page.
get inspired!
Check out and research alumni pages to betetr understand how to document and get inspired
-
Skin Circuit - Grecia Bello - Fab Lab BCN
-
Interactive glove - Asli Aksan - Textile Lab Amsterdam
-
Face Mask - Riley Cox - Textile Lab Amsterdam
-
Skin electronics research - Julija Karas - Fab Lab BCN
Wearability Factors for Skin Interfaces
References & Inspiration¶
@neoncowboys on instagram
Heart beat reactive makup by @theunseenalchemist on instagram
Aerodynamic makeup by @theunseenalchemist on instagram
Tools¶
Pressure Matrix Prototype Example¶
- Kobakant Tutorial
- Printable Template
- Fabricademy 2025-26 Tutorials - Capacitive Sensing and Pressure Matrix Tutorial Electronics by Emma Pareschi
- Tutorial Slides
- Processing Download
I used the printable template to draw the pieces into baking paper, this is good for a first prototype as you can see the velostat sandwiched in between the layers and how the copper tape creates a matrix however, I find it too flimsy when manipulating it to add the connections so I also made a prototype in cardboard for more stability.
Connections: - Row 1 -> to Arduino pin A0 - Row 2 -> to Arduino pin A1 - Row 3 -> to Arduino pin A2
- Col 1 -> to Arduino pin ~4
- Col 2 -> to Arduino pin ~5
- Col 3 -> to Arduino pin ~6
Using the serial monitor in Arduino IDE, we can see 9 columns which represent the values of each contact point on the matrix.The values are above 600 until you press on the velostat. It is easier to use the serial plotter to visualize the changes in values (top right icons)
Code Arduino: matrix_3rx3c_XIAOrp.ino by Emma Pareschi
/*
The analog sensor is connected between pin A0 and pin 4
*/
int row0 = A0; //first row pin
int row1 = A1; //first row pin
int row2 = A2; //first row pin
int col0 = 4; //first column pin
int col1 = 5; //first column pin
int col2 = 6; //first column pin
int incomingValue0 = 0; //variable to save the sensor reading
int incomingValue1 = 0; //variable to save the sensor reading
int incomingValue2 = 0; //variable to save the sensor reading
int incomingValue3 = 0; //variable to save the sensor reading
int incomingValue4 = 0; //variable to save the sensor reading
int incomingValue5 = 0; //variable to save the sensor reading
int incomingValue6 = 0; //variable to save the sensor reading
int incomingValue7 = 0; //variable to save the sensor reading
int incomingValue8 = 0; //variable to save the sensor reading
void setup() {
// set all rows to INPUT (high impedance):
pinMode(row0, INPUT_PULLUP);
pinMode(row1, INPUT_PULLUP);
pinMode(row2, INPUT_PULLUP);
//set the firt column as output
pinMode(col0, OUTPUT);
pinMode(col1, OUTPUT);
pinMode(col2, OUTPUT);
//open serial communication
Serial.begin(9600);
}
void loop() {
//set the col0 to low (GND)
digitalWrite(col0, LOW);
digitalWrite(col1, HIGH);
digitalWrite(col2, HIGH);
//read the three rows pins
incomingValue0 = analogRead(row0);
incomingValue1 = analogRead(row1);
incomingValue2 = analogRead(row2);
//set the col0 to low (GND)
digitalWrite(col0, HIGH);
digitalWrite(col1, LOW);
digitalWrite(col2, HIGH);
incomingValue3 = analogRead(row0);
incomingValue4 = analogRead(row1);
incomingValue5 = analogRead(row2);
//set the col0 to low (GND)
digitalWrite(col0, HIGH);
digitalWrite(col1, HIGH);
digitalWrite(col2, LOW);
incomingValue6 = analogRead(row0);
incomingValue7 = analogRead(row1);
incomingValue8 = analogRead(row2);
// Print the incoming values of the grid:
Serial.print(incomingValue0);
Serial.print("\t");
Serial.print(incomingValue1);
Serial.print("\t");
Serial.print(incomingValue2);
Serial.print("\t");
Serial.print(incomingValue3);
Serial.print("\t");
Serial.print(incomingValue4);
Serial.print("\t");
Serial.print(incomingValue5);
Serial.print("\t");
Serial.print(incomingValue6);
Serial.print("\t");
Serial.print(incomingValue7);
Serial.print("\t");
Serial.println(incomingValue8);
delay(10); //wait millisecond
}
Processing is...
In processing, we used PRO_serial_port_list.pde to identify the USB port number that Arduino is connected to. In my case it was [3].
Code Procesing:PRO_serial_port_list.pde
/*
You use this code to identify the USB port
*/
import processing.serial.*;
Serial myPort; // The serial port
void setup () {
size(100, 100); // set up the window to whatever size you want
printArray(Serial.list()); // List all the available serial ports
String portName = Serial.list()[5]; // set the number of your serial port!
myPort = new Serial(this, portName, 9600);
}
Using the port number we obtained before, we will include it in the following part of the code: String portName = Serial.list()[3]; // set the number of your serial port!
Code Procesing:PRO_pressure_matrix_vis_grey.pde
/*
The sensors values are not calibrated.
*/
/*
Code based on Tom Igoe’s Serial Graphing Sketch
>> http://wiki.processing.org/w/Tom_Igoe_Interview
Reads X analog inputs and visualizes them by drawing a grid
using grayscale shading of each square to represent sensor value.
>> http://howtogetwhatyouwant.at/
*/
import processing.serial.*;
Serial myPort; // The serial port
int rows = 3;
int cols = 3;
int maxNumberOfSensors = rows*cols;
float[] sensorValue = new float[maxNumberOfSensors]; // global variable for storing mapped sensor values
float[] previousValue = new float[maxNumberOfSensors]; // array of previous values
int rectSizeX = 0;
int rectSizeY = 0;
int rectY;
void setup () {
size(1000, 1000); // set up the window to whatever size you want
rectSizeX = width/rows;
rectSizeY = height/cols;
println(Serial.list()); // List all the available serial ports
String portName = Serial.list()[3]; // set the number of your serial port!
myPort = new Serial(this, portName, 9600);
myPort.clear();
myPort.bufferUntil('\n'); // don’t generate a serialEvent() until you get a newline (\n) byte
background(255); // set inital background
smooth(); // turn on antialiasing
rectMode(CORNER);
}
void draw () {
for (int i = 0; i < maxNumberOfSensors; i++) {
fill(sensorValue[i]);
rect(rectSizeX * (i%rows), rectY, rectSizeX, rectSizeY); //top left
if((i+1) % rows == 0) {
rectY += rectSizeX;
}
}
rectY=0;
}
void serialEvent (Serial myPort) {
String inString = myPort.readStringUntil('\n'); // get the ASCII string
if (inString != null) { // if it’s not empty
inString = trim(inString); // trim off any whitespace
int incomingValues[] = int(split(inString, "\t")); // convert to an array of ints
if (incomingValues.length <= maxNumberOfSensors && incomingValues.length > 0) {
for (int i = 0; i < incomingValues.length; i++) {
// map the incoming values (0 to 1023) to an appropriate gray-scale range (0-255):
sensorValue[i] = map(incomingValues[i], 000, 900, 0, 255); // stretch 5×5
sensorValue[i] = constrain(incomingValues[i], 0, 255);
//println(sensorValue[i]); // print value to see
//println(incomingValues[i]);
}
}
}
}

