Process¶
Ideation & sketches¶
Weeks Reviews¶
Week 1 & 2 Reviews¶
Objectives for my first weeks were to shape my final idea for final presenation so I know, where I am heading towards to, make a of all of the electonics, order the electronics and try to test as much as I can without my proper tools.
Sketches&Moodboard¶
I have designed the dress so it complements the electronics and serves its purpose well. I have bought strechy fabrics and will do it from the strechy fabrics.
Storytelling Moodboard¶
I have met with the dancer and we have finalized and shaped our idea about the final presentation. We have chosen a topic of Life & Death, but decided to make take a creative spin on the design. We will be not using black and white and the sound will be generated in afrobeats rythm. I have let ChatGPT (AI) generate a story, that I have then transformed int to a storyboard, that the dance will use to actually create the choreography.
Storyboard¶
Research for Electronics¶
I have been reasearching a lot, which electronics I should use for the project, I would love to make the body as much e-textile as I could, but also take advantage of the sensors that are small, light easy to use. I have taken in account the Oscar's comments how to add visual respons for someone who is watching the dancer dance and listening to the sound. I have added LEDs for my project that will light up whenever the certain area near is touched. This added a lot fo different problems to my project, since I now have 14 touch sensors, with 22 LEDs, 2 speakers, 2 acceletors and only 8 PINs on Flora to connect to. I have research different ways of how can I make multiple inputs as easiest as I could from matrix, to shift registers. I have decided that I will devide diagonally my design and devide each part of the body by individual microcontoller, therefore I have more PINs available and less PINs needed.
Devided circuite on the body by Linette Manuel
Even like this I was still lacking some PINS. To solve my problem I have found out an amazing ADCTouch Library by martin2250. This library enables you to use only one PIN to determine whether you touched the area or not. To add more analog input pins to my project I will use multiplexer.
Circuit Sketch by Linette Manuel
Paper prototype¶
Top Paper Prototype by Linette Manuel
I have drafted a paper prototype, since I needed the design in 3D. Paper is not enough for my imagination, I love to design on the manequine, since I give me more real sense of the "look". I have been drafting on the manuquine with paper and conductive copper sheets. I have prepared all my part to test.
Testing conductive paper pads¶
After creating the paper prototype, I have decided to test the actual pads. I am happy they work. But I am still waiting for all of the electronics to come, so I can start testing.
#include <ADCTouch.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN 1
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 4
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int touchSensor0;
int touchSensor1;
int touchSensor2;
int touchSensor3;
void setup()
{
Serial.begin(9600);
touchSensor0 = ADCTouch.read(A10, 900);
touchSensor1 = ADCTouch.read(A9, 900);
touchSensor2 = ADCTouch.read(A7, 900);
touchSensor3 = ADCTouch.read(A11, 900);
pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
pixels.clear(); // Set all pixel colors to 'off'
}
void loop()
{
int touchSensorValue0 = ADCTouch.read(A10);
int touchSensorValue1 = ADCTouch.read(A9);
int touchSensorValue2 = ADCTouch.read(A7);
int touchSensorValue3 = ADCTouch.read(A11);
if(touchSensorValue0 > 980) {
Serial.print("Touched Red with value: ");
Serial.println(touchSensorValue0);
pixels.setPixelColor(0, pixels.Color(255, 255, 255));
pixels.show();
} else {
pixels.setPixelColor(0, pixels.Color(0, 0, 0));
pixels.show();
}
if(touchSensorValue1 > 980) {
Serial.print("Touched Yellow with value: ");
Serial.println(touchSensorValue1);
pixels.setPixelColor(1, pixels.Color(255, 255, 255));
pixels.show();
} else {
pixels.setPixelColor(1, pixels.Color(0, 0, 0));
pixels.show();
}
if(touchSensorValue2 > 980) {
Serial.print("Touched Green with value: ");
Serial.println(touchSensorValue0);
pixels.setPixelColor(2, pixels.Color(255, 255, 255));
pixels.show();
} else {
pixels.setPixelColor(2, pixels.Color(0, 0, 0));
pixels.show();
}
if(touchSensorValue3 > 980) {
Serial.print("Touched Black with value: ");
Serial.println(touchSensorValue1);
pixels.setPixelColor(3, pixels.Color(255, 255, 255));
pixels.show();
} else {
pixels.setPixelColor(3, pixels.Color(0, 0, 0));
pixels.show();
}
delay(10);
}
ChatGTP¶
I have been using ChatGPT a lot to help me, figure research my ideas and even write a code. I have several example codes, that have been generated. It is not perfect, you still need to understand the logic and sometimes it is very incorrect, so you need to double check the information, but helps you so much at least navigate where to focus.
#include <Wire.h>
#include <Adafruit_ADXL343.h>
#include <Adafruit_NeoPixel.h>
#include <Adafruit_ADCTouch.h>
#include <Adafruit_TonePlayer.h>
// ADXL343 accelerometer
Adafruit_ADXL343 accel = Adafruit_ADXL343();
// Neopixel stripe
Adafruit_NeoPixel strip = Adafruit_NeoPixel(14, 12, NEO_GRB + NEO_KHZ800);
// 74HC4051 multiplexer
Adafruit_ADCTouch mux = Adafruit_ADCTouch(10,9,6,1);
// Stemma speaker
Adafruit_TonePlayer speaker = Adafruit_TonePlayer(0);
// variables for storing sensor data
float x, y, z;
float pitch = 440;
// variables for storing touch sensor data
int touchSensor1 = 0;
int touchSensor2 = 0;
int touchSensor3 = 0;
int touchSensor4 = 0;
int touchSensor5 = 0;
int touchSensor6 = 0;
int touchSensor7 = 0;
void setup() {
// initialize serial communication
Serial.begin(9600);
// initialize ADXL343
accel.begin();
// initialize neopixel stripe
strip.begin();
strip.show();
// initialize 74HC4051 multiplexer
mux.begin();
}
void loop() {
// read x, y, z values from ADXL343
x = accel.readX();
y = accel.readY();
z = accel.readZ();
// update touch sensor values
touchSensor1 = mux.measure(0);
touchSensor2 = mux.measure(1);
touchSensor3 = mux.measure(2);
touchSensor4 = mux.measure(3);
touchSensor5 = mux.measure(4);
touchSensor6 = mux.measure(5);
touchSensor7 = mux.measure(6);
// check for touch sensor 1 press
if (touchSensor1 > 1000) {
// turn on LEDs 1 and 2
strip.setPixelColor(0, strip.Color(255, 0, 0));
strip.setPixelColor(1, strip.Color(255, 0, 0));
strip.show();
// play sound
speaker.play(pitch);
}
// check for touch sensor 2 press
if (touchSensor2 > 1000) {
// turn on LEDs 3 and 4
strip.setPixelColor(2, strip.Color(255, 0, 0));
strip.setPixelColor(3, strip.Color(255, 0, 0));
strip.show();
// play sound
speaker.play(pitch);
}
// check for touch sensor 3 press
if (touchSensor3 > 1000) {
// lower pitch
pitch -= 20;
// turn on LEDs 5 and 6
strip.setPixelColor(4, strip.Color(255, 0, 0));
strip.setPixelColor(5, strip.Color(255, 0, 0));
strip.show();
// play sound
speaker.play(pitch);
}
// check for touch sensor 4 press
if (touchSensor4 > 1000) {
// lower pitch
pitch -= 20;
// turn on LEDs 7 and 8
strip.setPixelColor(6, strip.Color(255, 0, 0));
strip.setPixelColor(7, strip.Color(255, 0, 0));
strip.show();
// play sound
speaker.play(pitch);
}
// check for touch sensor 5 press
if (touchSensor5 > 1000) {
// lower pitch
pitch -= 20;
// turn on LEDs 9 and 10
strip.setPixelColor(8, strip.Color(255, 0, 0));
strip.setPixelColor(9, strip.Color(255, 0, 0));
strip.show();
// play sound
speaker.play(pitch);
}
// check for touch sensor 6 press
if (touchSensor6 > 1000) {
// raise pitch
pitch += 20;
// turn on LEDs 11 and 12
strip.setPixelColor(10, strip.Color(255, 0, 0));
strip.setPixelColor(11, strip.Color(255, 0, 0));
strip.show();
// play sound
speaker.play(pitch);
}
// check for touch sensor 7 press
if (touchSensor7 > 1000) {
// raise pitch
pitch += 20;
// turn on LEDs 13 and 14
strip.setPixelColor(12, strip.Color(255, 0, 0));
strip.setPixelColor(13, strip.Color(255, 0, 0));
strip.show();
// play sound
speaker.play(pitch);
}
// check for wrist movement
if (y > 500) {
// lower pitch
pitch -= 10;
// play sound
speaker.play(pitch);
} else if (y < -500) {
// raise pitch
pitch += 10;
// play sound
speaker.play(pitch);
}
}
Week 2 & 3 Reviews¶
Designing the bodysuit¶
Copy of Rachel Freire - Second Skin by Linette Manuel
Testing all the seperate parts¶
Capacitive Touch Sensors¶
Multiplexing¶
Multiplexing by Linette Manuel
Figuring out the platforms to generate music¶
I have been playing with several platforms and generated some music samples from heart beat.
Mid-term Presentation¶
Week 7 & 8 Reviews¶
Desing of the body suit¶
I have been struggling with the different ways how I would like my body suit to look and since I really wanted to applify and reflect the desing to fit the actual purpose of the suit, I have designed I sound wave pattern for the top part of the body suit. To represent that the suit is connected to movement I wanted to try to use dual color filament. At the end I was super happy wit the results.
I have used the soundwave picture as a inspiration and was battling between two designes - dots and lines. Lines ended up to be the part ones I have used.
Design by Linette Manuel
At first I was thinking to work with the random body design, but after talking to Cecilia, I have decided to take advantage of the technologies I am using and making the suit symetrical.
3D Printing the Body suit¶
I have devided the front part of the suit into 6 pieces and printed accordingly on top of them. I was in rush so I have not messured how much I have streched the fabrics, so at the end, there were some pieces of the fabric that were much more bendy that the others. But it is fine, because for the prototype I am not aming for perfection. Cecilia suggested that the best way to do it is to draw a square in the middle and messure how much I stretch each piece, so it can be streched evenly.
Copy of Design by Linette Manuel
I have discovered a nice thing, if I printed with the direction of the weft of the fabric, the tendency of the 3D print to deattach was much bigger, whearas if I printed in the direction of the warp the print was more stable.
I have been using lycra fabrics (20% elastan + 80 % polyamids). This lycra was very stretchy, so I had no troubled to strech them. I have used 3D Jake magic PLA - metallic Ememerald.
For the printing standard Prusa PLA DRAFT settings with 0.4mm nozzle. I have made a few changes for my test
I have tested 3 types of settings.
A. - 1mm height of the print, 4 layers of print, first layer thickenes 0,1mm and 0,3mm for the rest of layers
B. - 0.8mm height of the print, 3 layers of print, first layer thickenes 0,2mm and 0,3mm for the rest of layers
C. - 0.6mm height of the print, 3 layers of print, first layer thickenes 0,2mm and 0,2mm for the rest of layers
The test A. was a print that was to thick for the fabric, it looked the best, but I was a little conserned it would deattach from the fabric easily, also I the print took the longest and I was trying to optimize not only for the amount of material, quality but also time.
The C. printing settings were the thinnest ones. It attached nicely to the fabric, looked like its own pattern, but it was prone to show every single printing mistake.
The middle settings of B. ended up to be the best for the assembling the prototype.
Design by Linette Manuel
Changing the electronics¶
I was very frustrated with my electronics, but thankfully I have found that I have a Bare Conductive Touch Board at home that is sligtly bigger, but I was very excited about the fact, that it has everything I needed for the project prepared and a nice library to work with.
- touch pins
- analog and digital pins
- 3D card for MP3 slots
- output sound PINS
- SDA/SCL PINS for the acclerometer
Copy of Copy of Design by Linette Manuel
I have assambled everything together. I have been getting nice values but unfortuntelly I have run into a problem of exceeding the memory with the code and I have to find a solution how add more memory and optimize my the code.
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL343.h>
#define ADXL343_SCK 13
#define ADXL343_MISO 12
#define ADXL343_MOSI 11
#define ADXL343_CS 10
#include "Compiler_Errors.h"
// touch includes
#include <MPR121.h>
#include <MPR121_Datastream.h>
#include <Wire.h>
// MP3 includes
#include <SPI.h>
#include <SdFat.h>
#include <FreeStack.h>
#include <SFEMP3Shield.h>
// touch constants
const uint32_t BAUD_RATE = 115200;
const uint8_t MPR121_ADDR = 0x5C;
const uint8_t MPR121_INT = 4;
// serial monitor behaviour constants
const bool WAIT_FOR_SERIAL = false;
// MPR121 datastream behaviour constants
const bool MPR121_DATASTREAM_ENABLE = false;
// MP3 variables
uint8_t result;
uint8_t lastPlayed = 0;
// MP3 constants
SFEMP3Shield MP3player;
// MP3 behaviour constants
const bool REPLAY_MODE = true;
SdFat sd;
Adafruit_ADXL343 accel = Adafruit_ADXL343(12345);
void setup() {
Serial.begin(BAUD_RATE);
accel.begin();
/* Set the range to whatever is appropriate for your project */
accel.setRange(ADXL343_RANGE_16_G);
pinMode(LED_BUILTIN, OUTPUT);
sd.begin();
MPR121.begin();
MPR121.setInterruptPin(MPR121_INT);
if (MPR121_DATASTREAM_ENABLE) {
MPR121.restoreSavedThresholds();
MPR121_Datastream.begin(&Serial);
} else {
MPR121.setTouchThreshold(40);
MPR121.setReleaseThreshold(20);
}
MPR121.setFFI(FFI_10);
MPR121.setSFI(SFI_10);
MPR121.setGlobalCDT(CDT_4US); // reasonable for larger capacitances
digitalWrite(LED_BUILTIN, HIGH); // switch on user LED while auto calibrating electrodes
delay(1000);
MPR121.autoSetElectrodes(); // autoset all electrode settings
digitalWrite(LED_BUILTIN, LOW);
result = MP3player.begin();
MP3player.setVolume(5, 5);
}
void loop() {
/* Get a new sensor event */
sensors_event_t event;
accel.getEvent(&event);
MPR121.updateAll();
// only make an action if we have one or fewer pins touched
// ignore multiple touches
if (MPR121.getNumTouches() <= 1) {
for (int i=0; i < 12; i++) { // check which electrodes were pressed
if (MPR121.isNewTouch(i)) {
digitalWrite(LED_BUILTIN, HIGH);
if (i <= 11 && i >= 0) {
if (MP3player.isPlaying()) {
//MP3player.setBassAmplitude(event.acceleration.x);
if (lastPlayed == i && !REPLAY_MODE) {
// if we're already playing the requested track, stop it
// (but only if we're not in REPLAY_MODE)
MP3player.stopTrack();
} else {
// if we're already playing a different track (or we're in
// REPLAY_MODE), stop and play the newly requested one
MP3player.stopTrack();
MP3player.playTrack(i-0);
lastPlayed = i;
}
} else {
// if we're playing nothing, play the requested track
MP3player.playTrack(i-0);
lastPlayed = i;
}
}
} else {
if (MPR121.isNewRelease(i)) {
digitalWrite(LED_BUILTIN, LOW);
}
}
}
}
if (MPR121_DATASTREAM_ENABLE) {
MPR121_Datastream.update();
}
}
Testing the electronic pads¶
I have tested if I need to stich the fabrics with conductive thread to recognize the touch on the second layer of the body suit. I figured that it works fine (on the table), since you can change the treashold setting from very high to pretty low. Very high setting will change the touch sensor to proximity sensor, you can play aroun with it a bit. For my project I have used
Prototype¶
I have been battling with the idea of how to add the electronic circuit to the top. I have been thinking about making two layers of the top and sewing it together, but that would mean that the suit would be too thick and since I am designing a body suit for a dance that is suppose to be comforatble and also not crazily hot, I was struggling on how to do it. After mentoring with Cecilia, I have agreed to the idea, that it would be nice to have the electronics part and the "design" part of the dresses deattachable for differnt reasons.
Copy of Copy of Rachel Freire - Second Skin by Linette Manuel
- I could was them in different settings
- I coudl use different ligther fabrics at the bottom
- If something breakes it would be much easier to fix separatly
- if I wanted to expand on the suit I could
I have used the previous sketch of the paper prototype, added design at the back for the touch board to connected it. I have drafted my circuit and laser cutted it on the laser cutter, so I can avoid fraying. I have used more power then is neccesary on the lasercutter, so I could make sure that the condactive copper fabric will have burnt edges. After a week of a crazy manipulation, the fabric is still in place. DO NOT USE lowe power for min power unless you have curvy object, it will not cut the circuit correctly if it too thin.
The settings on the lasercutter I have used: Speed: 100, max power 30, min power 30.
Copy of Copy of Copy of Rachel Freire - Second Skin by Linette Manuel
Since I am using two types of fabrics, stretchy and non stretch conductive fabric, I had to tackle the problem of not losing the stretch of the fabric and also how to fit the circuit in place. The reason for it is that the stretchy fabric is still quite expensive, and the non-stretch is far more accesible, so I decided to take this challenge.
Copy of Copy of Copy of Copy of Rachel Freire - Second Skin by Linette Manuel
I have firstly fit the body suit on manequine and then I have arranged the circuit on the fabrics as I desired it to be, then I have traced the circuit on the fabric with chalk, took the circuit of and used the guide lines to help me, when sewing the circuit on the fabrics. I always aligned the circuit part to fit the edges of the guidlines and then streched the fabrics in the middle accordingly. It worked very well for me.
Design by Linette Manuel
Copy of Untitled by Linette Manuel
When I made the front part, I have decided I will test it with alligator clips and see if the touch pads work when on the body and it worked really nice. I have then sew the back part and started to think, how to connect the board.
Design by Linette Manuel
I have tryied naivly with wires, but since I am working with stretch fabrics, the soldered connections deattached and were breaking the circuit. I have decided to make a case from stretchy fabrics for my touch board, and add copper layer at the bottom and and clip on on the fabrics so it can be the last thing to clip, once the dress is already on top. I think this is the last part that I need to test the suit.
Copy of Copy of Wearables Projects on Intructables by Linette Manuel
Results¶
Copy of Copy of Rachel Freire - Second Skin by Linette Manuel
MAX MSP¶
I have been discovering how to work with MAX MSP to generate and change music with the accelerometer. I have been following, these amazing tutorials by Amanda Ghassaei on Instructables to understand how I can make sound change. I have to make the tutorial how to attach load the MAX MSP code to Arduino.
Sound of the heartbeat¶
I have been playing with different sampla data that have been given to me by different people and. I have used this data to try to create some sample of the music. I have used two platforms to work with it: Music Algoritms and AIVA.
Music Algorithms is a no-code platform, that enables you to create music using specific data converted by different mathematical functions. You can choose as many voices as you want but the number of instruments is very limited - you have only 4 basic options. I used this platform to generate a nice MIDI base from data, that I have received, that the AI can polish to a music, that would be much easier to listen to.
The raw music that I then had I passed to AIVA platform. You can preset different things like the key, mood of the song, genre, BPM etc.
Here you can play the raw sample.
And this is a the end product, that the AI has created.
Design & Fabrication¶
once you start designing and fabricating your first tests, you can link both at the bottom of the page with footnotes
"This step of the process was important because i learnt to draft my own pattern digitally. The first tests of this can be seen here on the right, find half- or test-fabrication files here[^1]"
Mentoring notes¶
Oscar: - think about the ways how to signal to the viewer, where the sound has been generated - think about the data that have been gathered together and how to make sure that the audience understands where is their heartbeat
Ricardo: - test as much as you can on body, every test made on a table will change quickly
Diane: - use platforms that already have premade algorithms to convert data into sound - do only piece of wearable project - (leave the heart beat sensor for later, if you have enough time)
Cecilia: - try to make the garmet a two piece garmet, so you can access it easily, wash it and modify any time it is needed