Light Me Up!

by eunjeong_ in Circuits > LEDs

5787 Views, 70 Favorites, 0 Comments

Light Me Up!

고은정신혜원이준성-융합.jpg
patterns.jpg
460E641E-DB9F-4753-9A4C-BBEA1205F613.jpeg
3E0EED97-35E1-4622-861D-0E04BC6015F9.jpeg

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

Let's Make It!

1.jpg
2piece.jpg
2.jpg
3.jpg
3.jpg
2.jpg

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.

Material Preparation

융합-사용설명서.png

Cutting Acrylic

KakaoTalk_20191023_181607919.jpg
아크릴-a.png
KakaoTalk_20191023_181609279.jpg
KakaoTalk_20191023_181616887.jpg

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.

Make Sides With 3D Printers

KakaoTalk_20191024_080231343.png
프린팅.png
3d옆면사진.JPG

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.

Filming

KakaoTalk_20191024_075200165.jpg
필름.png
KakaoTalk_20191024_074134044.jpg
KakaoTalk_20191024_075029510.jpg
KakaoTalk_20191024_074114583.jpg
KakaoTalk_20191024_074118119.jpg

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!

Attach LED Strip + Soldering LED Strip(NeoPixel) With Wires

네오픽셀-납땜-4.png
KakaoTalk_20191023_181551511.jpg
KakaoTalk_20191023_181526813.jpg
KakaoTalk_20191023_181555729.jpg

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.

Soldering Tact Switch With Wires

스위치 남땜 사진.jpg
스위치-납땜2.png

Assembly -Insert Bolt on Side= ①

KakaoTalk_20191205_061915406.jpg
조립-볼트넣기.png

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.

Attach Ⓛⓣ to the Ⓒ= ②

KakaoTalk_20191023_181438907.jpg
네오픽셀-부착.png

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

KakaoTalk_20191205_061915689.jpg
2+1=3.PNG
KakaoTalk_20191205_061915561.jpg
KakaoTalk_20191205_061915798.jpg
KakaoTalk_20191205_061915908.jpg

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

본딩.PNG
ae+3=4.png
KakaoTalk_20191024_074120464.jpg
앞면 부착.jpg

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.

Attach Ⓢ to Ⓓ= ⑤

KakaoTalk_20191205_061916024.jpg
d면에-스위치.png

Assembly -Combine ④ and ⑤ Using Ⓦ and Ⓝ= ⑥

전체-조립.png
KakaoTalk_20191205_061916130.jpg
6ABEC872-2ADB-472E-8425-EB9637AB93F6.png
KakaoTalk_20191205_061916228.jpg
KakaoTalk_20191205_061916455.jpg

Complete Piece Assembly

KakaoTalk_20191205_061916570.jpg
KakaoTalk_20191205_061916342.jpg
KakaoTalk_20191205_061916686.jpg

The Working Appearance of a Project

1(2piece)
2(all)

NeoPixel, Connector Wiring

커넥터설명1.jpg
커넥터설명2.jpg
커넥터설명3.jpg
커넥터설명4.jpg

NeoPixel and Arduino Wiring.

와이어링2.jpg

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); } } } }

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>

Patterns!

sdlfjasldjf.jpg
patterns.jpg

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!