これまでファミコンやNINTENDO64のコントローラーをUSB化してきました。でも普段PCなどで利用しているコントローラーはプレイステーションのコントローラーなんです。
PCに接続するときにはこれを使っています。
ELECOMのJC-PS201USVです。このUSB変換コネクタで、自宅に幾つも転がっているPSやPS2コントローラーを何不自由なく利用することが出来ます。
しかし、Arduinoにつないでみたいという欲求には逆らえませんでした。
そこで、まずはArduinoに物理的につなぐ方法を考えてみました。普段使用しているプレイステーションコントローラーのコネクタを分解して線を取り出すのは嫌なので、コントローラーのメスコネクタを入手しようと思いました。
ネットで調べてみると、プレイステーションのマルチタップを分解してコネクタを取り出している記事を見つけたので、これを真似しようと思いハードオフへ。
買ってきました。税込み¥324。
早速、解体します。中を開けてみるとしっかりした作りになっていて、なんだかバラすのがもったいないほどです。
ふと、このマルチタップ自体をArduinoで制御すればいいんじゃないという考えが浮かんできました。出来るか出来ないか分かりませんが、とりあえずやってみましょう。
Arduinoにつなぐ線はマルチタップのケーブルの根元から引き出すことにしました。
別途用意したコードを、ケーブルが半田付けされている基板上の端子につなぎます。新たな半田付け部分がシールドなどに接触しないよう、100円ショップで購入したグルーガンで固めておきます。コードはマルチタップの蓋を少し削って引き出しました。このコードをArduinoにつなぎます。
次は、Arduino Leonardoのスケッチ作成です。うまい具合に今まで利用してきたGitHubにマルチタップのスケッチがありました。RetroJoystickAdapter_Playstation.inoです。接続するピンを4番〜に変更して(2、3番はデバック用にI2C接続の小型有機ELディスプレイをつなぎたいのです。)コンパイル。マイコンボードに書き込みます。
プレイステーションのパッド4つをマルチタップに接続して、いつものようにUbuntuのjstest-gtkで確認すると、あれ?ジョイスティックになっていません。
しばらく悩みましたが、いつもお世話になっているライブラリArduinoJoystickLibraryのwikiから解決作にたどり着けました。
LinuxではHIDに複数のデバイスがぶら下がっている場合、カーネルに教えてあげる必要があるとのことです。方法は色々あると思いますが、Ubuntuの場合/etc/default/grubファイルで
GRUB_CMDLINE_LINUX=""
↓
GRUB_CMDLINE_LINUX="usbhid.quirks=0x2341:0x8036:0x040"
と変更します。(Arduino Leonardoの場合)
Ubuntuをリブートして確認すると...、ジョイスティックが4つ現れました。
補足:最近、Ubutnuのカーネルをアップデートして古いカーネルやモジュールを削除したところ、上記の記述を行わなくても複数のコントローラーが認識されるようになりました。
ちなみに、Raspberry piで複数デバイスを有効にするには/boot/cmdline.txtにusbhid.quirks=0x2341:0x8036:0x040を追加します。
Windowsでは何もしなくてもジョイスティックが4つ現れます。
ところでこのスケッチは、十字の方向キー(アナログスティックじゃない方)が、ただのスイッチに見えます。これでも特に問題ないのですが、普段使用しているELECOMのJC-PS201USVではハットスイッチになっています。どちらが正解なのか分かりませんが、勉強を兼ねて十字キーをハットスイッチにするスケッチを書いてみました。このスケッチはいつものようにArduinoJoystickLibraryが必要です。(ライブラリのインストールはこちらを参照してください。)
PlaystationMultiPad.ino
接続ピンの番号 PS→Arduino
1 DATA → 4番ピン
2 COMMAND → 5番ピン
4 GND → GND
5 3.6V → 3.3V
6 ATTENTION → 6番ピン
7 CLOCK → 7番ピン
jstest-gtkで確認します。
どうやら動作は問題なさそうです。右アナログスティックはZ軸とX軸回転に設定したのですが、これは上記ライブラリの説明に、状況によってそれぞれ右アナログスティックのX軸とY軸になると書いてあったからです。
一通り完成したので、RetroPieでゲーム機と化したRaspberry pi 3につないで遊んでみます。二人プレイで使用してみましたが、動作・レスポンスとも問題ないようです。残念ながら四人プレイできるゲームを持っていないので、四人同時使用のレスポンスがどうなのかは不明です。
ここまで出来たのでいつものように、Arduino Pro Microに移行します。マルチタップは3.3V(実際は3.6V?)で動作するので、NINTENDO64コントローラーをUSBジョイスティックにのときと同様にKEYESTUDIOの3.3V8MHz動作のPro Micro互換機を使用します。
基盤に半田付けして、念の為リセットボタンを付けたらマルチタップのコードをつないで完成です。
早速、Ubuntuでスケッチを書き込み動作確認をすると...、またまたジョイスティックが現れません。
ここでPro MircroのベンダーIDなどがLeonardoのものと異なっていることに気づき/etc/default/grubの内容を以下のように変更。
GRUB_CMDLINE_LINUX="usbhid.quirks=0x1b4f:0x9206:0x040"
Ubuntuをリブートして確認しても...まだ現れません。
そこでRaspberry piでも試してみようと思い、ProMicroをつないで/boot/cmdline.txtをusbhid.quirks=0x1b4f:0x9206:0x040に変更し再起動して確認すると、正常に動作しました。さらに、Windowsにつないでも問題ありませんでした。なぜかUbuntuだけ認識できないのです。
とりあえずRaspberry piで動作すればいいので、この問題は無視しましょう。
※コメント投稿者のブログIDはブログ作成者のみに通知されます