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