lipoyangのアイコン画像
lipoyang 2024年09月06日作成 © MIT
製作品 製作品 閲覧数 449
lipoyang 2024年09月06日作成 © MIT 製作品 製作品 閲覧数 449

ATARI仕様ジョイスティックをXIAO RP2040でUSB化

ATARI仕様ジョイスティックをXIAO RP2040でUSB化

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 ¥168,000~¥258,000 プライスレス!
1
lipoyangのアイコン画像
奈良県在住の組込み系なんでも屋。 そんなことよりハンダ付けしようぜ!
ログインしてコメントを投稿する