Biblography¶
About Me¶
Hi! I'm Gabríella Kamí Árnadóttir, a 25-year-old designer from Kópavogur, Iceland. I studied Fashion and Textiles with a minor in Arts and Innovation at FB (Fjölbrautaskólinn í Breiðholti). Creativity has always been part of my life—from sewing costumes for my sister to designing practical solutions that blend beauty with function.
Outside of design, I have a lifelong passion for figure skating, now coaching young skaters and sharing the joy of the sport.
At Fab Academy 2024, I built animatronic wings with LEDs for my sister, who has scoliosis and paralysis. This experience, along with founding Electric Geek—a company creating pet wheelchairs—inspired me to focus on inclusive, adaptive design.
ElectricThreads: Adaptive Cosplay¶
Growing up, my sister’s costumes needed major alterations to fit her medical and mobility needs. As her cosplay ambitions grew, so did the complexity of the designs—wings, lights, armor—which sparked the idea for ElectricThreads: a custom adaptive bodysuit that integrates shapewear, electronics, and structural support into one piece.
The suit features:
-
LED lighting stitched with conductive thread
-
A hidden battery pack
-
Reinforced areas for wings or heavy props
-
Skin-tone matching for a seamless look
-
Modular, washable design
By anchoring electronics and costume elements to the body, not just the clothing, the bodysuit increases comfort, mobility, and performance for wheelchair users—without sacrificing visual impact.
Vision¶
My goal is to create cosplay designs that are inclusive, practical, and stunning—proving that accessibility and high fashion can go hand-in-hand. With ElectricThreads, my sister can confidently step into any character, fully embodying the magic of cosplay.
PDF¶
Slide show¶
Midterm Presentation Slide show¶
GANTT¶
Creative Process Moodboard¶
Expeimentation Process Slide show¶
Story Storyboard & Moodbord¶
Story Video¶
Code Example¶
AnimatronicWingsWithLights_Works
#include
#ifdef __AVR__
#include // Required for 16 MHz Adafruit Trinket
#endif
#include
#define PIXEL_PIN 10
#define PIXEL2_PIN 2
#define BUTTON_PIN 7
#define PIXEL_COUNT 40
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2(PIXEL_COUNT, PIXEL2_PIN, NEO_GRB + NEO_KHZ800);
bool modeChanged = false;
int mode = 0; // 0 for rainbow, 1-7 for solid colors, 8 for off
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
Servo servoR;
Servo servoL;
int servoRPin = 6;
int servoLPin = 20;
void setup() {
Serial.begin(9600);
strip.begin();
strip.show();
strip2.begin();
strip2.show();
pinMode(BUTTON_PIN, INPUT_PULLUP);
servoR.attach(servoRPin, 500, 2500);
servoL.attach(servoLPin, 500, 2500);
}
void loop() {
int reading = digitalRead(BUTTON_PIN);
// Check button state and debounce
if (reading == LOW) {
if ((millis() - lastDebounceTime) > debounceDelay) {
if (!modeChanged) {
mode++;
modeChanged = true;
if (mode > 8) { // Update the maximum mode number
mode = 0;
}
Serial.print("Mode changed to: ");
Serial.println(mode);
}
lastDebounceTime = millis();
}
} else {
modeChanged = false; // Reset mode changed flag when button is not pressed
}
if (mode == 0) {
rainbowAnimation();
} else if (mode >= 1 && mode <= 7) {
solidColor(mode - 1);
} else if (mode == 8) {
turnOffLights();
}
if (mode != 8) { // Flap wings only if not in "off" mode
flapWings(getFlapSpeed(mode));
}
}
void flapWings(int speed) {
static unsigned long lastUpdate = 0;
static bool flapping = true;
static int pos = 0;
if (millis() - lastUpdate > speed) {
if (flapping) {
servoR.write(pos);
servoL.write(180 - pos);
pos++;
if (pos >= 90) {
flapping = false;
}
} else {
servoR.write(pos);
servoL.write(180 - pos);
pos--;
if (pos <= 0) {
flapping = true;
}
}
lastUpdate = millis();
}
}
int getFlapSpeed(int mode) {
switch (mode) {
case 0: return 30;
case 1: return 60;
case 2: return 50;
case 3: return 40;
case 4: return 30;
case 5: return 20;
case 6: return 15;
case 7: return 10;
default: return 30;
}
}
void rainbowAnimation() {
static unsigned long lastUpdate = 0;
static uint16_t j = 0;
if (millis() - lastUpdate > 20) {
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i + j) & 255));
strip2.setPixelColor(i, Wheel((i + j) & 255));
}
strip.show();
strip2.show();
j = (j + 1) % 256;
lastUpdate = millis();
}
}
void solidColor(int color) {
uint32_t col;
switch(color) {
case 0: col = strip.Color(255, 0, 0); break;
case 1: col = strip.Color(255, 165, 0); break;
case 2: col = strip.Color(255, 255, 0); break;
case 3: col = strip.Color(0, 255, 0); break;
case 4: col = strip.Color(0, 0, 255); break;
case 5: col = strip.Color(75, 0, 130); break;
case 6: col = strip.Color(238, 130, 238); break;
default: col = strip.Color(0, 0, 0); break;
}
for(int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, col);
strip2.setPixelColor(i, col);
}
strip.show();
strip2.show();
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void turnOffLights() {
for(int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip2.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
strip2.show();
}