'Wii Remote'에 해당되는 글 4

  1. 2008.07.17 Wiimote Library 분석 (1)
  2. 2008.06.30 [Wiimote project] Johny lee 따라하기_2
  3. 2008.06.22 [Wiimote project] Johny lee 따라하기
Interesting/Wii | Posted by hyena0 2008. 7. 17. 00:37

Wiimote Library 분석 (1)




Wiimote Library

Wiimote Library 내용을 알아야 응용프로그램을 만들 수 있기 때문에 라이브러리 내용을 살펴보도록 하겠다.

위모트 라이브러리는 C#으로 작성되어 있고, Wiimote.cs, HIDImports.cs, Events.cs, DataTypes.cs 네가지 파일로 구성된다.

Wiimote.cs는 wiimote class가 있고 위모트를 연결하고 동작하기 위한 Method 들을 포함하고 있어서 , 윈도우프로그램에서 초기화와 데이터입출력을 처리하는 부분이 된다.
HIDImports.cs는 인식된 위모트를 연결해주는 역할을 하고, Events.cs는 이벤트 처리에 해당하는 부분이고, DataTypes.cs는 데이터처리에 필요한 구조체들을 정의하고 있다.  

각 해당 파일에 대한 클래스와 메소드를 정리해 보았다.

------------------------
*Wiimote.cs

namespace WiimoteLib
{
public class Wiimote : IDisposable
{
public Wiimote();
public void Connect();
public void Disconnect();
private void BeginAsyncRead();
private void OnReadData(IAsyncResult ar);
private bool ParseInput(byte[] buff);
private void InitializeExtension();
private byte[] DecryptBuffer(byte[] buff);
private void ParseButtons(byte[] buff);
private void ParseAccel(byte[] buff);
private void ParseIR(byte[] buff);
private void ParseExtension(byte[] buff, int offset);
private void ParseReadData(byte[] buff);
private byte GetRumbleBit();
public void SetReportType(InputReport type, bool continuous);
public void SetLEDs(bool led1, bool led2, bool led3, bool led4);
public void SetLEDs(int leds);
public void SetRumble(bool on);
public void GetStatus();
private void EnableIR(IRMode mode);
private void DisableIR();
private void ClearReport();
private void WriteReport();
public byte[] ReadData(int address, short size);
public void WriteData(int address, byte data);
public void WriteData(int address, byte size, byte[] buff);
}
}
---------------------------
* HIDImports.cs

class HIDImports
{
[DllImport("hid.dll")]
public static extern void HidD_GetHidGuid(out Guid gHid);
public static extern Boolean HidD_GetAttributes(IntPtr HidDeviceObject, ref HIDD_ATTRIBUTES Attributes);
internal extern static bool HidD_SetOutputReport(
   IntPtr HidDeviceObject,
   byte[] lpReportBuffer,
   uint ReportBufferLength);
[DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetupDiGetClassDevs(
   ref Guid ClassGuid,
   [MarshalAs(UnmanagedType.LPTStr)] string Enumerator,
   IntPtr hwndParent,
   UInt32 Flags
   );
public static extern Boolean SetupDiEnumDeviceInterfaces(
   IntPtr hDevInfo,
   //ref SP_DEVINFO_DATA devInfo,
   IntPtr devInvo,
   ref Guid interfaceClassGuid,
   Int32 memberIndex,
   ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData
  );
public static extern UInt16 SetupDiDestroyDeviceInfoList( IntPtr hDevInfo );

[DllImport(@"setupapi.dll", SetLastError = true)]
public static extern Boolean SetupDiGetDeviceInterfaceDetail(
   IntPtr hDevInfo,
   ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
   IntPtr deviceInterfaceDetailData,
   UInt32 deviceInterfaceDetailDataSize,
   out UInt32 requiredSize,
   IntPtr deviceInfoData
  );
public static extern Boolean SetupDiGetDeviceInterfaceDetail(
   IntPtr hDevInfo,
   ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
   ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData,
   UInt32 deviceInterfaceDetailDataSize,
   out UInt32 requiredSize,
   IntPtr deviceInfoData
  );

[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern SafeFileHandle CreateFile(
   string fileName,
   [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
   [MarshalAs(UnmanagedType.U4)] FileShare fileShare,
   IntPtr securityAttributes,
   [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
   [MarshalAs(UnmanagedType.U4)] EFileAttributes flags,
   IntPtr template);

[DllImport("kernel32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle(IntPtr hObject);
}
---------------------------
* Events.cs

public delegate void WiimoteChangedEventHandler(object sender, WiimoteChangedEventArgs args);
public delegate void WiimoteExtensionChangedEventHandler(object sender, WiimoteExtensionChangedEventArgs args);
public class WiimoteExtensionChangedEventArgs: EventArgs
public class WiimoteChangedEventArgs: EventArgs
{
public WiimoteExtensionChangedEventArgs(ExtensionType type, bool inserted);
}
public class WiimoteChangedEventArgs: EventArgs
{
public WiimoteChangedEventArgs(WiimoteState ws);
}
---------------------------
*DataTypes.cs

public class WiimoteState
public struct LEDState
public struct NunchukCalibrationInfo
public struct ClassicControllerCalibrationInfo
public struct NunchukState
public struct ClassicControllerButtonState
public struct ClassicControllerState
public struct IRState
public struct AccelState
public struct AccelCalibrationInfo
public struct ButtonState
public enum ExtensionType : byte
public enum IRMode : byte
---------------------------

Interesting/Wii | Posted by hyena0 2008. 6. 30. 22:54

[Wiimote project] Johny lee 따라하기_2



Johny lee 따라하기 2단계

닌텐도 위모트를 PC에 연결하고 나서 그의 동영상에서 처럼 화이트보드 기능을 시험해 보려고 한다.
IR LED를 가지고 펜에다가 삽입한 후 닌텐도 위모트에 쏘면 펜의 위치가 인식되는 방식이다.

펜은 아래와 같은 방식으로 제작했다. 쟈니리와 약간 다른 것은 그냥 일반 리모컨에서 LED를 얻었고,
그러다 보니 특성값을 알 수 없어서 저항값을 정확히 알지 못해 가변저항을 이용하였다.

사용자 삽입 이미지

전원의 경우 USB를 이용하고 싶었으나, IR LED의 용량을 정확히 알지 못해서 PC에 무리가 갈까봐 DC adapter를 이용하였다.

쟈니리의 홈페이지에서 화이트보드 프로그램을 다운로드 받고 펜을 가지고 실험해 보면 동영상과 같은 기능을 확인할 수 있다. 단, 위모트가 45도 각도로 IR 신호를 입력받기 때문에 펜에서 나가는 IR 신호의 범위를 찾기가 좀 어려운 부분이 있다.



 특히나 와이드 모니터의 경우는 각도를 찾기 어려워서 상당히 뒤에 위치시켜서 동작을 시켜야 했다.

여기부터는 프로그램을 어떻게 동작시켜야 하는지 분석을 해보고, 자체적인 프로그램을 작성해서 더 나은 Human Interface를 만들 수 있을지 고민해 봐야 겠다.

To be continue...
Interesting/Wii | Posted by hyena0 2008. 6. 22. 22:59

[Wiimote project] Johny lee 따라하기

Johny lee 따라하기

Youtube 의 스타가 된 쟈니 청 리의 위모트 프로젝트를 따라해보자...

우선 화이트 보드 프로그램을 먼저 따라해보려고 한다.

그에 앞서 Wii 리모컨이 있어야 하고, 데스크탑에서 수행할 경우 블루투스 USB 동글이 있어야 한다.

Wiimote는 26000원, 블루투스 동글은 14000원 정도(SS-BT2)면 구입이 가능하다.

제품이 준비되면 우선 블루투스 동글 프로그램을 설치하고 위모트와 연결해본다.

위모트의 경우에 뒷면의 배터리 부분에 보면 우측하단에 싱크 버튼이 있다. 이것을 누르면 전면에 1,2,3,4 라고 써진 부분의 LED가 파란색으로 발광하게 된다.
혹은 케이스를 열지않는 방법으로 전면 하단에 버튼 1과 2를 동시에 누르면 싱크동작을 하게 되어 LED가 발광하게 된다.

동글 프로그램을 실행하고, 블루투스 장치를 검색한다.

그러면 프로그램에서 닌텐도 위모트를 검색하게 되고 검색된 디바이스에 커서를 선택하고 마우스 오른쪽 클릭을 하고 HID를 선택한다.

등록이 되었다면 위모트의 1번 LED가 켜져있을 것이다.

그리고는 쟈니리의 프로그램을 다운로드 받아서 실행해보자.

To be Continue...

사용자 삽입 이미지