1
0

More than 3 years have passed since last update.

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

Posted at

はじめに

かわろぼ参加者のみなさん!前回プロポを触ったのはいつですか?
私はすっかりプロポに埃が被ってしましました。そこで、少しでもプロポの操作感を忘れないように何か用途はないかと考えたのがきっかけです。あとゲームパッド持ってなかったのでちょうどよかったです。

概要

プロポの入力をキーボードに変換することで、数多のpcゲーを操作可能。

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

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

※うp主の環境だとarduinoで指定した文字が入力されないなどの問題が発生。

必要なもの

・プロポ (うp主は6kを使用)
・受信機
・Arduino Leonard または 互換機 Pro Micro (Unoやmicroでは動かないので注意)
・Keyboard.hというライブラリのインストール()

接続方法

Pro Microの場合 
注:接続ミスると受信機がおじゃんになる場合があるので慎重に
受信機.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

↑プロポとの対応表

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

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

besiegeでの使用方法

be.png
ホイールのところにキーを割り当てる機能があるので、対応するように割り当てください。

最後に

今回はプロポからキーボード入力する手法を紹介しました。
この手法以外にArduinoをゲームパッドとして認識させることもできます。下記のライブラリを参照
https://github.com/MHeironimus/ArduinoJoystickLibrary
今後もちょくちょく修正していきます

 
 
 
かわロボオンラインバトルやりたい

 

参考

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/

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0