レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

ファミコンジョイスティックをUSBジョイスティックに

2018年08月12日 | 電子工作

先日、ハードオフで購入したMacのテンキーをUSB-IO2.0でPCに接続して利用することは出来ました。でもテンキーは専用アプリから利用するだけでなく、普通にテンキーとして使えるようにしたいものです。

そんな折に見つけたのがArduino(アルドゥイーノというマイコンボード。いくつか種類のある中で、Leonardoとその小型版のPro Microというものなら簡単にUSBデバイスが作れるようです。早速、AmazonでLeonardoを購入。

純正品のLeonardoではなくkeyestudioのLeonardo R3開発ボードという互換機です。純正品より安くて¥1,000程度で購入出来ました。完全互換とのことなので、初めての利用にはこれで問題ないでしょう。

購入後、まず行うのは開発環境の構築です。開発はWindows、Mac、LinuxどのOSでも可能ですが、クロス開発は経験的にLinuxで行うのが一番トラブルが少ないと思っているので、今回はUbuntu18.04で開発することにしました。
インストールはArduinoのソフトウェア開発に必要なArduino IDEをここからダウロードし、Ubuntu上で解凍してinstall.shというスクリプトを実行するだけです。メニューとデスクトップにArduino IDEアイコンが登録されますので、これをクリックするとArduino IDEが起動します。

Arduino LeonardoをUSBでつないだらIDEを起動し、メニューのツールボードは"Arduino Leonardo"を、シリアルポートは"/dev/ttyACM0"を選択します。

一般ユーザでIDEを使用するとき、Ubuntuではデフォルトで/dev/ttyACM0にアクセスできないのでdialoutグループに自分のグループを追加しておきます。コマンドで追加出来ますが、確認の手間も省けるので直接/etc/groupを編集しました。
スーパーユーザーの権限でgroupファイルを開いたら、dialout:x:20:の後にdialout:x:20:hogehogeのように自分のグループ名を追加します。通常、自分のグループ名はユーサー名と同じです。
設定は以上です。

環境が整ったら使い方を調べます。今回、このサイトを参考にLチカやタクトスイッチ、圧電ブザーなどで利用方法を学びました。感謝です。
実は以前よりraspberry piは利用していたので、これらの実験に必要なパーツは手元にありましたが、初めての方は別途LEDやタクトスイッチ、配線のためのブレッドボードなどは購入しておきましょう。

利用方法とスケッチ(プログラムのこと)の書き方はおおよそ理解出来たので、いよいよテンキーのUSB化に挑戦といきたいところですが、配線が多めなのとスケッチがちょっとだけややこしくなりそうなのでこれは先送りにしておき、Arduinoの開発に慣れるという意味で別のものをUSB化することにしました。

これです。

大昔に購入したファミコン用ジョイスティックのジョイスティック7です。色々ナイスなジョイスティックを発売している(株)ホリの製品で、ファミコンの拡張端子に接続して利用します。前方側面に4←→8方向と1P←→2Pの切り替えスイッチがあります。ファミコン本体は捨ててしまいましたが(最近ファミコン互換機は買ってしまいました。でも拡張端子はありません。)いつか利用できるかもと思い収納の奥にしまいこんであったものです。やっと日の目を見ることが出来ました。

ネットで調べるとファミコンコントローラーとArduinoの接続事例は山ほどありますが、拡張端子に接続するコントローラーについてはドンピシャな記事は見つかりませんでした。とはいえピンアサインだけ分かればファミコンコントローラーとそれほど違いはないのでなんとかなりそうです。
後はUSBジョイスティックのスケッチをどう書くかだけです。これは自分ですべて書くよりは、世間に数多く公開されているライブラリを利用したほうが簡単で手っ取り早いのでネットで探してみました。

いろいろありましたが、ここが良さそうです。ファミコン含め様々なゲームパッドのスケッチを公開してくれています。ありがたいことです。このサイトのスケッチは、すべてではありませんがこちらのArduinoJoystickLibraryを使用しているようなので、場合によって自分のスケッチからこのライブラリを直接利用してもいいかもしれません。
そこで、まずこのライブラリをインストールしておきます。インストールと言っても、gitコマンドで作成したクローンの中にあるJoystickフォルダーをArduino IDEのlibrariesフォルダーにコピーするだけです。

次は、ジョイスティックとArduinoの接続です。ファミコン拡張端子のオスコネクタは当然手元にありませんが、中古ファミコンを分解して入手するというのも面倒なので、ジョイスティック7のメスコネクタを分解してピンヘッダー・ソケットを取り付けました。このときピンアサインも調べておきました。

Arduinoで使用するピン番号は、上記ゲームパッドのスケッチを提供してくれているGitHubからクローンしたフォルダーの中にあるRetroJoystickAdapter.inoで確認します。このスケッチは複数ゲーム機のジョイパッドに対応していますが、手直ししないとエラーでコンパイル出来ないので、これを元にファミコン専用のスケッチを書き直しました。

NESpad.ino

使用するピン番号も変更しています。(実はデバックに使用しているI2C接続のOLED液晶パネルのピンと競合してたんです。)

それではArduinoとジョイスティックを接続します。

CLOCK   → 6番ピン
LATCH(P/S) → 5番ピン
DATA    → 4番ピン
VCCとGNDも接続


ファミコンのコントローラーは5Vで動作するので、VCCは3.3Vではなく5Vのピンにつなぐ点に気をつけます。

Arduino IDEでスケッチをコンパイルして、マイコンボードに書き込みます。書き込みが終了してもそのままでは正常に動作しているのか分からないので、Ubuntuのjstest-gtkアプリを使用します。

スティックを動かしたりボタンを押すと、画面に表示されますので動作確認を行うことが出来ます。

実はジョイスティック7には2Pコントローラーへ切り替えるスイッチがあるので2P用のスケッチも作成してみたのですが、ジョイスティック使用中に切り替えると誤動作してしまいました。情報がなく詳しいことはわかりませんでしたので、今回2Pは無視しました。(^_^;)
そんな訳で、通常のファミコンコントローラーでこのスケッチを利用することが出来ると思います。たぶん。

これでUSBジョイスティックの完成です。早速、RetroPieでゲーム機と化しているRaspberry pi 3につないで遊んでみました。
動作は完璧です。でもこのジョイスティックはスティックの操作性が悪い。スティックが大きくて、かなり傾けないと内部のゴムボタン(メカニカルスイッチじゃない!)が押せないのです。スティックを抑えているバネも固くて長時間の使用は疲れます。いずれ収納の奥にしまわれることになりそうです。

ところでArduino Leonardoは色々なデバイスの開発に使用したいので、このままUSBジョイスティックにしておけません。そこでLeonardoと同等の機能を持ち、もっと小型のArduinoを購入することにしました。SparkFunというメーカーのPro MicroというLeonardoの小型版です。ただ、実際に購入したのはHiLetgoのPro Micro互換機5V/16MHz動作のもので、Amazonで¥1,100くらいでした。
利用する前に、Arduino IDEにSparkFunのボードをセットアップし(こちらを参考にしました。)、メニューのツールボードは"SparkFun Pro Micro"を、プロセッサには"ATmega32U4(5V,16MHz)"を選択しておきます。これを忘れるとボードに書き込まれているブートローダーを破壊することがあるとのことです。(未確認)

後はLeonardoと全く同じように使用できました。
このProMicroを基盤に半田付けしてUSBジョイスティックの完成です。

後で、ProMicroを保護するケースを作ろうかな。



最新の画像もっと見る

コメントを投稿