5. E-textiles¶
E-textiles¶
Stitching a Soft Connection, photo by Svetlana Khachatryan
Research¶
E-textiles has been a growing area of research in both the fashion industry, the textile industry as a whole and medicine. Thermo- regulating outerwear, health trackers, garments sensing and analyzing your movements, knitwear that responds to your needs.. Imagine the endless possibilities of the combination of electronics and design. Starting from the mid 1990s, Maggie Orth researched “soft-circuits” and treated textile as a circuit, while everyone else would use textiles to hold the circuit. She explored the technical possibilities of using electronics in textiles and wearables. Around the same time Philips “Softwear” Lab in the Netherlands, was researching e-textiles from the perspective of emotions and intimacy, they imagined mood-responsive clothing, wearables as a second nervous system.
And so this week has been full of surprises. I began the week thinking how physics and mathematics have never been my strong suit, yet I have so much excitement to take on this challenge. Onik Babajanyan, one of the instructors at the Dilijan Fab Lab initially gave a short introduction and explained the basics of electronics. We learned what a closed circuit is, what resistors are and how to use them. We spoke about Ohm's law and voltages and somehow everything was making so much sense. With every step, my excitement grew. We got introduced to conductive and non conductive materials, beautifully labeled led light bulbs and the breadboard.
The Basics¶
Voltage - V (unit: volt)¶
Current - I (unit: amperes)¶
Resistance - R (units: Ohms/ Ω)¶
In a series circuit the components recieve the same amount of current, aka they are connected in a single path and the voltage is devided between them. If one component fails, the rest will fail too.
In a parallel circuit the components are connected in individual paths, and the voltage each component recieves is the same. The current is devided between the branches. If one fails, the rest will continue to work.
Hard and Soft Connections ¶
Hard connections are refered to circuits built with hard materials on hard materials (rigid) - for example a copper wire on a plastic surface.
Soft connections are referred to circuits built with soft materials on soft (flexible) materials- for example a conductive thread on felt.
You can also have Hard & Soft connection, which involves using both rigid and flexible materials.
Ebru Kurbak, Knit Macro-Electronics, 2013
A Digital Sensor in the most simple terms measures the physical quantity and shows a binary output code- 0 (off) or 1 (on).

An Analog Sensor measures a continuous output signal, rather than two. It usually produces signals in the form of voltage or current. We can read this by using Arduino for exmple, and we will see a range between 0-1023.
References & Inspiration¶
E-textiles is a completely new area for me. Of course I have come across e-textiles throughout my life, in simple things like a heated blanket for example, or a health tracker. However, when it came to researching for this week I was surprised to find that what grabbed my attention was textiles that had the ability to make sound. Once I had discovered and understood building a circuit, I was wondering how I would integrate it in my week’s assignment. The digital circuit was simple. It was an on and off switch and I could use that to light up a project bag that I use all the time. When I thought of an analog circuit, all I could think about was sounds.. Textiles that made sounds. And I will reveal where this thought came from to begin with. But before I do that, I want to share with you two projects that have really inspired and excited my process this week.
KnittedKeyboard II, MIT Media Lab¶
In the MIT Media Lab, Irmandy Wicaksono, Mike Hao Jiang and JosephA. Paradiso created a knitted keyboard. It is made completely out of flexible materials, which can be used as a wearable, can easily be rolled/ folded and taken wherever you go. It gives you this musical creative freedom of expression, anywhere you choose to use it!
KnittedKeyboard II, MIT Media Lab, Irmandy Wicaksono
![]() |
![]() |
|---|---|
KnittedKeyboard II, MIT Media Lab, Irmandy Wicaksono
The genius of this keyboard lies in their approach of how they have put it together. The digitally knit technology explores intarsia, interlock patterning, and a collection of functional (electrically-conductive and thermoplastic) and non-functional (polyester) fibers to develop a seamless and customized, 5-octave piano-patterned textile for expressive and virtuosic sonic interaction. In building it this way, the keyboard senses touch and pressure as well as reacts to stretching and to continuous proximity. They have used the conventional technology of keystroke, where the conductive materials will create a sound by just touch, as well as conductive threads allow push, pull, twist, stretch to also result in sounds. However, they have also used a continuous non- contact proximity sensor, which allows the user to just hover over it to create sound.
Felted Terrain, Yihyun Lim¶
Yihyun Lim’s “Felted Terrain” is a translation of the mossy Icelandic landscapes into a three dimensional, interactive textile installation. She used soft circuits , which she stitched to the felted textiles using conductive thread. She also used Lilypad microcontrollers and arduino to manipulate and generate sounds upon touching the terrain.
Felted Terrain, Yihyun Lim
Tools¶
- Arduino IDE
- Adafruit Flora
- Conductive Copper Tape
- Conductive Thread
- 3V Lithium Coin Cell Battery
- Coin Cell Battery Holder
- Velostat
- Felt
- Piezoelectric Speaker (Piezo ceramic buzzer)
- Non- Conductive Thread
- Alligator Clips
- Multimeter
- LED lightbulbs
Process and workflow¶
Understanding a circuit¶
To make a simple digital circuit, I used three alligator clips, a 3V battery and the battery holder, a LED lightbulb, conductive copper tape and non conductive material (felt). LED lightbulbs have two “tails”. One is long and one is short. The long tail is the +, the short is the -. To connect the alligators correctly you have to clip the short tail (-) with the alligator to the minus of the battery. The long tail (+), is connected to the conductive copper tape. The + of the battery is connected to another conductive copper tape. See image below.
Once you press the two conductive copper tapes to each other, the light bulb should switch on. If your lightbulb doesn't turn on, check your connections again.
If you add velostat between the two conductive copper tapes, you will have created an analog sensor.
Making a circuit with conductive thread¶
To get more advanced, I took a piece of felt and carefully stitched the battery holder from both sides (+ -) with conductive thread. The - is stitched to the small tail of the LED lightbulb, the + is stitched to a conductive copper tape. A second conductive copper tape is stitched to the + of the battery holder.
Note: Only put the battery in the holder when finished stitching and making all your connections.
Photos by Svetlana Khachatryan
Using conductive thread to build a circuit reminded me of slow-stitching. I often use slow-stitching in my work and this felt like home, with an additional magic in the end of a lightbulb turning on!
Digital Circuit in a Bag¶
After these experiments I decided to build a third circuit using conductive threads and integrating it in my slow stitch project bag. I am always fiddling to find things in my project bag and having a on/off button connected to a lightbul in the ag can solve so many frustrating moments!
This time around I had to create an actual button using felt and conductive copper tape. The idea was for the two conductive copper tapes to touch each other only when pressed from both sides. For this I did all the (slow) stitching with the conductive thread, connecting the LED lightbulb - to the battery holder -, then stitching the + from the battery holder to connect to the first conductive copper tape. The second tape had to be stitched on a frame of double felt, to make sure that it sits right above the first one, but doesn't touch it.
Before putting the second conductive copper tape on the frame, I had to carefully stitch conductive thread under it onto the felt (non conductive material), while making sure that this thread didn't touch the first conductive copper tape, to make sure I don't make a short circuit.
Once everything was stitched and ready, I put the battery in and made sure that my circuit works. After this, I could stitch it into the bag!
I made a small hole for the LED lightbulb to pop out and slow stitched around the hole too! I tested again to make sure everything is working, and marked on my ag where the button is. I then stitched a little red cross + to indicate where to press from.
Once this was done, I hand stitched and closed the opening of the lining of the bag and voila!
Photos by Svetlana Khachatryan
We have ourselves a soft digital circuit fullly incorporated in textile, ready to be used. Surely the battery will need to be replaced at some point in the future, but thats an easy task!
Schematic diagram of the circuit used in the bag
Note In this circuit I didn't use a resistor, because the 3V cell battery has a high internal resistor, which will automatically limit the current. Moreover the small LED lights usually have a current of 2.0V-3.0V. Using conductive thread also loses some current and acts as a natural resistor. The combination of all three factors makes it safe and unnecessary to use a resistor.
Translating Color into Sound¶
For my next assignment this week I was inspired by a photo that I had taken last week actually! When I looked at one of the photos of all the naturally dyed textiles put in order, all I could hear was the piano.
So I decided to build a circuit and use Arduino IDE and Adafruit Flora, to interpret sounds of color.
A diagram showing how I plan to slow-stitch my analog circuit
I used a piezoelectric speaker (piezo buzzer) to make the sounds. It is a disc made of metal and ceramic in the middle. In simple terms, when you give voltage to piezoelectric material (such as ceramic) a mechanical motion is created (invisible to the eye). This is then converted to audible sound. What happens is that electric charge accumulates in certain solid materials—such as crystals, certain ceramics, and biological matter such as bone, DNA, and various proteins—in response to applied mechanical stress.
Working on this circuit took me back to my love of slow stitching yet again! When working with conductive thread, you need to be both firm, yet gentle. It is also important to make sure you do not cause a short circuit.
To avoid a short circuit, you will notice that I stitched an extra layer of fet under my second button. This was done so that the negative of my second button doesn't touch the positive of my first button.
Once I was done making all my connections, I tested it with Arduino IDE. I generated codes through the help of chatGPT and although I did many many experiments, I will only share a few!
Fa..So..La...
Use the three backticks to separate code.
// === 3-Pad Fa–Sol–La (Pad2 and Pad3 swapped) ===
// Pad1 = D6 -> Fa
// Pad2 = D12 -> Sol
// Pad3 = D10 -> La
// Buzzer = D9
const int BUZZ_PIN = 9;
// Pads reordered: {Pad1, Pad2, Pad3}
const int PAD_PINS[3] = { 6, 12, 10 };
// Frequencies: Fa (F4), Sol (G4), La (A4)
const int NOTE_HZ[3] = {
349, // Fa (F4)
392, // Sol (G4)
440 // La (A4)
};
int currentIdx = -1;
bool lastState[3] = {false,false,false};
void setup() {
for (int i = 0; i < 3; i++) pinMode(PAD_PINS[i], INPUT_PULLUP);
pinMode(BUZZ_PIN, OUTPUT);
Serial.begin(115200);
Serial.println("Pads: D6=Fa, D12=Sol, D10=La");
}
void loop() {
bool pressedNow[3];
int newlyPressed = -1;
bool anyPressed = false;
// Read pads (LOW = pressed)
for (int i = 0; i < 3; i++) {
pressedNow[i] = (digitalRead(PAD_PINS[i]) == LOW);
if (pressedNow[i] != lastState[i]) {
lastState[i] = pressedNow[i];
Serial.print("Pad "); Serial.print(i+1);
Serial.println(pressedNow[i] ? " pressed" : " released");
if (pressedNow[i]) newlyPressed = i;
}
if (pressedNow[i]) anyPressed = true;
}
if (newlyPressed != -1) {
currentIdx = newlyPressed;
tone(BUZZ_PIN, NOTE_HZ[currentIdx]);
Serial.print("Playing: "); Serial.println(NOTE_HZ[currentIdx]);
}
else if (!anyPressed) {
if (currentIdx != -1) {
noTone(BUZZ_PIN);
Serial.println("Silence");
currentIdx = -1;
}
}
else if (currentIdx != -1 && !pressedNow[currentIdx]) {
for (int i = 0; i < 3; i++) {
if (pressedNow[i]) {
currentIdx = i;
tone(BUZZ_PIN, NOTE_HZ[currentIdx]);
Serial.print("Playing: "); Serial.println(NOTE_HZ[currentIdx]);
break;
}
}
}
delay(12);
}
It was a rainy day...
// === Piezo "Rain" Sound Synth ===
// Pads to GND: D6=Drizzle, D12=Shower, D10=Downpour
// Buzzer: D9 -> piezo red, GND -> piezo black
//
// Hold any pad to hear rain at that intensity. Release = stop.
const int BUZZ_PIN = 9;
const int PAD_DRIZZLE = 6; // Pad1
const int PAD_SHOWER = 12; // Pad2
const int PAD_DOWNPOUR= 10; // Pad3
// Gap ranges between drops (ms) for each mode
struct Mode { int gapMin, gapMax; }; // inter-drop delay windows
Mode drizzle = { 60, 200 }; // sparse, gentle
Mode shower = { 20, 80 }; // steady rain
Mode downpour = { 5, 25 }; // intense
// Drop characteristics
// High "tick" drops: short, bright; Low "plop" drops: longer, lower freq.
const int TICK_F_LO = 2500, TICK_F_HI = 6000; // Hz
const int TICK_D_LO = 2, TICK_D_HI = 8; // ms
const int PLOP_F_LO = 500, PLOP_F_HI = 1200; // Hz
const int PLOP_D_LO = 6, PLOP_D_HI = 20; // ms
const int PLOP_CHANCE = 6; // 1 in 6 drops is a lower "plop"
// Cluster behavior (little bursts like rain hitting surfaces)
const int CLUSTER_CHANCE = 5; // 1 in 5 drops spawns a cluster
const int CLUSTER_MIN = 2, CLUSTER_MAX = 5; // extra drops in a cluster
const int CLUSTER_GAP_LO = 5, CLUSTER_GAP_HI = 30; // ms between cluster drops
unsigned long nextDropMs = 0;
bool wasAnyPressed = false;
void setup() {
pinMode(PAD_DRIZZLE, INPUT_PULLUP);
pinMode(PAD_SHOWER, INPUT_PULLUP);
pinMode(PAD_DOWNPOUR,INPUT_PULLUP);
pinMode(BUZZ_PIN, OUTPUT);
Serial.begin(115200);
randomSeed(analogRead(A0)); // crude seed
Serial.println("Hold D6=Drizzle, D12=Shower, D10=Downpour");
}
void loop() {
bool d = (digitalRead(PAD_DRIZZLE) == LOW);
bool s = (digitalRead(PAD_SHOWER) == LOW);
bool p = (digitalRead(PAD_DOWNPOUR) == LOW);
// "Last pressed wins" (simple priority if multiple held)
const Mode* mode = nullptr;
if (p) mode = &downpour;
else if (s) mode = &shower;
else if (d) mode = &drizzle;
bool anyPressed = (mode != nullptr);
unsigned long now = millis();
if (!anyPressed) {
if (wasAnyPressed) {
noTone(BUZZ_PIN);
Serial.println("Rain: off");
}
wasAnyPressed = false;
return; // idle
}
if (!wasAnyPressed) {
// starting rain
Serial.println("Rain: on");
nextDropMs = now + random(mode->gapMin, mode->gapMax + 1);
}
wasAnyPressed = true;
// Time for next drop?
if (now >= nextDropMs) {
// Decide drop type
bool plop = (random(PLOP_CHANCE) == 0); // ~1/6 chance
int f = plop ? random(PLOP_F_LO, PLOP_F_HI + 1)
: random(TICK_F_LO, TICK_F_HI + 1);
int dms = plop ? random(PLOP_D_LO, PLOP_D_HI + 1)
: random(TICK_D_LO, TICK_D_HI + 1);
tone(BUZZ_PIN, f, dms);
// Occasionally spawn a small cluster (extra quick drops)
if (random(CLUSTER_CHANCE) == 0) {
int n = random(CLUSTER_MIN, CLUSTER_MAX + 1);
for (int i = 0; i < n; i++) {
delay(random(CLUSTER_GAP_LO, CLUSTER_GAP_HI + 1));
bool subPlop = (random(PLOP_CHANCE) == 0);
int f2 = subPlop ? random(PLOP_F_LO, PLOP_F_HI + 1)
: random(TICK_F_LO, TICK_F_HI + 1);
int d2 = subPlop ? random(PLOP_D_LO, PLOP_D_HI + 1)
: random(TICK_D_LO, TICK_D_HI + 1);
tone(BUZZ_PIN, f2, d2);
}
}
// Schedule next drop according to selected mode
nextDropMs = now + random(mode->gapMin, mode->gapMax + 1);
}
// tiny sleep to keep loop smooth and avoid Serial spam
delay(2);
}
Final Result¶
Indigo Sound Pad, photos by Svetlana Khachatryan
// === Simple Do Re Mi ===
// Pads to GND:
// D6 -> Do (C4)
// D12 -> Re (D4)
// D10 -> Mi (E4)
// Buzzer: D9 -> piezo
const int BUZZ_PIN = 9;
const int PAD_DO = 6;
const int PAD_RE = 12;
const int PAD_MI = 10;
// Frequencies (Hz) for Do Re Mi
const int FREQ_DO = 261;
const int FREQ_RE = 294;
const int FREQ_MI = 329;
void setup() {
pinMode(PAD_DO, INPUT_PULLUP);
pinMode(PAD_RE, INPUT_PULLUP);
pinMode(PAD_MI, INPUT_PULLUP);
pinMode(BUZZ_PIN, OUTPUT);
Serial.begin(115200);
Serial.println("Pad 1 (D6)=DO, Pad 2 (D12)=RE, Pad 3 (D10)=MI");
}
void loop() {
// Read pads (pressed = LOW)
bool doPressed = (digitalRead(PAD_DO) == LOW);
bool rePressed = (digitalRead(PAD_RE) == LOW);
bool miPressed = (digitalRead(PAD_MI) == LOW);
if (doPressed) {
tone(BUZZ_PIN, FREQ_DO);
Serial.println("DO (261 Hz)");
}
else if (rePressed) {
tone(BUZZ_PIN, FREQ_RE);
Serial.println("RE (294 Hz)");
}
else if (miPressed) {
tone(BUZZ_PIN, FREQ_MI);
Serial.println("MI (329 Hz)");
}
else {
noTone(BUZZ_PIN); // silence when no pad pressed
}
delay(50); // prevent serial spam
}



















