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を選択、ポートを認識しているポートに設定して「→」の書込みでコンパイル&書込みを行ってください。