프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

LED 잔상 디스플레이 만들기

2014-09-04 13:18:45

개요


잔상 디스플레이라고 들어보셨나요 ? 
잔상 디스플레이는 POV(Persistance of Visual)라고도 하며,
말그대로 빠른속도로 흔들면  빛의 잔상이 남게되고
이를 이용하여 문자나 그림을 표현할수 있게 됩니다.

실제 예를 들어 살펴보면,

출처 : 불꽃놀이와 잔상효과 - http://herugi.tistory.com


해변가에서 불꽃을 들고 한사람씩 해당하는 글자를 허공에 반복적으로 그려넣고
이를 장노출로 사진을 찍으면 하나의 단어나 문장이 만들어지는 기념사진을 찍어본 경험도
바로 이같은 빛의 잔상을 이용한 방법입니다.

출처 :스마트폰 어플리케이션을 이용한 잔상 효과 - hacknmod.com

이를 응용하여, 자전거 바퀴에 적용하면
달리는 동안 바퀴에 이미지를 만들어 낼수 있습니다.


출처: 자전거를 이용한 잔상효과 - www.ladyada.net

이처럼 모터와 연동하여 허공의 빛으로 입체 패턴을 표현할수 있는
3D POV를 만들수도 있습니다.

출처 : 3D POV - www.eetimes.com
 

이번 프로젝트에서는 LED 5개를 이용하여 간단한 문자를 출력해 보겠습니다.
이를 응용하여 콘서트장에서 가수이 이름을 새긴 막대를 흔들어 뮤지션의 관심을 끌거나,
더 많은 LED를 연결하여 고해상도 POV를 만들어보세요.

 

 

부품목록

NO 부품명 수량 상세설명
1 아두이노 프로 미니 3.3v 1 아두이노호환보드
2 브레드보드 1 브레드보드
3 1kΩ 저항 5 저항
4 점퍼 케이블 12 점퍼 케이블
5 LED 5 LED
6 3.3v 베터리 1 베터리
부품명 아두이노 프로 미니 3.3v 브레드보드 점퍼케이블 LED 1kΩ 저항 저항
파트 x1 x1 x12  x5 x5
부품명 3.3v 베터리
파트 x1
 

하드웨어 Making

 

회로도


 

브레드보드 레이아웃

 

 

소프트웨어 Coding

아래의 코드를 아두이노에 업로드 합니다.

 

// 출처 : an project done by Glen p yeldho 
//      for more info and updates  https://www.facebook.com/glenp.yeldho
// 수정 : www.kocoafab.cc
// 알파벳마다의 표기방법을 미리 설정합니다.
int _[] = {0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0};
int A[] = {0,1,1,1,1, 1,0,1,0,0, 0,1,1,1,1};
int B[] = {1,1,1,1,1, 1,0,1,0,1, 0,1,0,1,0};
int C[] = {0,1,1,1,0, 1,0,0,0,1, 1,0,0,0,1};
int D[] = {1,1,1,1,1, 1,0,0,0,1, 0,1,1,1,0};
int E[] = {1,1,1,1,1, 1,0,1,0,1, 1,0,1,0,1};
int F[] = {1,1,1,1,1, 1,0,1,0,0, 1,0,1,0,0};
int G[] = {0,1,1,1,0, 1,0,1,0,1, 0,0,1,1,0};
int H[] = {1,1,1,1,1, 0,0,1,0,0, 1,1,1,1,1};
int I[] = {0,0,0,0,1, 1,0,1,1,1, 0,0,0,0,1};
int J[] = {1,0,0,0,0, 1,0,0,0,1, 1,1,1,1,1};
int K[] = {1,1,1,1,1, 0,0,1,0,0, 0,1,0,1,1};
int L[] = {1,1,1,1,1, 0,0,0,0,1, 0,0,0,0,1};
int M[] = {1,1,1,1,1, 0,1,1,0,0, 0,1,1,1,1};
int N[] = {1,1,1,1,1, 1,0,0,0,0, 0,1,1,1,1};
int O[] = {0,1,1,1,0, 1,0,0,0,1, 0,1,1,1,0};
int P[] = {1,1,1,1,1, 1,0,1,0,0, 0,1,0,0,0};
int Q[] = {0,1,1,1,1, 1,0,0,1,1, 0,1,1,1,1};
int R[] = {1,1,1,1,1, 1,0,1,0,0, 0,1,0,1,1};
int S[] = {0,1,0,0,1, 1,0,1,0,1, 1,0,0,1,0};
int T[] = {1,0,0,0,0, 1,1,1,1,1, 1,0,0,0,0};
int U[] = {1,1,1,1,1, 0,0,0,0,1, 1,1,1,1,1};
int V[] = {1,1,1,1,0, 0,0,0,0,1, 1,1,1,1,0};
int W[] = {1,1,1,1,0, 0,0,1,1,0, 1,1,1,1,0};
int X[] = {1,1,0,1,1, 0,0,1,0,0, 1,1,0,1,1};
int Y[] = {1,1,0,0,0, 0,0,1,0,0, 1,1,1,1,1};
int Z[] = {1,0,0,1,1, 1,0,1,0,1, 1,1,0,0,1};
int letterSpace;
int dotTime;
void setup()
{
  // 2-6번핀의 LED를 출력으로 설정합니다.
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
 
  // 글자 사이에 공간을 생성합니다.(단위:ms)
  letterSpace = 6;
  // 각 도트(LED)가 나타날 시간을 설정합니다. (단위:ms)
  dotTime = 3;
 
}
void printLetter(int letter[])
{
  int y;
 
  // 첫번째 y열을 출력합니다.
  for (y=0; y<5; y++)
  {
    digitalWrite(y+2, letter[y]);
  }
  delay(dotTime);
 
  // 2번째 y열을 출력합니다.
  for (y=0; y<5; y++)
  {
    digitalWrite(y+2, letter[y+5]);
  }
  delay(dotTime);
 
  //3번째 y열을 출력합니다.
  for (y=0; y<5; y++)
  {
    digitalWrite(y+2, letter[y+10]);
  }
  delay(dotTime);
 
  // 문자 사이의 공간을 출력합니다.
  for (y=0; y<5; y++)
  {
    digitalWrite(y+2, 0);
  }
  delay(letterSpace);
}
void loop()
{
  // 출력하기를 원하는 문자를 순차적으로 입력합니다. 언더바는 공백을 의미합니다.
  printLetter(K);
  printLetter(O);
  printLetter(C);
  printLetter(O);
  printLetter(A);
  printLetter(_);
  printLetter(F);
  printLetter(A);
  printLetter(B);
  
}

 

 

하드웨어 & 소프트웨어 설명

1.하드웨어 설명 


아두이노 호환 보드인 아두이노 pro mini를 사용하였습니다.
무선으로 작동하기 위해 작은 보드를 선택한것으로,
일반적으로 많이 쓰이는 Arduino UNO로도 가능합니다.

2.스케치설명


알파벳 'E'의 경우 LED 5개를 모두 켯다가 해당 밀리 초만큼 대기후
1,3,5만 켜고 이를 한번 더 반복하게 됩니다.
이로써 사람의 '눈'이 가지고 있는 착시를 이용하여
0.04초 이전의 사물과 현재의 사물을 합성하여 하나의 글자로 인식되게 됩니다.
 

 // 글자 사이에 공간을 생성합니다.(단위:ms)
  letterSpace = 6;
  // 각 도트(LED)가 나타날 시간을 설정합니다. (단위:ms)
  dotTime = 3;
 
}
void printLetter(int letter[])
{
  int y;
 
  // 첫번째 y열을 출력합니다.
  for (y=0; y<5; y++)
  {
    digitalWrite(y+2, letter[y]);
  }
  delay(dotTime);
 
  // 2번째 y열을 출력합니다.
  for (y=0; y<5; y++)
  {
    digitalWrite(y+2, letter[y+5]);
  }
  delay(dotTime);
}

 

글자사이의 공간과 글자가 출력되는 시간을 미리 설정하고,
배열된 알파벳마다 LED의 켜고 꺼짐을 설정해두었기 때문에
void loop()에서 해당 알파벳을 호출하는 것만으로 LED설정이 완료됩니다.

 

 

hihyo

아두이노,아두이노미니,초급,POV,LED,잔상효과,잔상디스플레이