Arduino Leonardo(Pro Micro)を利用した旧型パッド(DB9)USB接続アダプタ(X68000Z用)

X680x0実機用ゲームパッドは、ATARI規格を基にしたもので接続はDSUB9ピンが利用されています。
対して新たに発売されたX68000ZはUSBでコントローラーを接続する仕様となり、古いゲームパッドは繋ぐことが出来なくなりました。
現行の市販USBゲームパッドの多くは繋いで使用する事が可能ですが、リブルラブルに付属していたXPD-1LRは、左右に十字キーがある特殊仕様のものでした。
今回、そのリブルラブル用ゲームパッドをArduinoを使用しX68000Zで使えるようにするための記事を記載します。

まずArduinoIDEでジョイスティックライブラリを利用可能にするため、ライブラリの登録を行います。

使用するライブラリは、以下の物でInstallation Instructionsに書かれている様にアーカイブされたライブラリファイルをダウンロードし、ArduinoIDEのスケッチメニューからライブラリをインクルード、ZIP形式のライブラリをインクルードを選択しダウンロードしたライブラリファイルを読み込ませて利用できるようにします。

ジョイスティックライブラリを利用する場合、通常は移動方向の指定はJoystick.setXAxis等で行うのですが、X68000Zの現状ファームウエアだと上手く動作しない為、代わりにJoystick.setHatSwitchを使用し方向を指示させます。

XPD-1LRは右側にも十字キーがありますが、今回はテンキーの2468を上下左右に割り当てを行う仕様とします。なので使用する場合は対応ソフトのリブルラブル、クレイジークライマー1,2のコンフィグで設定をゲームパッドとテンキーでの入力として設定します。

使用する材料としては、Arduino Leonardoをベースに小型で作られているProMicroと、ゲームパッド接続用のD-SUBコネクタ9ピン(オス)と結線用のコードとなります。

ゲームパッド接続のピン配置は、次の通りとなります。
コネクタをハンダ面から見た状態
5 4 3 2 1
9 8 7 6

それぞれのピンの割り当て
1 UP
2 DOWN
3 LEFT
4 RIGHT
5 Vcc
6 A
7 B
8 読込切替
9 GND

このゲームパッドは8番ピンのLOW/HIGHを切替する事で左右の十字キー読込を切替しています。

結線は、以下のように行います。(プログラム上は#defineで定義しています)
DSUB9 Arduino
1(UP) 5
2(DOWN) 6
3(LEFT) 7
4(RIGHT) 8
5(Vcc) Vcc
6(A) 16
7(B) 14
8(読込切替) 15
9(GND) GND

プログラムは以下の通りとなります。

// X68000 リブルラブルコントローラtoUSB
// HAT SWITCH version (X68000Z対応)
// Programmed by ichibey

#include <Joystick.h>     // ジョイスティックライブラリ
#include <Keyboard.h>     // キーボードライブラリ

// DSUB9
// 1 UP
// 2 DOWN
// 3 LEFT
// 4 RIGHT
// 5 VCC
// 6 A
// 7 B
// 8 SEL
// 9 GND

#define BTN_UP      5
#define BTN_DOWN    6
#define BTN_LEFT    7
#define BTN_RIGHT   8
#define BTN_A       16
#define BTN_B       14
#define BTN_SEL     15
#define KEY_UP      0xE8    // 8
#define KEY_DOWN    0xE2    // 2
#define KEY_LEFT    0xE4    // 4
#define KEY_RIGHT   0xE6    // 6

#define A_BTN       0
#define B_BTN       1

int btnlst[10] = { BTN_UP , BTN_DOWN , BTN_LEFT , BTN_RIGHT , BTN_A , BTN_B , BTN_SELECT , BTN_START , MODESW1 , MODESW2 };

void setup() {
  int   i;

// ポートセット
  for( i=0; i<10; i++)
    pinMode( btnlst[i] , INPUT_PULLUP );    // 入力ポート
  pinMode( BTN_SEL , OUTPUT );              // リブルラブルパッド入力切替ピン

}

// 十字入力 0はセンター(入力無し) 1-8が方向(1が↑で時計回り)
byte axis_scan(){
  byte ud,lr,rt;
  ud = ( !digitalRead( BTN_UP )      + !digitalRead( BTN_DOWN )*5 );
  lr = ( !digitalRead( BTN_RIGHT )*3 + !digitalRead( BTN_LEFT )*7 );

  rt = (((ud==1)*(lr==3))*2 + ((ud==1)*(lr==7))*8 + ((ud==5)*(lr==3))*4 + ((ud==5)*(lr==7))*6)*((ud!=0)*(lr!=0)) + (!((ud!=0)*(lr!=0))*(ud+lr));
  return( rt );
}


// リブルラブルパッド 左十字はジョイスティック、右十字はテンキー
void librabpad(){
  Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_GAMEPAD,
    10, 1,                 // Button Count, Hat Switch Count
    false, false, false,   // X and Y, but no Z Axis
    false, false, false,   // No Rx, Ry, or Rz
    false, false,          // No rudder or throttle
    false, false, false);  // No accelerator, brake, or steering

  short int axistable[9] = { -1 , 0 , 45 , 90 , 135 , 180 , 225 , 270 , 315 };                                // hat switch table
  short int axiskbtable[] = { KEY_UP   ,   0 , KEY_UP   , KEY_RIGHT , KEY_RIGHT , 0 , KEY_RIGHT , KEY_DOWN ,  // 10key table
                              KEY_DOWN ,   0 , KEY_DOWN , KEY_LEFT  , KEY_LEFT  , 0 , KEY_LEFT  , KEY_UP   };

  byte axis,buff = 0;

  Keyboard.begin();
  Joystick.begin();

  while( 1 ){
    Joystick.setButton( A_BTN , !digitalRead( BTN_A ) );
    Joystick.setButton( B_BTN , !digitalRead( BTN_B ) );

    digitalWrite( BTN_SEL , LOW );                                        // 左十字
    axis = axis_scan();
    Joystick.setHatSwitch( 0 , axistable[ axis ] );

    digitalWrite( BTN_SEL , HIGH );                                       // 右十字
    axis = axis_scan();

    if ( buff != axis ){                                                  // 入力に変化有り
      Keyboard.releaseAll();
      Keyboard.press( axiskbtable[ ((axis-1)*2) ]);                       // 上下左右
      if ( axis%2 == 0 ) Keyboard.press( axiskbtable[ ((axis-1)*2)+1 ]);  // 斜め
    }
    buff = axis;

    delay(10);
  }
 }

void loop(){
    librabpad();
}

ArduinoIDEで新規スケッチを選択してプログラムをコピペしてProMicro接続後にツールのボードでArduino Leonardoを選択、ポートを認識しているポートに設定して「→」の書込みでコンパイル&書込みを行ってください。

いいなと思ったら応援しよう!