9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

M5Stackでファミコンコントローラーを動かしてみる

Last updated at Posted at 2021-05-23

昨年M5Stackのハッカソンで、ファミコンのコントローラーを繋いでみたので、忘れないように記録を残しておきます。

ちなみに、ハッカソンで作ったのははこちら

繋ぐ機器

使うのは、みんなの家に1個はあるハドソンのジョイコン。ファミコンの前の部分に刺さるさつです。

ジョイコン

ファミコン本体のコントローラーを切っても使えると思うけど、このジョイコンならD-SUB 15ピン(2列タイプ)がそのまま刺さるのでかなり便利。

コネクタの作成

D-SUB 15ピン(2列タイプ)のオス端子を用意します。安いのなら100円ちょっとで買えます。

コネクタ

このD-SUBコネクタに、以下の配線をおこないます。

  • GND (1pin)
  • STROBE (12pin)
  • DATA (13pin)
  • CLK (14pin)
  • VCC (15pin)

使うのはこの5本だけ。

裏面(ケーブルの半田付けする方)から見ると、こんな感じ。
※表面(コンローラーが刺さる方)は、この画像の左右が逆転するので注意してください。
pin

この図に合わせて苦手な半田付け。
そのままだとよく切れたので熱収縮チューブで補強して、ケースにも入れてみる(ケーブル細くてあまり意味ないけど)

配線

M5Stack Core2の以下のポートにジャンパーケーブルを接続します。
※M5Stackで使用する機能に応じて、利用できるポートが変わるので、使いたい内容に合わせて変更ください

今回はこちらを使用。

  • 黒のケーブル(1pin):GND
  • 黄のケーブル(15pin):3.3V
  • 橙のケーブル(14pin):G27
  • 赤のケーブル(13pin):G19
  • 焦茶のケーブル(12pin):G18

配線
配線2

ソフト

簡単なライブラリがあります。ありがとうございます。

今回は、上記のサンプル(NESPad_serial)で動作確認を行なっています。

GPIOのポート番号を、配線に合わせて修正
引数は、strobe / clock / data

NESpad_serial.pde
NESpad nintendo = NESpad(18 ,27, 19);

buttonsで、各ボタンの状態が取得されます。

NESpad_serial.pde
byte state = nintendo.buttons();

ボタンが押されてる場所のbitが立ちます。
詳細はこちら。

NESpad.h
#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個以上あるので、多分動作しません。
もし他のジョイスティックで動作してたら教えてもらいたいです。

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?