Wiiのコントローラー「ヌンチャク」をPC用のマウスにしてみました。スティックでカーソル移動、Zボタンが左クリック、Cボタンが右クリックです。
ましぐれ@mashigureヌンチャクをマウスとして使ってみる。割と直線移動がしやすい。プレゼンのときに持って、ページ送りするのとかにも使えそう。 https://t.co/6LNwVW8Hcu
2017/05/07 21:35:55
回路自体は簡単で、Trinketの5V電源端子とヌンチャクの+端子、GNDと-、SDAとd、SCLとcをつなぐだけ。なので、ブレッドボード上でも簡単に作ることができます。
ソースコードを掲載します。ただし、TrinketのスケッチをコンパイルするにはArduinoIDEを改造した専用のIDEが必要です。また、TrinketをPCが認識してスケッチを書き込むにはドライバをインストールする必要があります。さらに、マウス化に必要なライブラリをAdafruitのサイトから取得し、IDEのlibraryフォルダの下に置く必要があります。
ちなみにloop関数内TrinketMouse.moveの引数でx,yの値を10で割っているのは感度調整です。#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;}