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
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.
Material Preparation
Downloads
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.
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.
Downloads
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!
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.
Soldering Tact Switch With Wires
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.
Attach Ⓛⓣ to the Ⓒ= ②
Assembly -Use a Ⓦ and Ⓝ to Combine ① and ②= ③
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.
Attach Ⓢ to Ⓓ= ⑤
Assembly -Combine ④ and ⑤ Using Ⓦ and Ⓝ= ⑥
Complete Piece Assembly
The Working Appearance of a Project
NeoPixel, Connector Wiring
NeoPixel and Arduino Wiring.
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!
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!