バクフーンのブログ

スイッチの同時操作を楽しもう

wiiクラシックコントローラーProを改造した

前回書いたコントローラーが、ようやく完成しました。

wiiのコントローラーを改造し、PCやスイッチに対応して、さらに同時操作できるようにしたものです。今回はスティックなどにも対応しています。

基板設計

ガーバーデータとプログラムはこちらで配布しております。少し修正しました。

typhlosionchang.booth.pm

今回はkicadを使いました。初めてCADソフトを使ったのですが、偉大なるインターネットに助けられて完成しました。

コントローラー内に収めようと作ったのでいろいろ不都合がありますが、外付けで使う分には申し分ないと思います。

基盤を発注する前に気づけたらよかったのですが、穴の大きさや位置が少し間違っていました。ただ、回路のほうは間違っていなかったので、基盤としては機能してくれます。BOOTHで配布しているデータは少し修正していますが、ミスがない保証はありません。

ちなみにJLCPCBさんに発注しました。もう少し薄く発注すればよかったです。

完成品

こちらが完成品になります。

中の配線を撮るのを忘れていました。結構ギチギチだから開けたくないので想像にお任せします。

ココ


の部分がGNDとTXになっているので、今までの同時操作が使えるようになっています。

連打したいボタンを押しながらココのスイッチをオンにすると、連打ができるようになります。
例)Aボタンを押しながらココのスイッチをオンにすると、オフにするまで連打します。

親機(コントローラー側)のプログラム

 

#include <NintendoSwitchControlLibrary.h>
char l, e;
int leftX, leftY, rightX, rightY;
int i,j;
int sa = 0;//Aが押されているかどうかの判定
int sb = 0;//B
int sx = 0;//X
int sy = 0;//Y
int su = 0;//up
int sd = 0;//down
int sri = 0;//right
int sle = 0;//left
int sp = 0;//plus
int sm = 0;//minus
int sh = 0;//home
int sc = 0;//capture
int sl = 0;//L
int sr = 0;//R
int szl = 0;//ZL
int szr = 0;//ZR
int slc = 0;//LC
int src = 0;//RC
void setup() {
  for (leftX = 0; leftX < 11; leftX++) {
    if (leftX == 1) {
      continue;
    }
    pinMode(leftX, INPUT);
  }
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(A3, INPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  l = 'N';
  e = 'F';
  leftX = 128;
  leftY = 128;
  rightX = 128;
  rightY = 128;
  Serial1.begin(115200);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
}

void macro1(){
  pushButton(Button::A);
}

void macro2(){
  pushButton(Button::A);
}


void cont1(int data) {
  if (data  == 0)
    SwitchControlLibrary().pressButton(Button::A);
  else if (data  == 1)
    SwitchControlLibrary().pressButton(Button::B);
  else if (data  == 2)
    SwitchControlLibrary().pressButton(Button::X);
  else if (data  == 3)
    SwitchControlLibrary().pressButton(Button::Y);
  else if (data  == 4)
    SwitchControlLibrary().pressButton(Button::L);
  else if (data  == 5)
    SwitchControlLibrary().pressButton(Button::R);
  else if (data  == 6)
    SwitchControlLibrary().pressButton(Button::ZL);
  else if (data  == 7)
    SwitchControlLibrary().pressButton(Button::ZR);
  else if (data  == 8)
    SwitchControlLibrary().pressButton(Button::MINUS);
  else if (data  == 9)
    SwitchControlLibrary().pressButton(Button::PLUS);
  else if (data  == 10)
    SwitchControlLibrary().pressButton(Button::LCLICK);
  else if (data  == 11)
    SwitchControlLibrary().pressButton(Button::RCLICK);
  else if (data  == 12)
    SwitchControlLibrary().pressHatButton(Hat::UP);
  else if (data  == 13)
    SwitchControlLibrary().pressHatButton(Hat::DOWN);
  else if (data  == 14)
    SwitchControlLibrary().pressHatButton(Hat::LEFT);
  else if (data  == 15)
    SwitchControlLibrary().pressHatButton(Hat::RIGHT);
  else if (data  == 16)
    SwitchControlLibrary().pressButton(Button::HOME);
  else if (data  == 17)
    SwitchControlLibrary().pressButton(Button::CAPTURE);
}
void cont2(int data) {
  if (data  == 0) 
    SwitchControlLibrary().releaseButton(Button::A);
  else if (data  == 1) 
    SwitchControlLibrary().releaseButton(Button::B);
  else if (data  == 2) 
    SwitchControlLibrary().releaseButton(Button::X);
  else if (data  == 3) 
    SwitchControlLibrary().releaseButton(Button::Y);
  else if (data  == 4) 
    SwitchControlLibrary().releaseButton(Button::L);
  else if (data  == 5) 
    SwitchControlLibrary().releaseButton(Button::R);
  else if (data  == 6) 
    SwitchControlLibrary().releaseButton(Button::ZL);
  else if (data  == 7) 
    SwitchControlLibrary().releaseButton(Button::ZR);
  else if (data  == 8) 
    SwitchControlLibrary().releaseButton(Button::MINUS);
  else if (data  == 9) 
    SwitchControlLibrary().releaseButton(Button::PLUS);
  else if (data  == 10) 
    SwitchControlLibrary().releaseButton(Button::LCLICK);
  else if (data  == 11) 
    SwitchControlLibrary().releaseButton(Button::RCLICK);
  else if (data  == 12) 
    SwitchControlLibrary().releaseHatButton();
  else if (data  == 13) 
    SwitchControlLibrary().releaseHatButton();
  else if (data  == 14) 
    SwitchControlLibrary().releaseHatButton();
  else if (data  == 15) 
    SwitchControlLibrary().releaseHatButton();
  else if (data  == 16) 
    SwitchControlLibrary().releaseButton(Button::HOME);
  else if (data  == 17) 
    SwitchControlLibrary().releaseButton(Button::CAPTURE);
}

void cont3(int data) {
  if (data  == 18) {
    SwitchControlLibrary().moveLeftStick(leftX, leftY);
  }
  else if (data  == 19) {
    SwitchControlLibrary().moveLeftStick(leftX, leftY);
  }
  else if (data  == 20) {
    SwitchControlLibrary().moveRightStick(rightX, rightY);
  }
  else if (data  == 21) {
    SwitchControlLibrary().moveRightStick(rightX, rightY);
  }
}

void contp(int c) {
  Serial1.write(l);//プッシュ
  Serial1.write(c);
  Serial1.write(1);
  Serial1.write(e);
  cont1(c);
}

void contr(int c) {
  Serial1.write(l);//リリース
  Serial1.write(c);
  Serial1.write(0);
  Serial1.write(e);
  cont2(c);
}

void conts(int c, int d) {
  Serial1.write(l);//スティック
  Serial1.write(c);
  Serial1.write(d);
  Serial1.write(e);
  cont3(c);
}

void renda(){
  while(1){
    i=digitalRead(A1);
    if(i==HIGH){
      break;
    }
    if(sa==1){
      contp(0);
      contr(0);
    }else if(sb==1){
      contp(1);
      contr(1);
    }else if(sx==1){
      contp(2);
      contr(2);
    }else if(sy==1){
      contp(3);
      contr(3);
    }else if(sl==1){
      contp(4);
      contr(4);
    }else if(sr==1){
      contp(5);
      contr(5);
    }else if(szl==1){
      contp(6);
      contr(6);
    }else if(szr==1){
      contp(7);
      contr(7);
    }else if(sm==1){
      contp(8);
      contr(8);
    }else if(sp==1){
      contp(9);
      contr(9);
    }else if(slc==1){
      contp(10);
      contr(10);
    }else if(src==1){
      contp(11);
      contr(11);
    }else if(su==1){
      contp(12);
      contr(12);
    }else if(sd==1){
      contp(13);
      contr(13);
    }else if(sri==1){
      contp(14);
      contr(14);
    }else if(sle==1){
      contp(15);
      contr(15);
    }else if(sh==1){
      contp(16);
      contr(16);
    }else if(sc==1){
      contp(17);
      contr(17);
    }
  }
}

void loop() {
  digitalWrite(8, LOW);
  i = digitalRead(7);
  if (i == LOW) {
    j = 0; //Aボタン
    contp(j);
    sa = 1;
  } else if (i == HIGH && sa == 1) {
    j = 0;
    contr(j);
    sa = 0;
  }
  i = digitalRead(6);
  if (i == LOW) {
    j = 1; //Bボタン
    contp(j);
    sb = 1;
  } else if (i == HIGH && sb == 1) {
    j = 1;
    contr(j);
    sb = 0;
  }
  i = digitalRead(5);
  if (i == LOW) {
    j = 2; //Xボタン
    contp(j);
    sx = 1;
  } else if (i == HIGH && sx == 1) {
    j = 2;
    contr(j);
    sx = 0;
  }
  i = digitalRead(4);
  if (i == LOW) {
    j = 3; //Yボタン
    contp(j);
    sy = 1;
  }
  if (i == HIGH && sy == 1) {
    j = 3;
    contr(j);
    sy = 0;
  }
  i = digitalRead(3);
  if (i == LOW) {
    j = 4; //Lボタン
    contp(j);
    sl = 1;
  } else if (i == HIGH && sl == 1) {
    j = 4;
    contr(j);
    sl = 0;
  }
  i = digitalRead(2);
  if (i == LOW) {
    j = 5; //Rボタン
    contp(j);
    sr = 1;
  } else if (i == HIGH && sr == 1) {
    j = 5;
    contr(j);
    sr = 0;
  }
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  i = digitalRead(7);
  if (i == LOW) {
    j = 6; //ZLボタン
    contp(j);
    szl = 1;
  }
  if (i == HIGH && szr == 1) {
    j = 6;
    contr(j);
    szl = 0;
  }
  i = digitalRead(6);
  if (i == LOW) {
    j = 7; //ZRボタン
    contp(j);
    szr = 1;
  } else if (i == HIGH && szr == 1) {
    j = 7;
    contr(j);
    szr = 0;
  }
  i = digitalRead(5);
  if (i == LOW) {
    j = 8; //マイナスボタン
    contp(j);
    sm = 1;
  } else if (i == HIGH && sm == 1) {
    j = 8;
    contr(j);
    sm = 0;
  }
  i = digitalRead(4);
  if (i == LOW) {
    j = 9; //プラスボタン
    contp(j);
    sp = 1;
  } else if (i == HIGH && sp == 1) {
    j = 9;
    contr(j);
    sp = 0;
  }
  i = digitalRead(3);
  if (i == LOW) {
    j = 10; //Lスティックボタン
    contp(j);
    slc = 1;
  } else if (i == HIGH && slc == 1) {
    j = 10;
    contr(j);
    slc = 0;
  }
  i = digitalRead(2);
  if (i == LOW) {
    j = 11; //Rスティックボタン
    contp(j);
    sr = 1;
  } else if (i == HIGH && sr == 1) {
    j = 11;
    contr(j);
    sr = 0;
  }
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  i = digitalRead(7);
  if (i == LOW) {
    j = 12; //上ボタン
    contp(j);
    su = 1;
  } else if (i == HIGH && su == 1) {
    j = 12;
    contr(j);
    su = 0;
  }
  i = digitalRead(6);
  if (i == LOW) {
    j = 13; //下ボタン
    contp(j);
    sd = 1;
  } else if (i == HIGH && sd == 1) {
    j = 13;
    contr(j);
    sd = 0;
  }
  i = digitalRead(5);
  if (i == LOW) {
    j = 14; //左ボタン
    contp(j);
    sle = 1;
  } else if (i == HIGH && sle == 1) {
    j = 14;
    contr(j);
    sle = 0;
  }
  i = digitalRead(4);
  if (i == LOW) {
    j = 15; //右ボタン
    contp(j);
    sri = 1;
  } else if (i == HIGH && sri == 1) {
    j = 15;
    contr(j);
    sri = 0;
  }
  i = digitalRead(3);
  if (i == LOW) {
    j = 16; //ホームボタン
    contp(j);
    sh = 1;
  } else if (i == HIGH && sh == 1) {
    j = 16;
    contr(j);
    sh = 0;
  }
  i = digitalRead(2);
  if (i == LOW) {
    j = 17; //キャプチャボタン
    contp(j);
    sc = 1;
  } else if (i == HIGH && sc == 1) {
    j = 17;
    contr(j);
    sc = 0;
  }
  digitalWrite(10, HIGH);
  i=1;//digitalRead(0);
  leftX = analogRead(A2);
  if (leftX > 600 || leftX < 450) {
    j = 18; //LeftX
    leftX /= 4;
    conts(j, leftX);
  } else if (leftX < 600 && leftX > 450) {
    j = 18;
    leftX = 128;
    conts(j, leftX);
  }
  leftY = analogRead(A3);
  if (leftY > 600 || leftY < 450) {
    j = 19; //LeftY
    leftY /= 4;
    conts(j, leftY);
  } else if (leftY < 600 && leftY > 450) {
    j = 19;
    leftY = 128;
    conts(j, leftY);
  }
  rightX = analogRead(A4);
  if (rightX > 600 || rightX < 450) {
    j = 20; //RightX
    rightX/=4;
    if(i==LOW){
      j=201;
    }
    conts(j, rightX);
  } else if (rightX < 600 && rightX > 450) {
    j = 20; //RightX
    rightX = 128;
    conts(j, rightX);
  }
  rightY = analogRead(A5);
  if (rightY > 600 || rightY < 450) {
    j = 21; //rightY
    rightY/=4;
    if(i==LOW){
      j=211;
    }
    conts(j, rightY);
  } else if (rightY < 600 && rightY > 450) {
    j = 21; //rightY
    rightY = 128;
    conts(j, rightY);
  }
//  i=digitalRead(3);
//  if(i==LOW){
//    SwitchControlLibrary().sendReport();
//    macro1();
//  }
//  i=digitalRead(2);
//  if(i==LOW){
//    SwitchControlLibrary().sendReport();
//    macro2();
//  }
  i=digitalRead(0);
  if(i==LOW){
    SwitchControlLibrary().sendReport();
    renda();
  }
  SwitchControlLibrary().sendReport();
}

子機のプログラム
#include <NintendoSwitchControlLibrary.h>

const int x = 4;
int i;
byte b [x];
int leftX;
int leftY;
int rightX;
int rightY;

void setup() {

  Serial1.begin(115200);
  i = 0;
  leftX = 128;
  leftY = 128;
  rightX = 128;
  rightY = 128;
  pushButton(Button::B, 500, 4);
}

void cont(byte data[x]) {

  if (data[0] == 0) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::A);
    else SwitchControlLibrary().releaseButton(Button::A);
  }
  else if (data[0] == 1) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::B);
    else SwitchControlLibrary().releaseButton(Button::B);
  }
  else if (data[0] == 2) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::X);
    else SwitchControlLibrary().releaseButton(Button::X);
  }
  else if (data[0] == 3) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::Y);
    else SwitchControlLibrary().releaseButton(Button::Y);
  }
  else if (data[0] == 4) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::L);
    else SwitchControlLibrary().releaseButton(Button::L);
  }
  else if (data[0] == 5) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::R);
    else SwitchControlLibrary().releaseButton(Button::R);
  }
  else if (data[0] == 6) {
    if (data[1] == 1)  SwitchControlLibrary().pressButton(Button::ZL);
    else SwitchControlLibrary().releaseButton(Button::ZL);
  }
  else if (data[0] == 7) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::ZR);
    else SwitchControlLibrary().releaseButton(Button::ZR);
  }
  else if (data[0] == 8) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::MINUS);
    else SwitchControlLibrary().releaseButton(Button::MINUS);
  }
  else if (data[0] == 9) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::PLUS);
    else SwitchControlLibrary().releaseButton(Button::PLUS);
  }
  else if (data[0] == 10) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::LCLICK);
    else SwitchControlLibrary().releaseButton(Button::LCLICK);
  }
  else if (data[0] == 11) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::RCLICK);
    else SwitchControlLibrary().releaseButton(Button::RCLICK);
  }
  else if (data[0] == 12) {
    if (data[1] == 1) SwitchControlLibrary().pressHatButton(Hat::UP);
    else SwitchControlLibrary().releaseHatButton();
  }
  else if (data[0] == 13) {
    if (data[1] == 1) SwitchControlLibrary().pressHatButton(Hat::DOWN);
    else SwitchControlLibrary().releaseHatButton();
  }
  else if (data[0] == 14) {
    if (data[1] == 1) SwitchControlLibrary().pressHatButton(Hat::LEFT);
    else SwitchControlLibrary().releaseHatButton();
  }
  else if (data[0] == 15) {
    if (data[1] == 1) SwitchControlLibrary().pressHatButton(Hat::RIGHT);
    else SwitchControlLibrary().releaseHatButton();
  }
  else if (data[0] == 16) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::HOME);
    else SwitchControlLibrary().releaseButton(Button::HOME);
  }
  else if (data[0] == 17) {
    if (data[1] == 1) SwitchControlLibrary().pressButton(Button::CAPTURE);
    else SwitchControlLibrary().releaseButton(Button::CAPTURE);
  }
  else if (data[0] == 18) {
    leftX = data[1];
    SwitchControlLibrary().moveLeftStick(leftX, leftY);
  }
  else if (data[0] == 19) {
    leftY = data[1];
    SwitchControlLibrary().moveLeftStick(leftX, leftY);
  }
  else if (data[0] == 20) {
    rightX = data[1];
    SwitchControlLibrary().moveRightStick(rightX, rightY);
  }
  else if (data[0] == 21) {
    rightY = data[1];
    SwitchControlLibrary().moveRightStick(rightX, rightY);
  }
}


void loop() {
  while (Serial1.available()) {
    int c = Serial1.read();

    if ((char)c == 'N') i = 0;

    else if ((char)c == 'F') {
      cont(b);
    }

    else {
      b[i] = c;
      i++;
    }
  }
  SwitchControlLibrary().sendReport();
}