メガドラミニにプレステアケコンをつなぐアダプタを作ったよ

メガドラミニは大変すばらしいがアーケードコントローラが使えないのが玉にキズ。

コントローラの差込口はUSBだけど、付属パッドやバッファロー製など一部の対応コントローラ以外は、つないでも動かない。

そんなときこそArduino電子工作!

Pro Micro に対応コントローラのidを設定してやることで、いつものPS1用アケコンメガドラミニに接続するアダプタができました。

 

ただし、通常のJoystickライブラリではコントローラのボタンが効かないので注意。

Oh!石さんによるメガドラミニ対応の改造Joystickライブラリを使うとうまくいきます。

 

シューティングはもとより、テトリスアケコンの方が遊びやすいような気がする。(人によりけり)

 

自作キー配列をiPadで使いたいのだ

iPadのカバー型キーボードが大変気にいったワケですが、残念なことにiPad環境ではキー配列のカスタマイズができない。

親指シフトとかAZIKとか、M配列とか花配列とか、世の中いろいろ便利な配列があるんだけどそういうのはiPadでは使えない。


かくいうワタシも、病気でじゃっかん指にマヒがあり、小指と薬指が使いにくいのでオレ配列「ベム配列」を考案して、いつのまにか15年も使っています。

詳細は省きますが(そういえばどこにも詳細を書いてない!)、このベム配列を当然iPadでも使いたい。


Google日本語入力は出てないのか?ATOKにローマ字カスタマイズはないのか?自作テキストエディタでキー変換すればいいのか?

いろいろ調べていると、PCやタブレットとUSBキーボードの間に入れて好きなキー配列に変換する「かえうち」という製品を見つけました。

https://kaeuchi.jp/

 

なるほどこの手があったか!すばらしい!

でもおれはこのUltra thinをベム配列化したいワケで、このかえうちはちょっと違う。残念!


だが待てよ?かえうちがUSBでやってることを、Bluetoothでやる装置を作ればいいんでないかい?

つまりその装置は、iPadからはBTキーボードに見えて、UltrathinからはiPadに見える。

Arduinoとか、ESP32で作れるかな?そういう装置ほしい人いる?

気分は浦島太郎

またはてダを二年放置してたら、はてなブログに移行していた。はてな記法は使えるのか。

最近思い立ってiPadをAir2に更新して(3rdをずいぶん長いこと使っていたが、さすがにアプリが重くてつらくなった)、ついでにLogicoolのUltraThinキーボードを買ってみたら、たいへん気分がいい。

それでキーボードで文章打ちたくて、拙ブログの存在を思い起こした次第である。

 

つまり、なんのネタもない。

 

おいおい近況でも書きますか。

 

ところでiPadSafariでは投稿ボタンが出なかった。はてなブログアプリを使えば問題ない、といえばないけど。

 

ESP32でPSコントローラーを読むには

ESP32-devkitcというマイコン開発ボードでプレステのコントローラをファミコンで使うアダプタを作って遊んでいた。
弾を撃つと不意にポーズがかかったりして、出来はいまいちなんだが、開発メモを書いておく。

利用できるライブラリ

ぐぐるといくつか出てくる。

これはPSコントローラを認識できなかった。

そのまま使うと動かない。
ライブラリのソースコードGPSX.cの、GPIOピン番号を適切に変更する。

#define DAT_PIN 27  // CTL1 Data
#define CMD_PIN 13  // CTL2 Command
#define AT1_PIN 26  // CTL6 Attention (PAD1)
#define CLK_PIN 14  // CTL7 Clock

ここでは左の番号がESP32のGPIO、右のCTLxがPSコントローラのピン番号。

どのGPIOピンでも動くが、17〜22ピンは使ってはいけない。(内部で使っている)
また、12ピンはDATピンにはできない。DATにはプルアップ(PSピンとESP32ピンの間に10kΩの抵抗を入れ、Vcc(5V)につなぐ)が必要だが、ESP32は12ピンをプルアップするとBASICが起動してしまう!

digitalWriteを開く

digitalWriteは遅いのでポートレジスタを直接叩いてやる高速化メソッドがある。
これをESP32でやる場合、単純にポートレジスタのアドレスにand,orしてもうまくいかなかった。

fにはHIGH/LOWにあたる1/0が入るとして、

  // digitalWrite(PIN_OUT, f); // 相当のコード
  if (f) {
    GPIO.out_w1ts |= ((uint32_t)1<<PIN_OUT);
  } else {
    GPIO.out_w1tc |= ((uint32_t)1<<PIN_OUT);
  }

IO32〜39ピンなら以下のようになる。

  // digitalWrite(pin, f); // 相当のコード(PIN=32..39)
  if (f) {
    GPIO.out1_w1ts.val = ((uint32_t)1<<(pin - 32));
  } else {
    GPIO.out1_w1tc.val = ((uint32_t)1<<(pin - 32));
  }

esp32-hal-gpio.cの_digitalWriteに全部書いてある。

ファミコンコントローラ信号

GitHub - GOROman/NESBot-mini
ファミコンのコントローラー信号をソフトウェアで作るサンプルを見たのでESP32を使ってみたが、よくよく見るとここではVSyncのタイミングを得るためファミコンのCPUからNMIを取り出している。
PS,CLKピンの割り込みだけでもそこそこ動いたが、先に述べたようにゲームにならない。

結局本物のコントローラーと同じ4021のロジックで信号作るのだったら、PSコンの読み取りはArduinoで済んじゃう。
とするとESP32を用意した意味あんまりなかったが…まあここまで遊べたので良い。
また何かの役に立つ日も来るかも。

昔のマイクロソフトのゲームポートジョイスティックを復活させるためのメモ

ハードオフマイクロソフトのサイドワインダー・プレシジョン・プロのジャンク品を500円でゲットした。
箱にはゲームポートおよびUSBポート対応と書いてあったが、残念ながらUSBアダプタは欠品。
Arduinoでゲームポートを読みだして何とかできないか調べてみると、Teensyやダビンチといったマイコン(Atmega32U4)による作例はあるがArduinoの例が見あたらない。
http://www003.upp.so-net.ne.jp/BackyWorks/SWFFBP.html

だが、さらに調べてみるとマイコンを使うまでもないことがわかった。
http://www.descentbb.net/viewtopic.php?t=14791
プレシジョンプロは、USBの1〜4番ピンをゲームポートの1, 14, 10, 4につなぎ、ゲームポートの2番と7番をショートさせると、USBジョイスティックとして動作するのだ。
デバイスドライバWindows 7に内蔵されていて、接続即認識である。

USB ゲームポート
1(赤) Vcc 1
2(白) D- 14
3(緑) D+ 10
4(黒) GND 4
2-7

で、これをプレイステーション3に接続したら、PS2アーカイブギャラクシーフォースが動いた! これはすばらしい!
SEGA AGES 2500 シリーズ Vol.30 ギャラクシーフォースII~スペシャルエクステンデッドエディション~

……と思ったのもつかの間、STARTボタンが効かない。
ゲームスタートのたびに純正コントローラに切り替えるのが癪だ。
シフトボタン(9番ボタン)がセレクトボタンとして使えたので、10番ボタンがあればスタートボタンとして働くはずだ。ボタンなんか余ってるんだ!

そこで、Arduinoを使って余ってるボタンにスタートボタンを割り当てることはできないかと考えた。
ArduinoにUSBホストシールド2.0をつないでジョイスティックサンプルプログラムを動かしてみると、プレシジョンプロの出す信号がなかなか風変わりなのがわかった。

プレシジョン USBジョイスティック 備考
X軸 y1軸 0〜255
Y軸 x2軸 0〜255
Z軸(ラダー) y2軸 0〜255
レバー上ボタン x1軸 トリガー(10H), 左ボタン(20H) 右上(40H) 右下(80H)
台座上ボタン Rz軸 A(04H), B(08H), C(10H), D(20H), シフト(40H)
ハットスイッチ x1軸 上から時計回りで0〜7, ニュートラル時8
スロットル ハットスイッチ 0〜15

Windowsはともかく、こんな信号をPS3がしっかり認識するのにびっくりした。ギャラクシーフォースが偉いのか?
変換プログラムはこれから作る。