#include #include #define MARGIN 30 //スティックのあそび #define ACCEMG 3 //加速度センサーのあそび #define CURWAIT 2 //カーソル移動のウエイト #define WHEEL 1 //ホイールのスピード #define WHWAIT 30 //ホイールのウエイト #define DECODE(X) ((X ^ 0x17) + 0x17) uint8_t joyX, joyY, accelX, accelY, buttonZ, buttonC; int count; uint8_t nunchuck[6]; uint8_t stick[3]; //スティックの状態 uint8_t accel[3]; //加速度センサーの状態 uint8_t button[2]; //ボタンの状態 bool useflag = true; //ヌンチャクマウスのオン・オフ void setup() { //ヌンチャク初期化 Wire.begin(); Wire.beginTransmission(0x52); Wire.write((uint8_t)0x40); Wire.write((uint8_t)0x00); Wire.endTransmission(); //マウス初期化 Mouse.begin(); //加速度センサー状態初期化 for(int i=0; i<3; i++) stick[i] = 0; for(int i=0; i<3; i++) accel[i] = 128; for(int i=0; i<2; i++) button[i] = 0; } void loop() { count = 0; Wire.requestFrom(0x52, 6); while(Wire.available()) { nunchuck[count] = DECODE(Wire.read()); count++; } if(count >= 5 && useflag) { joyX = nunchuck[0]; joyY = nunchuck[1]; accelX = nunchuck[2]; accelY = nunchuck[3]; if(nunchuck[5] & 1) buttonZ = 0; else buttonZ = 1; if(nunchuck[5] & 2) buttonC = 0; else buttonC = 1; if(nunchuck[5] & 4) accelX += 1; if(nunchuck[5] & 8) accelX += 2; if(nunchuck[5] & 16) accelY += 1; if(nunchuck[5] & 32) accelY += 2; //X方向の移動 if(accelX > (128 - ACCEMG) && accelX < (128 + ACCEMG)) accelX = 128; if(accelX != accel[0]) { accel[0] = accelX; Mouse.move((accelX - 128) / CURWAIT, 0, 0); delay(2); } //Y方向の移動 if(accelY > (128 - ACCEMG) && accelY < (128 + ACCEMG)) accelY = 128; if(accelY != accel[1]) { accel[1] = accelY; Mouse.move(0, (accelY - 128) / CURWAIT, 0); delay(2); } //ホイール上 if(joyY > (128 + MARGIN)) { Mouse.move(0, 0, WHEEL); delay(WHWAIT); } //ホイール下 if(joyY < (128 - MARGIN)) { Mouse.move(0, 0, -WHEEL); delay(WHWAIT); } //左ボタン if(buttonZ != button[0]) { if(buttonZ) Mouse.press(MOUSE_LEFT); else Mouse.release(MOUSE_LEFT); button[0] = buttonZ; } //右ボタン if(buttonC != button[1]) { if(buttonC) Mouse.press(MOUSE_RIGHT); else Mouse.release(MOUSE_RIGHT); button[1] = buttonC; } //中ボタン if(joyX > (128 + MARGIN) && stick[0] != 1) { Mouse.press(MOUSE_MIDDLE); stick[0] = 1; } else if(joyX < (128 + MARGIN) && stick[0] != 0) { Mouse.release(MOUSE_MIDDLE); stick[0] = 0; } } //一時停止 if(nunchuck[0] < (128 - MARGIN)) { useflag = !useflag; delay(500); } Wire.beginTransmission(0x52); Wire.write(0x00); Wire.endTransmission(); delay(2); }