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) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。