9. Wearables¶
References¶
Workflow and first steps¶
Wearables was a real challenge for me. I felt limited in my creativity because my technical learning process was slower than expected. Very quickly, I felt the need to work with sound in my research, as it is an integral part of my artistic practice, particularly through the creation of sound pieces that highlight the different stages of wool transformation. I also regularly capture the sounds around me, recording ideas on my phone’s microphone, as well as conversations with people close to me. I see sound as a true material in its own right.
First, we experimented with old fabrics made at Green Fabric using thermo-ink and conductive thread shaped into spirals in order to increase conductivity. To allow the current to flow, we burned the ends of the thread to remove the protective coating. We also followed the workshop given to build a circuit that can withstand voltage and release it thanks to a MOSFET. Unfortunately, there was a false contact in my circuit that we were not able to identify, so I worked with the circuits made by Carmen and Annabel.
Still connected to sound, I then started creating different speakers by forming spirals with conductive thread, some embroidered, others sandwiched and glued between two layers of tape.
Once my speakers were finished, we integrated the Game of Thrones music onto Annabel’s XIAO board, since my own XIAO was not working either and I still wanted to test my speakers. The fabric embroidered in a spiral needs to remain stretched on the embroidery hoop in order to emit sound when a magnet is placed on top of it. The larger the magnet, the louder the sound.
// -------------------------------------------------
// Copyright (c) 2022 HiBit <https://www.hibit.dev>
// -------------------------------------------------
#include "pitches.h"
#define BUZZER_PIN 9
int melody[] = {
NOTE_AS4, NOTE_AS4, NOTE_AS4,
NOTE_F5, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F6, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F6, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_AS5, NOTE_G5, NOTE_C5, NOTE_C5, NOTE_C5,
NOTE_F5, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F6, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F6, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_AS5, NOTE_G5, NOTE_C5, NOTE_C5,
NOTE_D5, NOTE_D5, NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F5,
NOTE_F5, NOTE_G5, NOTE_A5, NOTE_G5, NOTE_D5, NOTE_E5, NOTE_C5, NOTE_C5,
NOTE_D5, NOTE_D5, NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F5,
NOTE_C6, NOTE_G5, NOTE_G5, REST, NOTE_C5,
NOTE_D5, NOTE_D5, NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F5,
NOTE_F5, NOTE_G5, NOTE_A5, NOTE_G5, NOTE_D5, NOTE_E5, NOTE_C6, NOTE_C6,
NOTE_F6, NOTE_DS6, NOTE_CS6, NOTE_C6, NOTE_AS5, NOTE_GS5, NOTE_G5, NOTE_F5,
NOTE_C6
};
int durations[] = {
8, 8, 8,
2, 2,
8, 8, 8, 2, 4,
8, 8, 8, 2, 4,
8, 8, 8, 2, 8, 8, 8,
2, 2,
8, 8, 8, 2, 4,
8, 8, 8, 2, 4,
8, 8, 8, 2, 8, 16,
4, 8, 8, 8, 8, 8,
8, 8, 8, 4, 8, 4, 8, 16,
4, 8, 8, 8, 8, 8,
8, 16, 2, 8, 8,
4, 8, 8, 8, 8, 8,
8, 8, 8, 4, 8, 4, 8, 16,
4, 8, 4, 8, 4, 8, 4, 8,
1
};
void setup()
{
pinMode(BUZZER_PIN, OUTPUT);
}
void loop()
{
int size = sizeof(durations) / sizeof(int);
for (int note = 0; note < size; note++) {
//to calculate the note duration, take one second divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int duration = 1000 / durations[note];
tone(BUZZER_PIN, melody[note], duration);
//to distinguish the notes, set a minimum time between them.
//the note's duration + 30% seems to work well:
int pauseBetweenNotes = duration * 1.30;
delay(pauseBetweenNotes);
//stop the tone playing:
noTone(BUZZER_PIN);
}
}
Still exploring embroidery, Stephanie gave us a short tutorial on the digital embroidery machine that we have at Greenfabric.
Marry me¶
Since my XIAO wasn’t working, I worked with a Micro:bit instead, experimenting with programming in a more intuitive, playful way, and I created a little love message for my partner just for fun. I think I needed some lightness !
input.onSound(DetectedSound.Loud, function () {
basic.showString("Will you marry me?")
})
input.onButtonPressed(Button.A, function () {
music._playDefaultBackground(
music.builtInPlayableMelody(Melodies.Wedding),
music.PlaybackMode.LoopingInBackground
)
basic.showIcon(IconNames.Heart)
basic.showIcon(IconNames.SmallHeart)
basic.showString("Yes")
basic.showIcon(IconNames.Heart)
basic.showIcon(IconNames.SmallHeart)
basic.showString("I")
basic.showIcon(IconNames.Heart)
basic.showLeds(`
# . . . #
# . . . #
# . . . #
# . . . #
# # # # #
`)
})
input.onButtonPressed(Button.B, function () {
music._playDefaultBackground(
music.builtInPlayableMelody(Melodies.Funeral),
music.PlaybackMode.LoopingInBackground
)
basic.showIcon(IconNames.Sad)
basic.showIcon(IconNames.Asleep)
basic.showString("No")
basic.showIcon(IconNames.Sad)
basic.showIcon(IconNames.Asleep)
basic.showString("I still")
basic.showIcon(IconNames.Heart)
basic.showLeds(`
# . . . #
# . . . #
# . . . #
# . . . #
# # # # #
`)
})
Wool and Microbit¶
Since my XIAO wasn’t working, I decided to work with a micro:bit, which allowed me to experiment with programming in a more intuitive, playful way. I even created a little love declaration for my partner just for fun.
I took advantage of the holidays to be at my parents’ house and used my loom. I revisited my project since I hadn’t finished it previously due to personal reasons. For the Wearable week, I wanted to integrate conductive thread directly into the fabric through weaving to create a conductive textile. Continuing to work with a micro:bit and NeoPixels, which I really enjoyed during the Skin Electronics week, I wanted to bring this approach into Wearable, but this time using a NeoPixel ring.
I planned the integration of my weaving for three different circuits: one for ground, 3V, and P0. I watched a tutorial on YouTube to verify that the ring worked correctly. Then I ran some tests with light patterns, still linking the lights to music, aiming for an effect where the lights change with the rhythm of the music.
let brightness = 0
let sound = 0
// Initialize NeoPixel strip on P0 with 12 LEDs
let strip = neopixel.create(DigitalPin.P0, 12, NeoPixelMode.RGB)
strip.setBrightness(30)
strip.clear()
strip.show()
basic.forever(function () {
// Read sound level (0 → 255)
sound = input.soundLevel()
// Map sound level to brightness
brightness = Math.map(sound, 0, 140, 5, 30)
brightness = Math.constrain(brightness, 0, 30)
// Safety: too loud → turn off lights
if (sound > 140) {
strip.clear()
strip.show()
} else {
strip.setBrightness(brightness)
strip.showColor(neopixel.colors(NeoPixelColors.Green))
}
basic.pause(50)
})
Once the weaving was done, I soldered additional wires to the ring to make it easier to connect with alligator clips for testing. After soldering and testing, I finished my weavings, one conductive and the other designed to hold my micro:bit. I completed all the connections and soldered directly onto the board, but unfortunately, it still didn’t work. I think there’s a false contact at the knots between the board and the NeoPixels.




