AVRでUSBゲームコントローラーを自作する

自分フレームワークの実装過程で、前回、エミュレーターソースを流用してスペースインベーダーを作成した。

GLFW3 には、標準で、ゲームコントローラーの取得 API があるので、それを使ってみる事にした。

適当な USB ゲームパッドを買っても良いのだがー、備品の中に、ファミコン時代に購入した、「ASCII STICK II TURBO」が埃をかぶっている事を発見したー

IMG_0423s

内部
IMG_0424s
※ボタンの「受け」などは鉄板で補強してあり、筐体はプラスチックだが、必要な剛性を確保してある。
※設計は、当時ナムコの筐体デザインなどをしていた遠山さんと言う噂なのだがー、この創りの良さとこだわりは、実際そうなのだろうと思う。

当時5000円くらいはした覚えがあるが、機能的には、ファミコン用なので、ボタンが少ないのだがー、連射や、4方向、8方向切り替えなど、色々と芸が細かい、
デザインも優れているし、剛性も高く、方向レバーはマイクロスイッチで、価格以上の素晴らしい創りとなっている、今回はこれを改造する事とした。

USB のゲームコントローラーでは当然ながら、制御用マイコンが必要だが、ネットを探すと色々ある、今回利用させてもらったのは「ココ」のサイト。
AVR を使った USB ゲームデバイスで、最近ではあまり馴染みの無い ATMega8 を使っている。
手持ちの ATMega88 とかで出来れば良いのだがー、このコントローラーの制御ソースはアセンブラなので、ATMega8 を別途購入した(秋月で180円)。
そもそも、USB の通信機能が無い AVR でUSB(Low スピード)の通信を行うのはかなりハードルが高い、マシンサイクルを正確に計算して、ソフトウェアーのタイミングループだけで、USB の制御信号を
生成しているのは、クールとしか言いようが無い。

ASCII STICK には、何に使うか最後まで不明な「OPTION」コネクターがある。
丁度良いので、USB コネクターはここに出そうと考えて、工作してみた。

IMG_0429s
※回路は、特に変更はしていないが、USB の差動ラインに入っている68オーム、手持ちが無かったので75オームとした。
※アナログの電源ライン「GND」も回路図ではオープンとなっているが、一応 GND に落としておいた。

—– Fuse ビット書き込み時の注意 —–

ATMega8 は、ピンアサインなどは、ATMega88P などに近いものの、古いデバイスで、注意する点があります。
現在も流通はしているものの、ATMega88Pや上位デバイスに置き換えるのでしょう。
※自分もそれでハマリました・・・
まず、ヒューズビットを書き込む場合ですが、最初に low バイトを書き込んでしまうと、発振機が動作しなくなります。
これは、「fuse.txt」の値が適切とは言えない点と、ATMega8 の仕様によるところにあります。
12MHz のクリスタルを使う場合なので、high バイトの「CKOPT」を変更して、「0」にしておく必要があるようです。

僕は、色々やった結果、high バイトに「0xC9」、low バイトに「0xEF」を書き込んでいます。
※WatchDog は有効にした方が良いかもしれません・・
※fuse.txtでは、low バイトの CKSEL が、「External Low-frequency Crystal」となっていて、これは絶対間違っていると思います。

AVR の痛いところは、fuse の書き込みを失敗すると、再起不能になる場合がありますので、注意が必要です。
クロックの選択を誤った場合は復帰するチャンスはありますが、「RESET」端子とかを無効にしたりすると、ISP でのプログラムは不可能となります。

IMG_0431s

IMG_0433s
※いつものフォーレックスを適当に削って、USB コネクターのカバーにした、基板とLOCTITE で接着してある。

Game_Controler_Dialogjpg
※ゲームコントローラーとして認識したダイアログ(ボタンが多いのは愛嬌)

フレームワークを USB コントローラーに対応した。
ソース
バイナリー

カテゴリー: 電子工作な日々 パーマリンク

AVRでUSBゲームコントローラーを自作する への2件のフィードバック

  1. you のコメント:

    はじめまして。
    ソースはNOT FOUNDとなっておりますが
    もう公開されることはないでしょうか?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です