Wiiのコントローラー「ヌンチャク」をPC用のマウスにしてみました。スティックでカーソル移動、Zボタンが左クリック、Cボタンが右クリックです。
 実はヌンチャクはI2Cという汎用的な通信規格でWiiリモコンから制御されており、Wiiリモコンの代わりにマイコンから制御して情報を取得することができるのです。自作の回路でWiiヌンチャクと接続するには、スイッチサイエンスで販売されている「WiiChuckアダプタ」を使うと簡単です。また、Adafruit Trinket というArduino互換(完全互換ではない少し特殊なもの)のマイコンの5V版を使うと、簡単にUSBマウスやキーボードを自作することができます。16MHzで動作する必要があるため、3.3V版はUSBマウス化できません。詳しくはAdafruitのWebサイトを参照して下さい。Trinketはスイッチサイエンスの他、マルツ共立でも購入することができます。この2つを組み合わせて作ったのがヌンチャクをマウスにする回路です。TrinketとPCをUSBケーブルでつなぐだけでマウスとして使用することができます。
NunchuckMouse
 回路自体は簡単で、Trinketの5V電源端子とヌンチャクの+端子、GNDと-、SDAとd、SCLとcをつなぐだけ。なので、ブレッドボード上でも簡単に作ることができます。
OnBB
 ソースコードを掲載します。ただし、TrinketのスケッチをコンパイルするにはArduinoIDEを改造した専用のIDEが必要です。また、TrinketをPCが認識してスケッチを書き込むにはドライバをインストールする必要があります。さらに、マウス化に必要なライブラリをAdafruitのサイトから取得し、IDEのlibraryフォルダの下に置く必要があります。

#include <TinyWireM.h>
#include <TrinketMouse.h>

#define NUN_ADDR (0x52)
#define LED_PIN (1)

static int init_x = 0;
static int init_y = 0;

void setup()
{
uint8_t dummy = 0;

TinyWireM.begin();
TrinketMouse.begin();
pinMode(LED_PIN, OUTPUT);
TinyWireM.beginTransmission(NUN_ADDR);
TinyWireM.write((uint8_t)0x40);
TinyWireM.write((uint8_t)0x00);
TinyWireM.endTransmission();
getValue(&init_x, &init_y, &dummy);
delay(5);
getValue(&init_x, &init_y, &dummy);
}

void loop()
{
int x = 0;
int y = 0;
uint8_t button = 0;
if( getValue(&x, &y, &button) == 0 ){
TrinketMouse.move((signed char)(x-init_x)/10, -(signed char)(y-init_y)/10, 0, button);
}
else{
TrinketMouse.move(0, 0, 0, 0);
}
delay(5);
}

int getValue(int *x, int *y, uint8_t *button)
{
static uint8_t nunchuck_buf[6];
int cnt = 0;

TinyWireM.requestFrom (0x52, 6);
while (TinyWireM.available ()) {
nunchuck_buf[cnt] = nunchuk_decode_byte( TinyWireM.read() );
cnt++;
}
TinyWireM.beginTransmission(NUN_ADDR);
TinyWireM.write((uint8_t)0x00);
TinyWireM.endTransmission();
if(5<=cnt){
digitalWrite(LED_PIN,LOW);
*button = 0;
if(!(nunchuck_buf[5] & 0x01)) *button = MOUSEBTN_LEFT_MASK;
if(!(nunchuck_buf[5] & 0x02)) *button |= MOUSEBTN_RIGHT_MASK;
*x = nunchuck_buf[0];
*y = nunchuck_buf[1];
return 0;
}
else{
digitalWrite(LED_PIN,HIGH);
return -1;
}
}

static char nunchuk_decode_byte (char x)
{
x = (x ^ 0x17) + 0x17;
return x;
}

ちなみにloop関数内TrinketMouse.moveの引数でx,yの値を10で割っているのは感度調整です。