/工房蟲/メカ物 /USB-PSPAD

〜お約束〜
このページは個人の趣味で作られたものであり、万全を期するものではありません。
よって、このページの内容を実行して万一不具合や損害が生じても、当方は一切責任を取りません。
よーするに、やるなら自己責任ってことで。

なお、現在コレは作成中なので内容が変わることがありますので要注意です。
最終:2003/11/12


予備知識編

購入編

作成編

予備知識編
まずはここのHPからPSパッドに関する解析資料を取って来て下さい。
藤田氏の資料 http://lillith.sk.tsukuba.ac.jp/~kashima/games/psx.html
Applauseさんのページ http://applause.elfmimi.jp/dualshock.shtml
NTさんのページ http://home.netyou.jp/cc/ntlab/Controller/Controller.htm

と言う訳で、先ずは藤田文書と呼ばれる藤田氏の解析資料から、PSパッドがプロトコル通信で動作していることが判ると思います。
コレをUSBでPCに接続する場合、2つほど方法があると思います。
  • USBらしくHIDデバイスとして認識させる、デバイスドライバは作成しなくて済む。
  • USBでプロトコルインターフェイスとして認識させる、パッドとして使用する場合にはデバイスドライバの作成が必要。
購入編

材料
レベルコンバーターマイコン
オープンコレクタバッファ(74HC07)x2H8-3664QFP(AKI-H8-3664)x1   
抵抗(470Ω:プルアップ用)x8
抵抗(2.2kΩ:プルアップ用)x8電源
可変電圧レギュレーター(LM317)x1   
USBインターフェイス可変抵抗(1kΩ)x1
USBN-9604x1   抵抗(240Ω)x1
クリスタルオシレーター(24MHz)x1抵抗(100Ω:LED用)x1
セラミックコンデンサー(15pF)x2電解コンデンサ(10μF)x2
抵抗(1MΩ)x1セラミックコンデンサ(0.1μF)x2
ダイオード(逆流防止用)x1
基盤など発光ダイオード(電源監視用)x1
PSパッドコネクタ(マルチタップ等から)x1
USBコネクタ(形状はお好みで)x1
基盤(ベースボード用)x1
基盤(1.27mmSOP変換24PIN以上用)x1
角ピン(2列14ピン以上)x2
角ピン用コネクター(2列26ピン)x2(必要に応じて)
角ピン用コネクター(2列14ピン)x2(必要に応じて)
配線材料それなり


USBインターフェイスチップにはUSBN9604を使います。(\600)
また、制御チップにはH8-3664F-QFPを使用します。(\1600)
これらは秋月電子にて販売しているので容易に入手することが可能です。
制御チップはPIC等でも良いのですがH8のプログラムの練習もかねてということでこちらを選択しました。
初めての方は開発セットで買うのがよろしいかと。
因みにUSBN9604を買うときは忘れずに24MHzのクリスタルと、15pFのセラミックコンデンサ、1MΩの抵抗器を忘れずに入手しておきましょう。

今回はお手軽に済ませるためにピッチ変換基盤などを使っています。が、
…高いです、こんなんでなんで1枚単価(2枚入り)¥400位しますか…。


作成編
折角USBで作るのだからバスパワーで動作させたい。
という事で、電源はUSBバスからとることにします。
解析資料にも在るとおり、PSパッドのコネクタには7.6Vの電源ラインが存在します。
しかし、USBのバス電圧は5V、通常の手段では確保できません。
という事で、コレについては外部電源に頼るか、オミットしてしまう方向で行きます。
つーか、ぶっちゃけ振動モーター用電源なので5Vを放り込んでおきます。

今回は元気いっぱいに信号レベル変換用のコンバーターを作ってみました。
ついでにSEL信号に連動したゲートも設置。
無駄に回路がでかくなっていい感じです。(ぉ
74ICを8個も使う大盤振る舞い。
最低限必要なセットならIC2つで済むというのに。
回路図はこんな感じ、まぁ参考程度に。
SEL信号の割り当ては任意で。

…って、作ってテストしてから気付きました、SEL信号の極性が逆でした。
直すのめんどいからこのまま放置♪

と、最初に作った回路は元気いっぱい74ICが8個というシロモノでしたが…、作ってから間違いだらけだと気付きあえなく断念。
しょうがないのでお手軽にIC2個の方向で。


電源は3.6Vを作るのに可変電圧レギュレーターLM317を使います。
ダイオード2個つないで1.2〜1.4Vの電圧降下を使ってもヨサゲですが今回はレギュレータで。
実はUSBN9604から3.3V出力が出てるので面倒ならばそちらを使っても良いかもしれません。

先ずはRS-232Cからパッドのデータを吸ってみることにします。
で、ウマい事成功。
時たま戻りのデータがおかしくなる事があるようですが…RS232Cのせいか?
んでもって、次はUSB周りの作成。

とか思ってたら、実はギリギリで動いてたことが発覚。
どうやらプルアップ抵抗の値が大きかったらしく信号波形の舐めることなめる事。
1kΩの抵抗を3.6Vにプルアップするとパルスの立上り時間が1μSecもかかる事が発覚。(立下りは綺麗にでる)
因みに10kΩだと250kHzのクロックパルスが全部潰れてました。(立上り時間2μSec以上)
ほんとはプルアップの下にスピードアップコンデンサを入れてやれば良いんでしょうが、ちっさい基盤で作ったのでムリポ。
とゆーわけで、プルアップ抵抗を下げる事に。
いやいや、CMOSだから電流少な目の方が良いのかと思いきや、やっぱり立上りエッジを良くするには一定以上の電流を流さなけりゃダメな模様。

というか、プログラムの問題でした。
SEL信号を入れてからクロック信号を入れるタイミングが早すぎた模様。
最低でも半クロック以上の時間を開けないと動作に支障が出る様子。
DualShock2:32ステート、2μSec
IMAGEGUN:192ステート、12μSec
といった感じ、万全を期するなら10〜20μSecのウェイトを入れるのが良いようです。

あと、プルアップ抵抗の値が大きいと波形が嘗めてしまいますので470Ω位がよろしいかと。
かなり適当に作った回路なので電源状態によては波形がきちんとでないかも?
回路図はこんな感じ、まぁ参考程度に。
実はH8からのの出力端子のプルアップは必要なかったりする罠。




と、途中まで作ったのは良かったのですが、インタラプト転送の動作がいまいち分からず、デッバッグをしようにも既にデバッグモードではプログラムが限界サイズ。
そこで、折角在るのだからとBestTechnology社製のSH2(7047)ボードで実験することに。


いきなり蹴躓きました。
何でかと結果だけ言うとデッバッグメッセージを表示させる時にウェイトを入れていたのですが、どうやら長すぎた模様。
頻繁にNAK_RESETイベントが発生してもはやどうにもなりませんでした。
皆さんもタイムアウトには注意しましょうね。

蹴躓きその2。 どうやらいい加減なREPORT_DISCRIPTORを送信するとパッドデータを送信したときにALT_RESET信号で刎ねられる模様。
ちゃんとしたレポートディスクリプタを使って実験することをお勧めします。
検証の結果、レポートディスクリプタで指定されたデータサイズよりも大きなものを送信してもRESETで刎ねられる模様。

ディレクトリメニュー
インデックス