Introduction: Light Me Up!

project team members

(Hyewon Shin, Eunjeong Ko, Junsung Yi)

What if you could touch and design the light? What would it feel like if you had a beautiful pattern of light that you designed yourself with an interesting animation?

Light me up will be an interesting sketchbook that touches and designs the light itself and makes interesting patterns!

This project has several triangles that form a hexagonal shape. So you can create stereoscopic patterns according to how you design light! Just press each piece and various colors will be gradated, and when the color you want comes out, just hit the hand you pressed and it will continue to shine beautifully with the color you wanted!

The project used about 312 triangles, but it could create a nice light that works well with 6 triangles. Now let me show you how to make it with six triangles. Follow the steps and you'll have your own wonderful work!

Supplies

Hardware: Arduino(I used arduino mega 2560), Acrylic(clear, white), LED Strip(NeoPixel), Diffuser Film, button, 4 pin Connector, Wire, Circuit Board, Power Supply

Tools: Laser-Guided Cutting Machine, 3D Printer

Step 1: Let's Make It!

Let's make this cute hexagonal piece with me!

The Light Me Up is made using 312 triangles, but even 6 triangles can design wonderful light. If you want to make it on a larger scale, you can make it by referring to the file attached below.

Step 2: Material Preparation

Step 3: Cutting Acrylic

Use a laser cutter to cut the front and back of each part. The color of the acrylic on the back can be anything you want, but make sure to use transparent acrylic because the front has to be dimmed! If you use a color acrylic other than transparent, you won't see the light well.

Step 4: Make Sides With 3D Printers

Now it's time to make the sides of each piece. Let's make it!
The 3D modeling files on the side are attached below. We used the PLA to make sides The PLA is stronger and less contractions than the ABS, so filaments are recommended to use the PLA.

Step 5: Filming

Now let's put a light diffusion film on the acrylic on the front. If you put film on it, it spreads out and shines much prettier. First, cut the film to the shape of a triangle.(You'd better cut the film larger than the cut acrylic) It's simple to put film on, like, a protective film on your phone. If you want to tip here, you can use a card to push it so it can be stuck neatly!

Step 6: Attach LED Strip + Soldering LED Strip(NeoPixel) With Wires

If you've been so good at soldering the LED strip, it's time to put the LED strip on the back. First, attach a glue gun or two-sided tape to the back of the LED strip. And first remove the wires from both sides of the soldering wire through the holes on both sides. Finally, attach the LED strip to the back acrylic and it's over!

It's soldering time! prepare LED strips, 4-pin connectors (connector or wires) and what you need for soldering. I used LEDs in three units. You can use one or two LEDs if you want, but I recommend using three. When all the materials are ready, solder the wires in both data lines, 5v lines, and ground lines of the LED strip.

Step 7: Soldering Tact Switch With Wires

Step 8: Assembly -Insert Bolt on Side= ①

Now it's a real easy part! Place one bolt on each of the three 3D printed sides. The reason why using the bolt button like using a structural bolts and nuts will be able to make. When the piece is finished, I'll put the piece in the case and finish it with a nut.

Step 9: Attach Ⓛⓣ to the Ⓒ= ②

Step 10: Assembly -Use a Ⓦ and Ⓝ to Combine ① and ②= ③

Step 11: Assembly -Attach Ⓐⓔ and ③ Using an Acrylic Bond= ④

If you put a bolt on the side, we'll put it on the side and the front. The front is acrylic, so you have to put it on with a dedicated acrylic bond. If you attach acrylic to a regular bond, it'll leave a mark.

Step 12: Attach Ⓢ to Ⓓ= ⑤

Step 13: Assembly -Combine ④ and ⑤ Using Ⓦ and Ⓝ= ⑥

Step 14: Complete Piece Assembly

Step 15: The Working Appearance of a Project

Step 16: NeoPixel, Connector Wiring

Step 17: NeoPixel and Arduino Wiring.

Step 18: Program the Arduino

extern volatile unsigned long timer0_millis;

#include #define MODEBTNNUM 3 int ani_mode = 0; unsigned long preM1, preM2, preM3;

void setup() { Wire.begin(); for (int i = 0; i < MODEBTNNUM; i++) { pinMode(i + 2, INPUT_PULLUP); } //Serial.begin(9600); }

void loop() {

for (int i = 0; i < MODEBTNNUM; i++) { if (!digitalRead(i + 2)) ani_mode = i + 1; } for (int i = 0; i < 6; i++) { Wire.requestFrom(i + 1, 1); while (Wire.available()) { int x = Wire.read(); // Serial.println(x); if (x == 5) { ani_mode = 0; // Serial.println("x=5"); } } } ////////////////////////////////////////////////////// if (ani_mode == 0) { for (int i = 1; i < 7; i++) { Wire.beginTransmission(i); Wire.write(ani_mode); //Serial.println("ready"); Wire.endTransmission(i); } } else if (ani_mode == 1) { unsigned long current1 = millis(); if (current1 - preM1 > 3000) { preM1 = current1; for (int i = 1; i < 7; i++) { Wire.beginTransmission(i); Wire.write(ani_mode); // Serial.println("500"); Wire.endTransmission(i); } } } else if (ani_mode == 2) { unsigned long current2 = millis(); if (current2 - preM2 > 5000) { preM2 = current2; for (int i = 1; i < 7; i++) { Wire.beginTransmission(i); Wire.write(ani_mode); // Serial.println("5"); Wire.endTransmission(i); } } } else if (ani_mode == 3) { unsigned long current3 = millis(); if (current3 - preM3 > 3000) { preM3 = current3; // timer0_millis = 0; // preM1 = 0; // preM2 = 0; // preM3 = 0; // Serial.println("timer reset"); for (int i = 1; i < 7; i++) { Wire.beginTransmission(i); Wire.write(ani_mode); //Serial.println("3000"); Wire.endTransmission(i); } } } }

Step 19:

extern volatile unsigned long timer0_millis;</p><p>#include 
#include 
#define PIN 12
#define NUMPIXELS 162
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
const int num = NUMPIXELS / 3;
const int slaveNum = 1;

int colors[num][3];
int hue[num];
int sat[num];
int bright[num];

int pNumber = 0;

int gValue[num] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
                  };

const int btnPin[num] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15,
                         16, 17, 18, 19, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40,
                         42, 44, 46, 48, 50, 52, 23, 25, 27, 29, 31, 33, 35, 37,
                         39, 41, 43, 45, 47, 49, 51, 53, 54, 55, 56, 57, 58, 59
                        };
int btnState[num];
boolean btnMode;
int hueV[num] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
                };

#include 
#define BTNNUM 1

int f_v = 1;

unsigned long preMillis1;
unsigned long preM;

int ani_mode = 0;
int ani2_Counter = 0;
int counter = 0;
///////////////////////////////////////////
void setup() {
  Wire.begin(slaveNum);
  Wire.onRequest(requestEvent);
  Wire.onReceive(receiveEvent);
  for (int i = 0; i < num; i++) {
    pinMode(btnPin[i], INPUT_PULLUP);
  }
  //Serial.begin(9600);
  strip.begin();
}
///////////////////////////////////////////</p><p>void loop() {
  if (f_v == 1) {
    for (int i = 0; i < num; i++) {
      hue[i] = 50;
      sat[i] = 95;
      bright[i] = 100;
    }
    f_v = 0;
  }
  //////////////////////////////////////
  //버튼 입력 체크 :멈춤신호 보내기
  btnMode = false;
  for (int i = 0; i < num; i++) {
    if ( !digitalRead(btnPin[i])) {
      btnMode = true;
    }
  }
  btnEvent(5);
  // Serial.println(ani_mode);
  //////////////////////////////////////
  switch (ani_mode) {
    case 0:
      ani0();
      break;
    case 1:
      ani1();
      ani_mode = 0;
      ani2_Counter = 0;
      break;
    case 2:
      ani2_Counter = 1;
      ani_mode = 0;
      break;
    case 3:
      ani3();
      ani_mode = 0;
      ani2_Counter = 0;
      break;
    default:
      readyState();
      break;
  }
  if (ani2_Counter == 1) {
    ani2();
  }
  setPixels(num);
}</p><p>///////////////////////////////////////////
void receiveEvent(int howMany) {
  int x = Wire.read();
  if (x == 5) {
    // Serial.println("received 5");
    ani_mode = 0;
  }
  ani_mode = x;
  //  Serial.println(ani_mode);
}
///////////////////////////////////////////
void requestEvent() {</p><p>  if (btnMode == true) {
    Wire.write(5);
    //    Serial.println("5 보냄");
  } else {
    Wire.write(0);
  }</p><p>}</p><p>void ani0() {
  //  Serial.println("0");
}</p><p>void ani1() {
  //  Serial.println("1");
  if (pNumber == 0) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int a1[] = {25, 26};
    int b1[] = {39, 52};
    int c1[] = {40, 53};
    for (int a = 0; a < 2; a++) {
      hue[a1[a]] = 100;
      sat[a1[a]] = 95;
      bright[a1[a]] = 100;
    }
    for (int b = 0; b < 2; b++) {
      hue[b1[b]] = 200;
      sat[b1[b]] = 95;
      bright[b1[b]] = 100;
    }
    for (int c = 0; c < 2; c++) {
      hue[c1[c]] = 300;
      sat[c1[c]] = 95;
      bright[c1[c]] = 100;
    }
    //      Serial.println("0");
  } else if (pNumber == 1) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int a2[] = {21, 22, 34, 35, 37, 46, 47, 51};
    //    int b2[] = {};
    //    int c2[] = {};
    int d2[] = {36, 48, 49, 50};
    for (int a = 0; a < 8; a++) {
      hue[a2[a]] = 26;
      sat[a2[a]] = 95;
      bright[a2[a]] = 100;
    }
    for (int d = 0; d < 4; d++) {
      hue[d2[d]] = 63;
      sat[d2[d]] = 95;
      bright[d2[d]] = 100;
    }
    //      Serial.println("1");
  } else if (pNumber == 2) { //giant cube pattern
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int a14[] = {34, 35, 46, 47, 48, 49};//yellow 06
    for (int a = 0; a < 6; a++) {
      hue[a14[a]] = 35;
      sat[a14[a]] = 95;
      bright[a14[a]] = 100;
    }
  }else if (pNumber == 3) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int a3[] = {34, 35, 46, 47, 48, 49};//yellow
    for (int a = 0; a < 6; a++) {
      hue[a3[a]] = 53;
      sat[a3[a]] = 95;
      bright[a3[a]] = 100;
    }
  } else if (pNumber == 4) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int a4[] = {34, 35};//yellow
    int b4[] = {47};//blue
    int c4[] = {48};//purple</p><p>    for (int a = 0; a < 2; a++) {
      hue[a4[a]] = 53;
      sat[a4[a]] = 95;
      bright[a4[a]] = 100;
    }</p><p>    for (int b = 0; b < 1; b++) {
      hue[b4[b]] = 210;
      sat[b4[b]] = 95;
      bright[b4[b]] = 100;
    }
    for (int c = 0; c < 1; c++) {
      hue[c4[c]] = 307;
      sat[c4[c]] = 95;
      bright[c4[c]] = 100;
    }
  } else if (pNumber == 5) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int a5[] = {34, 35, 46, 47, 48, 49};</p><p>    for (int a = 0; a < 6; a++) {
      hue[a5[a]] = 100;
      sat[a5[a]] = 95;
      bright[a5[a]] = 100;
    }
  } else if (pNumber == 6) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int a6[] = {34, 35, 46, 47, 48, 49};//yellow
    for (int a = 0; a < 6; a++) {
      hue[a6[a]] = 53;
      sat[a6[a]] = 95;
      bright[a6[a]] = 100;
    }
  } else if (pNumber == 7) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int c7[] = {34, 35, 46, 47, 48, 49};//purple
    for (int c = 0; c < 6; c++) {
      hue[c7[c]] = 307;
      sat[c7[c]] = 95;
      bright[c7[c]] = 100;
    }
  } else if (pNumber == 8) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int c8[] = {34, 35, 46, 47, 48, 49}; //purple
    for (int c = 0; c < 6; c++) {
      hue[c8[c]] = 307;
      sat[c8[c]] = 95;
      bright[c8[c]] = 100;
    }
  } else if (pNumber == 9) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int c9[] = {34, 35, 46, 47, 48, 49}; //purple
    for (int c = 0; c < 6; c++) {
      hue[c9[c]] = 307;
      sat[c9[c]] = 95;
      bright[c9[c]] = 100;
    }
  } else if (pNumber == 10) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int c10[] = {34, 35, 46, 47, 48, 49}; //purple
    for (int c = 0; c < 6; c++) {
      hue[c10[c]] = 307;
      sat[c10[c]] = 95;
      bright[c10[c]] = 100;
    }
  } else if (pNumber == 11) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int c11[] = {34, 35, 46, 47, 48, 49}; //purple
    for (int c = 0; c < 6; c++) {
      hue[c11[c]] = 307;
      sat[c11[c]] = 95;
      bright[c11[c]] = 100;
    }
  } else if (pNumber == 12) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int c12[] = {34, 35, 46, 47, 48, 49}; //purple
    for (int c = 0; c < 6; c++) {
      hue[c12[c]] = 307;
      sat[c12[c]] = 95;
      bright[c12[c]] = 100;
    }
  } else if (pNumber == 13) {
    for (int i = 0; i < num; i++) {
      bright[i] = 0;
      gValue[i] = 1;
    }
    int a13[] = {34, 35}; //yellow
    int b13[] = {47}; //blue
    int c13[] = {48}; //purple
    for (int a = 0; a < 2; a++) {
      hue[a13[a]] = 53;
      sat[a13[a]] = 95;
      bright[a13[a]] = 100;
    }
    for (int b = 0; b < 1; b++) {
      hue[b13[b]] = 210;
      sat[b13[b]] = 95;
      bright[b13[b]] = 100;
    }
    for (int c = 0; c < 1; c++) {
      hue[c13[c]] = 307;
      sat[c13[c]] = 95;
      bright[c13[c]] = 100;
    }
  }
  pNumber = pNumber + 1;</p><p>  if (pNumber == 14) {
    pNumber = 0;
  }
}</p><p>void ani2() {
  //  Serial.println("2");
  unsigned long curM = millis();</p><p>  if (curM - preM >= 10) {
    preM = curM;
    for (int i = 0; i < num; i++) {
      if (hue[i] <= 0) {
        gValue[i] = 1;
      } else if (hue[i] >= 360) {
        gValue[i] = -1;
      }
      hue[i] = hue[i] + gValue[i];
    }
    counter++;
    if (counter == 360) {
      //      Serial.print("counter : ");
      //      Serial.println(counter);
      //      Serial.println(curM);
      counter = 0;
      ani2_Counter = 0;
    }
  }
}</p><p>void ani3() {
  //  Serial.println("3");
}
///////////////////////////////////////////
void readyState() {
  //  Serial.println("ready");
}
///////////////////////////////////////////
void btnEvent( int b_interval) {
  unsigned long curMillis1 = millis();</p><p>  for (int i = 0; i < num; i++) {
    btnState[i] = digitalRead(btnPin[i]);
  }</p><p>  if (curMillis1 - preMillis1 > b_interval) {
    preMillis1 = curMillis1;
    for (int i = 0; i < num; i++) {
      if (btnState[i] == LOW) {
        ani2_Counter = 0;
        //        Serial.println("d");
        if (hue[i] >= 360) {
          hueV[i] = -1;
        } else if (hue[i] <= 0) {
          hueV[i] = 1;
        }
        hue[i] = hue[i] + hueV[i];
        bright[i] = 100;
      }
    }
  }
}
///////////////////////////////////////////
void setPixels(int k) {
  for (int i = 0; i < k; i++) {
    H2R_HSBtoRGB(hue[i], sat[i], bright[i], colors[i]);
    int num1 = i * 3;
    strip.setPixelColor(num1, colors[i][0], colors[i][1], colors[i][2]);
    strip.setPixelColor(num1 + 1, colors[i][0], colors[i][1], colors[i][2]);
    strip.setPixelColor(num1 + 2, colors[i][0], colors[i][1], colors[i][2]);
  }
  strip.show();
}</p>

Step 20: Patterns!

This project has several triangles that form a hexagonal shape. So you can create stereoscopic patterns according to how you design light! Just press each piece and various colors will be gradated, and when the color you want comes out, just hit the hand you pressed and it will continue to shine beautifully with the color you wanted!

You can create whatever you want!