만화경과 인피니티 미러의 결합! 거울을 회전시키면 조명이 그에 반응해 변합니다. 기성 거울과 액자, 몇 가지 부품으로 제작합니다. 아두이노 101 개발 보드에 내장된 위치 센서로 각도를 감지해 라이트 디스플레이를 제어합니다.
참고: 이 프로젝트는 홀리데이 섀도 씨어터와 동일한 전자 회로 구성입니다. 기본적으로 아두이노 101, LED 스트립, 배터리 팩만 있으면 됩니다. 저는 $4 전압 레귤레이터로 같은 배터리 팩이 LED와 아두이노 101 모두에 전원 공급되게 했습니다. 아니면 9V 배터리로 아두이노 구동하고 레귤레이터 생략도 가능합니다.
파트 1: 거울 제작
1단계
날카로운 박스 커터나 호비 나이프로 12"x12" 폼코어 정사각형을 자르고 연필로 중심을 표시하세요. 액자 뒷면 골판지를 참고하면 편합니다.
2단계
원형 제도기나 실과 연필로 12x12 정사각형 중심에 반지름 5.25"의 완벽한 원을 그리세요. 자로 가장자리에서 0.75" 지점에 표시해 기준점으로 삼으세요.
3단계
박스 커터나 호비 나이프(새 날 필수)로 원을 조심스럽게 잘라내세요. 이 절단면이 최종 작품에 보이므로 최대한 깔끔하게 자르세요.
4단계
구멍을 뚫은 후 더 예쁜 면을 골라 깨끗한 작업면 위에 좋은 면이 아래로 향하게 놓으세요.
5단계
별도로 폼코어 1/2인치 폭, 약 36" 길이 스트립을 자르세요. 짧은 조각들을 테이프로 이어 붙여도 됩니다. 자를 사용해 폭을 최대한 균일하게 0.5"로 유지하세요.
6단계
완성된 스트립을 테이블에 수평으로 놓고, 전체 길이를 따라 2인치 간격으로 윗종이만 세로로 칼집(스코어)을 내세요.
7단계
스트립을 뒤집고 글루건으로 LED 스트립을 폼코어 스트립 길이를 따라 부착하세요.
8단계
뒷면의 스코어 선을 접는 지점으로 삼아 스트립을 대략 원형으로 구부리세요.
9단계
12x12" 폼코어 정사각형의 구멍 위에 LED 스트립을 링 모양으로 올리세요. 전체 스트립이 너무 깁니다. 구멍보다 살짝 큰 원이 되게 크기를 조절하고 남는 LED(약 6개)는 잘라내세요. 잘라낸 LED는 다른 프로젝트에 재활용 가능합니다.
10단계
LED 링을 12x12" 정사각형 윗면(나쁜 면)에 원 구멍 가장자리에 맞춰 글루건으로 고정하세요. LED 링 뒷면이 12x12" 정사각형 가장자리에서 최소 0.25" 안쪽에 오게 하세요. (그렇지 않으면 액자의 검은 플라스틱 스페이서가 안 맞습니다.)
11단계
반투명 미러 필름 사용 시: 섀도박스 액자에서 유리를 꺼내 제조사 지침대로 필름을 부착하세요. 이 단계가 가장 까다롭습니다. 유리를 먼저 깨끗이 닦고 물(또는 비눗물)을 사용해 기포를 쉽게 제거하세요. 미러 필름을 쓰면 환상 효과가 훨씬 강해지고 LED가 숨겨지지만, 필수는 아닙니다(나중에 추가해도 됨!). 필름 사용 시 필름 면이 위/액자 안쪽을 향하게 유리를 다시 끼우세요.
12단계
액자를 뒤집어 놓고 유리가 깨끗한 상태에서 폼코어를 유리 위에 올리세요(좋은 면이 아래, LED 링이 위). 액자에 딸린 스페이서 2개를 넣고, 그 위에 12x12" 거울을 좋은 면이 아래로 향하게 올리세요. LED 전선은 거울 뒤로 빠져 액자 뒤로 나와야 합니다. 전선 때문에 거울이 너무 꽉 끼면 박스 커터나 호비 나이프로 액자 가장자리에 전선용 노치를 조심스럽게 파내세요.
여유 공간이 있으면 골판지 액자 백커를 넣고, 없으면 액자 탭으로 거울을 고정하세요. 거울 완성! 이제 전자 회로로 넘어갑니다.
파트 2: 전자 회로 구성
1단계
앞서 잘라낸 여분 6개 LED를 모으세요. 끝단 하네스를 LED에서 약 1cm 떨어뜨려 자르고 피복을 벗기세요.
2단계
전압 레귤레이터에 딸린 구부러진 헤더 핀을 분리해 녹색/노란 와이어 끝에 각각 2개씩 납땜하세요. 아두이노 101 핀에 쉽게 꽂기 위함입니다.
3단계
빨간 와이어를 전압 레귤레이터 VIN 단자에 납땜하고, GND와 VOUT 핀엔 직각 헤더 2개를 사진과 같이 납땜하세요.
4단계
배럴 잭 어댑터 연결: 배터리 케이스 전선 피복을 벗겨 수 배럴 잭 단자에 체결하세요. 빨강은 (+), 검정은 (-) 단자.
거울 뒷면에서 나오는 LED 스트립 시작 부분 전선에 암 배럴 잭 어댑터를 연결하세요. 이 스트립에선 노란색이 (-), 빨간색이 (+) 단자입니다.
5단계
아두이노 101에 하네스 연결: 녹색 와이어 → 6번 핀, 노란색 와이어 → 13번 핀 근처 GND 핀.
전압 레귤레이터의 헤더 핀 2개: GND → GND, VOUT → 아두이노 101 'Vin' 핀. 절대 반대로 꽂지 마세요! 역결선 시 타버립니다. 경험담입니다.
6단계
아두이노 101과 LED 스트립의 와이어 하네스를 서로 연결한 뒤, 배터리 팩 배럴 잭을 LED 스트립의 배럴 잭에 연결하면 배선 완료!
7단계
전자 회로 완성. 아두이노 101을 거울 뒷면에 어느 변과도 평행하게 놓고 벨크로, 양면테이프 또는 글루건으로 고정하세요. 배터리 팩도 근처에 고정하고 느슨한 전선은 테이프나 글루로 정리하세요.
컴퓨터, USB 케이블, 아두이노 IDE로 예제 코드 업로드.
또는 아두이노 웹 IDE로 코드 접근/편집/업로드 가능.
테스트 해보세요!
예제 코드는 인텔 퀴리 컴퓨트 모듈의 가속도계로 읽은 거울 각도에 따라 LED 색상을 변경합니다. 현재 한 위치에선 모든 조명 끄기, 한 각도에선 마지막으로 사용한 색상으로 체이싱 라이트 효과가 나옵니다. 코드를 수정해 더 멋진 조명 효과를 만들어보세요! Adafruit NeoPixel Uberguide가 좋은 출발점입니다.
중요! 영구 설치 시 배터리 팩 대신 플러그인 전원 공급 장치 사용 가능하지만, 출력 전압이 3.5V~5V여야 합니다! 9V 각형 배터리 같은 높은 전압은 LED 스트립을 손상시킬 수 있습니다.
코드
아두이노 101 인피니티 미러 스케치 Arduino
/* Copyright (c) 2016 Intel Corporation. All rights reserved. See license notice at end of file.
Arduino 101 "Infinity Mirror."
The rotation angle of the Arduino 101 changes the lights in a Neopixel strip.
This code uses the Adafruit Neopixel library.
Library installation instructions here: https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-installation
If using the desktop version of the Arduino IDE, make sure you have the latest Intel Curie Core installed.
For more info, visit https://www.arduino.cc/en/Guide/Arduino101 */
#include "CurieIMU.h"
#include
#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(54, PIN, NEO_GRB + NEO_KHZ800);
int tr = 0, tg = 0, tb = 0;
int r = 0, g = 0, b = 0;
int rawX = 0, rawY = 0;
float angle = 0.0;
void setup() {
CurieIMU.begin();
CurieIMU.setAccelerometerRange(2);
strip.begin();
strip.show();
}
void loop() {
rawX = CurieIMU.readAccelerometer(X_AXIS);
rawY = CurieIMU.readAccelerometer(Y_AXIS);
int rawZ = CurieIMU.readAccelerometer(Z_AXIS);
angle = atan2(rawX, rawY);
if (abs(angle) > 2.5) {
tr = 0; tg = 0; tb = 0;
runlights();
}
if ((angle > 1.5) && (angle < 2.5)) {
tr = 100; tg = 100; tb = 100;
runlights();
} else if ((angle < 1.5) && (angle > 0.5)) {
tr = 100; tg = 0; tb = 0;
runlights();
} else if ((angle < 0.5) && (angle > -0.5)) {
tr = 0; tg = 100; tb = 0;
runlights();
} else if ((angle < -1.5) && (angle > -2.5)) {
tr = 0; tg = 0; tb = 100;
runlights();
} else if ((angle < -0.5) && (angle > -1.5)) {
theaterChase();
} else {
tr = 0; tg = 0; tb = 0;
runlights();
}
}
void runlights() {
if (tr > r + 1) r++;
if (tg > g + 1) g++;
if (tb > b + 1) b++;
if (tr < r) r--;
if (tg < g) g--;
if (tb < b) b--;
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, r, g, b);
}
strip.show();
delay(10);
}
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256*5; j++) {
for(i=0; i