Physical Computing & Weaving / E-Textiles
Carnegie Mellon University - R.A. in E-Waste Recylcling at WHY Research Lab
PI: Prof. Daragh Byrne
Physical Computing & Weaving / E-Textiles
Carnegie Mellon University - R.A. in E-Waste Recylcling at WHY Research Lab
PI: Prof. Daragh Byrne
This project explores the revitalization of inner Ethernet cable wires through plain weave techniques, Work: Individual transforming them into a capacitive touch-sensitive surface. By integrating physical computing with craft, the woven matrix enables touch recognition directly through the recycled wires, highlighting the potential of tactile interaction within handmade structures.
This project begins with a focus on material reuse, sourcing electronic waste— specifically inner wires from discarded Ethernet cables— conductive threads. The weaving itself takes place on an improvised loom, crafted from the metal casing of a decommissioned router. This approach not only anchors the project in sustainable making practices, but also invites a reimagining of overlooked technological remnants as tactile and expressive design components.
The initial prototype serves as a proof of concept for both material behavior and structural viability. By untwisting and isolating the inner wires of — Ethernet cables, a basic plain weave was formed each warp and weft interlacing methodically to establish a grid. This early exploration tested the tactile and structural properties of the conductive wires when interwoven, laying the groundwork for later, more functional iterations.
At the heart of the system lies a capacitive sensing matrix, where woven rows and columns are assigned as transmitters (TX) and receivers (RX), respectively. This grid-like logic enables the detection of touch coordinates based on the intersection of active signals— much like locating a point on a map. The technique not only embeds interactivity into the fabric itself, but also mirrors the inherent grid structure of weaving, creating a natural harmony between craft logic and sensing infrastructure.
To enhance the sensitivity and effective interaction zone of the mat, a new weaving approach was developed. Each row was as the primary much like locating a point on a cut and reconnected in pairs, forming looped segments that function together as a single signal line. This method expands the capacitive surface area without sacrificing the clarity of touch data, allowing for more consistent detection across the mat. It also introduced a new layer of technical weaving logic that balanced aesthetics with electrical performance.
As the weaving method evolved, so did the strategy for organizing the sensing structure. The distinct color pairs within the Ethernet cables offered a practical affordance: they could be used to visually and functionally divide the mat into touch-sensitive zones. This led to the formation of four color-coded regions, each composed of approximately 13 to 14 rows (TX lines), totaling 55 rows across the entire surface. These zones not only made debugging and mapping touch data more intuitive, but also allowed for region-specific multiplexing later in the circuit.
To create functional rows, each conductive wire was cut, stripped, and Color Coded Regions and Row Structuring soldered to its neighbor to form signal-carrying pairs, enhancing the surface area and signal stability. A jumper wire was then soldered to the end of each pair, extending the rows cleanly out from the textile and allowing them to interface with the breadboard and microcontroller. This step marked a transition from soft structure to electrical system, preserving the woven logic while preparing the mat for embedded interaction.
// --- Code for Touch Detection --
// MUX select pins for 4 regions
int mux1_select[] = {22, 23, 24, 25}; // Blue
int mux2_select[] = {26, 27, 28, 29}; // Orange
int mux3_select[] = {30, 31, 32, 33}; // Green
int mux4_select[] = {34, 35, 36, 37}; // Brown
int* mux_selects[] = {mux1_select, mux2_select, mux3_select, mux4_select};
// Analog input pins for each MUX SIG
int muxSIG[] = {A0, A1, A2, A3};
// TX (warp) pins: 11 vertical lines
int txPins[] = {38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48};
const int numTX = sizeof(txPins) / sizeof(txPins[0]);
const int numMUX = 4;
const int numChannels = 14; // C0–C13
const int touchThreshold = 500; // Adjust as needed
void setup() {
Serial.begin(9600);
// Setup TX pins
for (int i = 0; i < numTX; i++) {
pinMode(txPins[i], OUTPUT);
digitalWrite(txPins[i], LOW);
}
// Setup all MUX select pins
for (int m = 0; m < numMUX; m++) {
for (int s = 0; s < 4; s++) {
pinMode(mux_selects[m][s], OUTPUT);
digitalWrite(mux_selects[m][s], LOW);
}
}
}
void setMUXChannel(int* selectPins, int channel) {
for (int i = 0; i < 4; i++) {
digitalWrite(selectPins[i], (channel >> i) & 1);
}
}
void loop() {
for (int tx = 0; tx < numTX; tx++) {
digitalWrite(txPins[tx], HIGH); // Activate TX line
delayMicroseconds(50);
for (int ch = 0; ch < numChannels; ch++) {
for (int m = 0; m < numMUX; m++) {
setMUXChannel(mux_selects[m], ch);
delayMicroseconds(5);
int val = analogRead(muxSIG[m]);
if (val > touchThreshold) {
Serial.print("Touch @ TX ");
Serial.print(tx);
Serial.print(", MUX ");
Serial.print(m);
Serial.print(" (C");
Serial.print(ch);
Serial.print(")
Value: ");
Serial.println(val);
}
}
}
digitalWrite(txPins[tx], LOW); // Deactivate TX
delay(20);
}
Serial.println("--- End of Scan ---");
delay(200);
}