lipoyang が 2024年09月06日19時00分08秒 に編集
初版
タイトルの変更
ATARI仕様ジョイスティックをXIAO RP2040でUSB化
タグの変更
joystick
ATARI
Seeeduino
XIAO
メイン画像の変更
記事種類の変更
製作品
ライセンスの変更
(MIT) The MIT License
本文の変更
# 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で使用できるようにします。 ![](https://camo.elchika.com/6587deb0b1b27335b47e621591b615d68ae3e276/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f64366163373165322d616534612d346662312d613962632d373635313361663036393131/) 【参考】[ATARI仕様ジョイスティックに関するメモ - 滴了庵日録](https://lipoyang.hatenablog.com/entry/2024/08/30/191147) # 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 ``` 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](https://arduino-pico.readthedocs.io/en/latest/platformio.html#usb-stack) ## 注意点 2:ピン番号の指定 ピン番号の指定は 0, 1, 2... と書けば D0, D1, D2, ... を意味するのかと思いきや、それだと P0, P1, P2, ... を意味することになります。D0, D1, D2, ... と書いたほうがピン配置が分かりやすいでしょう。ピン配置は下図の通りです。([メーカーの販売ページ](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html)より) ![](https://camo.elchika.com/d18de62ffa066b9af0f03ca3a2a14756d5a0bba1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f63333836316464342d383030622d343433302d396531392d393364303661323563393564/) # 結線図 D-sub 9ピン オスコネクタの 1~4番ピン(スティック)をD0~D3に、6~7番ピン(ボタン)をD4~D5に接続します。また、5番ピンを5Vに、8番ピンと9番ピンをGNDに接続します。 ![](https://camo.elchika.com/c06b6482d39ce57b4c53bc6277fdf6e9f3ceb764/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f37383135353661612d613066322d343862612d393664332d343733306135386436396664/) # コード ```cpp #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~~ プライスレス!|