wiiクラシックコントローラーProを改造した
前回書いたコントローラーが、ようやく完成しました。
wiiのコントローラーを改造し、PCやスイッチに対応して、さらに同時操作できるようにしたものです。今回はスティックなどにも対応しています。
基板設計
ガーバーデータとプログラムはこちらで配布しております。少し修正しました。
今回は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(); }