이번에는 사람 눈을 교묘히 속여 적은 수의 LED로 간지나는 전광판을 만들어 보자.

 아래 사진은 잔상효과를 이용하여 글자를 표시해주는 잔상돼지이다. 의도한바는 아니지만 만들다 보니 돼지처럼 만들어져 잔상돼지라는 이름이 붙었
다. 도트매트릭스의 원리를 간단히 응용하면 스테핑모터와 LED 8개와 나무젓가락만으로도 훌륭한 전광판을 만들 수가 있다.
 동영상이 있었으면 이해가 쉬웠을 것이나, 아쉽게도 남은건 아래 흐리멍텅한 사진 하나 밖에 없다. 이 돼지도 역시 다음 작품을 위해 바로 분해되었다.



 그럼 이 돼지가 어떻게 글자를 표시할 수가 있을까? 이해를 돕기 위해 급조해 만든 GIF 이미지를 통해 원리를 알아보자.

                   

 먼저 아래쪽에 파란색으로 동그랗게 된 부분이 스테핑모터이다. 모터가 회전하면서 그 위에 나무젓가락에 붙어있는 8개의 빨간색 LED가 불규칙적으로 깜빡이는 것을 알 수 있다. 하지만 이렇게 천천히 돌아서는 정말 LED가 무작위로 깜빡이는 것으로 밖에 안보일 것이다.
 그럼 조금 더 빨리 움직여보자.

 어떤가? 이번엔 잘 보이는가? 만약에 잘보인다면 모니터를 바꿀 때가 된것이다. 어서 모니터를 새것으로 교체하고 다시 보도록 하자. 
 여전히 눈만 아프고 보일 생각을 안한다. 잔상효과로 인해 글자를 표시하고 싶다면, 우리눈에 잔상이 없어지는 시간을 주어선 안된다. 일단 GIF 이미지론 더이상 빨리 돌릴수가 없는 관계로 인위적으로 잔상을 넣어서 돌려보자. 

  무언가 글자가 보이는가? 뭐 그다지 멋지게 나타나진 않지만, 글자가 나타나긴 한다. 사실 실제로 LED를 이용하여 만들어보면 기대보다 뛰어난 퀄리티로 표시될 것이다.(동영상이 없어서 참 아쉽다.)

 사람눈에 잔상이 남는 시간은 대략 1/16초라고 한다. 하지만 내 눈으로 테스트해봤을 때는 1초에 2~3번 정도만 왕복해도 글자가 잘 보였으므로 빛이 강할 수록 눈에 잔상이 더 오래 남는 듯하다. 사실 더 빨리 돌리고 싶어도 스테핑모터의 특성상 급가속을 하다보면 탈조가 나게되므로, 탈조가 나지 않는 선에서 최대한 빠른 속도로 돌려 주는 것이 관건이다.

 위의 방법 말고도 모터를 뺑뺑 돌려서 잔상을 얻어내는 방법도 있다. 하지만 모터가 뺑뺑 돌아가는 구조라면 선이 꼬이기 때문에 모터부와 LED부분을 분리해서 만들어야 하며, 모터와 LED의 씽크를 맞추어 줘야 한다.
 씽크가 안맞을 경우에는 글자가 항상 제자리에 표시되지 않고 돌아가기 때문에 의도한 효과를 내기 힘들 것이다.
씽크를 맞춰주는 방법에는 모터는 모터대로 돌도록 놔두고(보통 DC모터를 사용한다), 적외선센서 등을 이용하여 한바퀴 도는 시간을 계산하여 LED에 표시해주는 방법이 있겠다.
 다른 방법이 있다면, 가속도 센서를 이용하는 것도 있겠다. 위에서 적외선센서 대신 가속도 센서를 사용하거나, 아예 모터를 빼버리고 손으로 흔들어서 가속도값에 맞게 글자를 표시해주도록 만드는 것도 괜찮을 것이다.


그럼 이제 원리를 알았으니, 만드는 일만 남았다.
사실 원리만 이해하면 만드는 것은 일도 아니다.(MCU를 이용하여 LED를 켤줄 알고, 스테핑모터를 돌릴줄 안다면 말이다.)
회로도를 살펴보도록 하자.
  


 우선 마이크로 프로세서의 회로도이다. 프로세서는 흔히 사용하는(사용했던?) 8051을 사용하였다. 오른쪽에 외부인터럽트와 연결된 스위치가 보인다. 본인은 쇼를 위한 모드 세팅과 글자 선택 등의 기능에 사용했으므로 안넣어도 무방하다.


 그 다음은 LED회로도이다. LED 8개를 VCC-330Ω저항-PORT0에 각각 연결하였다. 기본 LED 회로도이므로 별 것 없다.
PORT0의 값을 0으로 넣어주면 전류가 흘러 LED가 켜지는 회로이다.


 다음은 스테핑모터의 회로도이다. 보통 모터의 경우엔 전류를 효과적이고 안정적으로 제어하기 위해 프로세서의 I/O Port에 바로 물리지 않고, 모터드라이버를 통해 제어하게 된다. 스테핑 모터도 역시 드라이버를 사용해야하는데 여기서는 SLA7026이라는 드라이버를 사용하였다. 스텝모터는 INA, INB에 일정한 시퀀스대로 시그널을 주면 그 시그널에 맞게 한스텝, 한스텝 움직이게 된다. 스텝모터의 이러한 특성으로 인해 잔상 LED를 만들기에 적합하다.(한스텝 움직이고 LED 시그널 바꾸고 하면 되기 때문에 모터와 LED간의 싱크를 맞추기에 편하다.)

그럼 이제 소스코드를 살펴 보도록 하자. 사실 해줄일이 별로 없기 때문에 프로그램도 간단하다.

우선 LED를 구동할 신호 Data 배열이다.


unsigned char code micro[48] = 
{
   0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xFF , 0xFF 
 , 0xE0 , 0x78 , 0xE0 , 0xFF , 0xFF , 0x00 , 0x00 , 0xFF 
 , 0xFF , 0x00 , 0x00 , 0x7E , 0xFF , 0xC3 , 0xC3 , 0xC3 
 , 0xC3 , 0x00 , 0x00 , 0xFF , 0xFF , 0xD0 , 0xD0 , 0xFF 
 , 0x6F , 0x00 , 0x00 , 0x7E , 0xFF , 0xC3 , 0xC3 , 0xFF 
 , 0x7E , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 
};



 위 배열에는 'MICRO'라는 글자가 들어가있다. 얼핏 보기에도 MICRO라는 글자가 보인다..면 당신은 공학용 계산기이다. 어서 공학용 계산을 수행하도록 하자. 비록 직관적으로 어떤 글자인지 안보이더라도, 저게 왜 MICRO라는 글자가 되는지는 알아야 한다. 잘 모르겠다면 공학용 계산기로 위의 16진수를 2진수로 변환해보면 알수도 있을 것이다.(사실.. 알아야한다.)
 배열을 만들때는 직접 한땀한땀 2진수에 대입하여 만들어도 되지만, 우린 도구를 쓸줄 아는 진보된 인간이기 때문에 원하는 글자 또는 그림을 Hexa 형태로 변환해주는 font editor와 같은 툴을 사용하도록 하자.

툴을 이용하여 배열을 만들었으면 이제 할일은 배열 값을 이용해 LED한번 켜주고 모터한번 돌려 주고를 반복하면 끝이다.
  

while(1)
{
	if(motorSequence == CW)
	{
		MotorForward();
		P0 = micro[index++]
		if(index > 48)
			motorSequence = CCW;
	}
	else
	{
		MotorBackward();
		P0 = micro[index--]
		if( index < 0 )
			motorSequence = CW;
	}
	delay();
}


  위에서 말로 써놓은걸 프로그램으로 짜보면 위와 같이 나올 것이다. 간단하지 않은가? 너무 간단해서 허무할 지경이다.
모터를 제어하는 부분은 따로 포스팅할 예정이므로, 일단은 MotorForward()시 시계방향으로 한칸, MotorBackward()시 반시계 방법으로 한칸 움직인다고만 이해해두자.

 사실 위 소스코드를 실제로 돌려본다면 의도하지 않게 글자가 반전되어 표시가 될 것이다. 왜 그런지 생각해보고 제대로 디스플레이 될 수 있도록 수정해보자.