터치에 의해 바뀌는 조명 테이블

by 하민정 | 2017-01-18 12:01
디지털아트 인터랙티브 일석이조 조명테이블

재료

  • RGB LED 스트립 1개
  • 나사 못 1개
  • 알루미늄 프레임 1개
  • 브래드 보드 1개
  • 사포 1개
  • 저항 1개
  • 거울 1개
  • 나무 판재 1개
  • 12 V 전압 1개
  • 점퍼 와이어 1개
  • 드릴 1개
  • 납땜기 1개
  • 2-way 거울 1개
  • 아두이노 우노 1개
  • 절연 테이프 1개
  • 실톱 1개
  • 트랜지스터 1개

                                                    


평소엔 거울이 있는 평범한 테이블 이지만, 

어두운 밤에 화려한 조명이 필요하다면, 굳이 조명을 구매하지  말고

테이블에 이런 디지털을 더해 보는 건 어떨 까요 ? 


터치에 의해  인터랙티브 하게 바뀌는 테이블을  instructables 에서 접해 소개하고자 합니다. 


Step 1. 준비물 


- 아두이노 우노 

- 브래드 보드 

- 점퍼 와이어 

- 트랜지스터

- 저항

- 납땜기

- RGB LED 스트립

- 거울 

- 2-way 거울 

- 알루미늄 프레임 

- 12V 전압 

- 실톱

- 사포 

- 드릴 

- 나사 못 

- 나무 판재

- 절연 테이프


Step 2. 메이킹 


 테이블과 거울 준비하기 


 테이블 자르기 



원하는 사이즈의 거울을 준비했다면, 

그것을 테이블에 올려 놓고 거울이 들어갈 사이즈를 측정합니다. 

측정한 사이즈의 사이드 4 군데에 드릴로 구멍을 냅니다. 

실톱을 이용해 해당 면적을 잘라 냅니다. 

테이블을 잘라낸 이후 사포로 가장자리를 정리합니다. 


 거울의 나무 프레임 


                                                   


테이블 안쪽에 나무로 거울 프레임을 만들어 놓습니다. 

이후 테이블의 위 쪽에서 거울을 놓게 되면 해당 프레임이 아래에서 단단히 받쳐주게 됩니다. 


 소프트웨어 및 하드웨어 연결 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Pin for the LED
int LEDPin = 13;
int trigger = 0;
int r, g, b;
// Pin to connect to your drawing
int capSensePin = 2;
// This is how high the sensor needs to read in order
// to trigger a touch. You'll find this number
// by trial and error, or you could take readings at
// the start of the program to dynamically calculate this.
int touchedCutoff = 20;
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
#define FADESPEED 5
cs


▶ LED 스트립을 아두이노 우노에 연결해 줍니다. 

RGB LED 핀을 아두이노의 13번 핀과 연결합니다. 

터치센서는 아두이노의 2번 핀과 연결 합니다. 





1
int touchedCutoff = 20;
cs


▶ 센서에 의해 감지된 값이 여기서 설정한 20 이라는 값 만큼 높아야 센서에 의한 접촉을

우리가 인지하는 터치로 인지 합니다. 


RED 핀은 아두이노의 5번 핀에 

GREEN 핀은 아두이노의 5번 핀에

BLUE 핀은 아두이노의 3번 핀에 연결해 줍니다. 


1
2
3
4
5
6
7
8
9
void setup(){
Serial.begin(9600);
// Set up the LED
pinMode(LEDPin, OUTPUT);
digitalWrite(LEDPin, LOW);
pinMode(REDPIN, OUTPUT);
pinMode(GREENPIN, OUTPUT);
pinMode(BLUEPIN, OUTPUT);
}
cs


▶ 아두이노의 내부 함수 pinMode ( ) 를 이용해 

LED 핀, RED 핀, GREEND 핀, BLUE 핀을 모두 아두이노의 출력으로 설정해 줍니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
void loop(){
// If the capacitive sensor reads above a certain threshold,
// turn on the LED
if (readCapacitivePin(capSensePin) > touchedCutoff) {
digitalWrite(LEDPin, HIGH);
}
else {
digitalWrite(LEDPin, LOW);
}
// Every 500 ms, print the value of the capacitive sensor
if ( (millis() % 500) == 0){
Serial.print("Capacitive Sensor on Pin 2 reads: ");
Serial.println(readCapacitivePin(capSensePin));
Serial.println(trigger);
}
if (readCapacitivePin(capSensePin) >=250){ //sensitivity
trigger++;
if (trigger >5){
trigger =0;
}
switch(trigger){ //these are the lighting schemes
case 0:
digitalWrite(REDPIN,255);
digitalWrite(GREENPIN,255);
digitalWrite(BLUEPIN,255);
break;
case 1:
digitalWrite(REDPIN,0);
digitalWrite(GREENPIN,255);
digitalWrite(BLUEPIN,0);
break;
case 2:
digitalWrite(REDPIN,0);
digitalWrite(GREENPIN,255);
digitalWrite(BLUEPIN,255);
break;
case 3:
digitalWrite(REDPIN,255);
digitalWrite(GREENPIN,0);
digitalWrite(BLUEPIN,255);
break;
case 4:
digitalWrite(REDPIN,0);
digitalWrite(GREENPIN,0);
digitalWrite(BLUEPIN,0);
break;
}
}
}
// readCapacitivePin
// Input: Arduino pin number
// Output: A number, from 0 to 17 expressing
// how much capacitance is on the pin
// When you touch the pin, or whatever you have
// attached to it, the number will get higher
// In order for this to work now,
// The pin should have a 1+Megaohm resistor pulling
// it up to +5v.
uint8_t readCapacitivePin(int pinToMeasure){
// This is how you declare a variable which
// will hold the PORT, PIN, and DDR registers
// on an AVR
volatile uint8_t* port;
volatile uint8_t* ddr;
volatile uint8_t* pin;
// Here we translate the input pin number from
// Arduino pin number to the AVR PORT, PIN, DDR,
// and which bit of those registers we care about.
byte bitmask;
if ((pinToMeasure >= 0) && (pinToMeasure <= 7)){
port = &PORTD;
ddr = &DDRD;
bitmask = 1 << pinToMeasure;
pin = &PIND;
}
if ((pinToMeasure > 7) && (pinToMeasure <= 13)){
port = &PORTB;
ddr = &DDRB;
bitmask = 1 << (pinToMeasure - 8);
pin = &PINB;
}
if ((pinToMeasure > 13) && (pinToMeasure <= 19)){
port = &PORTC;
ddr = &DDRC;
bitmask = 1 << (pinToMeasure - 13);
pin = &PINC;
}
// Discharge the pin first by setting it low and output
*port &= ~(bitmask);
*ddr |= bitmask;
delay(1);
// Make the pin an input WITHOUT the internal pull-up on
*ddr &= ~(bitmask);
// Now see how long the pin to get pulled up
int cycles = 16000;
for(int i = 0; i < cycles; i++){
if (*pin & bitmask){
cycles = i;
break;
}
}
// Discharge the pin again by setting it low and output
// It's important to leave the pins low if you want to
// be able to touch more than 1 sensor at a time - if
// the sensor is left pulled high, when you touch
// two sensors, your body will transfer the charge between
// sensors.
*port &= ~(bitmask);
*ddr |= bitmask;
cs


touchedCutoff > 로 설정한 값보다 현재 센서에 의해 인지되는 값이 

더 큰 경우 HIGH 로 LED 를 켜 줍니다. 

그렇지 않으면 접촉이 감지되지 않다고 판단하여 LOW 로 LED 를 켜지 않았습니다. 


이렇게 매번 500 ms 마다 접촉 센서에 의해 인지된 값을 출력해 줍니다. 


접촉만큼 < trigger > 라는 변수의 값이 증가하게 되고, 

switch 문에서 trigger 로 유도된 값에 따라 조명이 바뀌어 집니다. 


▶ 다음은 전체 코드입니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Pin for the LED
int LEDPin = 13;
int trigger = 0;
int r, g, b;
// Pin to connect to your drawing
int capSensePin = 2;
// This is how high the sensor needs to read in order
// to trigger a touch. You'll find this number
// by trial and error, or you could take readings at
// the start of the program to dynamically calculate this.
int touchedCutoff = 20;
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
#define FADESPEED 5
void setup(){
Serial.begin(9600);
// Set up the LED
pinMode(LEDPin, OUTPUT);
digitalWrite(LEDPin, LOW);
pinMode(REDPIN, OUTPUT);
pinMode(GREENPIN, OUTPUT);
pinMode(BLUEPIN, OUTPUT);
}
void loop(){
// If the capacitive sensor reads above a certain threshold,
// turn on the LED
if (readCapacitivePin(capSensePin) > touchedCutoff) {
digitalWrite(LEDPin, HIGH);
}
else {
digitalWrite(LEDPin, LOW);
}
// Every 500 ms, print the value of the capacitive sensor
if ( (millis() % 500) == 0){
Serial.print("Capacitive Sensor on Pin 2 reads: ");
Serial.println(readCapacitivePin(capSensePin));
Serial.println(trigger);
}
if (readCapacitivePin(capSensePin) >=250){ //sensitivity
trigger++;
if (trigger >5){
trigger =0;
}
switch(trigger){ //these are the lighting schemes
case 0:
digitalWrite(REDPIN,255);
digitalWrite(GREENPIN,255);
digitalWrite(BLUEPIN,255);
break;
case 1:
digitalWrite(REDPIN,0);
digitalWrite(GREENPIN,255);
digitalWrite(BLUEPIN,0);
break;
case 2:
digitalWrite(REDPIN,0);
digitalWrite(GREENPIN,255);
digitalWrite(BLUEPIN,255);
break;
case 3:
digitalWrite(REDPIN,255);
digitalWrite(GREENPIN,0);
digitalWrite(BLUEPIN,255);
break;
case 4:
digitalWrite(REDPIN,0);
digitalWrite(GREENPIN,0);
digitalWrite(BLUEPIN,0);
break;
}
}
}
// readCapacitivePin
// Input: Arduino pin number
// Output: A number, from 0 to 17 expressing
// how much capacitance is on the pin
// When you touch the pin, or whatever you have
// attached to it, the number will get higher
// In order for this to work now,
// The pin should have a 1+Megaohm resistor pulling
// it up to +5v.
uint8_t readCapacitivePin(int pinToMeasure){
// This is how you declare a variable which
// will hold the PORT, PIN, and DDR registers
// on an AVR
volatile uint8_t* port;
volatile uint8_t* ddr;
volatile uint8_t* pin;
// Here we translate the input pin number from
// Arduino pin number to the AVR PORT, PIN, DDR,
// and which bit of those registers we care about.
byte bitmask;
if ((pinToMeasure >= 0) && (pinToMeasure <= 7)){
port = &PORTD;
ddr = &DDRD;
bitmask = 1 << pinToMeasure;
pin = &PIND;
}
if ((pinToMeasure > 7) && (pinToMeasure <= 13)){
port = &PORTB;
ddr = &DDRB;
bitmask = 1 << (pinToMeasure - 8);
pin = &PINB;
}
if ((pinToMeasure > 13) && (pinToMeasure <= 19)){
port = &PORTC;
ddr = &DDRC;
bitmask = 1 << (pinToMeasure - 13);
pin = &PINC;
}
// Discharge the pin first by setting it low and output
*port &= ~(bitmask);
*ddr |= bitmask;
delay(1);
// Make the pin an input WITHOUT the internal pull-up on
*ddr &= ~(bitmask);
// Now see how long the pin to get pulled up
int cycles = 16000;
for(int i = 0; i < cycles; i++){
if (*pin & bitmask){
cycles = i;
break;
}
}
// Discharge the pin again by setting it low and output
// It's important to leave the pins low if you want to
// be able to touch more than 1 sensor at a time - if
// the sensor is left pulled high, when you touch
// two sensors, your body will transfer the charge between
// sensors.
*port &= ~(bitmask);
*ddr |= bitmask;
return cycles;
}
cs


⑤ 2-way 거울 연결 하기 


                          


테이블에 넣어둔 거울 위에 2-way 거울을 가운데를 중심으로 위치시킵니다. 


 테이블에 거울 설치 




거울과 프레임 사이의 빈 공간에 LED 스트립을 넣어 줍니다. 

* 이때 LED 스트립과 연결된 전선들이 나올 여유 공간을 고려해 넣어 줍니다. 


거울을 준비한 알루미늄 프레임으로 감싸 줍니다. 


 마무리 


               


아두이노 우노와 브래드 보드를 테이블 안쪽에 둡니다. 

LED 스트립의 전선들과 아두이노 우노를 연결해 주고

아두이노를 부착한 알루미늄 프레임 아래에 놓아 터치센서가 정상적으로 작동할 수 있도록 합니다. 


아두이노에 12V 전압을 연결하여 프레임을 통해 터치센서가 정상적으로 조명이 바뀌는 지를

확인할 수 있습니다. 


Step 3. 수행 결과 






댓글 1

MADE BY

터치에 의해 바뀌는 조명 테이블 현재글 인터랙티브 캘린더 만들기 이전글