SSブログ

Digisparkでスーパーファミコンのコントローラーを使う [Arduino]

前提として、スーパーファミコン型のUSBジョイパッドを買ったほうが簡単で安いというのは無しで。
また、この手の話題はすでにライブラリまで作っている方もみえて、何番煎じかという感じです。

うちの近くのハードオフに、スーパーファミコンのコントローラーの中古があるにはあるのですが、手垢で汚い・傷あり・変色・ボタンスカスカ・110円じゃなくて330円。
ですが、とりあえず1個よさそうなものを選んで購入。
Aliexpressでソケットも購入。

こんな感じで、、
sfc_socket1.jpg
sfc_socket2.jpg
先日つくった改造Digisparkと接続できるパーツを仕上げたのですが、改造Digisparkが死亡したため、以前に購入したmicroUSB版 Digisparkを出してきました。
sfc_socket3.jpg
ブレッドボートでつないで、十字キーを読み取るという以下のスケッチで動作確認できました。
// SFC(SNES) controller to HID            //     _______________+----- GND   (Brown)
//   digispark(USB 16.5MHz) version       //    |_O_O_O_O_|_O_O_O_)          connector
#define DAT   0                           //      | | | +------------> DATA1 (Red)
#define PS    1                           //      | | +--------------< P/S   (Orange)
#define CLK   2                           //      | +----------------< CLK   (Yellow)
#include "DigiKeyboard.h"                 //      +------------------- VCC   (White)

void setup() {
    pinMode( DAT, INPUT );
    pinMode( PS , OUTPUT );
    pinMode( CLK, OUTPUT );
    digitalWrite( CLK, HIGH );
    DigiKeyboard.sendKeyStroke(0);
}

void loop() {
    uint16_t sfc = 0;
    digitalWrite( PS , HIGH );
    digitalWrite( PS , LOW  );
    for(uint8_t i=0; i<12; i++) {
        sfc |= ( digitalRead( DAT )^1 ) << i;
        digitalWrite( CLK, LOW  );
        digitalWrite( CLK, HIGH );
    }
      // 0:B, 1:Y, 2:SEL, 3:STA, 4:UP, 5:DOWN, 6:LEFT, 7:RIGHT, 8:A, 9:X, 10:L, 11:R
    if( sfc & (1<< 4) ) DigiKeyboard.sendKeyStroke( 0x52 );     // UP    -> KEY_ARROW_UP
    if( sfc & (1<< 5) ) DigiKeyboard.sendKeyStroke( 0x51 );     // DOWN  -> KEY_ARROW_DOWN
    if( sfc & (1<< 6) ) DigiKeyboard.sendKeyStroke( 0x50 );     // LEFT  -> KEY_ARROW_LEFT
    if( sfc & (1<< 7) ) DigiKeyboard.sendKeyStroke( 0x4f );     // RIGHT -> KEY_ARROW_RIGHT
    DigiKeyboard.delay(10);
}

メディアキーでボリュームの操作もしたかったんだけど、なぜかできず。
タグ:Digispark
nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。