プロポ6kをArduinoを用いてゲームパッドにする

##はじめに
かわろぼ参加者のみなさん！前回プロポを触ったのはいつですか？
私はすっかりプロポに埃が被ってしましました。そこで、少しでもプロポの操作感を忘れないように何か用途はないかと考えたのがきっかけです。あとゲームパッド持ってなかったのでちょうどよかったです。
##概要
プロポの入力をキーボードに変換することで、数多のpcゲーを操作可能。

・プロポの入力を受信機からArduinoで読み取る
・Arduinoからキーボードの入力
   という２つの手順で行っている。

導入手順はArduinoを受信機、pcと接続しプログラムを書きこむだけ！

※うp主の環境だとarduinoで指定した文字が入力されないなどの問題が発生。
##必要なもの
・プロポ (うｐ主は6kを使用)
・受信機 
・Arduino Leonard または 互換機 Pro Micro （Unoやmicroでは動かないので注意）
・Keyboard.hというライブラリのインストール()


##接続方法
Pro Microの場合　
<font color="red">注：接続ミスると受信機がおじゃんになる場合があるので慎重に</font>
![受信機.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135191/1d7df4c7-5d8d-a208-8607-2ebb5f0531fb.png)


受信機の電源はArduinoから供給
Arduinoのアナログ端子と受信機の信号端子を接続
##プログラム
```
#include "Keyboard.h"

#define CH1_PIN A0
#define CH2_PIN A1
#define CH3_PIN A2
#define CH4_PIN A3

int CH1_value = 0;
int CH2_value = 0;
int CH3_value = 0;
int CH4_value = 0;
int threshold_plus = 1700;
int threshold_minus = 1300;

void setup() {
  pinMode(CH1_PIN, INPUT);
  pinMode(CH2_PIN, INPUT);
  pinMode(CH3_PIN, INPUT);
  pinMode(CH4_PIN, INPUT);
  
Keyboard.begin();
}

void loop() {
  
    CH1_value = pulseIn(CH1_PIN,HIGH);
    CH2_value = pulseIn(CH2_PIN,HIGH);
    CH3_value = pulseIn(CH3_PIN,HIGH);
    CH4_value = pulseIn(CH4_PIN,HIGH);
    
     if (CH1_value>threshold_plus){
        Keyboard.press("l");
        Keyboard.release("j");
     }
     else if(CH1_value<threshold_minus){
        Keyboard.press("j");
        Keyboard.release("l");
        }   
     else {
       Keyboard.release("i");
       Keyboard.release("j");
       }

     if (CH2_value>threshold_plus){
       Keyboard.press("s");
       Keyboard.release("w");
     }
    else if(CH2_value<threshold_minus){
       Keyboard.press("w");
       Keyboard.release("s");
        }   
    else {
       Keyboard.release("s");
       Keyboard.release("w");
       }

     if (CH3_value>threshold_plus){
       Keyboard.press("i");
       Keyboard.release("k");
     }
      else if(CH3_value<threshold_minus){
       Keyboard.press("k");
       Keyboard.release("i");
        }   
    else {
      Keyboard.release("i");
      Keyboard.release("k");
       }

      if (CH4_value>threshold_plus){
      Keyboard.press("a");
      Keyboard.release("d");
     }
      else if(CH4_value<threshold_minus){
      Keyboard.press("d");
      Keyboard.release("a");
     }
       
    else {
      Keyboard.release("a");
      Keyboard.release("d");
       }

  /* value check    
  Serial.print("CH1 value = ");
  Serial.println(CH1_value);
  Serial.print("CH2 value = ");
  Serial.println(CH2_value);
  Serial.print("CH3 value = ");
  Serial.println(CH3_value);
  Serial.print("CH4 value = ");
  Serial.println(CH4_value);
 */
   delay(10); 
}
```
プロポを任意の角度に倒すと受信機からのパルスが変化するため、そのパルスの値が閾値を超えたら対応するキーが入力されます。
![スライド1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135191/e20d16ba-96c7-c825-de9d-c5f5503cb2c9.png)

↑プロポとの対応表

うp主の場合、受信機から送られてくるパルスは各ch
min 1000:N 1500:max 2000くらいでした。
ここはプロポの設定によるので閾値の変更が必要かもしれません。

※環境によってはプログラムで指定した文字と実際に入力される文字が異なる場合があるので、メモ帳などで確かめてみることをお勧めします。
##besiegeでの使用方法

![be.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135191/e682af21-7a5b-3e66-1f18-24ddb83c718e.png)
ホイールのところにキーを割り当てる機能があるので、対応するように割り当てください。
##最後に
今回はプロポからキーボード入力する手法を紹介しました。
この手法以外にArduinoをゲームパッドとして認識させることもできます。下記のライブラリを参照
https://github.com/MHeironimus/ArduinoJoystickLibrary
今後もちょくちょく修正していきます
完
　
　
　
<font color="White">かわロボオンラインバトルやりたい</font>

　

##参考
https://shizenkarasuzon.hatenablog.com/entry/2018/10/19/053742
https://loochs.org/2020/07/06/arduino-micro-pro-original-keyboard/
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/