Arduino Uno R4 MinimaでHID ~ ジョイパッド?を作ってみた

Arduino Uno R4 Minima にHIDが搭載されているそうなので、試してみました。HIDとはヒューマンインターフェースデバイスの略で、Arduino Uno R4 Minimaをマウスやキーボードとして操作できる機能です。
私はゲームをほとんどしませんが、たまにクラシックゲームをやってみると、キーボードではなくてジョイパッドだったら良いのに、と思うことがあります。
そこで、Arduino Uno R4 MinimaでHIDを用いて、ジョイパッドのテスト版を作ってみることにしました。ジョイパッドを買った方が手っ取り早いですが、自分で作ってみるのが面白いのです。さて、どうなるでしょうか。
1.基本的な仕組み
Arduino Uno R4 Minimaで、パソコンに対してキーボード出力をすることはとても簡単です。以下コードでパソコンにキー出力ができてしまいます。
#include <Keyboard.h>
void setup() {
  Keyboard.begin();
}
void loop() {
  Keyboard.print("z");
  delay(60000) ; 
}
これで、zの文字がパソコンに対して出力されます。
さて、ジョイパッドのボタンをキーボードのキーに割り当てます。今回は、以下の割り当てにします。
左⇒Jキー
右⇒Lキー
上⇒Iキー
下⇒Kキー
左アクションキー⇒Zキー
右アクションキー⇒Xキー
ゲームの方でキー割り当てができることが条件になります。意外と少ないかも。
2.ジョイパッドを作成する

ユニバーサル基盤に、左右上下ボタンとアクションボタン2つを配置します。そして、ボタンが押されたらArduino Uno R4 MinimaのGPIOに出力が行われるようにします。基本的な配線は、以下のサイト様を参考にさせて頂きました。
抵抗を1kΩ使うとありますが、手持ちがなかったので512Ωを使っています。
ジャンパー線でArduino Uno R4 Minimaに接続します。今回は、以下の構成にしました。
左⇒GPIO4
右⇒GPIO5
上⇒GPIO6
下⇒GPIO7
左アクションキー⇒GPIO2
右アクションキー⇒GPIO3
そして、5V電源とGNDを接続します。難しい配線ではないですが、老眼で私的には手こずりました。また、温度調節のハンダゴテではないため、温度不足のハンダ付けをしてしまったりしています。いや、もうハンダ付けはやめて、ブレッドボードによる配線にした方が良いですね。もう、製作が楽しくないです。もう一点、失敗がありますが、それは説明しないでおきます。
3.プログラムコード
ボタンを押したらキー出力が行われるという簡単なプログラムです。
#include <Keyboard.h>
void setup() {
  // put your setup code here, to run once:
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  Keyboard.begin();
}
static bool isHit = false ;
static bool isHit2 = false ;
static bool isHit3 = false ;
static bool isHit4 = false ;
static bool isHit5 = false ;
static bool isHit6 = false ;
void loop() {
  // put your main code here, to run repeatedly:
  bool isSwitch = digitalRead(2) ;
  bool isSwitch2 = digitalRead(3) ;
  
  bool isSwitch3 = digitalRead(4) ;
  bool isSwitch4 = digitalRead(5) ;
  bool isSwitch5 = digitalRead(6) ;
  bool isSwitch6 = digitalRead(7) ;
  // zキー
  if (isSwitch == HIGH) {
//    if (isHit == false) {
        isHit = true ;
        Keyboard.print("z");
//    }    
  } else {
    isHit = false ;
  }
  // xキー
  if (isSwitch2 == HIGH) {
//    if (isHit2 == false) {
        isHit2 = true ;
        Keyboard.print("x");
//    }    
  } else {
    isHit2 = false ;
  }
  // 左キー
  if (isSwitch3 == HIGH) {
//    if (isHit3 == false) {
        isHit3 = true ;
        Keyboard.print("j");
//    }    
  } else {
    isHit3 = false ;
  }
  // 右キー
  if (isSwitch4 == HIGH) {
//    if (isHit4 == false) {
        isHit4 = true ;
        Keyboard.print("l");
//    }    
  } else {
    isHit4 = false ;
  }
  // 上キー
  if (isSwitch5 == HIGH) {
//    if (isHit5 == false) {
        isHit5 = true ;
        Keyboard.print("i");
//    }    
  } else {
    isHit5 = false ;
  }
  // 下キー
  if (isSwitch6 == HIGH) {
//    if (isHit6 == false) {
        isHit6 = true ;
        Keyboard.print("k");
//    }    
  } else {
    isHit6 = false ;
  }
  delay(5) ; 
}
テキストエディタへ文字を出力させると、問題なく文字が表示されます。また、上記のプログラムではコメントにしている、押している間の連続出力防止ですが、相手がテキストエディタであれば必要です。
4.動作させると。。
あるWindows上で動作するゲームで試してみました。
実際に動作させると、文字を押している間の連続出力を有効にしないと反応が悪くて使えません。また、delay処理もできるだけ小さい方が反応が良くなりました。そして、ボタンの複数押しをすると、処理が詰まった感じになり、ゲームに支障が出てしまいました。
やはり、こんな簡単な処理では、ジョイパッドとして使えないようです。複数のスレッド化(できる?)とか、何等かの対処が必要なのでしょう。
5.いろいろチューニングが必要です

というわけで、HIDの操作自体はうまくいきましたが、ジョイパッドとなると、そう簡単ではないということでした。これからチューニングしてみたり、Arduino や M5Stack
単独での使用ならどうなるかなどを試していきたいと思います。

日本周遊マップ