목적
피사체의 위치와 피사체가 바라보는 방향을 실시간으로 계산하는 헤드트래킹을 구현하기로 함, 이를 위해 Wiimote 두개와 IRED 3개로 구성된 표식자(태그)를 사용하였습니다.

특징
일반적으로 알려진 헤드트래킹은 피사체의 2차원 or 3차원 공간 좌표값(x,y,z) 성분만을 계산할 수 있는 제한이 있습니다.
본 3광점 태그를 이용한 헤드트래킹은 피사체의 위치와 더불어 방향벡터(로컬좌표계)까지 완전하게 계산하낼 수 있으므로 좀더 다양하게 응용할 수 있습니다.

용도
헤드 트래킹의 용도는 광범위하나 여기서는 3D 스캐닝 작업시, 여러차례 나눠서 스캐닝하지 않고, 한번에 피사체의 전체를 스캐닝하는데 활용하는 것을 가정하였습니다.

결과
헤드트래킹은 구현완료 하였으나 3D 스캐너 관련 개발은 현재 보류된 상태입니다. (3D 스캐너 관련글 링크)
One Step Full Scanning 구현은 언제가 될지 모르지만 꼭 완성하고 싶네요, 여러분이 먼저 하시렵니까??;;


방법 소개

3광점 표식자
헤드트래킹을 구현하기위해선 피사체에 고정되어 있는 정점(Vertex) 좌표값이 적어도 3개가 필요합니다. 물론 단순히 피사체의 위치벡터만 구하는 경우라면 두개의 Wiimote로 한개의 정점 좌표값만 구해도 됩니다만 이경우 정점의 3차원 좌표(x,y,z)값만을 알 수 있고 피사체의 2축 회전성분을 알수가 없으며, 정점 좌표가 2개인 경우엔 위치파악 및 2축 중 1축 회전성분을 알수 있습니다. 결국 피사체에 고정되어 있는 3개의 정점을 알아야 완전한 위치와 방향 성분을 갖는 벡터값을 구해낼 수 있습니다.

Wiimote
위모트는 한번에 4개까지의 IRED(적외선LED)광점을 인식할 수 있는 기능이 있습니다. 특정파장(940nm)의 적외선에 반응하므로 너무 밝지 않은 실내라면 별도의 장비없이도 쓸만한 광점인식 장비로 사용할 수 있습니다.  피사체에 3개의 IRED를 고정시킨 후 실시간으로 두개의 Wiimote로 그 광점들의 좌표값을 측정하는것으로 피사체의 위치와 바라보는 방향을 구할 수 있게됩니다.

3개의 정점으로 정의되는 Local 좌표계 구하기
위모트를 사용해보신 분들이라면 광점 3개를 읽어들이는것은 어렵지 않게 할 수 있습니다만, 실제 이값을 가지고 피사체의 벡터(위치와 방향)성분을 구해내는건 약간의 벡터연산에 대한 이해가 필요합니다.  사실 고등학교때부터 배워온 벡터지만,,  막상 써먹으려니 막막하더군요,  어쨌든 간만에 벡터연산 공부좀 하고 해답을 구했습니다.  정리해놓고 보면 별거 아니네요.


이제 순서대로 정리를 해보도록 하겠습니다.


1단계. 3광점의 3차원 좌표값 구하기

Wiimote 2개로 광점 3개의 2차원 좌표값들을 구하고 이값으로  3차원 좌표값 P1, P2, P3을 구해놓습니다.  이와 관련된 내용은3D 포인트 트래킹 구현하기 글에 소개되어 있습니다. 이값은 웹캠이나 기타 다른 방식으로 구할 수 도 있습니다.

준비된 결과 값:  P1(x,y,z)  P2(x,y,z)  P3(x,y,z)

2단계. 문제정의

3개의 정점으로 구성된 Local 좌표계 구하기라고 목표를 정의했지만, 사실 애매한 표현입니다. 수학적으로 엄밀한 표현까지는 아니더라도 좀더 구체적인 정의가 필요합니다.  그림으로 표현하는게 가장 이해하기 쉬울듯 합니다. 정의 방법에 따라 무수히 다른 방식의 좌표계 정의를 내릴 수 있을텐데요, 여기선 단계적으로 손쉽게 이해하고 계산하기 쉬운 방식으로 정의하겠습니다.



그림. 로컬 좌표계와 P1,P2,P3 관계 정의도

3단계. 계산하기

우리가 구해야할 값은 위 그림에서 u1,u2,u3로 표현된 벡터값 입니다.  각각 Local좌표계의 x,y,z축에 해당하는 벡터입니다. 헤드 트래킹의 경우, 월드좌표계안에서 헤드의 위치와 방향을 바로 이 좌표계 정보로 표현 한다는 개념입니다.
아래의 수식은 실제로 Away3D라는 플래시 3D엔진에서 Number3D 자료형의 벡터연산 메소드(함수)를 이용하여 계산하는 예입니다.  벡터 빼기 연산은 sub() 로, 벡터 외적 연산은 cross() 로 표기됩니다.

  P1->P2 를 벡터A 로 정의합니다.
  P1->P3 을 벡터B 로 정의합니다.

A.sub( P1 , P2);
B.sub( P1 , P3);

  이제 위 정보로 u1,u2,u3를 구합니다. 이때 방향성분이 중요하고 크기(길이)는 중요치 않습니다.
  (참고로 위 그림에서 u벡터들의 길이는 실제값이 아니고 임의의 크기로 표현했음에 주의바랍니다.)
  여기선, 두 벡터를 외적(Cross Prduct)하면 서로 직교하는 제 3의 벡터를 구할 수 있다는 것을 응용합니다.
  첫번째 로컬 좌표축 성분 벡터인 u1은 A와 B의 벡터 합으로 정의하고
  두번째 로컬 좌표축 성분 벡터인 u2는 A와 B의 외적으로 정합니다.
  세번째 로컬 좌표축 성분 벡터인 u3는 u1과 u2의 외적으로 구합니다.

u1.add( A, B);
u2.cross( A, B);
u3.cross( u2,u1);

위 연산으로 벌써 결과가 구해졌습니다. 벡터연산 함수를 사용하면 뺄셈 2번, 덧셈 1번, 곱셈2번으로 끝나는 매우 간단한 연산입니다. 이렇게 구한 벡터 3개는 모두 나머지 두 벡터와 직교하는 벡터가 되며, 로컬좌표계의 3개의 축 정보로 사용할 수 있습니다. 보통 좌표계의 축벡터는 크기가 중요하지 않으므로, 아래와 같이 크기가 1인 단위벡터로 변환하는 연산(Normalize)을 해줍니다.  위 그림에서는 u1,u2,u3 벡터를 단위길이 벡터로 변환한 것이 ^u1, ^u2, ^u3 로 표현되었습니다.

u1.normalize();
u2.normalize();
u3.normalize();


결과값과 활용


여기서 구한  u1,u2,u3를 이용하여 로컬좌표계를 정의할 수 있고, 월드좌표계와 좌표계변환 연산등을 할 수 있습니다. 좌표계 변환은 행렬연산과 관련된 또다른 주제가 됩니다. 그 부분은 기회가 되면 Away3D같은 3D 엔진 예제와 함께 설명 드릴 예정입니다.  계획했던 연관 프로젝트 진행이 중단되어 아직 보여드릴 만한 응용예제가 없네요, 추후 예제가 생기면 추가하겠습니다. 아래의 이미지는 실제 헤드트래킹 과정을 기록해둔 동영상의 한장면을 캡쳐한 것입니다. 머리의 움직임에따라 우측에 보이는 화면속 삼각형(+로컬좌표축)의 위치와 방향이 변합니다.


사진. 헤드트래킹 장면 예

우측 부분에 월드 좌표축과 삼각형 위에 붙은 작은 좌표축(헤드의 로컬좌표축)이 희미하게나마 보입니다.

끝으로
헤드트래킹을 구현한지가 벌써 반년이 넘어버렸습니다. 그동안 정리는 뒤로 미루고 새로운 일을 벌리곤 했지만 지나보니 정리를 안해놓으니 남는게 없네요;;  앞으로라도 좀더 정리된 자료를 만드는 습관을 들여서 개인 프로젝트 히스토리 관리도 하고 약간이나마 공공지식에의 공언도 해야겠다는 생각이 듭니다.  그러나,,,오랜만에 그림 하나 그리는데 왜이리 힘든지요 ^^;;


관련링크

1. 외적(Cross Product)연산 : wikipedia
2. 1광점 트래킹하기 (3차원 좌표값 실시간추적)

목표
2대의 Wiimote를 이용하여 3D 공간에 위치한 광점(IRED)의 x,y,z 좌표값을 구한다.

본 기능은 다음의 경우에 응용할 수 있습니다.
1. 3D 스캐너 만들기
2. 헤드 트래킹(단순 위치 파악형 및 3광점 헤드 트래킹)
3. 3D 마우스

※ 3광점 헤드 트래킹:
3개의 IRED를 이용하면 단순히 위치를 파악하는것 뿐아니라 어느방향을 바라보는지도 알수 있습니다. 관련링크 참조

준비물
Wiimote 2개,  IRED(적외선LED) (참고링크2 참조) 
기타 Wiimote 사용을 위해 필요한 게이트웨이 SW 및 BT 장치 등.

Wiimote 설치 및 연동
Wiimote와 Flash를 연동하는 방법은  참고링크1.을 참고하시기 바랍니다. 

Wiimote로 측정 가능한 정보
wiimote에는 3축 가속센서, 여러개의 버튼이 포함되어있고, 내장된 적외선 카메라로 적외선 광점의 좌표값을 4개까지 인식할 수 있습니다. 물론 wiimote에서 출력해주는 좌표값은 카메라 스크린을 기준으로한 x,y 좌표(2D)좌료 값이므로 이것만으로는 3D좌표값을 구할수 없습니다. 하지만 wiimote를 2개 이상 사용한다면, 이 값들의 조합으로 3D 좌표값을 구해 낼 수 있습니다.
참고로 일반적인 WebCam으로도 가능합니다. 다만 wiimote를 사용하므로써 광점을 인식처리해주는 이미지 처리과정이 필요없고, wiimote의 기타 센서 기능을 함께 사용할 수 있으므로 목적에따라 선택하여 사용하면 됩니다.
아래의 이미지는 WiiFlash Server에서 기본 제공되는 데모 실행화면입니다. 버튼의 눌림상태와 각종 센서들의 수치값이 실시간으로 보여지는 것을 볼 수있습니다.




예제 소스
아래에 첨부된 소스는 Wiimote 2개( WA와 WB)를 이용하여  3차원공간상에 위치한 광점(ir Point)의 좌표값을 계산하는 예제 소스입니다. 저는 이를 기초로하여 3D 스캐너와 헤드트래킹을 구현했습니다. 좀더 고급 수학을 이용한 복잡한 방법이 있을듯 합니다만  저는 잘 모르고요, 제가 아는 범위의 단순한 삼각함수를 이용했습니다. 중.고등학교 과정의 수학이면 이해 가능할 듯 합니다.

package{
	import org.wiiflash.Wiimote;
	import org.wiiflash.events.ButtonEvent;
	import org.wiiflash.events.WiimoteEvent;
	import flash.events.*;
	import flash.display.*;
	import flash.text.TextField;
	
	public class PositionDetector extends Sprite{

		public const D2R:Number = Math.PI / 180;
		public const R2D:Number = 180 / Math.PI;
		// Calibration 수치
		public const IRX2DEG:Number = 41;
		public const IRY2DEG:Number = 32;
		private var L:Number = 500;				//500mm
		private var WA_LRCenterDeg:Number = 60;
		private var WA_UDCenterDeg:Number = 0;
		private var WB_LRCenterDeg:Number = 120;
		private var WB_UDCenterDeg:Number = 0;

		// p(x,y,z)산출 기본자료
		private var WAirx:Number;
		private var WAiry:Number;
		private var WBirx:Number;
		private var WBiry:Number;

		private var p1x:Number;
		private var p1y:Number;
		private var p1z:Number;

		// create a new Wiimote
		private var WA:Wiimote = new Wiimote();
		private var WB:Wiimote = new Wiimote();
				
		public function PositionDetector(){
			//ir value update EventListener 설정
			WA.addEventListener( Event.CONNECT, onWiimoteConnect );
			WA.addEventListener( IOErrorEvent.IO_ERROR, onWiimoteConnectError );
			WA.addEventListener( Event.CLOSE, onCloseConnection );
			WA.addEventListener( WiimoteEvent.UPDATE, WiimoteAUpdateHandler );
			WB.addEventListener( Event.CONNECT, onWiimoteConnect );
			WB.addEventListener( IOErrorEvent.IO_ERROR, onWiimoteConnectError );
			WB.addEventListener( Event.CLOSE, onCloseConnection );
			WB.addEventListener( WiimoteEvent.UPDATE, WiimoteBUpdateHandler );								
			WA.connect ();
			WB.connect ();
			Canvas2D.point.visible = false;
		}

		function onCloseConnection ( pEvent:Event ):void{
			trace("onClose: " + pEvent.target );
		}
		
		function onWiimoteConnectError ( pEvent:IOErrorEvent ):void{
			trace("onError: " + pEvent.target );
		}
		
		function onWiimoteConnect ( pEvent:Event ):void{
			trace( "Wiimote successfully connected: " + pEvent.target );
		}		

		public function WiimoteAUpdateHandler(pEvent:WiimoteEvent){
			if(pEvent.target.ir.p1){	
				WAirx = WA.ir.x1;
				WAiry = WA.ir.y1;
			}			
		}
		public function WiimoteBUpdateHandler(pEvent:WiimoteEvent){
			if(pEvent.target.ir.p1){	
				WBirx = WB.ir.x1;
				WBiry = WB.ir.y1;
				Canvas2D.point.visible = true;				
				CalcProcess();
			}else{
				Canvas2D.point.visible = false;
			}
		}
		public function CalcProcess(){
			//irx => WADeg => WAm(기울기)  , WBm도함께
			var WADeg:Number = WA_LRCenterDeg - ( WAirx - 0.5 ) * IRX2DEG;
			var WAm:Number = Math.tan( WADeg * D2R);
			trace( WADeg, WAm);
			var WBDeg:Number = WB_LRCenterDeg - ( WBirx - 0.5 ) * IRX2DEG;
			var WBm:Number = Math.tan( WBDeg * D2R);

			// 기울기를 알고있는 두 선분의 교점P(x,z) 구하기  
			// WA는 (0,0)  WB는 (L,0)을 지나는경우이며,  WA/WB 수평평면이 x/z 평면이다.
			p1x = ( -WBm * L ) / ( WAm - WBm ) ;
			p1z = WAm * p1x;

			// py구하기
			var Lxz:Number = Math.sqrt( p1x * p1x + p1z * p1z ) ;
			var WA_UDDeg:Number = WA_UDCenterDeg - ( WAiry - 0.5 ) * IRY2DEG;
			p1y = - Math.tan( WA_UDDeg *D2R ) * Lxz;

			// p(x,y,z)표시
			PointXYZ.text = "px = " + String(p1x);
			PointXYZ.text += "\npy = " + String(p1y);
			PointXYZ.text += "\npz = " + String(p1z);			
			
			var Lcan = Canvas2D.WB.x - Canvas2D.WA.x;
			Canvas2D.point.x = Canvas2D.WA.x + p1x  * Lcan / L;
			Canvas2D.point.y = Canvas2D.WA.y - p1z * Lcan / L;
		}
	}
}


예제 소스 설명

1. 장비 설치에 따른 수치 정의
측정하기 전에 WA와 WB의 world좌표상의 거리 L과  x축을 기준으로 한 회전각을 정의합니다.
좀더 노력하면 자동으로 Calibration하여 이값들을 구해낼 수 도 있으나, 본 예제는 기초적인 수학으로 3차원 자표값을 구해내는것을 목표로 하므로, 단순하게 직접 측정하여 기입하는 방식을 사용합니다.
 정의되야할 정보는 아래와 같습니다.

private var L:Number = 500;                           // WA와 WB 사이의 거리, 이경우 500mm
private var WA_LRCenterDeg:Number = 60;      // WA의 좌우 회전각 (Deg)
private var WA_UDCenterDeg:Number = 0;        // WA의 상하 회전각
private var WB_LRCenterDeg:Number = 120;     // WB의 좌우 회전각
private var WB_UDCenterDeg:Number = 0;        // WB의 좌우 회전각
public const IRX2DEG:Number = 41;                // Wiimote의 수평 화각이다.  (측정 값이며 오차있음)
public const IRY2DEG:Number = 32;                // Wiimote의 수직 화각이다.  (측정 값이며 오차있음)


그림1. Wiimote 설정치 참조도 (xz평면도)

2. 작동프로세스
Wiimote의 update 이벤트 발생시마다,  WA,WB모두에서 irPoint 가 발견될 경우에만 WA,WB의 irx,iry를 구한 뒤, p(x,y,z) 값  px,py,pz을 구합니다.


3. 실제 좌표값을 구하는 수학은 간단한 삼각함수를 이용합니다.  소스를 보시고 이해해 보시거나 직접 삼각함수로 연산을 해보시면 됩니다. 단, 한가지 알아둘 사항은 Wiimote에서 출력해주는 좌표값은 0~1 사이의 값이기 때문에 이값을 각도에 해당하는 값으로 변환해줘야 삼각함수 연산이 가능합니다.  이때문에 Wiimote의 화각정보를 미리 측정해 둬야하는데요, 가령 Wiimote의 좌우방향 화각이 30도라고 합시다.   이경우 광점이 가장 왼쪽경계에서 발견된다면  wiimote의 irx값은 0으로 출력됩니다.  그리고 만약 우측 경계부분에서 광점이 발견되면 irx의 값은 1이 됩니다.  또한 Wiimote 화각의 중심점에서 발견될 경우 이값은 정확이 0.5로 출력됩니다.

즉, 아래와 같이 변환될 수 있습니다.
 irx  0  0.25  0.5 0.75
1
중심기준 각도(deg)
 -15  -7.5 0
 7.5  15

실제 코드상에서는 아래와 같이 계산합니다.
var WADeg:Number = WA_LRCenterDeg - ( WAirx - 0.5 ) * IRX2DEG;


추가로, D2R 과 R2D 는 Deg각도 값과 Radian값을 변환해주는 상수 값입니다. 
Degree값을 Radian값으로 바꾸려면 D2R을 곱해주면 됩니다.  마찬가지로 Rad를 Deg로 변환하려면 R2D값을 곱해주면 됩니다.




동영상1. 3차원 좌표값 실시간 구하기


사진1. 설치예



다른 글에서 전자칠판과 적외선펜을 소개해드렸는데요, 생각해보니 Wiimote로 할 수 있는게 전자칠판뿐이 아닙니다.  더 쉽게 응용가능한 용도가 한가지 더 있는데요,,,  Wiimote를 무선 포인터(마우스)로 사용하는 겁니다.  

종종 프리젠테이션 할때 페이지를 넘기거나 화면상의 특정지점을 지적하는데 사용되는 전용 기기들이 판매되고 있습니다. 가격이 십만원정도 했던것 같은데요  Wiimote로 이걸 대신할 수 있습니다.   영화를 보거나 할때도 리모컨으로 이용이 가능합니다.

그런데, 이때 Wii 센서바 라는게 필요합니다. 
그런데 이름은 Sensor Bar인데 센서같은건 들어있지 않고 적외선 LED 몇개 달려있는겁니다. 
움직이는 Wiimote가 기준위치를 참고할 수 있도록, 가만히 앉아서 적외선 빛만 발생시켜주고 자기 역활은 끝입니다.
일종의 등대같은 녀석입니다.

쇼핑몰에서 1만원 이내에 판매되고 있더군요, 구입해서 사용하시거나  IRED를 가지고 계시다면 직접 자작하시면 더 저렴하고요 포터블하게 들고다니며 사용할 수 도 있어서 좋습니다.
( 제게서 IRED 구입하신 분들은 적외선펜 만들고 남은 IRED로 센서바 하나 만들어 두시면 좋을듯합니다. )

어떻게 만드는지 이번에도 초간단 버전을 보여드리오니 참고하시기 바랍니다.  회로는 적외선 펜과 동일합니다.   건전지 한개에 저항없이 직결하면 됩니다.  관련내용은 적외선펜 만들기 글을 참고하시기 바랍니다.

저는 스위치가 장착된 2Cell짜리 건전지 케이스를 개조해서 On/Off 되게 만들었는데 두고두고 편리하게 사용하고 있습니다.
건전지 자리 하나 비우고 그곳에 IRED를 납땜해 버리는 방법입니다. 
한가지 더 가운데쯤엔 IRED 얼굴내밀 구멍도 뚤어줘야 하는군요... 

헉,,, 납땜과 드릴작업까지 ,,,  그리 간단하지 않네요;;  그래도 마음을 비우고 한번 해보시죠 ^^


자작 센서바 내부구조

[ 사진1. 자작 센서바 내부구조 ]


작동중인 센서바


[사진2. 작동중인 센서바 ]



※ 소프트웨어는 전자칠판을 지원하는 SW에서 선택만 하면 사용할 수 있습니다.



공인 받지는 못했지만, 자칭 세상에서 가장 쉬운 적외선펜(IR Pen)만들기 방법을 소개해 드리렵니다.
너무 간단해서 제작기라고 하기도 민망합니다.  멋들어진 적외선펜을 구입하거나 만들어 사용하시기 전에 우선 테스트로 적외선펜이 필요하신 경우나 여러개의 적외선펜이 필요하신 경우 뚝딱 만들어 사용할 수 있는 방법입니다.



Wii Remote Controller(이하 Wiimote)를 활용한 전자칠판 제작에 있어서 핵심 구성 요소 중 하나가  IR Pen(적외선펜)인데요, 제작 방법은 사실 단순하지만, 실제로 제작이 용이치 않습니다. 재료 구하고 조립하는데 그냥 하루가 갑니다. 그래서 제가 터득한 아주 간단한 제작법을 알려드리겠습니다. 일단 동영상을 먼저 보시죠.



[동영상1.  적외선펜(IR Pen) 만들기 - Wii전자칠판용 가장 간단한 방법 ]

주의사항. 동영상 자막중에 IRED의 짧은 다리를(+)라고 표시했는데, 오류입니다.
긴다리가(+)이고,  짧은 다리가(-)입니다.

혹시, 위 동영상이 버벅되시면 YouTube 동영상 자료를 참고하세요.  [링크 바로가기]



[사진. 완성된 스프레이형 적외선펜 ]

자세한 설명 들어갑니다. 위와 같은 적외선펜을 만들려면 아래와 같은 재료를 구하시면 됩니다.
보셔서 아시겠지만, 저항, 전선, 전지케이스, 스위치, 납땜도구 등 아무것도 필요없습니다. IRED 다리를 구부릴때 사용할 롱노오즈 플라이어(뺀찌)가 있다면 좀더 편하게 작업 할 수 있습니다.


재료1. 적외선 LED (IRED)
  • 파장이 940nm인 제품이라야 인식이 잘됩니다.  (파장이 다르면 인식률이 확~ 떨어집니다. 링크: 테스트자료)
  • 저항없이 1.5V 전지에 바로 연결하시려면 최대 허용전압이 1.7V이상인 제품을 사용해야합니다.
  • 단, 저항을 사용하신다면 최대 전압이 1.6V이하인 IRED를 사용하셔도 좋습니다.
  • 화각도 +-20도 정도가 되야 기울기에따른 인식률 저하가 적으며, 3D 포인터 등에 활용하기도 용이합니다.


  [사진1. 적외선 LED(IRED)] 

직접 찾아보신 분들은 아시겠지만, Wiimote용 IRED의 구입이 쉽지 않습니다. 제가 위 조건에 딱 맞는 IRED를 박스로 구입한 뒤 소량이 필요하신 분들께 판매중이오니 필요하신 분은 참고하세요 (글하단에 있는 관련링크참조)


재료2. 일반 1.5V 건전지
  • 일반 1.5V 건전지로 크기는 AA, AAA타입 모두 가능합니다. 
  • 건전지 (-)극 부위에 V홈이 있는(사진2) 형태가 좋습니다. 이곳에 IRED 다리를 둥굴게 말아 넣으면 전기적, 구조적으로 잘 결합되게됩니다.  신기하게도 국내산 건전지들이 보통 이런형태이고,  제가 갖고있던 중국, 일본, 미국산 건전지는 보통 이 홈의 깊이가 매우 작거나 아예 없더군요 (사진3 참조)
 ☞ 대부분의 국산 건전지의 경우 비닐커버를 벗겨내도 약간의 접착물이 남아있어서 v홈이 아닌부분에 IRED다리를 접합할 경우 이 접착물들로 인해  IRED 점등이 잘 안되곤 하므로 참고 바랍니다.



[ 사진2. 건전지 추천 형태 - v홈있는것 ]




[ 사진3. 건전지 비추천 형태 - v 홈 없는것 ]


작동원리 - 전지의 구조

동영상 후반부에 보여드렸듯이 건전지 옆면도 사실 (+)극성을 갖고 있는데 비닐커버로 감싸서 절연되어 있는것입니다. 음양(-)과 양군(+)이 바로 옆집에 살면서도, 멀리 학교에서만 만나야 하는 상황 같습니다.
무슨 연애소설이나 일제시대에 만들어둔 비밀 지하통로라도 발견한 기분입니다.
비닐 장벽을 조금 제거하고 곧바로 만나게 해줬더니 전선비용도 아낄수있으니 참 좋습니다.
그런데 간혹 이상한 녀석들도 있더군요, 제가 갖고있는 중국산 건전지는 옆면이 (-)극 입니다. [사진3.중국산 참조] 이런경우 극성이 바뀌므로  전압 테스터기로 직접 확인하신 후 다리 극성을 맞쳐서 연결하시기 바랍니다.


제작 후 작동 확인법

적외선펜은 작동상태가 맨눈으로 안보입니다. 
"눈에 안보이는 빛..." 참 매혹적인 시 구절같지만, 볼 수가 없으니 왠지 답답합니다.
하지만 다행이도 요즘 우리 주변엔 디지탈카메라가 넘쳐납니다. 대부분의 디지탈 카메라들이 가시광선외에 적외선도 함께 보고있으므로  디카, 핸드폰 카메라, 웹캠 어느것이던 적외선 발광 여부를 확인할때 사용하실 수 있습니다. TV리모컨이 말썽일때도 적외선이 제대로 발광하는지 디카로 확인 가능합니다.  제작후 꼭 테스트해 보시기바랍니다.

관련링크
1. 적외선펜 제작용 적외선 LED 팝니다.
2. 1000원짜리 비밀펜으로 적외선펜 만들기
3. 1광점 3D 포인트 트래킹 구현하기
4. 3광점 헤드 트래킹 구현하기



판매 종료했습니다.!!!!


Wiimote 전자칠판용 최적의 IRED 구하기

전자칠판을 만들기위한 재료 대부분은 쇼핑몰에서 바로 구입가능하지만 적외선펜만은 국내 판매처가 없으며(있다면 제게 좀 알려주세요), 자작을 위해 적외선 LED를 구하려해도 일반적인 부품이 아니므로 인터넷 전자부품상에서도 판매를 안하고 있습니다. 직접 사양에 맞는 제품을 구매하러 용산,구로,을지로를 돌아다니셔도 비슷한 제품은 있는데 주파수(빛의 파장)가 달라서 기껏 차비,시간, 돈을 들여서 구매한 부품이 무용지물이 될 수 있습니다. (저의 슬픈 경험담 입니다.)

하지만, 노력하면 배우는게 있습니다. Wiimote와 딱 맞는 940nm파장의 IRED를 구했습니다.
게다가, 작동 전원으로 건전지 1.5V 직결 사용이 가능하므로 "저항? 그런거 난 잘 몰라" 하시는 분들에게도 최적인 적외선 LED를 찾았습니다. 그리고 좀 많이 구매를 해뒀습니다.
(적외선펜을 만드시려는 분들은 맨 아래의 "적외선펜만들기"링크를 참고하시기 바랍니다. 저항도, 스위치도, 전선과, 건전지 케이스도 필요없는 적외선펜 만드는 방법을 알려드립니다.)

"나는 꼭 부품을 직접 구할꺼야!! " 라는 분들은 아래의 사양을 참고하시고요,
교통비, 시간 절약하실 분들은 저한테 구입해 주시면 감사하겠습니다. (위의 온라인샵 링크 참조)

사양소개:
 직경(mm) 파장(nm) 정격전압(V) 최대전압(V) dc Fwd 전류(I) 화각(deg)
 5 940 1.36 1.7  100mA +-20


특징1. Wiimote와 최적의 궁합 파장인 940nm 제품입니다.   (링크: 테스트 자료 참조)
특징2. 최대 허용전압이 1.7V이므로 일반 1.5V전지를 저항없이 연결해서 사용할 수 있습니다.
(일반 1.5V 건전지도 처음 사용시 전압을 측정해보면 1.6V가 넘습니다. 때문에 최대허용 전압이 1.6V인 IRED는 저항을 연결하여 사용해야 안전합니다.)
특징3. +-20도의 화각. 수신기와의 각도에 덜 민감하므로 적외선펜, 광점 트래킹 등 광범위한 용도로 사용하실 수 있습니다.
 


IRED 응용 사례:
  • Wii Remote Controller (Wiimote)를 이용한 전자칠판 만들기:   적외선 펜 만들때 사용됩니다.
  • IR SENSOR BAR :  Wiimote를 리모컨 용도로 사용할때  모니터 위에 센서바를 설치해야합니다.  이것도 IRED로 제작가능합니다.  참고 링크: 초간단 센서바 만들기
  • 자작 적외선 카메라용 포인터:  Wiimote가 없어도 일반 웹캠으로 적외선펜의 모션 트래킹이 가능합니다.
  • 터치패드구현: IR Array로 다량의 빛을 유리면에 방사후 손가락이 닿는 위치에서 반사되는 적외선을 카메라로 캡쳐하면 적외선펜 없이도 UI구현이 가능합니다.
  • 홍채인식 Eye Tracking:   모니터 쪽에서 적외선을 쏘고 사람의 눈에서 반사되는 적외선을 카메라로 감지하여, 눈알?의 각도를 측정해 냅니다. 쉽게말하면 사용자가 어딜 보는지 알려주는 장치입니다.  저도 사용해 봤는데요, 여러분이 알고있는 대형 웹사이트 운영사들이 이미 보유하고 있습니다. 왜냐고요?  새로운 디자인을 할때 여러분이 어딜 먼저볼지, 얼마동안 쳐다보는지 등을 미리 테스트 해볼 수 있기 때문입니다. 아직은 수천만원짜리 고가 장비이지만, 언젠가 개인용으로 저렴하게 나올때가 있을지 모릅니다. 기다리기 싫으시면 그냥 여러분이 만들어 보시죠!


☆ 1.5V 건전지와 IRED만 있어도 적외선펜 만들수 있습니다. 아래의 글을 참고하세요

+ Recent posts