ATARI仕様ジョイスティックとは?
ATARI仕様ジョイスティックとは、ATARI2600用ジョイスティックと互換性のあるジョイスティックの通称であり、1980年代前後のパソコンやゲーム機で多く採用されました。ただし、ピン配置は亜種があり、特に日本ではPC-6001で採用された2ボタンの仕様が、MSXをはじめ FM-7, FM77AV, FM TOWNS, MZ-2500, X68000, PC-8801mkIISR, PC-9800シリーズでも採用されたので、日本でATARI仕様というとこの仕様をさすことも多いようです。(ただし、国産でもX1やメガドライブはまた微妙に異なります。)
コネクタにはD-sub 9ピンが用いられ、パソコンやゲーム機側がオス、コントローラ側がメスです。ピン番号はメスの穴をのぞいたときに右上が1番です。スティックが倒されたりボタンが押されたりすると、対応する端子がCommon端子と導通するという単純な仕組みです。ただし、連射機能のための電子回路を備えたジョイスティックも存在します。
ピン番号 | 日本式(MSX等) | ATARI2600 |
---|---|---|
1 | Up | Up |
2 | Down | Down |
3 | Left | Left |
4 | Right | Right |
5 | VCC(+5V) | Paddle B |
6 | Button 1 | Trigger |
7 | Button 2 | VCC(+5V) |
8 | Common | GND |
9 | GND | Paddle A |
今回は、ATARI仕様ジョイスティックをUSBのHID準拠ゲームコントローラにするアダプタを製作し、マイコンソフト(電波新聞社)のATARI仕様ジョイスティック XE-1PRO (下図) をWindowsで使用できるようにします。
【参考】ATARI仕様ジョイスティックに関するメモ - 滴了庵日録
HID準拠ゲームコントローラへの割り当て
ATARI仕様のジョイスティックのスティックとボタン1, 2を HID準拠ゲームコントローラのPOVとボタン1, 2に割り当てることにします。
ATARI仕様ジョイスティック | HID準拠ゲームコントローラ |
---|---|
Up | POV↑ |
Down | POV↓ |
Left | POV← |
Right | POV→ |
Button 1 | Button 1 |
Button 2 | Button 2 |
使用するマイコンと開発環境
- マイコンボード : Seeed Studio XIAO RP2040
- 開発環境 : Platform I/O
- フレームワーク : Arduino
- 依存ライブラリ : Adafruit TinyUSB Library
platformio.ini
[env:seeed_xiao_rp2040]
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
board = seeed_xiao_rp2040
board_build.core = earlephilhower
board_build.filesystem_size = 0.5m
build_flags = -DUSE_TINYUSB
framework = arduino
; lib_deps = adafruit/Adafruit TinyUSB Library@^3.3.3
注意点 1:Adafruit TinyUSB Libraryの使用
platformio.ini にてAdafruit TinyUSB Library を依存ライブラリとして指定しているにもかかわらず、Adafruit_TinyUSB.h をインクルードするとfatal error: Adafruit_TinyUSB.h: No such file or directory
というビルドエラーが発生します。対策として、lib_deps =
でAdafruit TinyUSB Library を指定するのではなく、build_flags = -DUSE_TINYUSB
を指定します。
【参考】Using this core with PlatformIO — Arduino-Pico 4.0.1 documentation
注意点 2:ピン番号の指定
ピン番号の指定は 0, 1, 2... と書けば D0, D1, D2, ... を意味するのかと思いきや、それだと P0, P1, P2, ... を意味することになります。D0, D1, D2, ... と書いたほうがピン配置が分かりやすいでしょう。ピン配置は下図の通りです。(メーカーの販売ページより)
結線図
D-sub 9ピン オスコネクタの 1~4番ピン(スティック)をD0~D3に、6~7番ピン(ボタン)をD4~D5に接続します。また、5番ピンを5Vに、8番ピンと9番ピンをGNDに接続します。
コード
#include <Adafruit_TinyUSB.h>
#define PIN_UP D0
#define PIN_DOWN D1
#define PIN_LEFT D2
#define PIN_RIGHT D3
#define PIN_BUTTON_A D4
#define PIN_BUTTON_B D5
uint8_t const desc_hid_report[] =
{
TUD_HID_REPORT_DESC_GAMEPAD()
};
Adafruit_USBD_HID usb_hid(desc_hid_report, sizeof(desc_hid_report), HID_ITF_PROTOCOL_NONE, 2, false);
hid_gamepad_report_t gp;
void setup()
{
TinyUSB_Device_Init(0);
usb_hid.begin();
while( !TinyUSBDevice.mounted() ) delay(1);
pinMode(PIN_UP, INPUT_PULLUP);
pinMode(PIN_DOWN, INPUT_PULLUP);
pinMode(PIN_LEFT, INPUT_PULLUP);
pinMode(PIN_RIGHT, INPUT_PULLUP);
pinMode(PIN_BUTTON_A, INPUT_PULLUP);
pinMode(PIN_BUTTON_B, INPUT_PULLUP);
if ( !usb_hid.ready() ) return;
gp.x = 0;
gp.y = 0;
gp.z = 0;
gp.rz = 0;
gp.rx = 0;
gp.ry = 0;
gp.hat = 0;
gp.buttons = 0;
usb_hid.sendReport(0, &gp, sizeof(gp));
}
void loop()
{
bool a = (digitalRead(PIN_BUTTON_A) == LOW) ? true : false;
bool b = (digitalRead(PIN_BUTTON_B) == LOW) ? true : false;
gp.buttons = (a ? GAMEPAD_BUTTON_A : 0) |
(b ? GAMEPAD_BUTTON_B : 0);
bool u = (digitalRead(PIN_UP) == LOW) ? true : false;
bool d = (digitalRead(PIN_DOWN) == LOW) ? true : false;
bool l = (digitalRead(PIN_LEFT) == LOW) ? true : false;
bool r = (digitalRead(PIN_RIGHT) == LOW) ? true : false;
if(u){
if (l) gp.hat = GAMEPAD_HAT_UP_LEFT;
else if(r) gp.hat = GAMEPAD_HAT_UP_RIGHT;
else gp.hat = GAMEPAD_HAT_UP;
}
else if(d)
{
if (l) gp.hat = GAMEPAD_HAT_DOWN_LEFT;
else if(r) gp.hat = GAMEPAD_HAT_DOWN_RIGHT;
else gp.hat = GAMEPAD_HAT_DOWN;
}
else{
if (l) gp.hat = GAMEPAD_HAT_LEFT;
else if(r) gp.hat = GAMEPAD_HAT_RIGHT;
else gp.hat = GAMEPAD_HAT_CENTERED;
}
usb_hid.sendReport(0, &gp, sizeof(gp));
}
Windowsで動作確認
「コントロールパネル」→「デバイスとプリンター」でゲームコントローラ「XIAO RP2040」を選択し、右クリックで「ゲームコントローラの設定」→「プロパティ」の「テスト」タブで動作を確認する。
ちなみに
Seeed Studio XIAO RP2040 (2021年) | PC-8801 mkIISR (1985年) | |
---|---|---|
CPU | 32ビット (Arm Cortex-M0+) デュアルコア | 8ビット (Z80A互換) メイン/サブ |
クロック | 133MHz | 4MHz |
RAM | 264kB | 64kB + 48kB + 4kB + 16kB |
ROM | 2MB | 64kB + 32kB +8kB |
価格 | ¥1,172 |
-
lipoyang
さんが
2024/09/06
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する