Arduinoでファミコンのコントローラーを読む

久々にArduinoをいじってみましょう〜。
今回はファミコンのコントローラをつないで、ボタンの内容を読んでみます。
ファミコンのコントローラの回路については「ファミコン コントローラ 回路」とか「nes pad curcuit」とかでググったらいろいろ出てきますので各自掘ってみてください。

作例をみると大体ソフトウェアで処理されていますが、今回はAVRのハードウェアSPI機能を使ってみますね〜
ちゅうい:SPIのSlave Selectに対応していないモノを無理やり繋いでいるので、このままでは他のSPIデバイスと並列には繋げません!

用意するもの
ファミコンの拡張コントローラ(ジョイカードmarkIIとかホリパッドとかジョイボールとかパワーグローブとか)
・D-SUB15ピン(オス)コネクタ(注:ピンが2段のもの)
秋月→ http://akizukidenshi.com/catalog/g/gC-00025/
マルツ→ http://www.marutsu.co.jp/shohin_13956/
千石→ http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=26D8-4GEN
共立→ http://eleshop.jp/shop/g/g398147/

配線(ファミコン拡張端子-Arduino)直結しちゃいましょうね〜
1 (GND) - GND
12(P/S) - D9
13(DAT) - D12(MISO)
14(CLK) - D13(SCK)
15(VCC) - +5V

ファミコン側のピン番号は、コントローラ側のコネクタ端をみつめると書いてあるので確認おねがいします。
↓こんな感じになりました。

スケッチを以下のようにサクっと書いてArduinoへアップロードします。

#include <SPI.h>
#include <Serial.h>

char padData;
const int slaveSelectPin = 10;

void setup() {
  pinMode (slaveSelectPin, OUTPUT);  // set SPI mode to master
  pinMode (9, OUTPUT); // set P/S pin as an output

  // initialize SPI
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setClockDivider(SPI_CLOCK_DIV8);

  // initialize Serial out
  Serial.begin(115200);
}

void loop() {
  // P/S control
  digitalWrite(9,HIGH);
  delay(1);
  digitalWrite(9,LOW);

  // read shift-register with SPI port
  padData=SPI.transfer(0);

  // display data
  for(int i=8;i>0;i--){
    Serial.print( bitRead(padData,i-1));
  }
  Serial.print("\n");
  delay(20);
}

SPIモードとクロック分周比はとりあえず〜で動いた値にしてあります〜汗

シリアルモニタを表示させてコントローラのボタンを押すとボタン内容が表示されると思います。
左から、A/B/SELECT/START/下/上/左/右。押されているところが0になります。

スーパーファミコンのコントローラを読むときは、配線は同様。padData1,padData2等、変数を2バイト用意して、2回SPI.transfer()を行えばいいです。

思いつきを実行してみて、さくっと動いて嬉しかったんですがSPI端子は空けて他に使ったほうがいい感じもしましたw