Author Archives: Melissa Felderman

DIY Desktop Light Sculpture

via SparkFun: Commerce Blog

light sculpture overview

My latest project, the Desktop Light Sculpture, is a digitally fabricated object featuring a 3D-printed base and laser-etched acrylic inserts. Inside the base you can find a neopixel matrix, a Qduino Mini, and a few other basic electronic components for usability.

The idea for this project is dependent on edge-lighting the acrylic. What this means is that when light is applied to the edge of a piece of acrylic, it will be picked up by any etched parts on the surface of the plastic as well as along its edges. This creates a beautiful visual effect!

The major element of this project is definitely the digital fabrication. I really love that there are two parts to design that have very different design constraints. The first, the 3D-printed base, needs to be designed to fit the electronic parts, hold the acrylic, and separate the light from each row of LEDs (as to not affect a neighboring piece of acrylic). The parameters offer a good design engineering challenge, but offer less in the way of creativity.

The second part, our acrylic inserts, must fit into the slot in the base, but otherwise offer complete creative freedom. They can be any shape or size and feature any etched design. With endless colors, patterns, and animations to program your LEDs, the design possibilities of this project are endless!

light sculpture blue

light sculpture pink

light sculpture rainbow

light sculpture 3/4 view

If you would like to make this project at home, you can grab everything you need from my Light Sculpture Wishlist.

Both the .stl for the 3D-printed base and the Illustrator file for the acrylic insert shape can be found on thingiverse. The images below illustrate how the parts fit into the base.

light sculpture matrix placement

light sculpture neopixel rows

light sculpture components

light sculpture power cord

You will notice that in addition to the LEDs and microcontroller, the project features a button, a switch and a potentiometer. The button is used to cycle through different LED colors, patterns and animations. The switch will turn the project on or off, and the potentiometer controls the brightness of your LEDs. The diagram below illustrates the circuit used in this project.

light sculpture circuit

Having a hard time seeing the circuit? Click on the image for a closer look.

Below is the program I used for this project. It utilizes the Adafruit Neopixel Library.

//Desktop Light Sculpture by Melissa Felderman for SparkFun Electrnoics July/31/2018

#include <Adafruit_NeoPixel.h> //include afafruit library 
#define PIN 6 //LED matrix pin
#define brightPot A0 //potentiometer to controll brightness
#define pwrSwitch 4 //power switch
#define momBut 5 //button to control LED mode
int numPix = 64; //total LED count
int brightPotVal; //Variable to hold pot value
int pixelBrightness; //variabe to hold brightness value
int switchState; //variable to hold switch value
int butState; //variable to hold button value
int mode = 0; //starting mode for switch state
int prevButState = LOW;
boolean butBool = false;
int topMode = 4; //max number of LED modes in switch state

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 200;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(numPix, PIN, NEO_GRB + NEO_KHZ800); //declare neopixel matrix


//create an array for each row of LEDs
int rowOne[] = {0, 1, 2, 3, 4, 5, 6, 7};
int rowTwo[] = {8, 9, 10, 11, 12, 13, 14, 15};
int rowThree[] = {16, 17, 18, 19, 20, 21, 22, 23};
int rowFour[] = {24, 25, 26, 27, 28, 29, 30, 31};
int rowFive[] = {32, 33, 34, 35, 36, 37, 38, 39};
int rowSix[] = {40, 41, 42, 43, 44, 45, 46, 47};
int rowSeven[] = {48, 49, 50, 51, 52, 53, 54, 55};
int rowEight[] = {56, 57, 58, 59, 60, 61, 62, 63};

void setup() {
  Serial.begin(9600);
  strip.begin();
  strip.show();

  pinMode(momBut, INPUT);
  pinMode(pwrSwitch, INPUT);

}


void loop() {
  brightPotVal = analogRead(brightPot);
  pixelBrightness = map(brightPotVal, 0, 1023, 0, 200);

  switchState = digitalRead(pwrSwitch);
  butState = digitalRead(momBut);

  strip.setBrightness(pixelBrightness);
  strip.show();

  //function to debounce button
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if ((butState == HIGH) && (butBool == false)) {
      butBool = true;
      mode++;
      lastDebounceTime = millis();
    } butBool = false;
  } if (mode > topMode) {
    mode = 0;
  }

  Serial.println(mode);

  //switch state function to cycle through modes on LEDs, you can add as many or as few as you would like
  if (switchState == HIGH) {

    switch ( mode ) {
      case 0:
        for (int i = 0; i < numPix; i++) {
          strip.setPixelColor(i, 255, 255, 255);
        }
        strip.show();
        break;
      case 1:
        rainbow();
        break;
      case 2:
        buleGreenGradient();
        break;
      case 3:
        pinkGradient();
        break;
      case 4:
        yellowGradient();
        break;

    }
  } else if (switchState == LOW) {
    for (int i = 0; i < numPix; i++) {
      strip.setPixelColor(i, 0, 0, 0);
    }
    strip.show();
  }
}



//functions for LED colors


void everyOther() {
  for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowOne[i], 255, 255, 255);
    strip.setPixelColor(rowThree[i], 255, 255, 255);
    strip.setPixelColor(rowFive[i], 255, 255, 255);
    strip.setPixelColor(rowSeven[i], 255, 255, 255);

    strip.setPixelColor(rowTwo[i], 0, 0, 0);
    strip.setPixelColor(rowFour[i], 0, 0, 0);
    strip.setPixelColor(rowSix[i], 0, 0, 0);
    strip.setPixelColor(rowEight[i], 0, 0, 0);
  }
  strip.show();
}


void pinkGradient() {
  for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowOne[i], 185, 0, 255);
    strip.setPixelColor(rowTwo[i], 195, 0, 230);
    strip.setPixelColor(rowThree[i], 205, 0, 200);
    strip.setPixelColor(rowFour[i], 215, 0, 160);
    strip.setPixelColor(rowFive[i], 225, 0, 120);
    strip.setPixelColor(rowSix[i], 235, 0, 80);
    strip.setPixelColor(rowSeven[i], 245, 0, 40);
    strip.setPixelColor(rowEight[i], 255, 0, 10);
  }
  strip.show();
}

void buleGreenGradient() {
  for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowOne[i], 0, 75, 255);
    strip.setPixelColor(rowTwo[i], 0, 100, 225);
    strip.setPixelColor(rowThree[i], 0, 125, 200);
    strip.setPixelColor(rowFour[i], 00, 150, 175);
    strip.setPixelColor(rowFive[i], 0, 175, 150);
    strip.setPixelColor(rowSix[i], 0, 200, 125);
    strip.setPixelColor(rowSeven[i], 0, 225, 100);
    strip.setPixelColor(rowEight[i], 0, 255, 75);
  }
  strip.show();
}

void yellowGradient() {
  for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowOne[i], 255, 255, 25);
    strip.setPixelColor(rowTwo[i], 255, 220, 25);
    strip.setPixelColor(rowThree[i], 255, 190, 25);
    strip.setPixelColor(rowFour[i], 255, 160, 25);
    strip.setPixelColor(rowFive[i], 255, 130, 25);
    strip.setPixelColor(rowSix[i], 255, 100, 25);
    strip.setPixelColor(rowSeven[i], 255, 70, 25);
    strip.setPixelColor(rowEight[i], 255, 40, 25);
  }
  strip.show();
}
void rainbow() {
  for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowOne[i], 255, 0, 0);
  } for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowTwo[i], 255, 100, 0);
  } for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowThree[i], 255, 255, 0);
  } for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowFour[i], 0, 255, 0);
  } for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowFive[i], 0, 255, 200);
  } for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowSix[i], 0, 0, 255);
  } for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowSeven[i], 255, 0, 255);
  } for (int i = 0; i < 8; i++) {
    strip.setPixelColor(rowEight[i], 255, 0, 130);
  }
  strip.show();
}

I hope you enjoyed this project! It was a lot of fun to make and I’m excited to continue building out the program for more LED colors, as well as making different designs on the laser-etched acrylic.

If you love this project and want to give it a go but don’t have access to digital fabrication tools, try checking out your local library or maker space. If all else fails there are always online digital fabrication services from which you can order your 3D print and laser-etched acrylic. As always, please share your thoughts, ideas, and suggestions about this project in the comments below!


Shop For This Project Download the Design Files

comments | comment feed

DIY Festival Totem

via SparkFun: Commerce Blog

It’s festival season, and what better place to show off your creative engineering projects? Festivals are the perfect place to don your interactive, LED-clad outfits and accessories. After checking out some really cute and funny totems online, I decided to make one in my own image: a big, glowing, iridescent crystal totem. A totem in the context of a festival acts as a beacon or a locater for a group of friends and is a perfect object to add some electronics to.



The crystal totem features a clear plastic shaft stuffed with iridescent confetti, which is topped with a large, iridescent, crystal-like structure embedded with WS2812 LEDs.

crystal totem



The microcontroller - a Qduino Mini - can be found at the bottom of the shaft for easy access to the power switch and USB port for charging and reprogramming.

totem qduino



Toward the top of the shaft is a clear, laser-cut acrylic plate held in place using hot glue and wooden dowels. You can find the two potentiometers included in our circuit on this plate.

totem fabrication



Atop the acrylic plate sits an upside-down glass fishbowl, covered in resin-cast crystals and WS2812 LEDs.

totem top

Below is a fritzing digram of the circuit:

Totem Circuit

Having a hard time seeing the circuit? Click on the image for a closer look.

As mentioned, I included two potentiometers in this project. The first, connected to AO, controls the speed of the LED animation. The second, connected to A1, controls the animation currently displaying on the LEDs. My program features 11 distinct modes or animations, including an all-off and all-on mode.

The code for this project can be found below. I am absolutely aware that this is not the most efficiently or elegantly written program, and would love to hear about how you would have approached it in the comments below.

//Melissa Felderman for Sparkfun Electronics 2018 

#include <Adafruit_NeoPixel.h>
#define  A1 
#define speedPot A0
#define PIN 6
#define momBut 3
int numPix = 66;
int speedPotVal;
int modePotVal; 
int mappedSpeed;
int mode = 0;




Adafruit_NeoPixel strip = Adafruit_NeoPixel(numPix, PIN, NEO_GRB + NEO_KHZ800);

int stripOne[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
int stripTwo[] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21};
int stripThree[] = {32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22};
int stripFour[] = {33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43};
int stripFive[] = {54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44};
int stripSix [] = {55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66};

int stripOneNormal[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int stripThreeNormal[] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
int stripFiveNormal[] = {44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54};


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  strip.begin();
  strip.show();


}

void loop() {




  speedPotVal = analogRead(speedPot);
  modePotVal = digitalRead(modePot);

  mode = map(modePotVal, 0, 1023, 0, 10);
  mappedSpeed = map(speedPotVal, 0, 1023, 10, 200);
  //
  //  Serial.print(mappedBright);
  //  Serial.print(", ");
  //  Serial.println(mappedSpeed);

  Serial.println(mode);



  switch (mode) {
    case 0:
      for (int i = 0; i < numPix; i++) {
        strip.setPixelColor(i, 0, 0, 0);
      }
      strip.show();
      break;
    case 1:
      oneSixth();
      break;
    case 2:
      alternating();
      break;
    case 3:
      oneDrip();
      break;
    case 4:
      twoDrip();
      break;
    case 5:
      theaterChase(strip.Color(127, 127, 127), 50); // White
      break;
    case 6: 
      oneOpposingDrip();
      break;
    case 7: 
      twoOpposingDrip();
      break;
    case 8: 
     singleChase();
     break;
    case 9:
      allOn(); 
      break;
    case 10:
      allOn();
      break;
  }


}

void theaterChase(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 10; j++) { //do 10 cycles of chasing
    for (int q = 0; q < 3; q++) {
      for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
        strip.setPixelColor(i + q, c);  //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
        strip.setPixelColor(i + q, 0);      //turn every third pixel off
      }
    }
  }
}

void alternating() {
  strip.setBrightness(70);
  for (int i = 0; i < 11; i ++) {
    strip.setPixelColor(stripOne[i], 255, 255, 255);
    strip.setPixelColor(stripThree[i], 255, 255, 255);
    strip.setPixelColor(stripFive[i], 255, 255, 255);

    strip.setPixelColor(stripTwo[i], 0, 0, 0);
    strip.setPixelColor(stripFour[i], 0, 0, 0);
    strip.setPixelColor(stripSix[i], 0, 0, 0);
  }
  strip.show();
  delay(mappedSpeed);
  for (int i = 0; i < 11; i ++) {
    strip.setPixelColor(stripOne[i], 0, 0, 0);
    strip.setPixelColor(stripThree[i], 0, 0, 0);
    strip.setPixelColor(stripFive[i], 0, 0, 0);

    strip.setPixelColor(stripTwo[i], 255, 255, 255);
    strip.setPixelColor(stripFour[i], 255, 255, 255);
    strip.setPixelColor(stripSix[i], 255, 255, 255);
  }
  strip.show();
  delay(mappedSpeed);
}


void oneDrip() {
  for (int i = 0; i < 11; i++) {

    strip.setPixelColor (stripOne[i], 255, 255, 255);
    strip.setPixelColor (stripTwo[i], 255, 255, 255);
    strip.setPixelColor (stripThree[i], 255, 255, 255);
    strip.setPixelColor (stripFour[i], 255, 255, 255);
    strip.setPixelColor (stripFive[i], 255, 255, 255);
    strip.setPixelColor (stripSix[i], 255, 255, 255);

    strip.show();
    delay(mappedSpeed);
    strip.setPixelColor (stripOne[i], 0, 0, 0);
    strip.setPixelColor (stripTwo[i], 0, 0, 0);
    strip.setPixelColor (stripThree[i], 0, 0, 0);
    strip.setPixelColor (stripFour[i], 0, 0, 0);
    strip.setPixelColor (stripFive[i], 0, 0, 0);
    strip.setPixelColor (stripSix[i], 0, 0, 0);

  }

}


void twoDrip() {

  for (int i = 0; i < 11; i++) {
    strip.setPixelColor (stripOne[i], 255, 255, 255);
    strip.setPixelColor (stripTwo[i], 255, 255, 255);
    strip.setPixelColor (stripThree[i], 255, 255, 255);
    strip.setPixelColor (stripFour[i], 255, 255, 255);
    strip.setPixelColor (stripFive[i], 255, 255, 255);
    strip.setPixelColor (stripSix[i], 255, 255, 255);

    strip.setPixelColor (stripOne[i + 5], 255, 255, 255);
    strip.setPixelColor (stripTwo[i + 5], 255, 255, 255);
    strip.setPixelColor (stripThree[i + 5], 255, 255, 255);
    strip.setPixelColor (stripFour[i + 5], 255, 255, 255);
    strip.setPixelColor (stripFive[i + 5], 255, 255, 255);
    strip.setPixelColor (stripSix[i + 5], 255, 255, 255);

    strip.show();
    delay(mappedSpeed);
    strip.setPixelColor (stripOne[i], 0, 0, 0);
    strip.setPixelColor (stripTwo[i], 0, 0, 0);
    strip.setPixelColor (stripThree[i], 0, 0, 0);
    strip.setPixelColor (stripFour[i], 0, 0, 0);
    strip.setPixelColor (stripFive[i], 0, 0, 0);
    strip.setPixelColor (stripSix[i], 0, 0, 0);

    strip.setPixelColor (stripOne[i + 5], 0, 0, 0);
    strip.setPixelColor (stripTwo[i + 5], 0, 0, 0);
    strip.setPixelColor (stripThree[i + 5], 0, 0, 0);
    strip.setPixelColor (stripFour[i + 5], 0, 0, 0);
    strip.setPixelColor (stripFive[i + 5], 0, 0, 0);
    strip.setPixelColor (stripSix[i + 5], 0, 0, 0);

  }

}


void oneSixth() {

  for (int i = 0; i < 11; i++) {

    strip.setPixelColor (stripOne[i], 255, 255, 255);
    strip.setPixelColor (stripSix[i], 0, 0, 0);
  }
  strip.show();
  delay(mappedSpeed);
  for (int i = 0; i < 11; i++) {

    strip.setPixelColor (stripOne[i], 0, 0, 0);
    strip.setPixelColor (stripTwo[i], 255, 255, 255);
  }
  strip.show();
  delay(mappedSpeed);
  for (int i = 0; i < 11; i++) {

    strip.setPixelColor (stripTwo[i], 0, 0, 0);
    strip.setPixelColor (stripThree[i], 255, 255, 255);
  }
  strip.show();
  delay(mappedSpeed);
  for (int i = 0; i < 11; i++) {

    strip.setPixelColor (stripThree[i], 0, 0, 0);
    strip.setPixelColor (stripFour[i], 255, 255, 255);
  }
  strip.show();
  delay(mappedSpeed);
  for (int i = 0; i < 11; i++) {

    strip.setPixelColor (stripFour[i], 0, 0, 0);
    strip.setPixelColor (stripFive[i], 255, 255, 255);
  }
  strip.show();
  delay(mappedSpeed);
  for (int i = 0; i < 11; i++) {

    strip.setPixelColor (stripFive[i], 0, 0, 0);
    strip.setPixelColor (stripSix[i], 255, 255, 255);
  }
  strip.show();
  delay(mappedSpeed);
}


void pulse() {
  for (int j = 0; j < 255; j++) {
    for (int i = 0; i < numPix; i++) {
      strip.setPixelColor(i, j, j, j);
    }
    strip.show();
    delay(mappedSpeed/5);
  }
  for (int j = 255; j >= 0; j--) {
    for (int i = 0; i < numPix; i++) {
      strip.setPixelColor(i, j, j, j);
    }
    strip.show();
    delay(mappedSpeed/5);

  }
}

void allOn() {
  for (int i = 0; i < numPix; i++) {
    strip.setPixelColor(i, 150, 150, 150);
  }
  strip.show();
}



void singleChase() {
  for (int i = 0; i < numPix; i++){
    strip.setPixelColor(i, 255, 255, 255);
    strip.setPixelColor(i+1, 255, 255, 255);
   strip.setPixelColor(i+2, 255, 255, 255);
   strip.show();
   delay(mappedSpeed); 
    strip.setPixelColor(i, 0, 0, 0);
    strip.setPixelColor(i+1, 0, 0, 0);
   strip.setPixelColor(i+2, 0, 0, 0);

  }
}

void oneOpposingDrip() {
  for (int i = 0; i < 11; i++) {


      strip.setPixelColor (stripOneNormal[i], 255, 255, 255);
      strip.setPixelColor (stripTwo[i], 255, 255, 255);
      strip.setPixelColor (stripThreeNormal[i], 255, 255, 255);
      strip.setPixelColor (stripFour[i], 255, 255, 255);
      strip.setPixelColor (stripFiveNormal[i], 255, 255, 255);
      strip.setPixelColor (stripSix[i], 255, 255, 255);

      strip.show();
      delay(mappedSpeed);
      strip.setPixelColor (stripOneNormal[i], 0, 0, 0);
      strip.setPixelColor (stripTwo[i], 0, 0, 0);
      strip.setPixelColor (stripThreeNormal[i], 0, 0, 0);
      strip.setPixelColor (stripFour[i], 0, 0, 0);
      strip.setPixelColor (stripFiveNormal[i], 0, 0, 0);
      strip.setPixelColor (stripSix[i], 0, 0, 0);

    }
  }





void twoOpposingDrip() {

  for (int i = 0; i < 11; i++) {

    strip.setPixelColor (stripOneNormal[i], 255, 255, 255);
    strip.setPixelColor (stripTwo[i], 255, 255, 255);
    strip.setPixelColor (stripThreeNormal[i], 255, 255, 255);
    strip.setPixelColor (stripFour[i], 255, 255, 255);
    strip.setPixelColor (stripFiveNormal[i], 255, 255, 255);
    strip.setPixelColor (stripSix[i], 255, 255, 255);

    strip.setPixelColor (stripOneNormal[i + 5], 255, 255, 255);
    strip.setPixelColor (stripTwo[i + 5], 255, 255, 255);
    strip.setPixelColor (stripThreeNormal[i + 5], 255, 255, 255);
    strip.setPixelColor (stripFour[i + 5], 255, 255, 255);
    strip.setPixelColor (stripFiveNormal[i + 5], 255, 255, 255);
    strip.setPixelColor (stripSix[i + 5], 255, 255, 255);

    strip.show();
    delay(mappedSpeed);
    strip.setPixelColor (stripOneNormal[i], 0, 0, 0);
    strip.setPixelColor (stripTwo[i], 0, 0, 0);
    strip.setPixelColor (stripThreeNormal[i], 0, 0, 0);
    strip.setPixelColor (stripFour[i], 0, 0, 0);
    strip.setPixelColor (stripFiveNormal[i], 0, 0, 0);
    strip.setPixelColor (stripSix[i], 0, 0, 0);

    strip.setPixelColor (stripOneNormal[i + 5], 0, 0, 0);
    strip.setPixelColor (stripTwo[i + 5], 0, 0, 0);
    strip.setPixelColor (stripThreeNormal[i + 5], 0, 0, 0);
    strip.setPixelColor (stripFour[i + 5], 0, 0, 0);
    strip.setPixelColor (stripFiveNormal[i + 5], 0, 0, 0);
    strip.setPixelColor (stripSix[i + 5], 0, 0, 0);

  }

}

Every build leads to much discovery. In the case of my crystal totem, I found as I fabricated my totem that it was quickly getting far too heavy to realistically be held for several hours of dancing. In the next iteration, I would likely cast much smaller crystals and look for a lighter fishbowl - perhaps something in plastic. I might also increase the number of LED strips to 12 to give it some more light, and add a microphone to include a sound-reactive mode.

What would your festival totem look like? Let us know your thoughts in the comments below!

comments | comment feed

Power Solutions for Wearables and Cosplay

via SparkFun: Commerce Blog

One of the biggest challenges for wearables and cosplay projects with electronics is adding power to your creation. Batteries and power solutions can often be bulky and awkward. Whether you are powering a single LED or a robust interactive costume full of sensors, actuators and microcontrollers, you will need to make some decisions about how to add power to your costume. Let’s look at some of the options available to you.

COIN CELL BATTERY OPTIONS

Coin Cell Battery - 20mm (CR2032)

PRT-00338
$1.95

Coin cell batteries are a great option for wearables and cosplay because they are very small and thin, making it easy to hide them within a garment. The limitations of a small coin cell battery lie in the voltage and current. At 3V and 250mAh, a coin cell is perfect for powering low-voltage, low-current circuits, like a low-power processor or a few LEDs.

LilyPad Coin Cell Battery Holder - Switched - 20mm

DEV-13883
$1.95
8

One of my favorite boards for using a coin cell battery in a wearable circuit is the LilyPad Coin Cell Battery Holder - Switched. This is an excellent and convenient board because it includes an on/off switch, making it super easy for you to turn your project on and off without any extra components. It also features two + and two - sew tabs on either side of the board, making it super easy to connect to your projects via conductive thread or traditional wire. You can also use the extra tabs to arrange two holders in parallel or in series to up the current or the voltage.

Coin Cell Battery Holder - 2xCR2032 (Enclosed)

PRT-12618
$1.95
1

Another wonderful option for putting two coin cell batteries in series is the Coin Cell Battery Holder - 2xCR2032. This sleek and compact battery holder contains your batteries in a plastic enclosure, making sure that all conductive part are covered. It also features an on/off switch making it simple and easy for you to include a power switch to your project.

Coin Cell Battery Holder - 20mm (Sewable)

DEV-08822
$1.25
4

A smaller option for adding coin cell batteries to your wearables or cosplay is the Coin Cell Battery Holder - 20mm (Sewable). This little guy is extremely basic, making it wonderful for discreetly fitting into small spaces. Its + and - tabs feature a small hole, making it easily sewable, as well as usable with traditional hardware. While this battery holder does not feature a switch, you can certainly add one to your circuit using the LilyPad Slide Switch.

LiPo BATTERY OPTIONS

Lithium Ion Battery - 1Ah

PRT-13813
$9.95
5

Lithium ion batteries are a fantastic option for wearables and cosplay because they are extremely lightweight and super slim. These batteries vary in size and current depending on your circuit’s needs - our smallest option is super tiny at only 40mAh, while our largest option is a heck of a lot bulkier, but reaches 6Ah! These batteries are also rechargeable, making it easy for you to create a chargeable project. These LiPo batteries come with a 2-pin JST connector, which interfaces with several power connection boards. If you are planing to use conductive thread in your project that uses a LiPo battery, you should be extra careful about shorts in the thread - as this can cause a spark (LEARN FROM MY MISTAKES!!). Let’s take a look at the different ways to include LiPo batteries in your projects.

LilyPad Simple Power

DEV-11893
$9.95

The LilyPad Simple Power board is a great way to add a LiPo battery to your wearable or cosplay project, AND it includes a USB port for easy charging of your battery. Like the LilyPad Coin Cell Battery Holder, the Simple Power Board also includes an on/off switch for controlling the power on your project. This board features one + and one - conductive sew tab, which can be sewn with conductive thread or used with traditional hardware.

Lilypad USB Plus

DEV-14631
$24.95

Some of the LilyPad microcontroller boards include a JST connector on the board for powering your project. If you plan to use these boards, you will likely not need a separate power connector board. For example, the LilyPad USB Plus includes a JST connector for LiPo batteries, recharge circuit, as well as an on/off switch. This is definitely something to consider when planning your project because you can save a lot of room and time by using a board with included power connections and switches.

SparkFun LiPo Charger Basic - Micro-USB

PRT-10217
$7.95
23

If you are looking for a smaller option to connect your LiPo battery, you may be interested in the SparkFun LiPo Charger Basic - Micro-USB. I often use this board on its own to charge my LiPo batteries, but I have also used it in projects when I’m trying to save on space. This board includes a JST connector for your LiPo battery and a Micro-USB connector for charging purposes. There is one + and one - solder pad connection available to power your projects. The + and - connections are pretty close together though, so I would recommend using wires and solder to create the power connection over conductive thread, to avoid shorts.

Lithium Ion Battery Pack - 2.2Ah (USB)

TOL-14169
$6.95
1

If you need more than 3.3-3.7V, you may want to consider the Lithium Ion Battery Pack - 2.2AH (USB). This rechargeable battery pack runs at 5V and 2200 mAh. It is easy to connect to your projects using a USB micro-B port, like that on the LilyPad Simple Power board discussed above. The battery pack includes an on/off button and a 7-segment display to let you know how much charge you have left at all times. I often hide this power source inside a pocket where I can remove it for charging.

Let us know about how you power your wearables and cosplay in the comments below!

comments | comment feed

Experimenting with 3D Printing on Fabric

via SparkFun: Commerce Blog

I’ve been seeing a lot of 3D printing on fabric around on the internet lately. I found this technique extremely intriguing based on my interests in wearables and combining tech and craft, and I was excited to try it using our Lulzbot printers.

Before we jump in, I want to give credit to my inspiration. There have been tons of similar projects, but most credit for the development of this technique can go to David Shorey, who wrote about his work in Make Magazine. His work definitely piqued my interest, but I really decided to give it a go when I saw this necklace on imgur. I loved the idea of not only using this to make a scaling malleable surface, but also to create a visual floating effect against the skin.

I started my experiments by following the processes I read about online. It’s pretty straight forward but it does take some finesse. If it was broken down into a step-by-step format it might look something like this:

  1. Make/download a model and prepare the g-code for the printer
  2. Start the print
  3. Pause the print after 2-3 layers have been printed
  4. Manually move the Z-axis up
  5. Stretch the fabric over the printed materials
  6. Manually move the Z-axis back down to one position above where it was before you lifted it
  7. Resume print
    (All prints used standard print settings for the LulzBot Taz 5 with 2.85 mm ABS. G-code was generated using Cura.)

I decided to start making some floating bracelets. The first design was super simple, and was mostly a test to see if my general idea would work. You will notice I used tiny magnets for my clasp, which worked really well.

3D printed bracelet

3D printed bracelet

alt text

I wanted to make the design a bit more whimsical, so I put a model together with a handful of floating stars. This is where things started to get a little… annoying. It turns out that their sharp angles were having a hard time sticking to the print bed. When the nozzle made a sharp turn, it would start to pick up the filament it had just laid down with it, making a big mess of melted plastic. Because I am not a quitter, I managed to “successfully” print a pared-down version of the design after close to 30 attempts, but it was pretty clear that this direction was not the best for this technique on the printer I was using (calling it a success is a stretch because the print had a few holes and some stars in the model didn’t make it during the final print.)

3D printed bracelet

alt text

The shapes needed to be more simple, making them easier to print and stick to the bed. At this point I started wondering if I could get just a simple pulsing LED into my printed modules using a super bright white LED, LilyTiny, small battery, JST connector, resistor and a piece of protoboard. I decided that if I included some electronics, each module should be self contained as to avoid shattering the illusion of floating object with wires or conductive thread.

I started this leg of my experimentation by getting a rough idea of how much space a simple circuit and battery might take up and printing a loose design. Something I noticed right away was that the delicate fabric cannot withstand a super bulky module.

3d Printing test

I tried to minimize the size by replacing the super-bright white LED with a flat LilyPad LED. Unfortunately this guy wasn’t bright enough. I decided to let go of the pulsing of the LED to bring down the height of the circuit without compromising brightness, and just go with a a battery, resistor (hidden underneath the protoboard), LED and JST connector to make the smallest circuit possible. Below is an image of my circuit progression.

circuit iteration

I went through a bunch of iterations with the module design off fabric first, to nail it down before needlessly wasting fabric materials. The module needed to be in two parts - a base and a cap - so that I could easily put the electronics inside, plug the battery into the JST connector for use, access the battery connector for recharging and so on. I probably went through about 10 iterations before I finalized my design. In a few cases I made my walls too thin, and in some too thick. I initially planned to use magnets to secure the two parts of a module, but this meant making the walls a lot thicker than I wanted too.

3D printing mistakes

I eventually managed to create a design that would simply use pressure to hold the top and bottom together. I decided to hide the battery in the base to save on some space and keep it secure.

electronics module

electronics module

electronics module

Once I nailed everything down as a free-standing module, I moved on to print on fabric. With all the practice from my previous experiments, I was able to execute a few clean fabric prints pretty quickly. The final result of several electronics modules on fabric looks pretty ok, but I think could be refined a lot more.

final 3D print

final 3D print

I learned a few things about 3D printing on fabric as I developed my designs and tested them out.

First, if you’re thinking about printing on fabric, before you incorporate the fabric, print two to three layers first. One layer is not enough; four is probably too much. Second, the fabric needs to be SUPER taught, especially if it’s a cheap nylon like I was using. If the nozzle even grazes the fabric, it will burn a massive hole and basically ruin your entire print. I lost a lot of good fabric to the nozzle drag, which brings me to my third lesson: Don’t bring the Z-axis back down to its original position, but rather one notch above where it had been. The melted extruded plastic will still stick to the layers below and you won’t risk burning your fabric as much with that extra space.

The image below illustrates the technique I used to stretch the fabric on the print bed. I used a combination of binder clips on the edges with some masking/painters tape on the bed to keep the fabric flat against it.

taught fabric

I’m pleased with what I discovered during this process, but I definitely think I could spend a few more weeks finessing the incorporation of electronics - both on the hardware end and on the model design. I definitely think this is the kind of project that might require some custom PCB design, which is a good next step for me!

If you are interested in setting up your own 3D printing work space, check out our 3D printing tools. If you are interested in 3D printing but don’t have a printer, check out your local library or makerspace! If all else fails, you can always order prints online from companies like Shapeways.

Let us know what you think about 3D printing on fabric in the comments below!

comments | comment feed

3D-Printed Home Office

via SparkFun: Commerce Blog

It recently became apparent to me that I was in dire need of an at-home work space, but I was reluctant to start putting it together. As a maker, I want my work space to be super functional like a workshop, but as a designer I want it to look good, too. I live in a small, one-bedroom apartment without much space for an office, so I needed to engineer this work space to be as organized and functional as possible. And of course - cost was a factor.

I was pretty uninspired by the pre-made pegboard and work space accessories I found online, and I definitely did not want to invest in design-y office accessories, so I decided to take advantage of my access to 3D printers and make my own. This is one of the most amazing things about 3D printers; if you can’t find what you want out in the world, you can just make it yourself. As someone who thinks about the best and worst uses of 3D printing quite a bit, I was super excited to pursue this project, and I was really pleased with how it all turned out!

3D printed workspace

3D printed workspace

After a quick search on Thingiverse, I found countless open source models for pegboards and desks. For better or worse, all of these free existing models meant I didn’t have to do any modeling on my own. I ordered some brightly colored ABS filament from Amazon to give the accessories more of a design feel. I made a big mistake when I was ordering filament though – our LulzBot printer takes 2.85-3mm filament, but two of the colors I ordered were actually 1.75mm. I had enough bright colors to still make the work space look good, but it was a good lesson to always double check the filament diameter. Learn from my mistakes!

Before we jump into the different parts I ended up using, let’s talk about my printer and settings. For all of the below objects I was using a LulzBot Taz 5 with a single extruder and 2.85mm ABS filament. I prepared the downloaded .stl files in Cura with the following settings:

3D printer settings

You may notice I did not set the printing or bed temperature in Cura. That’s because before I started the print, I would set the bed and nozzle heat using the ‘prepare for ABS’ option on the printer. Newer printers will include the heat-up time in the g-code, but our printer requires a manual pre-heat.

The first files I sent to the printer were the pegboard brackets for mounting my pegboard to the wall. I was a little skeptical that these would be strong enough to hold my pegboard and all the stuff I planned to put on it, but I was very wrong. These guys hold up my pegboard without any issues and don’t strain under the weight as I continue to add more to the board.

3D printed Bracket

I found pegboard hook files on Thingiverse as well. These were a great addition to my pegboard because they can be used for so many different objects. I also printed a larger hook for a few bigger objects, like my embroidery hoops and painters tape. I found that I needed to do a little sanding on the actual pegs to get them to fit into my pegboard; that’s a common theme with these prints - sand, sand, sand. Often the print is a little too thick for the pegboard hole so it requires a little refining before use.

3D printed hooks

A major requirement for my workspace is to have plenty of storage, so I was happy to find bins, boxes and trays, all fitted for pegboards.

3D printed bins

3D printed boxes

3D printed tray

In the interest of making my workspace ready for DIY electronics, I wanted to find a decent solder spool dispenser.

3D printed solder dispenser

I also wanted somewhere to put my hot glue gun that kept the wire organized and out of the way, so I was very happy when this glue gun caddy came out well.

3D printed glue gun caddy

3D printed glue gun caddy

Another awesome find for the maker crowd is this USB Wire Holder, which allows me to keep my different wires organized.

3D printed usb wire holder

While we have easy access to 3D printers here at SparkFun, we understand that not everyone has a printer at their disposal. Often, local libraries or makerspaces will have a 3D printer available. If not, there are services like Shapeways that will print products for you - at a cost of course! If you are thinking about investing in your own printer, check out SparkFun’s 3D printer offerings.

comments | comment feed

DIY 3D-Printed Ink Stamps

via SparkFun: Commerce Blog

My adventures in 3D printing have taken me from DIY cookie cutters to the next logical place: DIY 3D-Printed Stamps. As an avid crafter, I am beyond excited about my newfound ability to make customized crafting tools using the 3D printer.

Making 3D-printed stamps is not as simple as designing a model and hitting “print.” In order to imitate the rubbery material of a stamp itself, as well as the wooden handle, I needed to use two kinds of filament. For the handle, I used regular ABS, which is a hard plastic and common 3D-printing material. For the stamp, I used a special flexible filament called NinjaFlex. This rubbery material is perfect for printing flexible or softer objects. Given the inherent qualities of the material, it requires a specific extruder for your printer. Here at SparkFun we use LulzBot 3D printers, so I picked up their special FlexyStruder Tool Head. If you are thinking about buying a new tool head for your LulzBot printer to interface with flexible materials, I would actually recommend the Aerostruder Tool Head as it can print both felxible materials, like NinjaFlex, and normal hard plastics like ABS/PLA.

alt text

I had to work through a few small challenges in this project. The first issue I encountered was the natural texture of the 3D print on the stamp face. The grooves between the fine lines held on to the ink, and when I would press the stamp to paper, the texture came through clear as day. In order to combat this, I came up with a surface melting technique. I put my clothing iron on high, covered it with a piece of parchment paper, and pressed the face of my stamp against the iron face through the parchment paper. This effectively removed the linear texture from the stamp and offered a smooth surface. I lightly sanded the surface to give it a bit of tooth to hold onto the ink.

alt text

I also found that using a 100 percent infill for the rubbery part of the stamp gave it a stronger structure that was easier to work with when using it in practice. With a 20 - 50 percent infill, the stamp was kind of wobbly when I pressed it against paper, and I was getting results that were not as sharp as I hoped. With the higher infill, the stamp was more rigid and stable against the paper and the results were crisp.

alt text

I have so many ideas for different stamps I can barely pick which one to make next. Let us know what you think about this project in the comments below!

Interested in learning more about at-home 3D printing? Check out SparkFun’s 3D printers and supplies.

comments | comment feed