バクフーンのブログ

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

実際に同時操作を作る

始めに

言わなければならないことがあります。それは、同時操作はとても効率が悪いということです。金銭、時間、労力、全てにおいてです。

ポケモンのためにスイッチを2台買うところまではいいものの、あとはマイコンを買って実質おしまいの自動化に比べ、マイコン以外にもいろいろ買い、なおかつそこから普通のポケモン厳選が始まる同時操作は、とても効率が悪いです。

それでも同時操作したいのなら、やっていきましょう。

購入品

arduino Leonardo 2個(同時操作したいスイッチの数に応じて増やす)

4×3キーパッド作成キット: パーツ一般 秋月電子通商-電子部品・ネット通販

ブレッドボード・ジャンパーワイヤ(オス−メス) 15cm(赤) (10本入): パーツ一般 秋月電子通商-電子部品・ネット通販

ブレッドボード・ジャンパーワイヤ(オス−オス) 10cmセット: パーツ一般 秋月電子通商-電子部品・ネット通販

arduinoはLeonardoです。UnoやNanoではできません。

arduino Leonardoは諦めてaliexpressで買いましょう。支払いはもちろんペイパルで。

スイッチサイエンスさん等で配達の早さと安心を買ってもいいです。
いろいろなところで売っているので検討してください。

実際に作っていく

まずはこのサイトを参考に、arduinoIDEを導入してください。

pokemonit.com

ここまでできたのなら、あとは簡単です。

組み立てます。はんだ付けが必要なので頑張ってください。

配線します。秋月に書いてあるように、1番を5Vに、それ以外を順にLeonardoにつけます。

Leonardの親機のTXを子機のRXに接続し、親機と子機のGND同士を接続します。

プログラムを書き込むと完成です。(下のほうにプログラムを置いておきます。)

次回ははんだ付けが必要ない赤外線を試したいと思います。

追記:別のことで忙しいので、赤外線はやらないことにします。IRremoteライブラリなどを使えばできると思います。

プログラム(親機)
#include <NintendoSwitchControlLibrary.h>
//親機のプログラムです
#define x 8
#define y 7
#define z 6
#define a 5
#define b 4
#define c 3
#define d 2

void setup(){
  pinMode(x,OUTPUT);
  pinMode(y,OUTPUT);
  pinMode(z,OUTPUT);
  pinMode(a,INPUT);
  pinMode(b,INPUT);
  pinMode(c,INPUT);
  pinMode(d,INPUT);
  Serial1.begin(9600);
  digitalWrite(x,HIGH);
  digitalWrite(y,HIGH);
  digitalWrite(z,HIGH);
}
void loop(){
  int i=1;
  digitalWrite(x,LOW);
  i=digitalRead(a);
  if(i==LOW){
    Serial1.write(13);
    pushButton(Button::A);
  }
  i=digitalRead(b);
  if(i==LOW){
    Serial1.write(12);
    pushButton(Button::B);
  }
  i=digitalRead(c);
  if(i==LOW){
    Serial1.write(11);
    pushButton(Button::X);
  }
  i=digitalRead(d);
  if(i==LOW){
    Serial1.write(10);
    pushButton(Button::Y);
  }
  digitalWrite(x,HIGH);
  digitalWrite(y,LOW);
  i=digitalRead(a);
  if(i==LOW){
    Serial1.write(9);
    pushHat(Hat::UP);
  }
  i=digitalRead(b);
  if(i==LOW){
    Serial1.write(8);
    pushHat(Hat::DOWN);
  }
  i=digitalRead(c);
  if(i==LOW){
    Serial1.write(7);
    pushHat(Hat::RIGHT);
  }
  i=digitalRead(d);
  if(i==LOW){
    Serial1.write(6);
    pushHat(Hat::LEFT);
  }
  digitalWrite(y,HIGH);
  digitalWrite(z,LOW);
  i=digitalRead(a);
  if(i==LOW){
    Serial1.write(5);
    pushButton(Button::HOME);
  }
  i=digitalRead(b);
  if(i==LOW){
    Serial1.write(4);
    pushButton(Button::R);
  }
  i=digitalRead(c);
  if(i==LOW){
    Serial1.write(3);
    pushButton(Button::L);
  }
  i=digitalRead(d);
  if(i==LOW){
    Serial1.write(2);
    pushButton(Button::MINUS);
  }
  digitalWrite(z,HIGH);
}

プログラム(子機)
#include <NintendoSwitchControlLibrary.h>
//子機のプログラムです
void setup(){
  Serial1.begin(9600);
   pushButton(Button::B, 500, 5);
}
void loop(){
  while(Serial1.available()>0){
    byte Signal = (byte)Serial1.read();
    if(Signal==13){
      pushButton(Button::A);
      }else
    if(Signal==12){
      pushButton(Button::B);
      }else
    if(Signal==11){
      pushButton(Button::X);
      }else
    if(Signal==10){
      pushButton(Button::Y);
      }else
    if(Signal==9){
      pushHat(Hat::UP);
      }else
    if(Signal==8){
      pushHat(Hat::DOWN);
      }else
    if(Signal==7){
      pushHat(Hat::RIGHT);
      }else
    if(Signal==6){
      pushHat(Hat::LEFT);
      }else
    if(Signal==5){
      pushButton(Button::HOME);
      }else
    if(Signal==4){
      pushButton(Button::R);
      }else
    if(Signal==3){
      pushButton(Button::L);
      }else
    if(Signal==2){
      pushButton(Button::MINUS);
      }
  }
}