昨年M5Stackのハッカソンで、ファミコンのコントローラーを繋いでみたので、忘れないように記録を残しておきます。
ちなみに、ハッカソンで作ったのははこちら
繋ぐ機器
使うのは、みんなの家に1個はあるハドソンのジョイコン。ファミコンの前の部分に刺さるさつです。
ファミコン本体のコントローラーを切っても使えると思うけど、このジョイコンならD-SUB 15ピン(2列タイプ)がそのまま刺さるのでかなり便利。
コネクタの作成
D-SUB 15ピン(2列タイプ)のオス端子を用意します。安いのなら100円ちょっとで買えます。
このD-SUBコネクタに、以下の配線をおこないます。
- GND (1pin)
- STROBE (12pin)
- DATA (13pin)
- CLK (14pin)
- VCC (15pin)
使うのはこの5本だけ。
裏面(ケーブルの半田付けする方)から見ると、こんな感じ。
※表面(コンローラーが刺さる方)は、この画像の左右が逆転するので注意してください。
この図に合わせて苦手な半田付け。
そのままだとよく切れたので熱収縮チューブで補強して、ケースにも入れてみる(ケーブル細くてあまり意味ないけど)
配線
M5Stack Core2の以下のポートにジャンパーケーブルを接続します。
※M5Stackで使用する機能に応じて、利用できるポートが変わるので、使いたい内容に合わせて変更ください
今回はこちらを使用。
- 黒のケーブル(1pin):GND
- 黄のケーブル(15pin):3.3V
- 橙のケーブル(14pin):G27
- 赤のケーブル(13pin):G19
- 焦茶のケーブル(12pin):G18
ソフト
簡単なライブラリがあります。ありがとうございます。
今回は、上記のサンプル(NESPad_serial)で動作確認を行なっています。
GPIOのポート番号を、配線に合わせて修正
引数は、strobe / clock / data
NESpad nintendo = NESpad(18 ,27, 19);
buttonsで、各ボタンの状態が取得されます。
byte state = nintendo.buttons();
ボタンが押されてる場所のbitが立ちます。
詳細はこちら。
#define NES_A B00000001
#define NES_B B00000010
#define NES_SELECT B00000100
#define NES_START B00001000
#define NES_UP B00010000
#define NES_DOWN B00100000
#define NES_LEFT B01000000
#define NES_RIGHT B10000000
動かすと、Serialで各bitの状態が出力されます。
※サンプルは、bitが反転されているので、1が未入力、0が入力です。
ちなみに、結果に対してbit演算行うことで、ボタンの情報を取得することができます。
if( state & NES_A) Serial.println("NES_A");
if( state & NES_B) Serial.println("NES_B");
if( state & NES_SELECT) Serial.println("NES_SELECT");
if( state & NES_START) Serial.println("NES_START");
if( state & NES_UP) Serial.println("NES_UP");
if( state & NES_DOWN) Serial.println("NES_DOWN");
if( state & NES_LEFT) Serial.println("NES_LEFT");
if( state & NES_RIGHT) Serial.println("NES_RIGHT");
まとめ
今回はハドソンのジョイコンでのみ動作確認をしています。
ちなみに、ファミリーマットはボタンの数が8個以上あるので、多分動作しません。
もし他のジョイスティックで動作してたら教えてもらいたいです。