PlayStationのコントローラー→USB変換アダプタ(usbjoy)


はじめに

PlayStationのコントローラー(デュアルショック)をパソコンで使いたいと思い,AVR-USBを利用してパソコンのUSBに接続する変換アダプタを作成しました.
この手の変換アダプタとして有名なものにDirect Pad Proがありますが,専用のデバイスドライバを必要とするため,例えば64bit版のWindowsなどドライバが用意されていないOSでは利用することができません.
今回は,USBのHIDデバイスとして動作する変換アダプタを作ることにしました.USBのHIDデバイスは多くのOSで標準的にサポートされているので,WindowsだけではなくMacやLinuxでも特別なドライバを必要とせずに利用できるようです.
作成したアダプタは4軸16ボタンのジョイスティックとして認識されます.Force Feedbackには対応していません.

製作

このような変換アダプタは,Web上にいくつかの作例があります.
PS2USBというものを見つけたので当初はこれを製作しましたが,うまく動作しませんでした.USB機器としてOSに認識されませんでした.
仕方が無いので,ハードウェアは変更しないでusbjoyのファームウェアを使うようにしてみました.
今度はUSB機器(HIDデバイス)として認識はされましたが,コントローラーからの入力が全く行えませんでした.調べてみると,avr-gccで"-O3"オプションを付けて最適化を行っているため,I/Oのタイミングをとるための空ループのウェイトが削除されてしまっているようでした.
そこで"-O0"で最適化無しでコンパイルすると,今度はAVR-USBで不具合が起こるらしくOSから認識できなくなってしまいました.
結局_delay_us()でウェイトをとるようにすると動作しましたが,コントローラーの十字パッドがボタンにマップされないなど少し満足できない点があったので,コントローラーのキーセンス部分を書き直しました.
回路図 回路図  回路図(2P用) 回路図(2P用)
回路図は左上の図のとおりで,PS2USBの回路を元にしています.ただし,PB2に2番目のコントローラーのATT(SEL)の代わりにACKをつないでいたり,LEDで電圧を下げてAVRとコントローラーをどちらも3V程度で駆動していたり,ATmega8の代わりにATmega88を使っていたりするなど若干異なる点があるため,PS2USBを動かす場合はファームの変更が必要です(変更してもうまく動きませんでしたが...).コントローラーから本体への信号(DAT,ACK)はオープンコレクタですが,AVRの内部でプルアップしています.
後述するファームを使って2番目のコントローラーを接続する場合は,右上の回路図のように,ポートCの方に,ポートBに1番目のコントローラーをつないだのと同様に接続します(PlayStation用のコントローラーはバス接続できるようですが,ピンも余っているので別々に接続します).ただし,コントローラーを1つしか持っていないので2つめのコントローラーをつないだ場合の動作確認はしていません.
なおACK端子は結局ファームでは使わなかったので,配線する必要はありません.
上図の回路のようにLEDを使って電圧を下げるとコントローラーに供給する電圧が3V程度になってしまいますが,本来の電源電圧は3.6Vとなっているようなので,LEDの代わりにダイオード(1N4148等)を2本直列につないで電圧を落とすようにした方がいいかもしれません.
配線図とケースに組み込んだ写真は下のようになりました.
ケースはテイシンのTB-50というもので,D30xW50xH20のとても小さいサイズのものです.
配線図 配線図  完成したもの 完成したもの

ファームウェア

ファームウェアはusbjoyを改造して使用しました.
はじめにusbjoy(usbjoy_20060108.zip)を入手して"Programm_PSX"というディレクトリに含まれるファイルを展開したのち,上のzipファイルに含まれる"common.h"と"out_psx.c"と"usbconfig.h"のパッチをあて,"Makefile"と"in_psx.c"をこのzipファイルに含まれるもので置き換えて下さい.
なお,"-O3"オプションを付けて最適化すると,関数がインライン展開されコードサイズが極端に大きくなってエラーが出るようなので,in_psx.cのコンパイル時にはオプション("-fno-inline")でインライン展開を禁止にしています.
ATmega88のヒューズビットの下位バイトは0b11011111にします.
コントローラー側のボタンとOS側で認識される信号の対応は何も考えませんでしたが,ファームを変更すればもちろん自由に変えられます.

参考資料

  1. PS2USB
  2. usbjoy
  3. プレイステーション・PAD/メモリ・インターフェースの解析

[戻る]
2008-12-29 ページ作成
(2008-12 製作)
T. Nakagawa