3D프린터와 아두이노를 이용해 주사위처럼 요리조리 굴리면 큐브의 색이 바뀌는 조명을 만들어볼까요? 간단한 버튼이나 가변저항을 이용한 LED 조명제어를 해보셨다면 이번에는 센서를 이용해서 조명을 컨트롤을 해볼 수 있는 실습이 될 거에요!
큐브의 형태를 가진 조명을 생각하던 중에 버튼이나 별도의 컨트롤러를 달지 않고도 색을 바꾸게 할 수 있는 방법을 생각해보다가, 3축가속도센서를 활용해서 주사위처럼 돌리면 색이 변하는 조명을 만들고 싶었어요.
큐브의 정육면체 모든 면에 빛이 나게 하기 위해서 왼쪽 그림과 같이 내부 큐브에 센서와 마이크로컨트롤러를 넣고 LED를 연결했어요. 그리고 외관인 케이스가 안쪽 큐브를 고정해 주는 형태로 디자인했습니다.
[ws_table id="1"]
* 사용된 Beetle은 아두이노와 같은 마이크로컨트롤러입니다.
20x22mm 사이즈의 초소형 컨트롤러로 MicroUSB 케이블이 있어야 프로그램을 임포트할 수 있습니다.
없으신 분들은 가지고 계신 아두이노를 통해서 프로토타이핑 하실 수 있습니다. (Beetle Wiki)
01. 다운로드 받은 폴더 중 [큐브케이스_3D도안] 폴더 안에는 STL파일과 스케치업 파일로3d프린팅 모델링이 들어있습니다. 스케치업 파일은 케이스를 수정하실 경우에 사용해주시면 됩니다. 그렇지 않고 3D출력만 원하실 때에는 stl파일를 가지고 Cura 소프트웨어에서 Gcode로 변환하여 출력해주시면 됩니다. (혹시 3d프린터 출력과 관련해 궁금한 점이 있으신가요? 그럼 여기를 참고해주세요!)
02. 3d 프린터로 큐브의 케이스를 출력해 봅니다. 총 두 파트로 나누어져 있으며 상단이 하단에 낄 수 있는 구조로 되어있습니다. 스케치업 파일 안에 있는 초록색 큐브는 종이로 만들 예정이므로 출력하지 말아주세요.
* 제가 사용한 3d프린터는 Peanut 3D 프린터이며, 필라멘트는PLA소재의 natural 컬러를 사용하였습니다.
(필라멘트 구입하러가기)
**이 3d모델을 bridge구조가 포함되어 있습니다.
따라서 프린트 시 꼭 Fan을 켜주셔야 내부의 구조물이 잘 출력될 수 있습니다.
[페이퍼큐브_2D도안]폴더 안에 있는 Paper_cube.ai파일 또는Paper_cube.pdf파일을 열어 출력한 후 오른쪽 사진처럼 오려 접어주세요. 이 페이퍼 큐브는 Light Cube의 핵심적인 역할을 담당합니다. LED가 발광되는 부분이며, 뿐만 아니라 센서와 소형 아두이노(Beetle)를 감싸고 있는 부분입니다. 가능한 두꺼운 종이로 만들어주세요.
본격적으로 제작하기에 앞서 브레드보드에 아두이노, 센서 그리고 led를 다음과 같이 연결해보세요. 3축가속센서의 x는 A0 , y는 A1, z는 A2에 연결합니다. LED의 R은 D9, G는 D10, B는 D11에 각각 연결합니다.
※ RGB LED / 삼색 led RGB LED의 가장 긴 핀이 GND로 연결해 주세요. 제가 사용한 LED는 Red, GND(가장 긴 핀), Green, Blue의 순서로 되어있습니다. 낱개로 테스트 시에는 꼭 330옴 이상의 저항을 사용하여 사용해주세요. (RGB LED는 스펙에 따라 달라질 수 있기 때문에 꼭 사신 곳에서 스펙을 확인 후 사용해주세요.)
※ Triple Axis accelerometer / 3축가속센서 3축 가속 센서와 함께 동봉되어 있는 케이블을 연결해서 프로토타이핑 시, 간편하게 테스트 할 수 있습니다. 하지만 실제로 크기가 작은 큐브 안에 넣는 과정에서는 케이블을 사용하지 않고 아래 노랑색으로 체크된 부분에 직접 납땜하여 사용했습니다.
01. [아두이노소스 – LightCube ]폴더 안에 LightCube.ino 파일을 열어주세요.
* 사용한 Beetle을 이용하실 때에는 보드선택을 ‘Arduino Leonardo’ 로 선택하셔서 사용해주세요. 케이블을 Micro USB를 이용해서 업로드합니다.
02. 라이브러리 파일을 넣고 소스코드를 실행시킵니다.
#include<math.h> #include<stdio.h> //3축 가속도센서의 X,Y,Z값을 각각 아날로그 0,1,2핀에 연결합니다. #define A_X 0 #define A_Y 1 #define A_Z 2 int LED_1 = 1; int LED_2 = 2; int LED_3 = 3; int LED_4 = 4; int LED_5 = 5; int LED_6 = 6; //RGB led의 R,G,B를 아두이노의 디지털 핀 9,10,11에 연결합니다. int r = 9; int g = 10; int b = 11; int val_x,val_y,val_z; int dx, dy, dz; void setup() { Serial.begin(115200); pinMode(A_X,INPUT); pinMode(A_Y,INPUT); pinMode(A_Z,INPUT); pinMode(r,OUTPUT); pinMode(g,OUTPUT); pinMode(b,OUTPUT); dx = analogRead(A_X); dy = analogRead(A_Y); dz = analogRead(A_Z); } void loop() { // 센서에서 들어오는 값을 serial monitor로 확인 할 수 있습니다. // Serial.print(x); // Serial.print("\t"); // Serial.print(y); // Serial.print("\t"); // Serial.println(z); // 가속도 센서에서 들어온 default 값에서 현재의 값을 뺀 후, // 세자리 수로 들어오는 센서의 값을 1의 자릿수로 변환하기 위해 100으로 나누어줍니다. int x = (dx - analogRead(A_X)) / 100; int y = (dy - analogRead(A_Y)) / 100; int z = (dz - analogRead(A_Z)) / 100; // 이 부분부터는 달라질 수 있습니다. 센서를 정육면체 도형에 살짝 부착시키신 후, // 각 면마다 들어오는 값을 확인해주세요. // 만약 아래 코드와 다르다면 해당하는 면의 x,y,z값을 수정해주시면 됩니다. if(x == 0 && y == 0 && z == 0) { on(LED_1); } else if(x == -1 && y == 0 && z == 1) { on(LED_2); } else if(x == 0 && y == -1 && z == 1) { on(LED_3); } else if(x == 1 && y == 0 && z == 1) { on(LED_4); } else if(x == 0 && y == 1 && z == 1) { on(LED_5); } else if(x == 0 && y == 0 && z == 3) { on(LED_6); } delay(100); // 센서 값이 들어오는 속도를 조절합니다. } void on(int num) { // LED의 색이 바뀌는 부분입니다. 6개의 면에 원하시는 색으로 설정해주세요. // 원하시는 색을 빛으로 나타내기 위해서 각 0에서 255값이 필요합니다. // 원하는 색으로 LED를 바꾸고 싶으시면 이 페이지 하단에 TIP을 참고해주세요. if(LED_1 == num){ //white color analogWrite(r, 255); analogWrite(g, 255); analogWrite(b, 250); } if(LED_2 == num){ analogWrite(r, 0); analogWrite(g, 250); analogWrite(b, 50); } if(LED_3 == num){ analogWrite(r, 205); analogWrite(g, 255); analogWrite(b, 0); } if(LED_4 == num){ analogWrite(r, 0); analogWrite(g, 100); analogWrite(b, 255); } if(LED_5 == num){ analogWrite(r, 255); analogWrite(g, 0); analogWrite(b, 255); } if(LED_6 == num){ analogWrite(r, 255); analogWrite(g, 20); analogWrite(b, 0); } }
※ RGB led 색 바꾸기 TIP! [그림판 → 색편집]
RGB led를 이용해서 자신이 원하는 색으로 골라서 표현해봅시다. 그림판을 열어 우측상단에 ‘색편집’을 선택합니다. 색상표에서 자신이 원하시는 색을 선택하시면 아래 빨강(R), 녹색(G), 파랑(B)의 값이 나타납니다. 이 값을 각각 위의 코드에 대입하여 넣어주시면 됩니다.
LED를 사용하여 작품을 만들 때 소위 LED의 스팟(점 형태로 보이는 현상) 때문에 고생해보신 분들 많으실꺼에요. 은은하게 빛이 퍼질수 있도록 LED가공해줍니다. Led를 확산시켜주는 led캡과 led를 사포에 갈아서 오른쪽 사진처럼 만들어주세요.
① 표면을 불투명하게 갈은LED를 확산캡에 꾹 눌러 끼워주세요. 그 다음 미리 출력해놓은 종이큐브의 동그란 구멍에 꼽아줍니다.
② 아래 그림과 같이 6개의 LED를 조립하여 준비해주세요.
③ LED핀을 자르기 전에 유성펜으로 각 핀을 미리 표시해주어 자르고 난 후에 혼돈하지 않도록 해줍니다. LED의 핀은 5mm정도를 남기고 잘라주어 3번 그림과 같이 만들어주세요.
① 이제 LED를 병렬로 연결하기 위해서 전선을 같은 핀끼리 납땜하여 연결해줍니다. 핀이 짧기 때문에 미리 납을 핀에 녹여두고 전선을 납땜하면 좀 더 쉽게 연결하실 수 있습니다.
② 다음과 같이, 같은 핀끼리 납땜해주세요. LED의 4핀 모두 오른쪽 사진과 같이 연결해주세요.
③ 그리고 한 쪽 LED의 끝에 전선을 한 가닥씩 연결해줍니다. 이 선들은 각각 Beetle(Arduino)의 디지털핀9,10,11에 각각 연결될 것입니다.
⑤ 마무리로 글루건을 이용해서 납땜한 부위를 꼼꼼하게 감싼 뒤 식혀주시면 LED연결파트는 완성입니다!!
① Beetle과 LED가 연결된 4개의 전선을 연결합니다.
② 각 전선들을 다음과 같이 연결해 주세요.
(Red ⇨ digital 9 / Green ⇨ digital 10 / Blue ⇨ digital 11)
③ 아래 그림과 같이 가속도센서와 Beetle 전선으로 납땜하여 연결해주세요.
(왼쪽에서 부터)
VCC ⇨ 5V(+)
GND ⇨ GND (+)
EN ⇨ 연결하지 않음
X ⇨ A0
Y ⇨ A1
Z ⇨ A2
④ 다음과 같이 연결되면 Beetle과 센서의 연결이 완성됩니다.
❶ 전원을 연결할 두 줄의 전선을 준비합니다.(50cm이상의 넉넉한 길이로 준비해주세요.)
❷ 3개의 수축튜브를 각 전선에 하나씩, 그리고 전체적으로 감싸도록 잘라서 끼워주세요.
❸ 각 전선을 DC 커넥터의 전선과 납땜하여 연결합니다.
❹ 사진과 같이 수축튜브를 납땜한 곳을 감싸도록 위치시켜주세요.
❺ 라이터나 드라이어기를 이용해서 수축튜브를 수축합니다.
❻ 마지막으로 수축튜브를 이용한 두 전선을 하나의 튜브로 감싼 후, 수축해주세요.
❶ DC커넥터와 연결한 전선을 3D프린팅한 케이스 안 쪽으로 빼주세요.
❷ 그 다음 페이퍼 큐브의 네모난 구멍을 통해서 전선을 넣어주세요.
❸ 그리고 Beetle의 (+), (-)에 맞추어 납땜해주세요.
① 접착제를 이용해서 큐브의 가장자리 부분을 붙여주신 후, 먼저 Beetle을 넣고 그 위에 센서를 수평이 되도록 넣습니다.(TIP : 페이퍼 큐브의 뚜껑에 해당하는 부분은 접착제로 붙이시지 마시고 테이프를 이용해서 붙여주시면 문제발생 시 해결하기 쉽습니다. )
② 아래 그림과 같이 마무리해주시면 케이스 안쪽에 넣을 큐브가 완성되었습니다!!
③ 그럼 어댑터를 콘센트에 꼽고 불이 들어오는지, 또 센서값에 따라 LED의 색이 잘 변하는지 확인해주세요.
④ 잘 작동이 된다면 마지막으로 출력한 3D프린팅된 케이스 안쪽에 페이퍼큐브를 넣고 뚜껑을 덮으면 완성!!!
[Fabrication Lab] Light Cube
from mediaflow on Vimeo.
LightCube 프로젝트를 통해서 가속도 센서를 이용해 큐브 조명의 색을 컨트롤 해보았습니다. 또 같은 원리를 이용해서 정육면체뿐만 아니라 삼각뿔이나 육각면체 등 다른 도형도 각도를 이용해 얼마든지 컨트롤러로 응용이 가능할 것입니다.
또 3D프린터로 디자인한 형태를 바로 출력하고, 내부의 구조적인 부분도 3D 모델링으로 한번에 해결할 수 있다는 점이 3D프린팅의 큰 장점으로 느껴졌습니다.
다음 4강에서는 제작한 큐브를 이용해 PC와 연동이 되는 예제를 준비했습니다. 앞으로도 Makezone Fablab 프로젝트는 피지컬 컴퓨팅과 3D프린팅을 활용한 재미있는 컨텐츠를 만들어갈 예정이니 기대해주세요!