Arduinoでジョイスティックを作ってみる

Arduinoを使用して自分だけのジョイスティックを作成する。
何番煎じかはわからないが，自分なりにまとめる 

# 環境
* Arduino Pro micro
* Mac版　Arduino IDE 1.8.9


# 1.Arduino Pro micro について
今回使用するArduino Pro microはATmega32u4チップを搭載したもので、USB deviceとして使うこともできるArduinoである。
ATmega32u4チップを搭載したArduinoには他にもArduino Leonald , Arduino Microがある。  
今回はArduino Pro microを使用する

価格は秋月電子で3000円ほど。互換機など安い物も多く存在している



|Arduino Pro micro| Arduino Leonald       |  Arduino Micro  |
|:-----------------|:-----------------|:------------------|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482400/abc5ee4e-2974-b7f8-9a69-ea94d4dcc4ba.jpeg" > |<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482400/96b99890-f4fa-dfc1-47eb-668e6aac2125.jpeg" width=90%>　|  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482400/df58dae1-c14a-b29e-1590-81c494360579.jpeg" width=90%> |
|https://www.switch-science.com/products/3914|https://akizukidenshi.com/catalog/g/gM-07384/|https://akizukidenshi.com/catalog/g/gM-08286/  |



# 2.ArduinoIDEの下準備  
### Joystickのライブラリを入れる  
下記のGitからzip ファイルをDLしてArduinoIDEに読み込ませる  

https://github.com/MHeironimus/ArduinoJoystickLibrary  


# 3.配線

### 使用する部品
|スイッチ|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482400/25522082-e89c-d345-c180-cd485ce11320.jpeg" width=50%>  |
|:-----------------:|:-----------------:|
|ボリューム   |<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482400/6b87abb7-d4c0-7429-e731-c826a674e98b.jpeg" width=40%>|


### 回路図  
部品とArduino Pro microをつなぐ  
スイッチをD7  
アナログをA0に接続

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482400/0ad249c0-37dd-7403-c970-9eb4ad73ca18.png" width=90%>

# 4.ジョイスティックとして認識させる  

### コードの実装

ライブラリの追加とピンの定義
```
#include <Joystick.h>

#define SW_PIN 7
#define ANALOG_PIN_1 A0
```

Joystickの有効無効を切り替える構造体
今回はスイッチ１個　ボリューム１個なので
```
Joystick_ Joystick(//有効無効を切り替える
  0x03, //hid report id
  JOYSTICK_TYPE_GAMEPAD, //joystick type
  1, //button count   <- 使用するスイッチの数
  0, //Hsw 0-2
  true, //x   <- ボリュームを使用するためここをtrue
  false, //y
  false, //z
  false, //rx
  false, //ry
  false, //rz
  false, //rudder
  false, //throttle
  false, //accelerator
  false, //brake
  false//steeing;
);

```
setup内ではGPIOピンとJoystickライブラリの初期設定  
GPIOスイッチはプルアップさせる  

```
void setup() {
  pinMode(SW_PIN, INPUT_PULLUP); //ピンの設定
  pinMode(A0, INPUT); //ピンの設定
  Joystick.begin();//Joystickライブラリを使用するため必須
  Joystick.setXAxisRange(0,1023);//あたいの入れる範囲を設定。
}
```
loop関数内では、analogRead,digitalReadで読み取った値をJoystickにセットする
```
void loop() {
    Joystick.setXAxis(analogRead(ANALOG_PIN_1)); //ボリュームの値を読み取りセット
    Joystick.setButton(0, digitalRead(SW_PIN)); //スイッチの値を読み取りセット
}
```

### Windowsで認識するか確認

Arduino に書き込んでWindowsにさしJoystickとして認識することを確認する 

コントロール パネル\ハードウェアとサウンド\デバイスとプリンターからArduino Leonald名のデバイスを確認  
ゲームコントローラの設定

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482400/456a6452-3111-c35e-0e02-c1f6a3c123ea.png" width=40%>  

ボリュームを回すとx軸の+が左右に動作する  
スイッチを押すとボタン1が点灯するのを確認できる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482400/9ac50d28-a10f-9ec4-2e6b-011dc65b431e.png" width=90%>

# 5.まとめ  
1個のボリュームとスイッチをJoystickとしてPCに取り込むことができた。  
複数増やすことにより多くの操作をシミュレータに取り込むことができるだろう

# 参考サイト
Arduino を複数使用する場合フライトシミュレータから見ると同じデバイスが複数あるように見えるため、設定が変更される可能性がある
名前の変更やIDを変更して対応すると設定が変わることが減る。
https://kohacraft.com/archives/1072655339.html

https://programresource.net/2020/03/02/3060.html