그림에 조명을 켜보자

by 하민정 | 2017-01-12 17:07
lcd 디지털아트 아두이노 액자 조명 조명액자

재료

  • 절연 시트 1개
  • 폼 보드 1개
  • 아두이노 우노 1개
  • 배터리 1개
  • 버터 페이퍼 1개
  • 터치센서 1개
  • PCB 1개
  • 알루미늄 호일 1개
  • 방수 크레용 1개
  • LED 1개

                                      


이 그림이 액자 일까요 조명 일까요? 

이것은 조명 기능이 있는 액자 입니다. 

너무 예쁘고 참신하지 않나요? 


이 액자에 영감을 받아 그림에 조명을 킬 수 있는 프로젝트를 찾아 헤매던 중 

instructables 에서 비슷한 프로젝트를 발견해 소개하고자 합니다. 


'내가 만든 그림에 조명을 켜봅시다' 




이 프로젝트는 터치를 인지해 그림의 특정 부분을 누르면 출력으로

내가 원하는 곳에 조명을 비추게 됩니다. 

자 그럼 이 프로젝트를 함께 해 보도록 합시다. 


 Step 1. 준비물 


- 아두이노 우노 

- PCB

- LED 

- 배터리 

- 알루미늄 호일 

- 절연 시트 

- 버터 페이퍼 

- 방수 크래용 

- 폼 보드 

- 터치 센서 


Step 2. 하드웨어 연결방식 


① 터치센서를 아두이노에 연결하기 


터치센서를 아두이노의 디지털 8번핀, 10번핀, 11번핀, 12번핀에 연결합니다. 

센서를 보드에 연결하고 코드를 수행해 주면 됩니다. 


만약 그림에서 터치센서로 인지하는 부위를 더 늘리고 싶은 경우

그리고 유효한 터치로 감지하는 역치를 설정하는 부분을 수정해 사용해 줍니다. 


 디자인 만들기 


내가 만들고 싶은 디자인을 만듭니다. 

터치센서로 인지해야 할 부분을 아두이노의 8번 핀에서 12번 핀 사이의 핀들로 연결해 줍니다. 


 LED 회로 만들기 


먼저 PCB 에 내가 원하는 디자인을 그립니다. 

그 중 내가 터치센서로 감지할 부분을 표시합니다. 

LED 를 저항과 함께 납땜해 줍니다. 

터치센서의 출력 부분에 이 LED 들을 연결해 줍니다. 

배터리를 연결해 줍니다. 


④ 센서 연결하기 (1) 


절연시트와 PCB 를 연결해 터치센서로 인지해야 할 부분에 구멍을 뚫습니다. 

터치센서로 인지해야 할 부분들에 알루미늄 호일로 덮어줍니다. 


 센서 연결하기 (2) 


버터 페이퍼에 원하는 그림을 그려줍니다. 

그림에 방수 크래용을 이용해 색칠해 줍니다. 

폼 보드를 PCB 와 같은 사이즈로 자르고, 터치센서로 표시된 부위에 구멍을 만들어 줍니다. 

버터 페이퍼와 폼보드 그리고 PCB 를 모두 연결해 줍니다. 


Step 3. 코드 


1
2
3
int count = 0;
int pinCount = 3;  //This is the number of touch sensing that u want
 
cs


▶ 현재 이 프로젝트에서 원하는 터치센서 부위는 3 곳 이므로,

< int pinCount = 3 ; > 으로 설정해 놓았습니다. 

만약 더 많은 부위를 이용하고 싶은 경우 이 값을 변경해 주면 됩니다. 


1
2
3
4
5
void setup() 
{
    Serial.begin(9600);      // connect to the serial port
}
 
cs


▶ setup ( ) 설정에서 시리얼 포트와 연결해 줍니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void loop ()
{
  char capval[4];
  char pinval[4] = {
    1<<PINB0,1<<PINB2,1<<PINB4  };    //PINB0 means DIGITAL PIN 8, PINB1 = DIGIPIN 9, PINB2= DIGIPIN 10,
                                      //PINB3 = DIGIPIN 11, PINB4 = DIGIPIN 12
  delay(1000);
  for(char i = 0; i < 3; i++)
  {
    capval[i] = getcap(pinval[i]);   //the function which gets the touch value of the pin
//CODE to display the value of the pin on the serial port
    Serial.print("digital ");
    Serial.print( 2*i + 8, DEC);
    Serial.print(": ");
    Serial.println(capval[i], DEC);
    Serial.println("");
  }
}
cs


▶ PINB0, PINB2, PINB4 를 이 그림에서 터치센서로 사용하고 있습니다. 

PINB0 는 아두이노의 8번핀과 연결되어 있고, 

PINB2 는 아두이노의 10번핀과 연결되어 있고, 

PINB4 는 아두이노의 12번핀과 연결되어 있습니다. 


3개의 센서 중 getcap ( ) 함수를 통해 터치로 인지된 경우, 이 함수를 호출합니다. 


1
2
3
4
5
6
7
8
9
10
11
12
char getcap(char pin)
{
  char i = 0;
  DDRB &= ~pin;          // input
  PORTB |= pin;          // pullup on
  for(i = 0; i < 16; i++)
    if( (PINB & pin) ) break;
  PORTB &= ~pin;         // low level
  DDRB |= pin;           // discharge
  return i;
}
 
cs


▶ getcap ( ) 함수에서 입력이 있는 경우, 즉 터치가 감지된 경우 

출력으로 연결한 부위에 LED 를 밝혀 줍니다. 


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


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
/*Capacitative Sensing Code for ATMega328 Arduinos*/
 
 
int count = 0;
int pinCount = 3;  //This is the number of touch sensing that u want
 
void setup() 
{
    Serial.begin(9600);      // connect to the serial port
}
 
void loop ()
{
  char capval[4];
  char pinval[4] = {
    1<<PINB0,1<<PINB2,1<<PINB4  };    //PINB0 means DIGITAL PIN 8, PINB1 = DIGIPIN 9, PINB2= DIGIPIN 10,
                                      //PINB3 = DIGIPIN 11, PINB4 = DIGIPIN 12
  delay(1000);
 
  for(char i = 0; i < 3; i++)
  {
    capval[i] = getcap(pinval[i]);   //the function which gets the touch value of the pin
 
//CODE to display the value of the pin on the serial port
    Serial.print("digital ");
    Serial.print( 2*i + 8, DEC);
    Serial.print(": ");
    Serial.println(capval[i], DEC);
    Serial.println("");
 
  }
 
}
 
// returns capacity on one input pin
// pin must be the bitmask for the pin e.g. (1<<PB0)
char getcap(char pin)
{
  char i = 0;
  DDRB &= ~pin;          // input
  PORTB |= pin;          // pullup on
  for(i = 0; i < 16; i++)
    if( (PINB & pin) ) break;
  PORTB &= ~pin;         // low level
  DDRB |= pin;           // discharge
  return i;
}
 
 
cs



Step 4. 수행결과 











댓글 3

MADE BY